Вывод текста по буквам [дубликат]

То, что вы видите здесь, - это то, что я считаю неправильным и неудачным выбором дизайна в спецификации языка C ++ и многих других языков, принадлежащих к одному и тому же общему семейству языков программирования.

Эти языки позволяют ссылаться на статические члены класса, используя ссылку на экземпляр класса. Фактическое значение ссылки на экземпляр, конечно, игнорируется, поскольку для доступа к статическим членам не требуется экземпляр.

Итак, в d->fun(); компилятор использует указатель d только во время компиляции , чтобы понять, что вы обращаетесь к члену класса demo, а затем игнорируете его. Никакой код не испускается компилятором для разыменования указателя, поэтому факт, что он будет NULL во время выполнения, не имеет значения.

Итак, то, что вы видите, происходит в полном соответствии со спецификацией язык, и, на мой взгляд, спецификация страдает в этом отношении, потому что это позволяет сделать нелогичную вещь: использовать ссылку на экземпляр для ссылки на статический член.

PS Большинство компиляторов на большинстве языков на самом деле способны выдавать предупреждения для такого рода материалов. Я не знаю о вашем компиляторе, но вы можете проверить, потому что тот факт, что вы не получили предупреждения о том, что вы делали, может означать, что у вас недостаточно предупреждений.

5
задан Christopher 27 December 2012 в 01:02
поделиться

2 ответа

Поскольку выходной поток буферизируется по строке - поскольку он явно не сбрасывается между операторами печати, он ждет, пока он не увидит новую строку для выведения вывода.

Вы можете принудительно выполнить промывку через sys.stdout.flush() .

Альтернативно, если вы запустите Python с флагом -u, он отключит буферизацию строки.

18
ответ дан Amber 18 August 2018 в 18:47
поделиться

Это всего лишь 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, и он не будет буфер.

7
ответ дан Community 18 August 2018 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: