[课业] c语言 算子

楼主: mike31830   2017-05-10 00:24:10
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裹的计算是先乘除后加减呢
而不是由右到左推算呢
因为本题没有提运算子优先权,是不是应该照题目要求一律从右到左呢
谢谢
作者: pisuke   2017-05-10 00:44:00
由右向左 跟 先乘除后加减 是两回事吧
作者: jachin (火腿哥)   2017-05-10 07:56:00
所谓先乘除后加减,其实就是运算子的优先权顺序,在程式定义时期就已经定义完成了,不管在哪里计算都不会改变;而您说的由右而左的右结合,则是依编译器决定,不同编译器,可能有不同结合情形。简单说,运算子优先权不用题目说,是必要条件。而由右而左是像a+b(先计算b,再计算a),且a/b的右结合,也是先计算b,再计算a,可是a/b的定义不会变呀,是程式定义的a除b。
作者: assu (ASSU)   2017-05-10 08:41:00
答案错 用程式实际跑 result1=46 result2=48
作者: outofyou   2017-05-10 10:48:00
因为虽然先乘除后加减,但先计算右边的算子的值为何。
作者: pisuke   2017-05-10 12:55:00
你知道你的编译器是由左到右还是右到左吗这题本来就不能用实际程式的结果当答案啊
作者: jachin (火腿哥)   2017-05-10 13:09:00
to assu大,这题就是要视编译器而定,像一般pascal是由左而右,C是由右而左,但是如p大所言,实际仍视编译器而定。考试时,可没编译器呀
作者: pisuke   2017-05-10 13:38:00
我是觉得这题一样先乘除后加减,只是右边那个括号先做 然后再算左边的Btw 怎么每年程式语言都出这种啊 冏 我记得板上对类似的题目就有很多讨论了
作者: pt7441 (批踢)   2017-05-10 13:48:00
运算子 算子 是不一样的
作者: lingpxs (Kelly Lin)   2017-05-11 21:21:00
我的话 会先在答案第一行写 依一般运算方式,相同优先权之运算以左结合为主

Links booklink

Contact Us: admin [ a t ] ucptt.com