Есть ли что-нибудь в стандарте C (я предполагаю в данный момент, что C99 + TC1-3 C11), который гарантирует, что &
и |
не будут закорочены?
Если я пишу:
x = y & foo();
... Я ожидаю, что foo
всегда будет вызван, но действительно ли это определено? Теоретически, если запретить стандарт, говорящий иначе, если y
содержит 0
, оптимизация времени выполнения может пропустить вызов в отсутствие чего-то, говорящего, что это не разрешено. (И аналогично с |
, вы могли бы игнорировать правый операнд, если левый операнд был уже включенным. В этом случае даже x = y * foo();
может быть закорочен, если y
были 0
.)
Не зная спецификации хорошо (и я этого не делаю), сложно доказать такой негатив. Я могу противопоставить разделы на &
(6.5.10 на C99) и &&
(6.5.13 на C99). В последнем это совершенно ясно:
В отличие от побитового двоичного оператора
&
оператор&&
гарантирует оценку слева направо; после оценки первого операнда есть точка последовательности. Если первый операнд сравнивается с0
, второй операнд не оценивается.
... но 6.5.10 конкретно не указывает отрицательную версию этого.
Мне кажется разумным принять тот факт, что 6.5.10 не определяет точку последовательности, означающую, что foo
всегда будет вызван, а реализация, которая не вызвала бы его, была бы нестандартной. Я прав об этом?