gpt4 book ai didi

c - C 中数组索引(相对于表达式)的求值顺序

转载 作者:行者123 更新时间:2023-12-02 09:37:52 24 4
gpt4 key购买 nike

看看这段代码:

static int global_var = 0;

int update_three(int val)
{
global_var = val;
return 3;
}

int main()
{
int arr[5];
arr[global_var] = update_three(2);
}


哪个数组条目得到更新? 0 还是 2?

C 的规范中是否有部分指示在这种特殊情况下操作的优先级?

最佳答案

左右操作数的顺序
执行 arr[global_var] = update_three(2) 中的分配,C 实现必须评估操作数,并且作为副作用,更新左操作数的存储值。 C 2018 6.5.16(关于赋值)第 3 段告诉我们左右操作数没有排序:

The evaluations of the operands are unsequenced.


这意味着 C 实现可以自由地计算左值 arr[global_var]首先(通过“计算左值”,我们的意思是弄清楚这个表达式指的是什么),然后计算 update_three(2) ,最后将后者的值赋给前者;或评估 update_three(2)首先,然后计算左值,然后将前者分配给后者;或评估左值和 update_three(2)以某种混合方式,然后将右值分配给左左值。
在所有情况下,将值分配给左值必须放在最后,因为 6.5.16 3 还说:

… The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands…


测序违规
由于两者都使用 global_var,有些人可能会考虑未定义的行为。并在违反 6.5 2 的情况下单独更新它,其中说:

If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined…


对于 x + x++这样的表达式的行为,很多C从业者都非常熟悉。没有被 C 标准定义,因为它们都使用了 x 的值。并在同一表达式中单独对其进行修改,无需测序。然而,在这种情况下,我们有一个函数调用,它提供了一些排序。 global_var用于 arr[global_var]并在函数调用 update_three(2) 中更新.
6.5.2.2 10 告诉我们在函数调用之前有一个序列点:

There is a sequence point after the evaluations of the function designator and the actual arguments but before the actual call…


在函数内部, global_var = val;是一个完整的表达式, 3 也是如此。在 return 3; , 每 6.8 4:

A full expression is an expression that is not part of another expression, nor part of a declarator or abstract declarator…


然后在这两个表达式之间有一个序列点,再次按照 6.8 4:

… There is a sequence point between the evaluation of a full expression and the evaluation of the next full expression to be evaluated.


因此,C 实现可能会评估 arr[global_var]先然后进行函数调用,在这种情况下它们之间有一个序列点,因为在函数调用之前有一个序列点,或者它可能会评估 global_var = val;在函数调用中,然后 arr[global_var] ,在这种情况下,它们之间有一个序列点,因为在完整表达式之后有一个。所以行为是未指定的——这两个东西中的任何一个都可能首先被评估——但它不是未定义的。

关于c - C 中数组索引(相对于表达式)的求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59722807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com