2010-07-15 181 views
1

規則解析該表達什麼優先級:*(C++)運營商爲了

*(c++); // c is a pointer. 

謝謝。

好,我嘗試以下

x = *c; c++; 
x = (*c++); 
x = *(c++); 

他們似乎相當於

回答

6

++運算符與優先級沒有太大關係,但是告訴在評估之後才增加。

所以* c將被「返回」,然後c將遞增。

請不要混淆優先順序和執行順序!

+0

OMG的人,請...嘗試它爲你自己,工作(*(C++))相當於工作(* C); C++; 真的。 – mvds 2010-07-15 01:58:22

+0

謝謝。 我試過了,它似乎是這樣,就像你說的,(*(C++))和(* C++)在增量 – Anycorn 2010-07-15 02:19:53

+0

之前的解引用試圖使事情變得更清晰:「precendence」處理「膠水」規則,並且可以被迫以括號()方式行事,就像在數學中一樣。 ++比*有更高的優先級,因此在這種情況下對c有點困難。 ++ c和C++用於在表達式中使用c的值之前或之後執行。請注意,即使*({C++;})被評估爲* c; C++;但*({C++; C++;})被評估爲*(++ c); C++; – mvds 2010-07-15 09:45:16

5

有括號括住的表達,所以++*之前評估。

如果刪除括號以獲得*c++,那麼由於優先規則,該表達式仍將被解析爲*(c++)而不是(*c)++

+0

so *(C++)和* C++是一樣的嗎? – Anycorn 2010-07-15 01:53:03

+3

@aaa:是的,但是,如果您認爲這可能會造成混淆,那麼使用括號將表達式分組並使其更加清晰沒有任何問題。 – 2010-07-15 01:54:06

+0

謝謝。 出於某種原因,我認爲* C++首先解除引用,但後來在使用它時開始得到不正確的結果,並且來到這裏要求 – Anycorn 2010-07-15 01:56:40

2

指針增量首先應用於括號,然後是取消引用。

但是,c++的返回值是增量前的值c。所以表達式*(c++)的返回值與*c相同。例如:

char *c = "Hello"; 
char a, b; 

a = *c;   // a is 'H' 
b = *(c++);  // b is 'H', but now c is "ello" 
+0

這是不正確的。在語句執行之前,後綴增量實際上是不可見的。這就是爲什麼增量/減量在儘可能地放在自己的行上時可以避免很多混淆的原因。 – virstulte 2010-07-15 02:28:21

+0

我給的命令是正確的。但是,'C++'操作的返回值是增量前的'c'的值。這就是增量看起來不可見的原因。 – MatthewD 2010-07-15 03:02:14

+0

@virstulte:好點? – MatthewD 2010-07-15 03:09:15

1

正如mvds所說:在評估之後執行「X ++」操作符。 「當Postfix ++應用於一個可修改的左值時,結果是左值所引用的對象的值。在記錄結果之後,該對象增加1(一) 。「