2017-01-09 4 views
-1

이것은 삼항 연산자입니다 : (statement)?(if true):(if false) 맞습니까?3 진수 연산자에서 두 개의 피연산자를 참값으로 처리 할 수 ​​있습니까?

왜이 코드가 제대로 작동하지 않습니까?

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

쉼표 연산자는 3 자 연산자보다 낮은 우선 순위를 갖습니다. 콜론은 고아가 될 수 없으므로 첫 번째 쉼표는 사용하지 않지만 두 번째 쉼표는 사용하지 않습니다.

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

고맙습니다. 알 겠어! – user7394178

2

조건 연산자는 다음과 같습니다 당신은 적어도 두 번째 쉼표 표현하고, 내가 할 것입니다 읽기의 용이성을 모두 그룹에 괄호를 사용할 필요가

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

:로 컴파일러는 코드를 이해하는

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

그래서이 표현 문

(a<b)? a++, b++ : a--, b--; 
같은 C++에서 정의

는 할당 식 콤마 식보다 더 높은 우선 순위를 갖는다

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

때문에 동일하다.

당신은 C의 조건 연산자 ++와 C에서의 조건 연산자 사이에 차이가 적어도

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

처럼 또는 고려

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

처럼 명확하게 작성해야 C 조건부 연산자는 다음과 같이 정의됩니다.

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

E C이 기록

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

동등 및 C 컴파일러 에러를 발행 할 때 C에서이 기록 +++

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

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

에 상응된다.

C에서 한편

이 기록 ++

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

유효합니다. :)

+0

고맙습니다. 알 겠어! – user7394178