求C语言高手

求值顺序使交换律失去作用
例3:c=a*b + ++b; 与 c= ++b + a*b;
求值顺序使括号失去作用
例4:int a=3,b=5,c;
c=++b * (a+b);
理解不了啊,详细解释一下好吗,跪谢

在一个操作数同时与几个操作符结合时,由操作符的优先级顺序决定先结合哪个。
比如例3里c=a*b+ ++b。第一个b同时与*和+结合,但*优先与+,所以b先与*结合,即该表达式等价于c=(a*b) + (++b)。问题来了,现在左右两个括号都是+的操作数,先计算哪个括号里的内容?
你可能以为是从左到右,这和+的结合顺序相符。但这是误解,结合顺序是针对操作数的,而不是操作符,正确的使用场合:一个操作数同时与几个操作符结合,且各操作符优先级顺序相同,则按操作符的结合顺序来决定。
回到问题,C标准没有规定先计算+的哪一边,所以各编译器各出己招,有的先算右边,有的先算左边。但不管怎么样,不是同时算的,总有个先后顺序。那么先算(++b)和先算(a*b)就大不相同,++b是否先执行,会造成a*b的值的差异。所以“交换律”在此失去作用,因为交换律根本不关心“执行顺序”这个因素。

例4也是一样,(++b)和(a+b)作为*的两个操作数,有执行先后顺序。如果先执行左边的,则()无法保证a+b先被执行,换言之,就是括号失去了作用。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-25
都已经忘没了
第2个回答  2011-08-25
首先+是又结合,c=a*b+ ++b先求a*b=15再求++b=6,然后15+6=21赋值给c。c= ++b + a*b,先算++b=6,再算a*b=18,最后6+18等于24.追问

哦,那例四C的值为54吗?怎么理解‘求值顺序使括号失去作用
’啊

相似回答