2014-10-20 9 views
-7

Что будет напечатано этой линией?Что будет напечатано этой линией и почему?

printf("hello\n") | (printf("goodbye\n") || printf("world\n")); 

После испытания, он напечатал:

hello 
goodbye 

Но я до сих пор не знаю, почему и до сих пор застрял на нем, любые намеки будут очень благодарны! Кстати, я знаю, что printf() возвращает количество выводимых символов, но по-прежнему не получает логики.

+8

Подсказка: возможно, выяснить, что '' 'и' || 'делать? – juanchopanza

+1

Заголовок вашего вопроса, похоже, противоречит вашему вопросу. Вы знаете, что он делает ... –

+0

Я знаю | является бит-мудрым OR, а || является оператором OR, но до сих пор не знает, почему он напечатал прощай, но не мир :( –

ответ

3
| - Bitwise OR operator 
|| - Logical OR operator 

printf("hello\n") | (printf("goodbye\n") || printf("world\n")); 

В этом случае, как и printf("hello\n")printf("goodbye\n") будет выполнена, так как вы использовали | между ними. Поскольку это побитовая операция, оба будут выполнены. Также printf возвращает количество напечатанных символов. Следовательно, в вашем случае printf("hello\n") | printf("goodbye\n") приведет к 6 | 8 = 0110 | 1000 = 1110 = 14 (в десятичной системе).

Следовательно, выражение становится эквивалентным 14 || printf("world\n"). Так как 14 (будучи отличны от нуля) сама удовлетворяет Логическое ИЛИ проверить, не приступит к printf("world\n") который будет 6.

+0

Спасибо @Kay за редактирование. Мне нужно сделать некоторые исследования, как это сделать следующим образом :-) –

2
(printf("goodbye\n") || printf("world\n")) 

Оба «до свидания» и «мир» истинные утверждения. Следовательно, он принимает «до свидания», как первый, который должен выполняться по порядку.

Попробуйте представить дополнительные разъяснения

printf(printf("hello\n") | (printf(NULL) || printf("world\n"))); 
Output: 
hello 
world 

Поскольку "NULL" ЛОЖЬ и "мир" имеет значение ИСТИНА. (0 || 1 = 1)

Спасибо,

Смежные вопросы