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

希望能够帮帮我,不难,很基础

希望能够帮帮我,不难,很基础

C++ C
XAGT 2017-10-24 12:46:08
有如下:#include<stdio.h> main() { int j=3; printf("%d\n%d",++j,j++); printf("\n%d\n%d",j++,++j); } 为什么会输出5  3                          6  7 呢,这个是这样分的,按照++和--的,不是应该输出 吗                4  4                          4   5
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

printf("%d\n%d",++j,j++);  这样的代码的行为是“未定义的”

自增/减运算符构成的表达式,对操作数的自增/减算是表达式的“副作用”,这副作用并不保证和表达式求值同时发生

以你这个函数调用是参数求值为例。函数的两个参数都是自增表达式。那么 ,是++j 先算还是 j++ 先算呢? 答案是:不确定!  而且关键是这两个自增表达式还是对同一个变量自增的,那么 ++j 中的 j 会在 j++ 之前自增吗? 还是别的情况?  答案也是:不确定!  所以这句 printf 打印出什么都有可能。


像自增这样有副作用的表达式,如果你不确定它的副作用的发生顺序,那最好一句中只用一个这样的表达式。

比如像 @xungeer29 说的那样分开写,就能得到确定的结果了。

查看完整回答
2 反对 回复 2017-10-24
?
xungeer29

TA贡献46条经验 获得超20个赞

你输出
printf("%d\n",++j);
printf("%d\n",j++);
printf("%d\n",j++);
printf("%d\n",++j);
试试,4457


查看完整回答
1 反对 回复 2017-10-24
  • XAGT
    XAGT
    合起来就输出不行了吗,像printf("%d\n%d",a,b); 这样的可以输出a,b的值,那个++合在一起输出就不行
  • 2 回答
  • 0 关注
  • 2061 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信