2013-09-23 124 views
5

+ +之間有一個空格時,表達式「+ + a」的含義是什麼。這個表達式是如何評估的?表達式「+ + a」是什麼意思?

int main() 
    { 
     int a = 3; 

     printf("%d %d", + +a, a); 
    } 

以及如何評估a+++a? 它未定義或未指定或實現定義?

回答

4

當運算符++中間有一個空格時,則只需應用一元加運算符兩次。

關於表達a+++a, 的C規範說,當存在這樣的二義性,咀嚼儘可能(在 「貪婪詞法分析器」或「最大適合」規則)。所以a+++a被評價爲a++ + a

根據該規則,例如,z = y+++++x; 將被解析爲z = y++ ++ +x;的表達,這是無效的(一個後增量的結果不是本身可遞增)。

+4

也被稱爲「最大的蒙克」規則。 –

+0

請注意,當兩個'+'符號之間有空格時,它不是增量運算符;它是兩個獨立的'+'運算符。根據定義,你不能在'++'運算符中有空格。 –

8

這是一個無操作 - 兩次,因爲+ a是一個無操作,它被重複。

a+++a被明確解析爲a++ + a,但執行時會導致未定義的行爲。

請注意,如果代碼集a = -3;,打印的值仍然是-3兩倍。

+1

只是一個挑逗,「+」並不總是一個nop,它也可能強制轉換爲更寬的類型。 –

+0

@JensGustedt:有沒有一種背景下,一元'+'的存在會強制改變,在沒有一元'+'的情況下不會發生改變?副手,我想不出一個。在'printf()'的例子中,如果'a'是'char'或'short',無論是否存在'+',都會發生到'int'的轉換(因爲處理可變參數的規則) 。如果存在諸如'a = + a;'這樣的賦值,那麼在RHS上可能名義上是從'char'到'int'的轉換,但是賦值會再次減少它,同樣的情況也適用於' a = a;'。 –

1

+a正好與-a相反。
換句話說,其中-a將具有相反的符號a,+a只是重申a的現有正/負號。

然後是外正再次,還造成3

相反的版本是:

printf("%d %d",- -a,a); 

這將是「負負3」 ......這又是+3

+1

鑑於:'a = -3;','b = + a;'與'b = abs(a);'不一樣。在第一種情況下,'b'是'-3';在第二個('abs()')情況下,它是'+ 3'。 –

+0

嗯從來沒有想過它,但我不認爲+ a是相反的 - 因爲,無論a的值如何,+ a總是正值,但 - 可以是正值或負值,即兩個負值是正值,積極也是積極的...只是說。 –

+5

Will + a永遠是正面的嗎?我不這麼認爲。在數學上,+( - 3)是_still_ -3 ... – ppeterka