簡體   English   中英

誰能解釋一下程序的輸出?

[英]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 == 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求值。 因此,整個表達式語句僅將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM