gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:06 24 4
gpt4 key购买 nike

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

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

令人惊讶的是(至少对我而言)这段代码给出了正确的结果。我测试了高达 100000000 的数字,老实说,我无法解释为什么这段代码会这样运行。

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

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

最佳答案

无论您的编译器实际发生了什么,在不返回任何内容的情况下从函数末尾流出是未定义的行为。请注意,如果您将 -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 恰好有分支检查的结果。

当然,这纯属学术讨论;学生的代码是错误的,我肯定会给它零分,不管它是否通过了你运行的任何测试。

关于c++ - 在 C++ 中检查数字是否为奇数。代码的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40468336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com