C中的评估顺序(用*和++表示)

时间:2017-05-09 11:01:10

标签: c operator-precedence postfix-operator

如果我们有

int i = 5; /*line 1*/
int *p = &i; /*line 2*/
*p++; /*line 3*/ 

第3行的评估顺序是什么? (我知道在这之后p可能指向一些奇怪的东西 - 但我对正确的内存寻址不感兴趣,但对评估的顺序不感兴趣,因为*和++似乎具有相同的优先级)

3 个答案:

答案 0 :(得分:4)

不,postfix increment has higher precedence

在您的情况下,增量的副作用将在值评估 note (使用解除引用运算符)之后发生。但是,值评估的结果将被丢弃(您没有做任何努力来存储结果)。

所以,最后,结果将是等效p++;

注意:

引用C11,章节§6.5.2.4,(强调我的

  

后缀++运算符的结果是操作数的值。作为副作用,   操作数对象的值递增(即,相应类型的值为1   添加到它)。请参阅添加剂操作符和化合物分配的讨论   有关约束,类型和转换以及操作对其影响的信息   指针。 结果的值计算在副作用之前排序   更新操作数的存储值。 [...]

答案 1 :(得分:0)

*p++被视为*(p++),因为后缀++的优先级更高而不是*

答案 2 :(得分:-2)

您必须在* p周围加上括号才能使其正常工作:

int i = 5; /*line 1*/
int *p = &i; /*line 2*/
(*p)++; /*line 3*/ 
printf("Hello, World! %d\n", *p); 

请参阅:http://en.cppreference.com/w/c/language/operator_precedence