2013-07-25 3 views
1
int main() 
{ 
    int var1=4, var2=6; 
    var2=var2||var1++&&printf("computer world"); 
    printf("%d%d",var1,var2); 
    getch(); 
} 

Отпечатанный ответ 41.c программа, которая использует логические операторы

Вопрос:
Здесь он не печатает «компьютерный мир». В соответствии с порядком приоритета мы должны вычислить логический оператор &&, но поведение здесь не такое, и значение var1 должно увеличиваться после этого оператора, но этого не происходит. Ожидаемый ответ computer world51.

+1

Это дубликат, по крайней мере один недавний вопрос, и, возможно, несколько старше из них. Это вопрос приоритетности и порядка исполнения. –

+0

Вы просто скопируете исходный код в Google. Вы можете найти несколько сайтов, имеющих один и тот же вопрос. –

+1

Возможный дубликат [Проблема с приоритетом оператора] (http://stackoverflow.com/questions/7212482/problem-with-operator-precedence). Другой был [почему оператор с более низким приоритетом выполняется первым] (http://stackoverflow.com/questions/12152143/why-lower-precedence-operator-executes-first). –

ответ

6

Это называется «старшинства», а не «приоритет». И приоритет не совпадает с порядком оценки.

С || и && операторов short-circuit и var2 считается истинным (с 6 не равен нулю), ни операция пост-инкремент, ни вызов функции оценивается.

+0

+1 Вы были довольно быстро со ссылкой :). И вам потребовалось 15 секунд, чтобы объяснить это лучше. – 0decimal0

+0

+1 для оценки короткого замыкания –

0

|| является оператором короткого замыкания, если первый операнд оценивает значение true, который не выполняется дальше.

Так var2 становится 1 (Поскольку var2 первоначально 6, и операция вычисляет истинного) и не приращение не происходит так var1 остается 4.

0

|| Укороченный, поэтому в заявлении:

var2=var2||var1++&&printf("computer world"); 

Поскольку var имеет значение 6, который оценивает как истинный, последнее выражение var1++&&printf("computer world"); не будет выполнена.

1

|| оператор проверяет, имеет ли первое значение true. Если это правда, то он не будет оценивать вторую часть логического выражения, и поэтому оператор printf не выводит текст. Это называется операцией короткого замыкания.

Код ниже дает ожидаемый результат

#include<stdio.h> 

int main() 
{ 
    int var1=4,var2=0; 
    var2=var2||var1++&&printf("computer world"); 
    printf("%d%d",var1,var2); 
    getch(); //remove getch if you are working on gcc 
} 
+2

Он также не выполняет 'var1 ++'. –

+0

Sir @JonathanLeffler Я сделал вышеупомянутые изменения и работает как и ожидалось. –

+1

Я не уверен, должен ли я спросить, каково соответствующее поведение «как ожидалось». Ваш фрагмент кода должен печатать 'computer world51', так как' var2' равно 0 (false), поэтому происходит пост-инкремент, но возвращаемое значение равно 4 (значение до инкремента), поэтому условие '&&' должно оценивать функцию , который выводит «компьютерный мир» и возвращает 14, количество напечатанных символов. Таким образом, общее выражение оценивается как 1 (false), а 'var2' присваивается 1, что приводит к значениям' var1 == 5' и 'var2 == 1'. В конце второго формата 'printf()' должна появиться новая строка, чтобы получить нормальное поведение. –

1

var2||var1++&&printf("computer world") будет оцениваться по:

var2||( var1++&&printf("computer world") ) 

так, поскольку var2 не равна нулю, вся часть после || будет игнорироваться.

так что результат верен. который равен 1, и ему будет присвоен var2.

0

для удовольствия:

#include"stdio.h"                                       
    main() 
    { 
     int var1=4,var2=6; 
     var2=printf("step1")&&var2||printf("step2")||var1++&&printf("step3"); 
     printf("%d%d\n",var1,var2); 
     var2=printf("step1")&&var2&&printf("step2")||var1++&&printf("step3"); 
     printf("%d%d\n",var1,var2); 
     var2=printf("step1")&&var2&&printf("step2")&&var1++&&printf("step3"); 
     printf("%d%d\n",var1,var2); 
     // getch(); 
    } 

Результат:

step141

step1step241

step1step2step351

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