Fw: [课业] c语言 算子

楼主: mike31830   2017-05-10 00:35:06
※ [本文转录自 Examination 看板 #1P4Uqjzd ]
作者: mike31830 () 看板: Examination
标题: [课业] c语言 算子
时间: Wed May 10 00:24:10 2017
int abc(int *k) {
*k += 4;
return 3 * ( *k) - 1;
}
void main() {
int i = 10, j = 10, result1, result2;
result1 = (i / 2) + abc( &i);
result2 = abc( &j) + (j / 2);
}
如果在运算式中的算子估算的顺序是由右到左,则result1,则result2的值为何?
看了补习班答案是 result1=48, result2=46
result1= (i/2) + abc(&i)
= (14/2) + 41 (*k=14; 3*14 - 1=41)
= 48
想问的是,为什么在abc裹的计算是先乘除后加减呢
而不是由右到左推算呢
因为本题没有提运算子优先权,是不是应该照题目要求一律从右到左呢
谢谢
作者: kyuudonut (善良老百姓)   2017-05-10 01:14:00
呃,你搞错了,C expression 是由左往右的没有提到运算子优先权,请自行参阅 C precedence这题的重点是 C compiler 会先对 operand 进行value computation,才会开始计算 expression啊...抱歉,我搞错问题了,这题的答案应该是未定义的举 C++ 而言他没有定义 operand 的求值顺序(实务上由 compiler 任意决定) 补习班的答案看看就好与 i = i++ 异曲同工的一题天啊...我再回答什么... (看到未定义行为太兴奋)总之,题目的设定是为了避免我5~8F描述的情况至于你的问题,你应该去练习写一下程式。
作者: shownlin (哈哈阿喔)   2017-05-10 09:00:00
k大题目有假定由右往左
作者: imindflow (imindflow)   2017-05-10 09:00:00
运算子优先级"大于"结合律,结案!
作者: shownlin (哈哈阿喔)   2017-05-10 09:01:00
这题就是优先权相同下右结合,而优先权既然题目没要求当然不变
作者: kyuudonut (善良老百姓)   2017-05-10 10:42:00
不是,这跟结合律并没有关系。运算依然是左结合。题目的假设与此无关,此假设是定义operand 求值顺序,避免 side effect 会带来 undefined behavior
作者: TWkobe (中华柯比)   2017-05-10 11:24:00
undefined behavior+1 因为sequence point每个compiler实作未必如你所想由左而右 因为+号并没有保证side effect的顺序
作者: ryan0508 (水屁哥)   2017-05-11 08:42:00
http://i.imgur.com/pGJVwtz.jpg!我看懂楼上几楼了 我也顺便学了一下

Links booklink

Contact Us: admin [ a t ] ucptt.com