我是计算机科学的助教,我的一个学生提交了以下代码来检查整数是奇数还是偶数:
int is_odd (int i) {
if((i % 2 == 1) && (i % 2 == -1));
else;
}
令人惊讶的是(至少对我来说)这段代码给出了正确的结果。我测试的数字高达100000000,老实说我无法解释为什么这段代码表现得像。
我们正在使用gcc v6.2.1和c ++
我知道这不是一个典型的问题,但我希望能找到一些帮助。
答案 0 :(得分:15)
在不返回任何内容的情况下流出函数的末尾是未定义的行为,无论编译器实际发生了什么。请注意,如果您将-O3
传递给GCC,或使用Clang,则会得到不同的结果。
至于为什么你真正看到“正确”答案,这是GCC 6.2在-O0
生成的x86程序集:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov eax, DWORD PTR [rbp-4]
cdq
shr edx, 31
add eax, edx
and eax, 1
sub eax, edx
cmp eax, 1
nop
pop rbp
ret
如果您无法阅读x86,请不要担心。需要注意的重要一点是eax
用于返回值,if
语句的所有中间计算都使用eax
作为目标。因此,当函数退出时,eax
恰好会在其中检查分支的结果。
当然,这完全是学术讨论;学生的代码是错误的,我肯定会给它零分,无论它是否通过你所经历的任何测试。