0

閱讀以下兩個條件後...在C語言中使用逗號分隔的運算符是多麼複雜的表達式?

What does the comma operator , do?

How does the Comma Operator work

我仍然不知道,我無法分析下面的語句,我在別人的源代碼中發現:

int i, n, val, locala = a, bestval = -INFINITY; 

逗號運算符按照從左到右的順序進行評估,是嗎?如果我們用括號來表示優先順序,我認爲我們有這樣的事情:

(int i, (n, (val, (locala = a, (bestval = -INFINITY))))); 

所以,也許,原來是等效於下面的?

int bestval = -INFINITY; 
int locala = a; 
int val; 
int n; 
int i; 

如果是這樣,爲什麼是int關鍵字應用於所有的變量,而不是隻有最左邊的變量i的?

此外,最右邊的表達式返回它們的值,是嗎?因此,locala = a可能會在分配發生後返回值locala。這是否意味着變量i,nval都已初始化?如果是這樣,他們會初始化到什麼程度? -INFINITY?價值a

+6

這不是逗號運算符。 C中逗號的大部分用法不是逗號運算符。 – user2357112

+0

體面的經驗法則:如果左邊的東西沒有被丟棄,它不是逗號操作符。 – user2357112

+1

@牙籤銀蓮花沒有逗號運算符。有一個聲明列表。 –

回答

4

int i, n, val, locala = a, bestval = -INFINITY; 

是一個聲明。

聲明被定義在C下列方式(沒有所有的細節)

declaration: 
    declaration-specifiers init-declarator-listopt ; 

init-declarator-list: 
    init-declarator 
    init-declarator-list , init-declarator 

init-declarator: 
    declarator 
    declarator = initializer 

聲明 - 符影響了的init-declarator- 列表所有聲明符。

如果你想用逗號在聲明中則這樣的聲明可以看看例如像

int i = 1, j = 2, k = (++i, j++, i + j); 

這裏用作基於逗號操作的初始化表達式(++i, j++, i + j)

聲明i後等於2j - 3k - 5

3

逗號令牌確實用C幾個不同的東西,其不應混淆:

  • 分隔函數樣預處理宏定義的參數:

    #define CAT_NO_EXPAND(x,y) x ## y 
    
  • 分隔的參數類似功能的預處理器宏使用:

    int CAT_NO_EXPAND(ident_, 3) = 3; 
    
  • 分隔枚舉在枚舉定義:

    enum colors { RED, GREEN, BLUE }; 
    
  • 分隔在聲明的說明符:

    int a, b=3, c; 
    
  • 分隔在一個支撐初始化成員/元素:

    int arr[3] = {0, 2, 4}; 
    struct mystruct s = {8, 3.0}; 
    func((mystruct s){8, 3.0}); 
    
  • 分隔函數聲明或定義的參數:

    void f(int n, double, const char* fmt, ...); 
    
  • 分隔一個函數調用表達式的參數:

    f(3, 0.5, "Test %s\n", "Hello"); 
    
  • 形式其中,如果評價將丟棄該左側和使用右側作爲其值的值的表達式。

    #define CALL_G_IGNORE_RESULT(x) ((void)g(x), 0) 
    for (i=0, j=0; i<m && j<n; ++i, ++j) 
    

您已經閱讀怎麼樣的「逗號操作符」是只說明過去的情況下,這不符合任何其他情況下,上述表達式上下文工作

你發佈的是一個聲明,它不涉及「逗號運算符」,並且一次聲明多個變量。任何初始化器都按順序進行評估(這很重要,因爲您可以在稍後的初始化器中使用較早聲明的變量)。

+0

你可以在列表項中縮進4個多餘的代碼塊,使其看起來更漂亮 –

+0

@AnttiHaapala我通常會這樣做,但是SO好像在緊跟在項目符號列表項後出現問題。 – aschepler

+0

空間就像暴力,如果他們不工作,你只是用得不夠。 –

0
  1. 這不是逗號運算符。
  2. 這是一個聲明列表。
  3. 它從左到右執行,或者至少執行它的部分。
  4. 評估順序和運算符優先級是兩個不同的東西。
  5. 從左到右的執行順序與您在括號中發佈的內容相反。
  6. int關鍵字適用於所有的聲明,因爲這就是語法的含義。
  7. 這裏沒有'最右邊的表達式',只有帶初始化符的聲明。
  8. 因此沒有返回值。
  9. i,nval未被初始化。
相關問題