2017-05-09 74 views
0

如果我们有订购的C评价的(与*和表达++)

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

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

+0

不,它们没有相同的优先顺序。与前缀形式不同,Postfix形式++的优先级高于*。 – StoryTeller

+0

记住'++'递增指针的一个简单方法是注意通常的单行strcpy实现:'while(* dst ++ = * srC++);'如果'++'递增实际字符而不是指针,则会失败。 – Groo

+3

运算符优先级是[可发现的东西](http://en.cppreference.com/w/c/language/operator_precedence)。 –

回答

4

不,postfix increment has higher precedence

在您的情况下,增量的副作用将发生在值评估注释(带有解引用运算符)之后。然而,价值评估的结果被丢弃(你没有努力存储结果)。

所以,最后,其结果将是相当于p++;


注:

引用C11,章§6.5.2.4,(重点煤矿

后缀的结果运算符是操作数的值。作为副作用,操作数对象的值 递增(即,将相应类型的值1添加到它的值为 )。有关约束条件,类型和转换以及 指针操作的影响,请参阅关于 附加运算符和复合赋值的讨论。 在 的副作用更新操作数的存储值之前,对结果的值计算进行排序。 [...]

+0

因此,即使++(通过具有更高的优先级)应该首先被评估,它被推迟到* p被评估? – Alex

+0

@Alex是的,“递增”是一种副作用,后缀“++”的值是操作数本身的值,正如我的答案中突出显示的那样。 –

+0

@Alex - 的确 - 评估顺序和优先顺序基本上是无关的;请参阅http://stackoverflow.com/a/5475260/129570。 –

-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

+3

*什么*工作? OP没有具体说明他希望发生的事情,只询问如何评估这三条线。 – StoryTeller

+0

你说得对。实际上,OP应该编译并运行一些关于运营商优先级的变体,并看看它们与预期的匹配程度。哦,好吧 - 赢得积分并非易事! :-) – EricWerk

0

*p++被视为*(p++)因为后缀++的优先级是高于高于*

+0

你确定吗? –

+0

@SouravGhosh是的先生。 – rsp

+1

@SouravGhosh - 从语义上讲,这是一个正确的评估。编译器可能会在增量之前对负载进行排序,但对于标准“* p ++”所定义的C抽象在语义上等同于“*(p ++)”,正如** rsp **所述。 – StoryTeller