2012-05-26 3 views
3

В Lua, вы можете сделать это:Эквивалент Lua "и/или" в C++?

foo = a and b or c and d or e 

что эквивалентно (по крайней мере, я уверен, что это эквивалентно):

local foo = nil 
if a then 
foo = b 
elseif c then 
foo = d 
else 
foo = e 
end 

Есть ли что-нибудь эквивалент или похожее на это C++?

ответ

5

Там в ternary operator. У этого есть забавный приоритет, так что это хорошая практика, чтобы всегда заключать в скобки его.

bool foo = (a ? b : (c ? d : e)) 

Обратите внимание, что это работает только в том случае b, d и e может сводиться к одному типу. Если a - double, d - float и e - это int, ваш результат всегда будет отлит к double.

+0

Что смешно в отношении приоритета??: '? Он ниже, чем любой оператор, не назначающий и превышающий все присваивающие, и все. Поэтому вы можете легко оставить внешние скобки. Что еще более забавно, так это его _associativity_, поэтому вам нужны параны между вложенными '?:' S. – leftaroundabout

+0

@leftaroundabout у него нет приоритета, которого я ожидал бы от него. Пример: http://stackoverflow.com/q/10007140/382471 – robert

+0

Предшествование вполне разумно: оно имеет смысл писать такие вещи, как 'Foo = с ==«х»? x: y' или 'foo = a || b? x: y', поэтому он должен иметь более низкий приоритет, чем операторы логического и сопоставления. - Кроме того, мне нужно взять обратно то, что я сказал об ассоциативности: это просто право-ассоциативный, так что вы также можете оставить внутренние парады. Хотя вам следует распространить выражение на три строки с подходящим отступом, в противном случае оно станет нечитаемым. – leftaroundabout

2

Вы можете использовать тройной оператор ?:

foo = a ? b : c ? d : e; 
+0

пока это не нужно добавлять скобок здесь, я хотел бы сделать это в любом случае, чтобы улучшить ясность - код выше только о читаемом с кучей имен переменных односимвольными, но ничего более сложного, чем пример, приведенным быстро станет неуправляемый. – Spudley

-3

Использование && в C или в C++ для , а затем и использовать || для или еще

Использование тройное ?: для условные выражения

+0

-1 Это дает вам логический результат. – delnan

+0

-1 этот вопрос был о C++. нет необходимости использовать «&&» вместо «и». –

6

Я думаю, это то, что вы хотите:

foo = a ? b : (c ? d : e); 
1

Не совсем. Основная причина, по которой это работает в Lua, - это динамическая типизация на C++, которая никогда не могла заставить ее работать. Ближе всего вы можете получить тернарный оператор, но он имеет ограничения srs.

+2

Каковы ограничения? Все остальные ответы указывают на тернарный оператор. – pighead10

+1

@PigHead все ветви должны иметь один и тот же тип ... –

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