gpt4 book ai didi

c - 在没有副作用的情况下对 bool 操作数进行短路

转载 作者:太空狗 更新时间:2023-10-29 17:04:44 26 4
gpt4 key购买 nike

对于赏金:如何在不禁用或降低优化级别的情况下根据具体情况禁用此行为?

以下条件表达式是在 MinGW GCC 3.4.5 上编译的,其中 asigned long 类型的 a,m 是输入 unsigned long

if (!a && m > 0x002 && m < 0x111)

使用的CFLAGS-g -O2。这是相应的汇编 GCC 输出(使用 objdump 转储)

120:    8b 5d d0                mov    ebx,DWORD PTR [ebp-0x30]
123: 85 db test ebx,ebx
125: 0f 94 c0 sete al
128: 31 d2 xor edx,edx
12a: 83 7d d4 02 cmp DWORD PTR [ebp-0x2c],0x2
12e: 0f 97 c2 seta dl
131: 85 c2 test edx,eax
133: 0f 84 1e 01 00 00 je 257 <_MyFunction+0x227>
139: 81 7d d4 10 01 00 00 cmp DWORD PTR [ebp-0x2c],0x110
140: 0f 87 11 01 00 00 ja 257 <_MyFunction+0x227>

120-131 可以很容易地追踪到首先评估 !a,然后评估 m > 0x002。第一个跳转条件直到 133 才会发生。此时,已经计算了两个 表达式,而不管第一个表达式的结果如何:!a。如果 a 等于零,则表达式可以(并且应该)立即结束,这里没有这样做。

这与 C 标准有什么关系?C 标准要求 bool 运算符在确定结果后立即短路?

最佳答案

C 标准只规定了“抽象机”的行为;它没有指定程序集的生成。只要程序的可观察行为与抽象机器上的行为相匹配,实现就可以使用它喜欢的任何物理机制来实现语言结构。标准 (C99) 中的相关部分是 5.1.2.3 程序执行。

关于c - 在没有副作用的情况下对 bool 操作数进行短路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7355414/

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