2017-02-06 4 views
1

Это образец кода, который я встретил в начального курса Уровень компьютерного программирования:Проблема с оператором приращения

#include <stdio.h> 
int main() 
{ 
    int l = 20, m = 10; 
    int z; 
    z= l++ || m++; 
    printf("z = %d l = %d m = %d\n", z, l, m); 
} 

Кодовые печатает л = 21, т = 10 и Z = 1 значения л и г являются что ожидалось от меня, но значение m беспокоит меня. Разве это не должно быть 11, поскольку m ++ присутствует в коде.

+0

Если вы знаете, что 'z = 1' является правильным, вы можете понять, почему' m ++ 'никогда не выполнялся. –

ответ

2

Это потому, что m++ был выполнен только в том случае, если l++ == 0. С l++ оценивает 20, тогда m++ не выполняется. Если l было 0, то тогда было бы выполнено m++.

+0

Я думаю, было бы полезно немного объяснить оценку короткого замыкания, чтобы лучше понять, почему. –

2
z= l++ || m++; 

В вашем выражении, l первое значение правопреемником и после, на единицу.

В логическом или (||) операции, если левый операнд не равен нулю, то правый операнд не вычисляется и результат верно. Вот почему l становится 21 и m не оценен и его значение равно 10.

стандарт C (N1256: 6.5.14-пункт 4) Сэя:

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

+0

Вы имеете в виду, что сначала оценивается, не так ли? –

+0

@Iharob В операции логического И, сначала проверьте значение левого операнда, если оно истинно, а затем не проверяет правильное значение операнда. – rsp

+0

@KeineLust Благодарим за предложение. – rsp

0

То, что вы видите, называется оценкой короткого замыкания.

Ваша линия здесь:

z= l++ || m++; 

Говорит, Проверьте значение л (приращение при его проверке). Если l не равно 0, установите z в 1. Если l равно 0, проверьте значение m (приращение при его проверке). если m не равно 0, установите z в 1. В противном случае установите z в 0.

По существу, когда первая из двух проверок (l++) уже оценивает значение true, нет необходимости, чтобы система проверяла вторую условие, так что это не так, и, следовательно, также не может увеличивать m.

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