2014-01-06 1 views
4
int a=5; 
#include<stdio.h> 
int main() 

{ 
    printf("%d",printf("hi!")*printf("bye")); 
    return 0; 
} 

Выход:объяснить этого вложенного PRINTF Заявление о

hi!bye9 

Я хотел бы знать, как порядок, в котором выход произошло. Означает ли это, что функция printf возвращает значение? В чем причина выполнения внутренних команд printf?

ответ

4

Порядок внутренних printf s не указан. Другая реализация, та же реализация с разными настройками компилятора или одна и та же реализация с одним и тем же кодом в другом месте может привести к byehi!9.

9-приходит потому, что printf возвращает количество напечатанных символов, поэтому двух внутренних printf сек возврата 3 и * является знаком оператор умножения, что дает 9.

+0

Это не неопределенное это не указано, большая разница –

+0

Совершенно верно, я исправлю. –

+1

И волшебное слово: «точки последовательности». –

2

printf как и другие функции ввода-вывода, возвращает количество напечатанных байтов.

Это делается для того, чтобы вы могли проверить, прошло ли IO, как ожидалось, поскольку могут возникнуть ошибки ввода-вывода/потока, а иногда и единственный способ узнать, что нужно проверить правильность напечатанного количества байтов.

2

printf возвращает количество записанных байтов. Итак, «привет!» и «bye» возвращают 3 каждый. 3 * 3 - 9, и это то, что напечатано

1

printf() возвращает количество символов (байтов), которые оно печатало успешно. Пожалуйста, прочитайте man page из printf().

5

Эта программа демонстрирует unspecified behavior поскольку порядок оценки суб выражение не определенно исключением случаев, когда это специально определенно:

printf("%d",printf("hi!")*printf("bye")); 
      ^   ^
      1    2 

Так что либо 1 или 2 может быть оценен первым, и вы не можете определить, какие. Мы можем увидеть это из раздела C99 draft standard6.5Выражения пункт который говорит (курсив мой идти вперед):

Группировка операторов и операндов обозначается syntax.74) За исключением случаев, указанных позже (для функции-call(), & &, ||,?: И операторы запятой), порядок оценки подвыражений и порядок, в котором происходят побочные эффекты, не определены.

Да, printf имеет возвращаемое значение, которое является количеством символов печатных или -1 если есть ошибка, в этом случае не предполагая никакой ошибки возвращаемого значения будет 3 как для внутреннего printf s

аргументы функции вычисляются до того, как функция вызывается поэтому внутренние printf s выполнены первый, это рассматривается в разделе 6.5.2.2функция вызывает пункт :

Аргумент может быть выражением любого типа объекта. При подготовке к вызову к функции, аргументы вычисляются, и каждый параметр имеет значение соответствующего argument.81)

1

Вы получаете hi!bye9 потому printf возвращает количество выходных байтов или отрицательное число, если есть ошибка.

От http://www.cplusplus.com/reference/cstdio/printf/:

В случае успеха, общее количество записанных символов возвращается. Если возникает ошибка записи, отображается индикатор ошибки (ferror) и возвращается отрицательное число.

Так с:

printf("%d",printf("hi!")*printf("bye")); 

Прежде всего двух внутренних printf вызовов выход hi! с последующим bye. Тогда возвращаемые значения из этих двух трактовались похожи на ниже (они получают перемножать и выход на внешней printf):

printf("%d", 3 * 3); 
Смежные вопросы