我在Linux上尝试使用time -p命令,并编写了一些代码来浪费CPU周期:
#include <iostream>
using namespace std;
int main() {
long int c;
long int ss;
for(c = 0;c < 10000000;c++) {
ss += c*c;
}
cout<<ss<<endl;
return 0;
}
但是在运行几次之后我发现了一些有趣的东西,但是:
me@octopus:~/Desktop> ./test
1292030741067648912
me@octopus:~/Desktop> ./test
1292030742538841328
me@octopus:~/Desktop> ./test
1292030742228685600
me@octopus:~/Desktop> ./test
1292030740402651312
me@octopus:~/Desktop> ./test
1292030740207543344
me@octopus:~/Desktop> ./test
1292030740346553856
me@octopus:~/Desktop> ./test
1292030741629275040
me@octopus:~/Desktop> ./test
1292030740397307072
me@octopus:~/Desktop> ./test
1292030742928964784
me@octopus:~/Desktop> ./test
1292030741780094096
我不仅每次都没有获得相同的数字,正如我所料,我甚至没有得到相同的数字。这是怎么回事?
答案 0 :(得分:10)
您尚未将ss初始化为零,因此其初始值未定义。你需要:
long int ss = 0;
答案 1 :(得分:5)
您尚未初始化ss
。初始值可以是任何值。
long int ss = 0;
答案 2 :(得分:3)
您必须初始化ss
,否则会产生无法预测的结果。
long int ss = 0;
未初始化的变量在C和C ++中具有未确定的值,与Java和C#等其他编程语言不同,它们根据类型获得正确的默认值。因此,请注意C / C ++。
答案 3 :(得分:2)
ss += c*c;
总是不同的,因为在循环的第一次迭代中,ss总是随机的。
您必须先将其初始化为0才能按预期工作。
答案 4 :(得分:1)
听听编译器的说法很有意思:
#include <cstdio>
int main() {
long int ss;
for(long int c = 0; c < 10000000; c++) {
ss += c*c;
}
printf("%ld", ss);
return 0;
}
(我使用C IO,因为它在IR中产生较少的垃圾,但行为与流类似)
检索以下LLVM IR(已启用优化):
define i32 @main() nounwind uwtable {
%1 = tail call i32 (i8*, ...)* @printf(c"%ld\00", i64 undef)
ret i32 0
}
我相信undef
能说明问题。