2016-03-03 49 views
7

我有關於含有逗號(,)運算符(或多個)表達一個簡單的C代碼和大的混亂。在C中,爲什麼表達式(聲明)conatining逗號(,)操作者工作方式不同

int main(){ 
    int i=0,j=11,c; 
    c=i=j,++i; 
    printf("c=%d i=%d\n",c,i); 
    c=(i=j,++i); 
    printf("c=%d i=%d\n",c,i); 
    return 0; 
} 

上面的代碼打印:

c=11 i=12 
c=12 i=12 

我的問題是:

  1. 什麼是逗號(,)作爲一個經營者的實際工作?
  2. ++,=,爲什麼評價爲表達做了左逗號更優先?
  3. 會有什麼順序如果表達式包含運營商提供不同的優先級,將它依賴於逗號(,)?
  4. 是它表現得像分號的替代品(;)?
+2

我不是專家,但這個'C = 1 = j的,++ i'看起來像U.B. –

+3

@MargaretBloom不,逗號運算符引入了一個序列點IIRC。 –

+0

http://stackoverflow.com/questions/2087026/effect-of-using-a-comma-instead-of-a-semi-colon-in-c-and-c – Turamarth

回答

10

賦值運算符與逗號運算符相比具有更高的優先級。 因此表達

c = i = j, ++i; 

相當於

(c = i = j), ++i; 

按照C標準(6.5.17逗號運算符)

2逗號操作者的左操作數被作爲評價void 表達式; 在它的評估和右操作數的 之間有一個序列點。然後評估右操作數;結果 有其類型和value.114)

在逗號運算符被丟棄的結果上面的表達,但它具有提高i的副作用。

在這個表達式中

c = (i = j, ++i); 

由於使用括號你改變了上述表達式的計算順序。現在它相當於

c = ((i = j), ++i); 

和可變c得到根據從C標準報價上面列出的表達式++i的值。

1

那麼讓我們把它分解。在第一種情況下,c和i取j => c = i = j = 11的值;那麼你增加i => i = 12;因此,代碼就等於這個

c = j; 
i = j; 
++i; 

對於第二種情況i取j的值=> I = J = 11然後就增量I => I = 12和則c取i的值= > c = 12;

因此,代碼是相同的:

i = j; 
++i; 
c = i; 
4

運營商逗號是執行許多語句,並返回最後一條語句的唯一結果。

所以對於c=i=j,++i;c=i=j被執行,然後++i和返回的++i這一結果後(但不使用)。

而對於c=(i=j,++i);,根據運算符優先級,i=j執行,執行後立即++i,然後做作到(i=j, ++i),這是最後一條語句的結果,結果c,即++i

所以,逗號的行爲與分號不完全相同。您可以使用它作爲替代品,如c=i=j,++i;

就個人而言,我不鼓勵使用該運營商,它產生的可讀性和少維護的代碼

+0

++我是在給定語句c =(i = j,++ i); i = j之後完成。 – skyconfusion

+0

@skyconfusion抱歉,英語不好,當然是,我編輯我的答案 – Garf365

+0

有人可以向我解釋爲什麼我的答案是downvoted嗎? – Garf365

1

逗號運算符將評估丟棄所有操作,最多,但不包括最後的操作。這允許在只有最後一個操作感興趣的單行上一起調用任何數量的非相應操作。

想一想,如果你有一些循環變量在循環中的任何一個位置增加,你可以分開所有的增加/減少等等,在他們自己的單獨的變量上分開,但是爲什麼?他們在哪裏執行(在合理範圍內)是無後果來操作代碼。然後它們可以在一行中被調用,而不會對代碼產生不利影響。

+1

逗號運算符只有2個操作數,所以它會簡單地丟棄左操作數的結果並使用正確的那一個。正確的一個永遠是最後一個。 – Lundin

+0

「然後,他們可以在一行中調用,而不會對代碼產生不利影響。」不,他們真的不能。此代碼對於(int i = 0,int j = 0,int k = 0; i Lundin

+1

@Lundin廢話。當然,你可以在一個循環中有多個循環迭代器。 C不是BASIC,循環迭代器沒有特殊的狀態; for循環只有三個角。如果你想使用'continue',你的第二個示例代碼就會出錯,並且它給'j'和'k'一個不必要的大範圍。 –

2

逗號(,)作爲操作符的實際工作是什麼?

逗號運算符主要是一個多餘的功能。 See this瞭解它是如何工作的。

++的優先級高於,並且=,爲什麼對逗號左側的表達式進行評估? 如果一個表達式包含具有不同優先級的運算符,那麼它將依據逗號(,)取決於什麼順序?

左側操作數針對副作用進行評估。逗號運算符的結果是經過評估的右操作數的結果。請注意,逗號運算符在C中所有運算符的優先級最低。

它表現得像分號(;)的替代嗎?

的樣子,是的。分號和逗號運算符都包含一個序列點。不同之處在於逗號運算符不是語句的結尾,所以它可以與同一行中的其他運算符一起擠入,並返回結果。

真的沒有理由爲什麼你會想要做到這一點,雖然。逗號運算符的主要用途是混淆代碼,應該避免。你需要了解它是如何工作的唯一原因是你可能會遇到包含它的垃圾代碼。

例如,你胡說代碼應該被改寫成更具可讀性和安全:

int main(){ 
    int i=0; 
    int j=11; 
    int c; 

    i=j; 
    c=j; 
    i++; 
    printf("c=%d i=%d\n",c,i); 

    i=j; 
    i++; 
    c=i; 
    printf("c=%d i=%d\n",c,i); 

    return 0; 
} 
+1

'// i = j; //多餘的,我們已經做了這個,爲什麼又這樣做?'不正確,因爲上面有'i ++',所以實際上你最終會得到'c = 11,i = 12',接着'c = 13 ,我= 13' –

+0

@NeilTwist嗯,是固定的。 – Lundin

相關問題