《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
虽然*和++优先级一样,但是结合性是从右到左,也就是说它们在一起时右边的优先级高。
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点钟方向重新开始一遍语法分析。
不过,编译出来的指令都是一样的,因此运算结果也都是一样的。
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点钟方向重新开始一遍语法分析。
不过,编译出来的指令都是一样的,因此运算结果也都是一样的。