为什么这个C++代码在不同的编译器上给出不同的输出
Why does this C++ code give different output on different compilers?
我意识到SO上有很多关于这个标题的问题,但我发现的所有问题都做了i = ++i
或f(f(f(x)))
之类的事情,这两个问题都不在本代码中。这是一个回溯解决方案的尝试。我在C方面有一些经验,但我刚刚开始尝试学习C++,我一直在练习Codeforces问题。下面的片段是程序的主体。main
处理输入和输出,我没有显示。为了使solve
的每个堆栈帧尽可能小,我在这里为weights
、answer
和max_depth
使用了全局变量。
造成故障的输入是weights = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
和max_depth = 1000
。当我用g++ std=C++11 file.cpp
编译它时,它给出了"4 3 2 3 4 3 3 4…3 2 1",这是正确的答案。当Codeforces编译它时,它会给出"9 10 9 10 9 9 9 10…",这是不正确的。我的猜测是,for(int i : weights)
遍历向量的顺序不是由标准定义的,但即使如此,我也不明白为什么它会有任何不同。我错过了什么?
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
string answer = "";
vector<int> weights;
int max_depth;
bool solve(int left_scale, int right_scale, int last_added, int depth){
bool is_left = (depth % 2) == 0;
int new_weight;
int weight_to_inc = is_left ? left_scale : right_scale;
int weight_to_exceed = is_left ? right_scale : left_scale;
if (depth == max_depth){
return true;
}
for(int i : weights){
if (i != last_added){
new_weight = weight_to_inc + i;
if (new_weight > weight_to_exceed){
bool ans = solve(is_left ? new_weight : left_scale,
is_left ? right_scale : new_weight,
i, depth + 1);
if (ans){
stringstream ss;
ss << i;
answer.append(ss.str() + " ");
return true;
}
}
}
}
return false;
}
void start_solve(void){
if (solve(0, 0, 0, 0)){
return;
}
answer = "";
}
(我提交的完整代码,如果有什么不同的话,就在这里。)
编辑:
如果有人在寻找Codeforces问题的答案时遇到了这个问题:这个代码的问题是"答案"颠倒了。将answer.append(ss.str() + " ")
更改为answer = ss.str() + answer
是使其工作的最短修复。
为什么这个C++代码在不同的编译器上给出不同的输出?
它不会给出不同的输出。
当我用g++std=C++11 file.cpp编译这个文件时,它给出了"4 3 2 3 4 3 3 4…3 2 1",这是正确的答案。当Codeforces编译它时,它会给出"9 10 9 10 9 9 9 10…",这是不正确的。
我认为您误解了代码部队服务器上的测试结果。
正确答案是"9 10 9 10…"
您的程序在代码部队服务器和本地工作站上的输出都是"4 3 2 3 4 3…"。
所以你的算法是错误的,程序的输出是一致的。
您混淆了测试结果上的两个字段"Output"answers"Answer"。
再次检查您的测试结果。
- C++编译器命令 C++ 不会生成输出
- 编译器资源管理器和 GCC 具有不同的输出
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- 在MSDOS编译器上,用大于最大值的值初始化int时输出混乱
- 我不明白我的编译器是如何获得此输出的
- C++编译器只显示数字,不显示正确的输出
- 乘以时输出错误.这是我编译器中的错误吗?C
- Web 编译器输出奇怪的结果
- 输出错误:两个不同编译器上的不同输出:Prime Cryptarithm USACO
- 编译器将输出的流运算符<<解释为用于按位左移的二进制运算符<<
- 构建 C/C++ 代码时的 Gradle 编译器输出
- C 编译器输出由于Permisson误差而未运行
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- VS说"Too few arguments...",但其他编译器给了我正确的输出?
- GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6
- 以下代码的输出是什么(答案因差异编译器而异)
- 简单构造函数的复杂编译器输出
- C++程序中的输出编译器版本
- 最后的所有输出——c++编译器