2010-07-15 115 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(一) 。“