为了账号安全,请及时绑定邮箱和手机立即绑定

int a = 3; b = 4;计算a+b%a-b/a+a*b-a++该算式的运算结果以及运算后a的值如果题目改成int a = 3; b = 4;计算a+b%a-b/a+a*b-(++a)答案是多少啊?

int a = 3; b = 4;计算a+b%a-b/a+a*b-a++该算式的运算结果以及运算后a的值如果题目改成int a = 3; b = 4;计算a+b%a-b/a+a*b-(++a)答案是多少啊?

正在回答

3 回答

没有答案, a+b%a-b/a+a*b-a++ 这个式子本身就是错的。

你先要明白前置自增运算符和后置自增运算符是怎么回事:

通常说,a++是先取值后运算,++a是先运算后取值。实际上这里涉及“运算符”、“表达式”和“语句”的概念。

++ 是一个“自增运算符”,自增运算符有两种形式:前缀自增(++a)和后缀自增(a++)。

运算符和操作数合起来就是一个表达式(a++、++a都是表达式,a就是操作数)。注意:每一个表达式本身都有值(和其类型),有的表达式还有“副作用”。比如自增表达式的副作用就是使其操作数自增1。那么自增运算表达式的值是什么呢? a++ 的值就是 a 的值,而 ++a 的值等于 a+1。 

表达式后面加上一个分号才是一个完整的“语句”。

还有一个关键内容:前面说使操作数自增1是自增表达式的副作用,那么这个副作用什么时候发生呢? 准确地说是在“序列点”后保证会发生。 序列点这个概念比较复杂,简单地说:“语句结束时”是一个序列点。这序列点之前的运算符的副作用,在执行到这点以后都保证会发生。注意并不是在这一点之后就突然发生的,这些副作用可能在序列点前的任何一个位置发生,C标准只是规定在序列点之后这些副作用必须都已经发生了。

在a+b%a-b/a+a*b-a++这个大复合表达式中,最后有一个a++,这个子表达式的值是3没有错(因为是先求值再自增),但在整个表达式中a还出现了很多次,就是说需要取a的值很多次,可是最后这个子表达式a++的副作用在什么时候发生是并不确定的。我只知道在整个语句结束之后a的值肯定是4,但a也可能在取第一个a的值时就已经是4了......也可能第一个a还是3,第二个a就是4了......也可能所有的a都是3......这一切都是有可能的。所以也许这段代码在我这里编译出的结果就和你的不一样。


对于写复合表达式,一般建议:如果表达式改变了一个操作数的值,那就不要在这个复合表达式中再次使用这个操作数。除非你能确定“改变值”和“使用值”的先后顺序。 在这个例子中,显然你不能确定顺序。

4 回复 有任何疑惑可以回复我~
#1

梦颖千年 提问者

这个前面一个是慕课网出的题目啊,是前面一个没答案还是后面一个没答案啊
2015-07-24 回复 有任何疑惑可以回复我~
#2

梦颖千年 提问者

#include <stdio.h> int main() { int a = 3; int b = 4; printf( "y=%d\n",a+b%a-b/a+a*b- a ++); printf( "a=%d\n",a); return 0; } //我这么写代码对吗
2015-07-24 回复 有任何疑惑可以回复我~
#3

梦颖千年 提问者

非常感谢!
2015-07-25 回复 有任何疑惑可以回复我~
#4

onemoo 回复 梦颖千年 提问者

解释中的意思是:两个都没有答案。 可能你没有看懂解释。
2015-07-26 回复 有任何疑惑可以回复我~
#5

王彧喧

你的意思是a++或++a使得a值变化的时间点不确定(这又是由于式子中出现了多个a),所以答案不确定对吧。这是标准中没有明确规定的,可能在TC,VC,C4droid等不同编译器上不同结果等情况。
2015-08-25 回复 有任何疑惑可以回复我~
#6

onemoo 回复 王彧喧

是的,因为C并没有规定操作数的求值顺序,加上序列点导致的不确定性,整个表达式的行为就是未定义的了。
2015-08-25 回复 有任何疑惑可以回复我~
查看3条回复

#include <stdio.h>

int main()

{

    int a = 3;

    int b = 4;

    printf( "y=%d\n",a+b%a-b/a+a*b- a ++);

    printf( "a=%d\n",a);

    return 0;

}

0 回复 有任何疑惑可以回复我~
#1

onemoo

a+b%a-b/a+a*b- a ++ 写这样的表达式本身就不对
2015-07-26 回复 有任何疑惑可以回复我~
#2

梦颖千年 提问者 回复 onemoo

错了吗?这个应该怎么写的啊
2015-07-27 回复 有任何疑惑可以回复我~
#3

onemoo 回复 梦颖千年 提问者

请再看一遍我前面的解答。 如果看不懂,请明确指出是哪里不明白。
2015-07-29 回复 有任何疑惑可以回复我~
#4

小玖so 回复 onemoo

大神,指教一下,我看到这个问题明白你的意思,但是这个题目中的表达式就是这样写的,我把这个表达式放进去也能运行,能正确的出来值,这是为什么?
2015-08-04 回复 有任何疑惑可以回复我~
#5

onemoo 回复 小玖so

你看,我说这样写是错的,没有说这样写不合法。这个代码是可以编译通过的,也能运行,但有结果并不能说明这是“正确的”,而且这个结果也不能说是“正确”的值。 正如我前面解答中所说“...但a也可能在取第一个a的值时就已经是4了......也可能第一个a还是3,第二个a就是4了......也可能所有的a都是3......这一切都是有可能的...”,这种不确定性就是C标准中的“未定义”行为,你无法保证这个代码在所有的平台上都得出同样的结果,这种连结果都不确定的代码能说是正确的吗?
2015-08-04 回复 有任何疑惑可以回复我~
#6

小玖so 回复 onemoo

明白了,谢谢!
2015-08-05 回复 有任何疑惑可以回复我~
查看3条回复

举报

0/150
提交
取消

int a = 3; b = 4;计算a+b%a-b/a+a*b-a++该算式的运算结果以及运算后a的值如果题目改成int a = 3; b = 4;计算a+b%a-b/a+a*b-(++a)答案是多少啊?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信