2013-09-03 3 views
1
#include<stdio.h> 
main() 
{ 
(5%5)?1:0&puts("fizz"); 

} 

Код выше печатает fizz как ожидалось. Но я не понимаю, как побитовый операнд & работает с 0&puts("fizz"). Что за это работает? Какова ценность выражения?C побитовый оператор '&' использует

Кто-то пожалуйста, объясните

+0

Вместо '&' попробовать с '&&' вы найдете интересный результат –

+0

Я рассмотрю это для своих следующих if-else-операторов :) – Antonio

ответ

2

Ну ... 5 % 5 0 (ложь), так что ?: часть продолжает оценивать выражение справа от двоеточия.

Это означает оценку 0 поразрядным и: ed с возвращаемым значением puts(), поэтому очевидно, что функция должна быть вызвана.

3

Выражение:

(5 % 5)? 1 : 0 & puts("fizz"); 
^   ^  
    0 == False  executes 

ставит отпечатки: "fizz". Возвращаемое значение из функции puts побито & с 0, и результат (который должен быть 0) отбрасывается.

Значит, ваше выражение эквивалентно (5 % 5)? 1 : puts("fizz"); в эффектах.

+0

Фактически просто 'puts (" fizz ");' потому что значение '5% 5' определяется во время компиляции. –

+1

Я не думаю, что есть такая гарантия где угодно. – unwind

+0

@unwind yes Я не уверен, я попытался наблюдать оптимизированный код asm и нашел, что это не оптимизировано для оператора puts(). –

4
  1. (5%5) оценивается как 0, что является ложным.
  2. Весь оператор затем вычисляет 0&puts("fizz");
  3. Чтобы оценить, что значение 0 является побитовое AND'd с возвращаемым значением puts, который можно найти только выполнив функцию, которая печатает шипение.
  4. Результат (который всегда будет 0) отбрасывается.
+1

Вы можете заметить, что результат, возвращаемый или хранящийся в переменной, будет '0', так как' 0 & anything' равно 0. – Lohrun

+0

Я думаю, что стоит отметить, почему использование && будет вести себя по-другому – Antonio

0

Функция puts() возвращает неотрицательное число, если оно завершено успешно. Это неотрицательное число тогда AND с нулем.

0

puts() возвращает неотрицательный номер при успешном завершении. if (5%5) вернет false. Поэтому возвращаемое значение от puts() побито & с 0.

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