最近在 Fedora Linux 上,gcc 和 clang 的版本可以编译以下程序而不出现错误:
#include <ctype.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
char c = 'a';
if islower(c)
printf("%d", c);
else
printf("%c", c);
return 0;
}
这是使用gcc 4.7.2和clang 3.0进行的。在我的Mac上,相反,gcc 4.2.1和Apple clang 4.1都会抱怨“if islower(c)”行缺少括号,这是预期的。在所有情况下,我都使用“-std=c99”运行编译器。
这是最近版本的gcc和clang中的一个错误、C语言的怪癖还是其他原因? C99标准(http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf p. 133)似乎要求在所有情况下都要在if表达式周围加上括号。
if 42 printf("42!\n");
如果可以,那么这是表达式的有趣用法。正式地说,如果我们忽略if
,42
和(42)
是相同的。对于islower(c)
和(islower(c))
也是如此。 - Alexey Frunze