为什么原文说total+=*start++和total+=*(start++)是等价的

C语言 码拜 9年前 (2016-04-23) 1603次浏览
《C primer plus》中的一道题目,文中说total+=*start++和total+=*(start++)是一样的,这里本人想不通,加了括号后不是应该先算括号里的内容么?怎么会是一样的呢。请高手解答!

#include <stdio.h>
#define SIZE 10
int sump(int *start,int *end);
int main()
{
    int marbles[SIZE]={20,10,5,39,4,16,19,26,31,20};
    long answer;
    answer=sump(marbles,marbles+SIZE);
    printf("%ld.\n",answer);
    return 0;
}
int sump(int *start,int *end)
{
    int total=0;
    while(start<end)
        total+=*(start++);
    return total;
}
解决方案

10

这里是优先级表:
http://www.slyar.com/blog/c-operator-priority.html
虽然*和++优先级一样,但是结合性是从右到左,也就是说它们在一起时右边的优先级高。

10

解释一下:
total+=*start++和total+=*(start++)从结果上讲是一样的,从编译角度讲不太一样
*属于unary-operator
++放在表达式之后,构成:postfix-expression ++
total+=*start++
从语法分析上要先分析postfix-expression ++,然后转到unary-expression,过度到cast-expression,整合 * 的unary-operator组合成unary-operator cast-expression,最后转一圈回到赋值表达式
因此先执行++,再执行*
total+=*(start++)
要比上面不加括号的情况下,多一圈语法分析;即start++自身走一圈回到exp,然后再转一圈把*整合进去。
因此从编译角度讲,假如想让代码编译更快点,在知道优先级的情况下,优先选择total+=*start++,原因是每加一个括号,就要从上面12点钟方向重新开始一遍语法分析。
不过,编译出来的指令都是一样的,因此运算结果也都是一样的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么原文说total+=*start++和total+=*(start++)是等价的
喜欢 (0)
[1034331897@qq.com]
分享 (0)