- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
本来,我提出了一个更复杂的例子,这个是@n提出的。 '代词' m.在现已删除的答案中。但是问题变得太长了,如果您有兴趣,请参阅编辑历史记录。
以下程序在 C++17 中有明确定义的行为吗?
int main()
{
int a=5;
(a += 1) += a;
return a;
}
我相信这个表达式是明确定义和评估的:
a
被评估为 5。a
的引用, a += 1
是明确定义的。 a==6
. a
的当前值加 5 ,使其变为 11。An expression X is said to be sequenced before an expression Y ifevery value computation and every side effect associated with theexpression X is sequenced before every value computation and everyside effect associated with the expression Y.
The assignment operator (=) and the compound assignment operators allgroup right-to-left. All require a modifiable lvalue as their leftoperand; their result is an lvalue referring to the left operand. Theresult in all cases is a bit-field if the left operand is a bit-field.In all cases, the assignment is sequenced after the value computationof the right and left operands, and before the value computation ofthe assignment expression. The right operand is sequenced before theleft operand. With respect to an indeterminately-sequenced function call, the operation of a compound assignment is a single evaluation.
The right operand is sequenced before the left operand.
In all cases, the assignment is sequenced after the value computationof the right and left operands, and before the value computation ofthe assignment expression
a
被评估为 5。a
, a += 1
是明确定义的。 a
的当前值加 5 ,使其变为 10。a==11
或者甚至 6
如果旧值甚至用于副作用。 <source>: In function 'int main()':
<source>:4:8: warning: operation on 'a' may be undefined [-Wsequence-point]
4 | (a += 1) += a;
| ~~~^~~~~
我在阅读汇编方面很糟糕,也许有人至少可以重写 gcc 如何达到 12?
(a += 1), a+=a
有效,但这似乎是错误的。
a
的引用。 ,而不仅仅是值 5。所以 Gcc 仍然可能是正确的,在这种情况下,clang 可能是错误的。
最佳答案
为了更好地遵循实际执行的内容,让我们尝试用我们自己的类型模仿相同的内容并添加一些打印输出:
class Number {
int num = 0;
public:
Number(int n): num(n) {}
Number operator+=(int i) {
std::cout << "+=(int) for *this = " << num
<< " and int = " << i << std::endl;
num += i;
return *this;
}
Number& operator+=(Number n) {
std::cout << "+=(Number) for *this = " << num
<< " and Number = " << n << std::endl;
num += n.num;
return *this;
}
operator int() const {
return num;
}
};
然后当我们运行时:
Number a {5};
(a += 1) += a;
std::cout << "result: " << a << std::endl;
We get different results with gcc and clang (并且没有任何警告!)。
+=(int) for *this = 5 and int = 1
+=(Number) for *this = 6 and Number = 6
result: 12
clang :
+=(int) for *this = 5 and int = 1
+=(Number) for *this = 6 and Number = 5
result: 11
这与问题中的整数结果相同。 即使它不是完全相同的故事:内置赋值有自己的排序规则,而不是作为函数调用的重载运算符,但相似性仍然很有趣。
constexpr int foo() {
int res = 0;
(res = 5) |= (res *= 2);
return res;
}
int main() {
std::cout << foo() << std::endl; // prints 5
assert(foo() == 5); // fails in clang 11.0 - constexpr foo() is 10
// fixed in clang 11.x - correct value is 5
}
这与
a bug in clang 有关.断言的失败是错误的,这是由于在编译时不断评估期间,此表达式在 clang 中的评估顺序错误。该值应为 5。此错误
is already fixed在叮当的行李箱中。
关于c++ - 使用 C++17 排序的链式复合赋值仍然是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64195482/
每次我尝试构建(执行完整的 Clean,然后构建)时,我都会在 Eclipse 的问题部分下弹出此错误消息。项目本身旁边还显示一个错误。 我已经尝试了同一问题的其他解决方案中包含的所有内容: 删除项目
我收到以下错误(注意:我使用的是 Netbeans): java.sql.SQLException: No suitable driver found for jdbc:derby://localho
例如 //somewhere struct IFace; struct Base { Base(IFace* iface): f(iface) { //wi
我试图通过 stringstream 将 double 变成字符串,但它不起作用。 std::string MatlabPlotter::getTimeVector( unsigned int xve
我正在尝试使用 AudioKit 框架中的音序器播放音频文件。 AudioKit.output = sampler AudioKit.start() sampler.enableMID
昨天我问了一个关于插入 Heroku 的问题。它不工作,然后突然开始工作。我什么都没改变。现在在一个新的应用程序上,我遇到了完全相同的问题。我决定包含我的整个 Gemfile,希望我可以继续没有这种令
我知道,这个topic已经是discussed许多times,所以直截了当。 这是ItemsSource的TabControl: Tabs = new ObservableCollection {
我有一个更新对象的函数,问题是当我从更新表单字段返回到详细 View 时,它初始化旧对象而不是更新后的对象。 我想在 CarService 而不是 app.js 中填充汽车列表 这是我的汽车服务:
在 resolution comments错误报告 12266 (“套接字连接错误导致资源泄漏”),Robert Ehteshamzadeh 写道 TClientSocket is deprecate
我最初发布了一个问题 here 我发现 JTextField 仅在 JScrollPane 存在时才调整大小。换句话说,我可以根据需要最小化和最大化它,直到出现滚动条(因为文本太多,无法放入窗口)。之
我读过关于 postion:absolute 的问题并尝试了几乎所有可能的解决方案。包括相对定位 div,将它们包装在相对定位的父级中等等,但它没有帮助。 我正在绘制一个表格,然后我将 div 放入其
我在这里发起了一个话题document.getElementById not working但看起来即使提出的建议都是有效的,我仍然有问题。 我有几个复选框。当我在这里查看页面源代码时,有。 docu
我正在做一些阅读,试图更好地理解按位运算符,然后偶然发现了 a helpful old blog post from 2012 ,其中指出 - 在随机正整数 x 的奇数测试中 - 在作者的计算机上评估
我正在尝试在 Eclipse Neon 中使用 aspectj 创建一个示例 maven 项目。然而,方面并没有编织/工作(参见下面的输出)。我尝试寻找很多原因和解决方案,但没有一个有效(请参阅下面的
无论我如何配置我的 appsettings.json 和 appsettings.Development.json,除非我手动添加 ConfigureLogging,否则我无法在信息消息下方记录任何内
我正在尝试使用 JQuery .get() 方法和 JavaScript for 循环来处理来自外部文件的一些数据。我已经在 stackoverflow 上阅读了有关闭包和回调返回值的内容几个小时,但
我正在使用 PHP 5.6 并且要打印一些东西,我必须编辑 php.ini 并包含 php_printer.dll 文件。但是 PHP 5.6 没有.dll 文件。 我要解决的问题: 我想将凭证打印机
我目前正在调试一个包含内存泄漏的大(非常大!)C# 应用程序。它主要使用 Winforms 作为 GUI,尽管一些控件是在 WPF 中制作的,并由 ElementHost 托管。直到现在,我发现许多内
[已解决] 看来 PHP MYADMIN 变量成功了。我将 wait_timeout 设置为 30 ,并将 Lock_wait_timeout 设置为 50 花了将近 6 个小时才恢复稳定,包括几次重
我读过几个关于该主题的讨论,有人说 qmake < 3.0 不正确支持该指令。我刚刚为 g++-64 重新安装了 Qt 5.9.1,但问题仍然存在。此外,我尝试过各种 mkspecs/xxx/xxx.
我是一名优秀的程序员,十分优秀!