Для цикла с printf в качестве аргументов - PullRequest
0 голосов
/ 11 сентября 2018

Я не могу понять, почему следующий код выводит 10. Я понимаю, что !printf("0") означает !0, то есть TRUE. Так почему же код не печатает "Sachin"

#include <stdio.h>

int main() {
    for (printf("1"); !printf("0"); printf("2"))
        printf("Sachin");
    return 0;
}

выход

10

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Если вы посмотрите на ссылку man printf в Google, вы увидите, что эта функция возвращает количество записанных байтов.

Здесь ваше условие равно !printf("0"), в другихслова: "до тех пор, пока возвращение printf не существует (или равно 0), сделайте что-нибудь. Но вы печатаете символ '0', так что printf фактически возвращает 1, так что ваше условие ложно.

Теперь ПОЧЕМУпечатает 10:

  • Первый printf("1") печатает 1.
  • Ваше состояние проверено хотя бы один раз, поэтому второе printf("0") происходит один раз (печатается 0)
0 голосов
/ 11 сентября 2018
printf("1")

печатает 1 и возвращает количество символов, равное 1

printf("0")

, печатает 0 и возвращает количество символов, равное 1

! 1 означает! (True) = false , поэтому выполнение остановится, и вы увидите 10 в качестве вывода.

0 голосов
/ 11 сентября 2018

давайте проанализируем этот оператор цикла побочных эффектов:

for(printf("1"); !printf("0"); printf("2"))
  • Первый оператор выполняется всегда (условие init), yieiding 1
  • Тогда условиепроверено: !printf("0") печатает 0, затем, поскольку printf возвращает 1, потому что он просто печатает 1 символ, отрицание возвращает 0, и цикл никогда не вводится, поскольку условие ложно с самого начала.Так что ни 2, ни Sachin не печатаются.

Конечно, этот код не практичен, почти не читается.Поэтому никогда не делайте таких вещей (например, puts("10"); - хорошая альтернатива).

больше о возвращаемом значении printf (которое часто игнорируется):

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

(от https://linux.die.net/man/3/printf)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...