gpt4 book ai didi

c++ -++x %= 10 在 C++ 中是否明确定义?

转载 作者:IT老高 更新时间:2023-10-28 13:23:32 24 4
gpt4 key购买 nike

在浏览某个项目的代码时,我遇到了以下语句:

++x %= 10;

这个语句在 C++ 中定义得很好还是属于同一类

a[i] = i++

?

最佳答案

根据 C++11 1.9 Program execution /15 :

Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced.

If a side effect on a scalar object is unsequenced relative to either another 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 %= 10是一个值(value)计算,所以你会认为它是未定义的行为。但是,assignment 部分 (5.17 /1) 有这样的说法(我的粗体字):

In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression.

因此,这意味着双方在分配之前和分配结果可用之前都已排序。而且由于标准还规定(5.17 /7)x OP = y等同于 x = x OP y但与 x只被评估一次,事实证明这个定义明确的行为,因为它相当于:

++x = Q % 10; // where Q is the value from ++x, not evaluated again.

剩下的唯一问题是赋值的哪一个被评估,因为它们没有被排序。但是,在这种情况下,我认为这并不重要,因为这两种情况都会产生相同的效果:

++x = Q % 10; // LHS evaluated first
Q = ++x % 10; // RHS evaluated first

现在,这就是我的对标准的解读。虽然我在解码复杂文档方面拥有丰富的经验,但可能有些我错过了 - 我不这么认为,因为我们都在这里进行了热烈的讨论以达到这一点:-) 我想我们都已经建立了相关的部分。

但是,无论是否定义良好,体面的程序员不应该编写这样的代码。距离 PDP mini 的低内存/小存储时代已经过去了很长时间,现在是时候让我们的代码可读了。

如果你想增加然后取模,使用x = (x + 1) % 10 ,如果只是为了让下一个阅读该代码的可怜的 Joe 更容易理解。

关于c++ -++x %= 10 在 C++ 中是否明确定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27835808/

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