【发布时间】:2012-10-02 15:05:51
【问题描述】:
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,这并不完全正确,因为 C 语法在此特定上下文中需要括号。恰好这里的括号是由宏提供的。
-
Jelle,这就是为什么我说“这是一种有趣的表达方式”,因为据我所知,括号是必需的。