оператор printf внутри условия if

#c #printf

#c #printf

Вопрос:

Кто-нибудь может объяснить, как это работает, вывод A3, но почему он печатает 3

 #include <stdio.h>

int main() {
    int i;
    if(printf("A"))
        i=3;
    else
        i=5;
    printf("%d",i);
}
  

Ответ №1:

printf() возвращает количество символов при успешном выполнении и отрицательные значения при сбое.

Следовательно, в случае printf("A") успешного выполнения он вернет 1 .

В C значения, отличные от 0 , рассматриваются как true, поэтому i=3; выполняется.

Ответ №2:

Давайте проверим поток:

     int i;            --> i has indeterminate value
    if(printf("A"))   --> prints A and returns 1, so the condition is TRUE (see note)
        i=3;          --> This statement is executed
    else              --> this condition is skipped
        i=5;          --> so this does not execute
    printf("%d",i);   --> prints the value of i which is 3.
  

Окончательный отпечаток есть A3 .

Тем не менее, если спецификация преобразования не требуется, вместо использования printf() следует использовать puts() или fputs() .

Примечание:

От man printf()

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

Ответ №3:

хитрость, позволяющая понять это поведение, находится здесь и возвращает значение od printf

возвращает количество символов при успешном выполнении и отрицательные значения при сбое. это здесь:

 if(printf("A"))
  

может быть прочитан как

 int r = printf("A");// at this point r ==1

if(1) //this here is true so i is assigned to 3