2013-06-25 3 views
0
#include<stdio.h> 
main() 
{ 
    int x=10,y=20; 
    if(!(!x)&&x) 
     printf("x=%d\n",x); 
    else 
     printf("y=%d\n",y); 
    return 0; 
} 

выход равен 10. как? , пожалуйста, укажите значение x на каждом шаге.Объяснить выход программы

+0

Ваш предполагаемый вывод не соответствует коду. –

+3

«пожалуйста, укажите значение x на каждом шаге». Пожалуйста, прочтите FAQ. ** Вы должны показать значение x на каждом шаге. Если вы ошиблись, мы можем указать на это. –

+0

Оператор '!' Возвращает 0, если его аргумент равен 0, и в этом случае он возвращает 1. Поэтому '!! x' возвращает 0, если' x' равно 0 и 1 в противном случае. Результат '1 && 10' равен 1 или true, поэтому выполняется первая' printf() '. –

ответ

0
(!x) ==> (!10) ==> 0 
!(0) ==> 1 
1 && 10 ==> 1 

поэтому вы получите заявление printf("x=%d\n",x);.

2

Значение !x является 0, а затем !(!x) является 1 что справедливо и условие в if()(1 && 10) т.е. становится истинным, так что печатает x=10.

3

(!x) - это логическое значение, которое проверяет, является ли x равным нулю, уступая нулю, если его операнд не равен нулю, а один, если его операнд равен нулю. if(!(!x)) эквивалентен if(x), так как он инвертирует !x, который является инвертированным значением x. Этот результат объединяется с результатом x оператором &&. Поскольку оба условия выполняются, если блок выполняется

+0

(! (! X)) эквивалентно x ????? –

+0

В булевом смысле –

+0

Что я имею в виду: 'if (! (! X))' равнозначно 'if (x)' –

0

Поскольку х 10,

!x=0

!(!x)=1

1&&10 верно

, следовательно, печать x, т.е. 10

7

Во-первых, оператор pre cedence выглядит следующим образом

() > ! > && 

Теперь, решая на основе выше старшинства

1. (!x) = 0 
2. !(!x) = !(0) = 1 
3. (1 && 10) = 1// hence, true. 
4. hence, print x = 10 
+1

+1 для упоминания приоритета, что имеет решающее значение. – Jens

+0

Один со своей стороны тоже. – 0decimal0

+0

@Jens Конечно, но было бы странно ожидать, что бинарный оператор будет связываться более плотно, чем унарный оператор, и даже более странно, чтобы он пересекал парсеры и связывался сильнее, чем операторы внутри. –