【问题标题】:Are a[i]=y++; and a[i++]=y; undefined behavior or unspecified in C language?是a[i]=y++; a[i++]=y;未定义的行为或未在 C 语言中指定?
【发布时间】:2023-01-13 21:46:22
【问题描述】:

当我在寻找表达式 v[i++]=i;为什么要定义行为,突然看到一个解释是因为表达式存在于程序中两个序列点之间,而c标准规定在两个序列点中副作用的发生顺序是不确定的,所以当程序中运行表达式,不确定是先运算++运算符还是先运算=运算符。我对此感到困惑。当表达式求值的过程中,是不是应该先用优先级判断,再引入序列点来判断先执行哪个子表达式呢?我错过了什么吗?

他这样解释的时候,是不是说在代码里写a[i]=y++;a[i++]=y;这样的代码?在程序中不能确定++运算符和=运算符不能确定谁先运行。

【问题讨论】:

  • 这就是为什么您总是在不同的代码行中编写增量和赋值操作。那样的话,你和跟在你后面的程序员就不必进行这些脑力劳动了。
  • 由于a[i]=y++a[i++]=y 在赋值的两边都使用了不同的变量,所以没有问题。一切都很明确。

标签: c


【解决方案1】:

v[i++]=i; 是未定义行为的原因是因为变量 i 是在同一个表达式中读取和写入的,没有排序。

诸如 a[i]=y++a[i++]=y 之类的表达式不会表现出未定义的行为,因为在不排序的情况下,表达式中没有变量被读取和写入。

【讨论】:

  • “因为变量 i 是在同一个表达式中读取和写入的”,嗯,关于 i++ 也可以这么说。
  • 标准语宁愿是“因为相对于同一对象的值计算而言,未排序的对象存在副作用”。诚然,这是一个在阅读后不会让任何人变得更聪明的措辞......
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 2011-04-25
  • 2017-02-15
  • 1970-01-01
  • 2012-11-23
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多