相关疑难解决方法(0)

C中的序列点和副作用

在这个C-FAQ中给出了序列点 ;

标准规定:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.

在例子中

i = i++;
a[i] = i++;
Run Code Online (Sandbox Code Playgroud)

从声明的第一句可以清楚地看出,这些例子是未定义行为的结果.
在解释声明的第二句时,据说;

第二句话说:如果一个对象被写入一个完整的表达式,那么同一个表达式中对它的任何和所有访问都必须直接参与计算要写入的值.此规则有效地将法律表达式约束为在修改之前明显存在访问的表达式.例如,旧备用

 i = i + 1 
Run Code Online (Sandbox Code Playgroud)

是允许的,因为i的访问用于确定i的最终值.这个例子

a[i] = i++
Run Code Online (Sandbox Code Playgroud)

是不允许的,因为i的一个访问(a [i]中的一个)与最终存储在i中的值无关(在i ++中发生),因此没有好的方法来定义.

我的问题是;
1.它是什么意思,如果一个对象被写入一个完整的表达式,那么在同一个表达式中对它的任何和所有访问必须直接参与计算要写入的值.

2.它是什么意思,该示例a[i] = i++ 是不允许的,因为i的一个访问(a [i]中的一个)与最终存储在i中的值无关(在i ++中发生)
可能有人以一种简单的方式解释它吗?

c undefined-behavior sequence-points

6
推荐指数
2
解决办法
830
查看次数

标签 统计

c ×1

sequence-points ×1

undefined-behavior ×1