2012-03-24 92 views
1
#include<stdio.h> 
#include<conio.h> 
int main (void) 
{ 
    int a,b,c,d; 
    clrscr(); 
    a=3; 
    b=5; 
    c=a,b; 
    d=(a,b); 
    printf("c=%d",c); 
    printf("d=%d",d); 
    getch(); 
} 

我得到的輸出爲 c = 3d = 5 任何人都可以請解釋我如何得到這個輸出?任何人都可以請解釋程序的輸出?

回答

2

的結果,問題主要圍繞着=操作符比,操作下precendence陳述

c=a,b; 
d=(a,b); 

,所以第一條語句的意思是:

(c=a),b; 

,運算符返回第二操作數的值,所以第二個語句意味着:

a,(d=b); 
6

您的代碼:

a=3; 
b=5; 
c=a,b; 
d=(a,b); 

,如果它是書面的處理:

a=3; 
b=5; 
(c=a),b; 
d=(a,b); 

這就是爲什麼c == 3d == 5

一個好的編譯器可能會警告你包含賦值爲c;對b的評估對計算的狀態沒有影響。類似地,在d的表達式中評估a


什麼d=(a,b) —它是如何顯示在輸出d=5

逗號操作符是C.它所有運營商的優先級最低也必須記住,在函數的參數列表中的逗號逗號運營商。

通過舉例說明的逗號操作的行爲:

x, y; 

是評估表達x和丟棄的結果,然後計算表達式y(和總的結果是的y的值)。逗號運算符有一個序列點;這是一種對你現在無關緊要的改進,但未來可能會有所改進。

在您的表達:

d = (a, b); 

表達a進行評估(它是3)和忽略;那麼對錶達式b進行評估(它是5),並將其用作逗號運算符表達式的結果,因此將其用作括號表達式的結果,因此將值5指定爲d

相反,在表達式:

c = a, b; 

逗號運算的LHS是c = a,所以a進行評估(它是3)和分配給c。然後扔掉,並且b被評估。因此,整體表達式語句僅將c賦予3。

您可能會問:「爲什麼逗號運算符有用?」

在有些情況下它是有用的地方,如for循環的初始化和增量部分:

for (i = 0, s = p; *s != '\0'; i++, s++) 
{ 
    ... 
} 

有兩個逗號運營商那裏。第一個包含一對分配;第二個包含一對帶有副作用的表達式。

另一個地方,它有時被用來(雖然我認爲這是很少良好的作風),是:

if (some_variable == A_VALUE) 
    p = q++, r = z; 

這種「節約」不必增加周圍的狀況的身體支撐。然而,隱藏這樣的作業並不是一種好的風格。該代碼應該是(給予或採取括號的位置,這是有爭議的):

if (some_variable == A_VALUE) 
{ 
    p = q++; 
    r = z; 
} 

如果你喜歡混淆後的C,還有的International Obfuscated C Code Contest

如果您正在編寫宏,有時候逗號運算符可能會成爲生命保護程序。

+0

d =(a,b) 它如何在輸出中顯示d = 5? – 2012-03-24 20:54:11

0

OK,我會DOIT

c=a,b; 

方式做:

c=a; 
b; 

d=(a,b); 

的意思是: 一個; b; 將最後的「結果」賦值給d;

「,」逗號分隔兩個語句。最後聲明的回報是合併報表

0

你的輸出將是 c = 3 d = 5; 以顯示結果,您應該知道{=} - 賦值運算符和{,} - 逗號運算符的關聯性。 - >因爲賦值(=)接管優先逗號(,)你的第一條語句C = A,B相當於用逗號分隔

(a=3),5; 

表達式總是從左向右計算。因此,一個表達

(表達式1,表達式2)

的值總是最後一個表達式的值。因此,在你的第二條語句d =(a,b)中,右邊的結果是d = 5 ......

相關問題