2013-07-16 5 views
0

Я скомпилировал код в кодовых блоках и отобразил вывод 0 ... 0. Но я думаю, что его вывод должен быть 0 ... 1, потому что выражение «if» здесь неверно, поэтому оператор, следующий за «if», не выполняется. Затем j увеличивается на 1 (из-за j ++ в выражении «if»), но i остается 0. Итак, последний printf() должен давать 0 ... 1.C Операторы приращения

#include <stdio.h> 

int main() 
{ 
    int i =0,j=0; 
    if(i && j++) 
     printf("%d..%d\n",i++,j); 
    printf("%d...%d",i,j); 
    return 0; 
} 

ответ

3

См C11 6.5.13 Логическое И оператор p4 (курсив мой)

В отличие от побитового двоичного & оператора, то оператор & & гарантии слева направо оценки; если второй операнд оценивается, то существует точка последовательности между оценками первого и второго операндов . Если первый операнд сравнивается с 0, второй операнд не оценивается.

Первый операнд в вашем примере - i. Он сравнивается с равным 0, поэтому второй операнд (j++) не оценивается (выполняется). Поэтому правильно, что ваш позже printf показывает, что j еще 0.

+0

+1 для стандартной ссылки – RiaD

0

первая часть условия (i) уже ложно, так что вторая часть (j++) не выполняется.

3

С i является 0 (фальшивый), нет причин для выполнения j++. Это называется короткое замыкание.

Это полезно в проверках, как if(a < v.size() && v[a] == 5) // do something

0

Вы не получите на увеличивающиеся j. Посмотрите на ваше заявление, если:

if(i && j++) 

Вы только выполнить, если блок, когда оба i И j истинны. Но так как i уже ошибочно, нет необходимости даже проверять j++. Его также называют Short-circuit evaluation.

0

Причина, по которой приращение j в условии if не применяется, связано с тем, что это выражение короткозамкнуто - i.e., I никогда не отличается от нуля, поэтому второе выражение не нужно оценивать.

0

Вместо использования логико-&&, использовать побитовое-и &, который не будет короткого замыкания и работать так, как вы хотите, пока i и j являются 0 или 1:

... 
if(i & j++) 
    printf("%d..%d\n",i++,j); 

или если они «повторно не:

if (!!i & !!(j++)) 
    ... 
0

j++ выражение не выполняется, так как оценка первого условия i (левая сторона оператора &&) уже возвращает ложь так, то второе условие j++ не оценивается.

Это обычная оптимизация, сделанная компилятором, обычно называемая оценка состояния короткого замыкания. В некоторых компиляторах вы можете отключить эту оптимизацию, чтобы избежать такого побочного эффекта.

0

, как вы видите в этом примере кода, из источника второй ПЧ не выполняется:

movl i(%rip), %eax  
    testl %eax, %eax   ; <-- if i 
    je .L2 
    movl j(%rip), %eax 
    testl %eax, %eax   ; <-- if j Not EXECUTED !!! 
    setne %dl 
    addl $1, %eax   ; <-- j++ 
    movl %eax, j(%rip) 
    testb %dl, %dl 
    je .L2 
    ...       ; inner IF 
.j2 

, как описано в другом ответе.

0

Как вы упомянули, если утверждение false, это правда. Но я верю, что используемая концепция/логика где-то не подходит, причина будет следовать.

До этого позволяет понять работу & & (Логический И) оператор. Если указано, что если оба операндов, связанных с ним, являются истинными, то только результат является истинным. ПРИМЕЧАНИЕ: 1. для компилятора это означает, что если какой-либо один операнд является ложным, то компилятор не будет вычислять дальше, то есть пропустить следующую допустимую строку кода. 2. 0 (ноль) указывает на программирование с ошибкой.

Ну, Компилятор при первом поиске ищет оператора, а затем ищет операнды, которые связаны с ним .

Таким образом, как только компилятор соударениях «& &» это будет выглядеть на левой стороне оператора, как ассоциативность & & (логическое И) находится слева-направо и оценить значение операнда слева - 0 (ноль). Теперь см. Примечание 2, а затем 1.

Следовательно, компилятор переходит к следующему действительному оператору, который равен printf («% d ...% d», i, j);

Здесь нет прироста не было сделано переменной «J», поэтому значение „J“ останется 0 (ноль)

ПРИМЕЧАНИЕ. Для дальнейшего получения ясно с этой идеей, я предложил бы попробовать один и тот же пример с разными значениями i и j, например i = 1 и j = 1 или i = 2 и j = 1.

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

  • Нет связанных вопросов^_^