2012-04-28 77 views
5

這將是下面的代碼
int x,a=3;
x=+ +a+ + +a+ + +5;
printf("%d %d",x,a);
變量後的符號是什麼意思?

輸出中是輸出:11 3.我想知道怎麼樣?和一個方法之後的+符號是什麼?

+7

爲什麼要編寫代碼不明白? – cnicutar 2012-04-28 07:38:57

+8

我不知道這是如何得到解析,但很確定結果是未定義的。 – juanchopanza 2012-04-28 07:39:22

+0

有沒有['#define + a + a']? – vard 2012-04-28 07:41:36

回答

18

我認爲DrYap是對的。

x = + + a + + + a + + + 5; 

是一樣的:

x = + (+ a) + (+ (+ a)) + (+ (+ 5)); 

這裏的關鍵點是:

1)C,C++不具備+作爲後綴操作符,所以我們知道我們必須其解釋爲前綴

2)一元+結合更緊密(是更高的優先級),比二元+

Funn不是嗎?如果這些是 - 標誌,它不會看起來很奇怪。 Monadic +/-只是一個領先的標誌,或者換句話說,「+ x」與「0 + x」相同。

+0

是的,這是有道理的。 +符號之間有空格,但如果刪除空格,則會顯示編譯錯誤:'需要Lvalue'。 – user980089 2012-04-28 07:56:26

+3

是的,因爲如果你刪除'+ +'之間的空格,你會得到一個'++'(增量運算符)而不是兩個加號。 – 2012-04-28 07:58:07

+1

對於'x'的類型''存在''0','+ x'應該與'0 + x'類似,但是在重載時沒有這樣的保證。它可以被稱爲「衰變算子」,因爲即使它的操作數是一個左值,它也會返回一個純粹的值。例如,'++ + a'除了重載外是非法的,並且通常不會增加'a'。 – Potatoswatter 2012-04-28 08:52:06

13

在剛剛看到下一個值之前的+之後的+。如果使用一致的間距是一樣的:

x = + + a + + + a + + + 5; 

但並不是所有的+ S是必要的,這樣它會採取同樣因爲這樣做:

x = a + a + 5; 

的價值是不變的,因爲你從未使用++兩個符號之間沒有空白的遞增運算符。 +和++是兩個獨立的運算符。

+4

我會補充說C有一個一元'+',與一元減號'-'對稱,這就是這裏所用的。除了令人困惑的程序員之外,沒有人知道單元加號是什麼。 http://msdn.microsoft.com/en-us/library/s50et82s(v=vs.71).aspx – 2012-04-28 07:46:54

+0

但在這種情況下,它不會發生,值不會增加。第二秒前有3個標誌。 – user980089 2012-04-28 07:48:01

+0

你的意思是沒有發生什麼? – DrYap 2012-04-28 07:50:21

3

的代碼似乎是等同於:

x= (+(+(a)))+ (+ (+(a)))+ (+(+(5)));

x = a + a + 5。這是11.你知道你可以在數字前加+或 - 號,對吧?現在這些+只是表示變量的符號。由於符號是+,變量保持不變I.e. 「+5」表示「5」,所以「+ a」表示「a」,「+ + a」表示「+(+ a)」,表示「a」。以同樣的方式,你可以寫x = + + + 3 + + + + 3 + + + + 5。或者x = - + + - 3 + - + - 3 - - + 5;

3

由於+運營商都無法在兩個彼此相鄰,但始終由空格聲明 x=+ +a+ + +a+ + +5;居然被讀作

x=+ (nothing)+a+(nothing) +(nothing) +a+(nothing) +(nothing) +5;

所以基本上最後的等式變成的那種分離 x=a+a+5;並因此得出結果。

0

X = + + A + + + A + + 5:這等同於

X = X = + + A + + + A + + 5或 我們可以把它寫爲x = +(+一)+(+(+ a))+(+(+ 5)) 和+只表示最終評估爲 x = a + a + 5的符號。