如果我们有
int i = 5; /*line 1*/
int *p = &i; /*line 2*/
*p++; /*line 3*/
第3行的评估顺序是什么? (我知道在这之后p可能指向一些奇怪的东西 - 但我对正确的内存寻址不感兴趣,但对评估的顺序不感兴趣,因为*和++似乎具有相同的优先级)
答案 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