以下脚本应该计算从0到4的整数平方和.
数学上,0²+1²+2²+3²+4²= 30,但在Python 3.2上运行时脚本打印4!为什么?
total = 0
for val in range(5):
v?l = val * val
t?tal = total + val
print(t?tal)
Run Code Online (Sandbox Code Playgroud) C和C++标准规定执行顺序必须严格遵循源指令顺序.编译器可以按任何顺序自由地评估指令中的子表达式,但不能重新排序用分号或冒号分隔的指令.
例如,在指令中:
A = A + B * C + D * E;
Run Code Online (Sandbox Code Playgroud)
编译器可能选择在B*C之前执行D*E,或者在结尾添加A.
如果现在将相同的计算拆分为各种指令:
int t1 = B * C;
t1 += D * E;
A += t1;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器无法在B*C之后评估D*E.
通常,这种代码稍微慢一点,因为编译器无法优化特定硬件的CPU指令的顺序.
我想做的是相反的方式.例如,如果展开的循环的主体读取:
A[0] = B[0] * C[0];
A[1] = B[1] * C[1];
A[2] = B[2] * C[2];
A[3] = B[3] * C[3];
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉编译器这四条指令可以按任何顺序进行评估,因为它们对不同的数据进行操作?即使是非便携式技巧也是受欢迎的.
我的代码:
#include<iostream>
int main(){
int n=2;
std::cout << "hello world"+n<<std::endl;
printf("hello world");
}
Run Code Online (Sandbox Code Playgroud)
我试图像java语法一样打印变量C++,只是作为一个实验。但是输出:
llo world
hello world
Run Code Online (Sandbox Code Playgroud)
谁能解释一下?
我在我们的 C++ iOS 应用程序中发现了一个严重的错误,我怀疑这是由基于 ARM 的 Apple Clang 上的编译器错误引起的。
我能够在 Mac M1 机器上的 MRE 中重现该错误。
#include <cstdio>
int main(int argc, const char** argv)
{
int total = 0;
for(double a=1000; a<10000; a*=1.1)
{
unsigned char d = a / 0.1;
total += d;
}
printf("Total: %d\n", total);
}
Run Code Online (Sandbox Code Playgroud)
在没有优化的情况下编译,测试程序总是产生相同的输出:
% ./a.out
Total: 3237
% ./a.out
Total: 3237
% ./a.out
Total: 3237
Run Code Online (Sandbox Code Playgroud)
然而,当进行优化编译时,结果数字似乎是随机的:
% clang -O3 test.cpp
% ./a.out
Total: 74841976
% ./a.out
Total: 71057272
% ./a.out
Total: 69828472
Run Code Online (Sandbox Code Playgroud)
Apple Clang …