2012-07-16 3 views
2

첫 번째 프로그램에는 오류가 없습니다. 두 번째 프로그램에는 오류가 있습니다. 그 이유는 무엇입니까?c의 할당 문의 조건부 동작

첫번째 프로그램 :

#include<stdio.h> 
void main() 
{ 
int k=8; 
int m=7; 
k<m?k=k+1:m+1; 
printf("%d",k); 
} 

번째 프로그램 :

#include<stdio.h> 
void main() 
{ 
int k=8; 
int m=7; 
k<m?k=k+1:m=m+1; 
printf("%d",k); 
} 
+0

오류가 없습니다. 오류를 게시 하시겠습니까? – james

+0

할당의 왼쪽 피연산자로 lvalue가 필요합니다. – Dhatri

+1

gcc의 구현에서 오류를 발견했다고 생각합니다. 버그를 신고하고 조건의 양쪽에 괄호를 추가하여 문제를 해결하십시오. – dasblinkenlight

답변

5

조건부 연산자의 우선 순위가 할당 연산자보다 높습니다. 원하는 우선 순위를 얻으려면 여분의 괄호가 필요합니다. 문

상태로

(k < m) ? (k = k + 1) : (m = m + 1); 
+0

나는 그것을 받아들이는 C 컴파일러를 모른다. 'g ++ '로 컴파일하지 않았습니까? – ouah

+0

@PaulR 대입 연산자의 결과는 C의 lvalue가 아니라 C++의 lvalue이므로 C++에서 오류를 얻지 못합니다. 그러나 C++에서도 여전히 원하는 우선 순위가 없습니다. – ouah

+0

아하 - 설명해 봤어 - ideone.com이 C++로 컴파일하고있는 것 같아. –

1

it.Both 프로그램에 오류가없는 정확한 8의 출력을 제공한다.

0

:

k < m? k = k + 1 : m = m + 1; 

((k < m) ? (k = k + 1) : m) = m + 1; 

올바른 우선 순위가 괄호를 추가로 평가한다? a : b

a 및 b는 평가 후 동일한 유형을 반환해야하는 표현식입니다. 이것은 C 표준에서 부과 된 유일한 요구 사항입니다. 해당 코드를 컴파일/실행하는 데 문제가 있으면 gcc 버그를 발견 했으므로 개발자에게보고해야합니다.