我不假思索地编写了一些代码来检查结构的所有值是否都设置为0.为了实现这一点,我使用了:
bool IsValid() {
return !(0 == year == month == day == hour == minute == second);
}
Run Code Online (Sandbox Code Playgroud)
其中所有struct成员都是unsigned short类型.我使用代码作为更大测试的一部分,但注意到它对于不等于零的值返回false,对于全部等于零的值则返回true - 与我预期的相反.
我将代码更改为:
bool IsValid() {
return (0 != year) || (0 != month) || (0 != day) || (0 != hour) || (0 != minute) || (0 != second);
}
Run Code Online (Sandbox Code Playgroud)
但是想知道是什么导致了奇怪的行为.这是优先的结果吗?我试过谷歌这个答案,但没有发现任何东西,如果有任何术语来描述我想知道它的结果.
我使用VS9和VS8编译了代码.
我最近注意到以下表达式在我的编译器(Clang)中编译:
float a;
if (0.0 < a < 1.0) { ... }
Run Code Online (Sandbox Code Playgroud)
这是否符合我的期望?我希望它的评估与这种情况相同:
if (0.0 < a && a < 1.0) { ... }
Run Code Online (Sandbox Code Playgroud)
如果是这样,那么何时以及与其他编译器一起编写这种简短形式的条件?
考虑:
#include<stdio.h>
int main() {
if (2 >= 1 >= 1)
printf("1\n");
if (200 >= 100 >= 100)
printf("2\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
nyc @ nyc:〜/ PRG $ gcc sample.c
nyc @ nyc:〜/ PRG $ ./a.out 1
为什么即使第二个表达式的计算结果为TRUE,该程序也只打印1?