2011-01-07 4 views

ответ

13

Это действительный C++ и недействительный C.

Результат условного выражения может быть (и в этом случае остается) именующее в C++ отсылая к одному из x или y в зависимости от оценивает ли truesome_condition. В C++ либо x присваивается значение 100, если some_condition является true, когда преобразуется в bool, в противном случае y назначается 100.

В C, результат условного выражения не бывает именующее и не могут быть назначены.

+0

Я тоже пробовал это в C. Оно работает. (Я использовал CodeBlocks/Mingw, но я предполагаю, что он также работает с другими компиляторами) – user2011

+0

Итак, я понял, что это должно работать только на C++, если спецификации соблюдены? – user2011

+1

Да, он работает на C++, но не в C, как я сказал в своем ответе. –

0

Вы назначаете либо x, либо y в зависимости от состояния.

4

По крайней мере, в C++, что фрагмент кода, по существу, эквивалентно следующему:

if(some_condition) 
{ 
    x = 100; 
} 
else 
{ 
    y = 100; 
} 

Это гарантируется стандартом C++, хотя вы должны внимательно прочитать соответствующие разделы. Правила оператора удивительно сложны (главным образом, из-за преобразований типов, которые выполняются), поэтому условный оператор и оператор if-then-else не совсем эквивалентны все время.

Однако во фрагменте кода выше, этот пункт в стандарте имеет отношение:

5,16/4 Условный оператор:

Если второй и третий операнды lvalues ​​и имеют тот же тип, результат этого типа и является значением lvalue.

+0

на нашем уровне да, но, что я не уверен с точки зрения компилятора. Существует, по крайней мере, сильное ограничение ввода между x и y, которое не существует с 'if else'construct. – VGE

0

Похоже, что тройной оператор выбирает значение lvalue. Я не знал, что это можно сделать, но я полагаю, что это имеет смысл. На основании условия одному из двух значений (x или y) будет присвоено число 100.

Очень здорово, если оно работает!

+0

Я действительно не уверен, что он работает над каждым существующим компилятором C++! И тернарный оператор немного запутывает, этот рисунок добавляет немного удовольствия для сопровождающих. – VGE

+0

@VGE: Да, это немного запутывает. Наверное, достаточно маленький, чтобы терпеть (или наслаждаться?). –

1

x и y оба lvalue того же типа. Я не думаю, что в этом коде есть что-то слепое. Но вы можете найти компилятор, который не может скомпилировать этот код.

Обычно я предпочитаю использовать код if/else, который производит точно такой же код и является более читаемым для сопровождающих. И если вы хотите отслеживать ошибку, проще разместить каждую ветку на отдельной ветке, проще установить точки останова.

Контроль покрытия кода также легче проверить.

1

Если x и y являются l-значением, тройное выражение является l-значением.

Обсуждаемые here

+0

Только в C++. (И только если их типы совпадают?) –

1

Нет, это короткая форма для если условия. Это как

if(somecondition) 
{ 
    x = 100; 
} 
else 
{ 
    y = 100; 
} 
0

Предназначен для работы.

Тернарный оператор?: Может генерировать lvalue (то есть вы можете назначить), если оба его возможных результата равны lvalues, как они приведены в вашем примере.

Таким образом, ваш пример присваивает значение x или y в зависимости от другого значения.

2

Это выражение, которое имеет тот же результат, как этот код:

if (some_condition) 
    x = 100; 
else 
    y = 100; 
0

Значение х или у заменяются 100 зависит от состояния. Он также обычно используется при возврате -

return condition ? x : y ; // If condition is true => return x else return y 
Смежные вопросы