C/C++中的未定义行为和`sequence points`, `sequenced`,`unsequenced`

随心所欲,最近不想学习真的很烦课内的东西,所以就来发个文。昨天打的第一份稿子幸好还自动保存了,挺不错的。这是我的第一篇文章,我不希望成为和许多博主一样只会复制粘贴和转载三种操作的人。

问题

在C/C++中写下如下代码,编译运行后j的返回值其实是不确定的(多数为4),因编译器和程序运行环境而定。如果你使用clang,则情况会相对好一些,编译器会显式地给出警告。

int j = 4;
j = j++;

clang给出的警告(实测多个版本的gcc都没有):

常见解答

国内论坛常见的解释为这里先执行了赋值操作,然后j才自增,所以返回j的值仍然是4. 然而这种说法显然是错误的。

理由:

  1. j++这种语句是自增,并不需要赋值就能改变变量的值,因此如果仅从运算顺序分析的话无论何种情况最后的结果都应该是5.

    可以假设,

    1. j先完成了自己对自己的赋值(即令j = 4),然后自增,最后其值为5;
    2. j先自增,再赋值,最后j仍然等于5.
  2. 回归C/C++语言基础,赋值语句是从右到左执行的,不存在先赋值再运算的情况。

另外,如果你忘了运算表达式顺序而且不想去回顾(这很不好),还可以实验证明:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值