2013-12-26 3 views
0
#include <stdio.h> 
    void main() 
    { 
     int i = -3, j=2, k=0, m; 
     m= ++i|| ++j && ++k; 
     printf("%d%d%d%d", i, j, k, m); 
    } 

Если мы видим порядок оценки в ++i|| ++j && ++k; мы приедем с оценкой ++j && ++k сначала будет увеличивать значение у и к, и он будет оценивать как 1 после этого ++i || 1 будет оценивать, что будет увеличивать значение i и присваивать от 1 до m, поэтому выход должен быть -2 3 1 1, но он дает результат -2 2 0 1. Я думаю, что здесь отсутствует какая-то концепция.Неожиданное поведение заранее оператора инкремента в C

+0

Зачем писать код, который в лучшем случае нечитаемый? Если вам нужно почесать голову, чтобы понять, если вы делаете что-то неправильно –

ответ

4

|| и && являются операторами короткого замыкания. Они не оценивают второй операнд, если нет необходимости определять выход.

Здесь ++i оценивает ненулевое значение, которое равно true в булевом контексте. Правая часть вообще не оценивается.

+0

Здесь && оператор имеет больший приоритет, а затем || оператор so ++ j && ++ k сначала будет оцениваться как && является двоичным оператором, поэтому ++ j будет оцениваться, и поскольку это ненулевое значение, поэтому будет оцениваться ++ k. Возможно, я ошибаюсь –

+0

Приоритет и порядок оценки не связаны. || и && на самом деле действительно особенны со своим свойством иметь определенный порядок оценки (левая сторона сначала, правая сторона только при необходимости) и ввести точку последовательности. Оператор '?:' - другой, имеющий одни и те же характеристики. В противном случае порядок оценки обычно не указан. – Mat

+0

Что я понял В случае || и && оператора нам не нужно заботиться о приоритете. Правильно? Итак, ++ i || ++ j && ++ k это будет оцениваться как ++ i || (++ j && ++ k) –

3

Так как оператор || и && короткие замыкания оценивали, как только ++i оценивается как true, ++j и ++k не будут оценены. Таким образом, j и k не изменились.

1

Логический оператор всегда оценивает слева направо. Эти операторы известны как оператор короткого замыкания, т. Е. Если значение выражения можно вывести из значения только одного левого операнда, то правый операнд не оценивается. Так как i здесь не равен нулю, ++j && ++k никогда не оценивается и, следовательно, модификация не производится до j и k.
Приоритет оператора не имеет никакого отношения к порядку оценки. Не путайте.

0

м будет равна 1, так как во-первых, ИЛИ состояние первого оценивается, а также ++ я не равен нулю, вы получите

m=1 

в качестве первой части или заявления сам true, вторая часть не оценивается. Таким образом, ваши значения j и k останутся без изменений.

+0

&& имеет большее предвидение, чем || то почему сначала условие OR будет оценено? –

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