То, что вы видите здесь, - это то, что я считаю неправильным и неудачным выбором дизайна в спецификации языка C ++ и многих других языков, принадлежащих к одному и тому же общему семейству языков программирования.
Эти языки позволяют ссылаться на статические члены класса, используя ссылку на экземпляр класса. Фактическое значение ссылки на экземпляр, конечно, игнорируется, поскольку для доступа к статическим членам не требуется экземпляр.
Итак, в d->fun();
компилятор использует указатель d
только во время компиляции , чтобы понять, что вы обращаетесь к члену класса demo
, а затем игнорируете его. Никакой код не испускается компилятором для разыменования указателя, поэтому факт, что он будет NULL во время выполнения, не имеет значения.
Итак, то, что вы видите, происходит в полном соответствии со спецификацией язык, и, на мой взгляд, спецификация страдает в этом отношении, потому что это позволяет сделать нелогичную вещь: использовать ссылку на экземпляр для ссылки на статический член.
PS Большинство компиляторов на большинстве языков на самом деле способны выдавать предупреждения для такого рода материалов. Я не знаю о вашем компиляторе, но вы можете проверить, потому что тот факт, что вы не получили предупреждения о том, что вы делали, может означать, что у вас недостаточно предупреждений.
Поскольку выходной поток буферизируется по строке - поскольку он явно не сбрасывается между операторами печати, он ждет, пока он не увидит новую строку для выведения вывода.
Вы можете принудительно выполнить промывку через sys.stdout.flush()
.
Альтернативно, если вы запустите Python с флагом -u
, он отключит буферизацию строки.
Это всего лишь python buffering stdout. Этот ответ содержит некоторую дополнительную информацию.
Вы можете его скрыть следующим образом:
import sys
from __future__ import print_function
import time
x = 0
while x < 5:
print(x, end='')
x += 1
sys.stdout.flush()
time.sleep(1)
Альтернативно запустите python python -u
, и он не будет буфер.
print(x, end='', flush=True)
будет работать – evan54 9 October 2016 в 19:10