代码(C++14):
#include <cstdio>
struct Node {
int x;
};
Node f(int A, int B) {
if (A < 0) return {0};
return {A / B + (A % B != 0)};
}
Node g(int C, int D) {
if (C > 0) return {0};
return {C / D + (C % D != 0)};
}
int main() {
int n;
scanf("%d", &n);
f(1, 1);
Node t = g(-1, n);
printf("%d\n", t.x);
}
输入:
2
输出:
1
以上代码在使用 GCC 9.2 及以上版本编译并开启 O2 优化时输出 0,不开 O2 优化时运行结果正常,使用 Clang 编译时运行结果正常。
注意到 GCC 9.2 没有为 C % D != 0
生成相应的汇编代码:
@@ -19,12 +19,8 @@
ret
.L7:
mov eax, edi
- xor edi, edi
cdq
idiv esi
- test edx, edx
- setne dil
- add eax, edi
ret
.LC0:
.string "%d"
@@ -37,13 +33,10 @@
lea rsi, [rsp+12]
call __isoc99_scanf
mov eax, -1
- xor esi, esi
mov edi, OFFSET FLAT:.LC1
cdq
idiv DWORD PTR [rsp+12]
- test edx, edx
- setne sil
- add esi, eax
+ mov esi, eax
xor eax, eax
call printf
xor eax, eax
问题来源:关于语言类型 - 洛谷