Условное выполнение на основе логической операции короткого замыкания

Как оценка логических операторов && и || определяются как «короткое замыкание», я предполагаю, что следующие две части кода эквивалентны:

 p = c || do_something(); 

а также

 if (c) { p = true; } else { p = do_something(); } 

p и cbool , а do_something() – функция, возвращающая bool и возможно имеющая побочные эффекты . Согласно стандарту C, можно ли полагаться на предположение, что fragmentы эквивалентны? В частности, имея первый fragment, обещано ли, что если c истинно, функция не будет выполнена, и никаких побочных эффектов этого не произойдет?

После некоторого поиска я отвечу на свой вопрос, ссылаясь на стандарт: стандарт C99 , раздел 6.5.14 Оператор логического ИЛИ заявляет:

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

И аналогичный раздел о && . Таким образом, да, код можно смело считать эквивалентным.

Да, вы правы в своем мышлении. c || do_something() c || do_something() будет короткозамкнуто, если c true , и поэтому никогда не вызовет do_something() .

Однако, если c false , тогда будет вызываться do_something() , и его результатом будет новое значение p .