2012-03-01 101 views
0

我有一個C代碼,它使用簡單的逗號運營商爲什麼下面的C代碼失敗而編譯

main() 
{ 
int a= 1,2,3; 
printf("%d",a); 
} 

現在,當我編譯了一個錯誤,而很少修改同一程序運行正常

main() 
{ 
int a; 
    a= 1,2,3; 
    printf("%d",a); 
} 

爲什麼這樣?

+1

第二個代碼不會**編譯。 '.. \ main.c:7:5:error:expected';' 'printf''之前 – m0skit0 2012-03-01 11:31:05

+0

我的錯誤,更正了它 – 2012-03-01 11:32:28

+0

其中是3printf(「%d」,3); ,我只能看到printf(「%d」,a); – 2012-03-01 11:38:35

回答

6

在第一種情況下,會引發錯誤,因爲如果您假裝聲明多個變量或分配多個值,編譯器無法區分。

int a= 1,2,3; 

您的意思是int a; a = 1, 2, 3,或者int a = 1, int 2, int 3?編譯器無法從上下文中得知(即使或不是合法變量名稱)。

第二種情況下不存在這種歧義,因此沒有錯誤(但是仍然發出警告)。

PS:它是int main()而不是void main()

+1

和聲明'a = 1,2,3;'就像有 a = 1; 2; 3; 並且在執行第一個語句之後,a被賦值1, 表達式'2'和'3'被評估,但沒有任何變化... – Mallik 2012-03-01 12:01:38

0

使用變量初始化形式時,逗號不作爲相同的運算符。這是一種特殊的簡短形式,用於在同一行中聲明多個變量,因此需要自己的語法。

因此,在語句int a = 1, 2, 3中,逗號實際上的解釋與語句a = 1, 2, 3中的不同。

前者是語法錯誤,因爲它不符合多變量聲明形式。第二種是有效的語法,但正如其他人指出的那樣毫無意義,因爲語句2;3;雖然在語法上正確,但什麼也不做。

請參閱this article on Wikipedia