2012-07-16 86 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 2012-07-16 10:28:38

+0

作爲賦值左操作數所需的左值是給出的錯誤 – Dhatri 2012-07-16 10:32:40

+1

我認爲你已經發現了gcc實現中的錯誤。提交一個錯誤,並在您的條件兩邊添加括號以解決該問題。 – dasblinkenlight 2012-07-16 10:33:34

回答

5

條件運算符的優先級高於賦值運算符。您需要額外的括號以獲得所需的優先級。

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

被評估爲

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

添加括號有正確的優先順序:

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

我不知道任何接受它的C編譯器。你確定你沒有用'g ++'編譯嗎? – ouah 2012-07-16 11:31:12

+0

@PaulR賦值運算符的結果不是C中的左值,而是C++中的左值,這就是爲什麼在C++中不會出現錯誤。但即使在C++中,它仍然沒有理想的優先級。 – ouah 2012-07-16 11:36:26

+0

阿哈 - 解釋它 - 我想ideone.com正在編譯爲C++。 – 2012-07-16 14:03:29

1

沒有在it.Both程序中的錯誤給出8的輸出這是正確的。

0

到語句

條件? a:b

a和b是在評估之後必須返回相同類型的表達式。這是C標準規定的唯一要求。如果您在編譯/運行該代碼時遇到困難,這意味着您發現了一個gcc錯誤,並且您必須將其報告給開發人員。