Запрещает ли текущий стандарт C короткое замыкание `&` и `|`?

Есть ли что-нибудь в стандарте 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 , а реализация, которая не называть это было бы нестандартно. Я прав в этом?

18
задан T.J. Crowder 13 February 2012 в 18:35
поделиться