Как происходит проверка условия с сложным выражением на си
Думаю лучше всего начать с примера чтобы стало сразу понятно.
Вот условие:
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 шт):
Для логических выражений используется сокращенное вычисление. Т.е.
(pop(&Stack_Zm) == CRZ
если это ложно - все, вычисления завершены, остальные условия не проверяются. Истинно - проверяется
pop(&Stack_Zm) == 'z'
если это ложно - все, вычисления завершены, остальные условия не проверяются. Истинно - проверяется
pop(&Stack_Zm) == 'r'
Просто если в && ложно хоть одно - то результат точно ложен.
Вычисления слева направо, и сокращенные вычисления - все это есть в стандарте, это не оптимизация.