如果我们有订购的C评价的(与*和表达++)
int i = 5; /*line 1*/
int *p = &i; /*line 2*/
*p++; /*line 3*/
什么是评价的3线的顺序? (我知道在这个p之后可能会指向一些奇怪的东西 - 但我对正确的内存寻址不感兴趣,但评估的顺序不同,因为*和++似乎具有相同的优先级)
如果我们有订购的C评价的(与*和表达++)
int i = 5; /*line 1*/
int *p = &i; /*line 2*/
*p++; /*line 3*/
什么是评价的3线的顺序? (我知道在这个p之后可能会指向一些奇怪的东西 - 但我对正确的内存寻址不感兴趣,但评估的顺序不同,因为*和++似乎具有相同的优先级)
不,postfix increment has higher precedence 。
在您的情况下,增量的副作用将发生在值评估注释(带有解引用运算符)之后。然而,价值评估的结果被丢弃(你没有努力存储结果)。
所以,最后,其结果将是相当于为p++;
注:
引用C11
,章§6.5.2.4,(重点煤矿)
后缀的结果运算符是操作数的值。作为副作用,操作数对象的值 递增(即,将相应类型的值1添加到它的值为 )。有关约束条件,类型和转换以及 指针操作的影响,请参阅关于 附加运算符和复合赋值的讨论。 在 的副作用更新操作数的存储值之前,对结果的值计算进行排序。 [...]
因此,即使++(通过具有更高的优先级)应该首先被评估,它被推迟到* p被评估? – Alex
@Alex是的,“递增”是一种副作用,后缀“++”的值是操作数本身的值,正如我的答案中突出显示的那样。 –
@Alex - 的确 - 评估顺序和优先顺序基本上是无关的;请参阅http://stackoverflow.com/a/5475260/129570。 –
你必须把括号围绕* 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
*什么*工作? OP没有具体说明他希望发生的事情,只询问如何评估这三条线。 – StoryTeller
你说得对。实际上,OP应该编译并运行一些关于运营商优先级的变体,并看看它们与预期的匹配程度。哦,好吧 - 赢得积分并非易事! :-) – EricWerk
*p++
被视为*(p++)
因为后缀++
的优先级是高于高于*
。
你确定吗? –
@SouravGhosh是的先生。 – rsp
@SouravGhosh - 从语义上讲,这是一个正确的评估。编译器可能会在增量之前对负载进行排序,但对于标准“* p ++”所定义的C抽象在语义上等同于“*(p ++)”,正如** rsp **所述。 – StoryTeller
不,它们没有相同的优先顺序。与前缀形式不同,Postfix形式++的优先级高于*。 – StoryTeller
记住'++'递增指针的一个简单方法是注意通常的单行strcpy实现:'while(* dst ++ = * srC++);'如果'++'递增实际字符而不是指针,则会失败。 – Groo
运算符优先级是[可发现的东西](http://en.cppreference.com/w/c/language/operator_precedence)。 –