5

Если у Вас есть следующие:ли короткое замыкание тройная оператора определенным образом

if (x) 
{ 
    y = *x; 
} 
else 
{ 
    y = 0; 
} 

Тогда поведение гарантированно определить, так как мы можем только разыменовать x, если это не 0

Может то же самое можно сказать:

y = (x) ? *x : 0; 

Это, кажется, работает, как ожидалось (даже скомпилирован с -Wpedantic на г ++)

Гарантировано?

+0

Да - Тернарный оператор - это просто синтаксический сахар –

+3

Да. (Слишком короткий, чтобы быть отправленным как ответ). – JSF

+0

В тройном выражении нет «короткого замыкания». И он преждевременно не оценивает и не выполняет какую-либо ветвь до того, как условие будет полностью оценено. –

ответ

12

Да, только второй или третий операнд будет оцениваться проект C++ стандартный раздел 5.16[expr.cond] говорит:

Условные выражения группируются справа налево. Первое выражение преобразуется контекстно в bool (раздел 4). Он оценивается, и если он истинен, результатом условного выражения является значение второго выражения, в противном случае третьего выражения. Оценивается только одно из второго и третьего выражений. Каждое значение вычисление и побочный эффект, связанные с первым выражением, секвенируются перед вычислением каждого значения и побочным эффектом, связанным со вторым или третьим выражением.

Смежные вопросы