[英]Can anyone please explain the output of the program?
#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誰能解釋一下我如何獲得此輸出?
您的代碼:
a=3;
b=5;
c=a,b;
d=(a,b);
就像被寫為:
a=3;
b=5;
(c=a),b;
d=(a,b);
這就是為什么c == 3
和d == 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
求值。 因此,整個表達式語句僅將3分配給c。
您可能會問:“為什么逗號運算符有用?”
在某些地方有用,例如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,那么可以參加國際混淆C代碼競賽 。
如果您正在編寫宏,則有時逗號運算符可以起到救生作用。
因為逗號( ,
)具有比賦值運算符(優先級低=
)。 因此,您的第一個示例等效於:
(c=a),b;
參見此處: http : //en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence 。
問題主要圍繞陳述
c=a,b;
d=(a,b);
=
運算符的優先級低於,
運算符,因此第一條語句的意思是:
(c=a),b;
的,
操作者返回第二個操作數的值,那么第二條語句的意思是:
a,(d=b);
好的,我會做
c=a,b;
手段是:
c=a;
b;
d=(a,b);
意思是: b; 將最后的“結果”分配給d;
“,”逗號分隔兩個語句。 最后一條語句的返回是合並語句的結果
您的輸出將是c = 3 d = 5; 為了使結果可視化,您應該知道{=}-賦值運算符和{,}-逗號運算符的關聯性。 ->因為賦值(=)優先於逗號(,),因此第一個語句c = a,b等於
(a=3),5;
用逗號分隔的表達式始終按從左到右的順序求值。 所以表達的價值
(expr1,expr2)
始終是最后一個表達式的值。 因此,在您的第二條語句d =(a,b)中,右側的結果為d = 5 ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.