Как происходит проверка условия с сложным выражением на си

Думаю лучше всего начать с примера чтобы стало сразу понятно.

Вот условие:

if(pop(&Stack_Zm) == CRZ &&  pop(&Stack_Zm) == 'z' && pop(&Stack_Zm) == 'r') 

Выполнение с права налево или с лева на право ? Сначала проверяется pop(&Stack_Zm) == CRZ после pop(&Stack_Zm) == 'z' после pop(&Stack_Zm) == 'r' или наоборот? И нет ли зависимостей от компилятора или версии языка ?


Ответы (1 шт):

Автор решения: Mikhailo

Для логических выражений используется сокращенное вычисление. Т.е.

 (pop(&Stack_Zm) == CRZ

если это ложно - все, вычисления завершены, остальные условия не проверяются. Истинно - проверяется

 pop(&Stack_Zm) == 'z'

если это ложно - все, вычисления завершены, остальные условия не проверяются. Истинно - проверяется

pop(&Stack_Zm) == 'r'

Просто если в && ложно хоть одно - то результат точно ложен.

Вычисления слева направо, и сокращенные вычисления - все это есть в стандарте, это не оптимизация.

→ Ссылка