2017-01-09 9 views
-1

Это тройной оператор: (statement)?(if true):(if false) справа?В тройном операторе можно выполнить два операнда в истинном значении?

но почему этот код не работает должным образом?

int a=10, b=20; 
(a<b)? a++, b++ : a--, b--; 
+0

Оператор старшинство снова ... Посмотрите на него. И определите * правильно * в следующий раз. – LogicStuff

+5

Возможный дубликат [Что является преимуществом оператора запятой внутри условного оператора в C++?] (Http://stackoverflow.com/questions/12136156/whats-the-precedence-of-comma-operator-inside-conditional-operator-in -c) – LogicStuff

+1

Написание тройки, как это только приводит к путанице, и на самом деле не более читабельны или быстрее писать, чем просто 'else-if', так как для каждого результата есть два задания.В принципе, вам нужно будет включить скобки, хотя вы не должны писать троицу в первую очередь (imo). – George

ответ

3

Оператор запятой имеет более низкую точность, чем тернарный оператор. Поскольку двоеточие не может стать сиротой, вы уходите с первой запятой, но не второй. Компилятор понимает код как:

((a<b)? a++, b++ : a--), b--; 

Вы должны использовать скобки для группы, по крайней мере второе выражение запятой, и для удобства чтения я сделал бы так:

(a<b)? (a++, b++) : (a--, b--); 
+0

Спасибо. Я понял! – user7394178

2

условный оператор является определены в C++ как

conditional-expression: 
    logical-or-expression 
    logical-or-expression ? expression : assignment-expression 

Так это выражение утверждение

(a<b)? a++, b++ : a--, b--; 

эквивалентно

((a<b)? a++, b++ : a--), b--; 

, потому что выражение присваивания имеет более высокий приоритет, чем выражение запятой.

Вы должны написать по крайней мере, как

(a<b)? a++, b++ : (a--, b--); 

или для ясности, как

(a < b)? (a++, b++) : (a--, b--); 

принять во внимание, что есть разница между условным оператором в C++ и условного оператора в С. В C условный оператор определен как

conditional-expression: 
    logical-OR-expression 
    logical-OR-expression ? expression : conditional-expression 

Это означает для примера е, что эта запись в C+++

(a < b)? a = b : b = a; 

эквивалентно

((a < b)? a = b : b = a); 

в то время как в C эта запись эквивалентна

((a < b)? a = b : b) = a; 

и C компилятор выдаст сообщение об ошибке.

С другой стороны, эта запись в C++

((a < b)? a = b : b) = a; 

действует. :)

+0

Спасибо. Я понял! – user7394178

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

  • Нет связанных вопросов^_^