检查c ++中的数字是否为奇数。代码的奇怪行为

时间:2016-11-07 15:04:08

标签: c++ compilation

我是计算机科学的助教,我的一个学生提交了以下代码来检查整数是奇数还是偶数:

int is_odd (int i) {
    if((i % 2 == 1) && (i % 2 == -1));
    else;
}

令人惊讶的是(至少对我来说)这段代码给出了正确的结果。我测试的数字高达100000000,老实说我无法解释为什么这段代码表现得像。

我们正在使用gcc v6.2.1和c ++

我知道这不是一个典型的问题,但我希望能找到一些帮助。

1 个答案:

答案 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恰好会在其中检查分支的结果。

当然,这完全是学术讨论;学生的代码是错误的,我肯定会给它零分,无论它是否通过你所经历的任何测试。