Может кто-нибудь объяснить этот синтаксис C / C ++? - PullRequest
1 голос
/ 07 января 2011

Может кто-нибудь объяснить, как это работает?

int x, y;
....
(some_condition ? x : y) = 100;

Это предназначено для работы или это просто "слепой" перевод или компилятор (что-то вроде vec[10] равно 10[vec])?

Ответы [ 10 ]

13 голосов
/ 07 января 2011

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

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

В C результат условного выражения никогда не бывает lvalue и не может быть назначен.

4 голосов
/ 07 января 2011

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

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

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

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

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

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

2 голосов
/ 07 января 2011

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

if (some_condition)
  x = 100;
else
  y = 100;
1 голос
/ 07 января 2011

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

if(somecondition)
{
  x = 100;
}
else
{
  y = 100;
}
1 голос
/ 07 января 2011

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

Обсуждается здесь

1 голос
/ 07 января 2011

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

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

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

0 голосов
/ 07 января 2011

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

return condition ? x : y ; // If condition is true => return x else return y 
0 голосов
/ 07 января 2011

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

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

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

0 голосов
/ 07 января 2011

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

Очень круто, если оно работает!

0 голосов
/ 07 января 2011

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

...