问题问,
让 int x = 1,找到一个 int y 的值,其中以下语句将返回 false:
(x < y) == (-x > -y)
我知道答案应该是 4 个字节长(8 个十六进制数字),但我不知道如何解决这个问题。
没有任何值y
的表达式为假。如果我们编译这个:
int test(int y)
{
int x = 1;
return (x < y) == (-x > -y);
}
Run Code Online (Sandbox Code Playgroud)
启用优化的 gcc 和 clang 都会生成以下代码:
test(int):
mov eax, 1
ret
Run Code Online (Sandbox Code Playgroud)
任何其他认为聪明的答案很可能使用溢出,实际上是未定义的行为或误解了一些 C 基础知识。
实际上,没有任何值x
或y
表达式为假的值:
int test(int x, int y)
{
return (x < y) == (-x > -y);
}
Run Code Online (Sandbox Code Playgroud)
给出相同的:
test(int, int):
mov eax, 1
ret
Run Code Online (Sandbox Code Playgroud)
似乎有些人忽略了编译器将表达式转换为return 1
. 这证明编译器已明确证明不存在表达式为假的有效输入。否则它不会被允许进行这种优化。