【问题标题】:Does the output depend on the compiler? [duplicate]输出是否取决于编译器? [复制]
【发布时间】:2023-02-06 15:41:07
【问题描述】:

我有一个代码。代码打印1236 (g++ 7.5.0)

输出是否取决于编译器? (例如输出可以是3216

#include <bits/stdc++.h>


using namespace std;


int foo(int& x) {
    std::cout << ++x; 
    return x;
}


int main() {
    int i = 0;
    cout << foo(i) + foo(i) + foo(i) << endl; // 1236
}

【问题讨论】:

  • 第一行已经是不可移植的 C++。其他编译器甚至可能不会编译这个
  • @463035818_is_not_a_number “不要”。其他编译器编译这个。没有“可能”。特别是 MSVC。
  • 具体关于foo(i) + foo(i) + foo(i)部分;我相信它是便携式的。三个foo 调用的计算顺序未指定,但代码经过安排,无论顺序如何,它都会产生相同的结果。这三个调用是等价的,因此哪个先调用或后调用都没有关系。

标签: c++ c++17


【解决方案1】:

不,输出不依赖在编译器上(对 bits/stdc++.h 取模废话)。三个调用 foo(i) 的计算顺序未指定,但这不影响输出:函数调用不交错,所以一些调用会将 i 递增到 1,打印并返回它(作为复制),然后另外两个将分配、打印并返回 2,然后最后一个将执行 3,并且它们的返回值总和为 6。

请注意,如果 foo 返回int&amp;,最后的输出可能是任何数字 6–9,因为实现可能不会选择读取 i 以在返回时立即进行加法运算。但是,行为仍将被定义,因为这些读取将是不确定的顺序关于任何写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多