有人可以告诉我为什么以下代码编译(参见下面的getchar)?我有一段时间没写C,但我很确定getchar行不应该允许这个编译。刚安装的VS2013 Pro使用/ Za + / Wall编译为C.寻找C99合规性。
int count_lines(void) {
char c;
int num_of_lines = 0;
while ((c = getchar) != EOF) // compiles as getchar instead of getchar()
if (c == '\n') ++num_of_lines;
return num_of_lines;
}
答案 0 :(得分:2)
此:
c = getchar
尝试将函数getchar
的地址分配给char
对象c
。
这是约束违规,这意味着任何符合要求的C编译器都必须发出诊断。该诊断可能在法律上是一个非致命的警告,并且仍然允许编译器生成“工作”可执行文件 - 尽管它的行为不是由标准定义的。
如果编译器没有完全拒绝它,它很可能会生成函数指针值到类型char
的转换。该标准没有定义这种转换的行为(但它可能采用地址的低8位。这不太可能与EOF
的值匹配,从而导致无限循环。)
我确定你知道,行
while ((c = getchar) != EOF)
应该是
while ((c = getchar()) != EOF)
正如您可能没有注意到的那样,getchar()
函数返回类型为int
的结果,而不是char
,因此可以将值EOF
与任何值区分开来有效的字符值。您应将c
声明为int
,而不是char
。参见comp.lang.c FAQ的问题12.1。
答案 1 :(得分:1)
我确定你有一个编译器警告。但它编译是因为你正在做的是将c
设置为函数getchar
的地址(当然你只获得地址的最低字节)。
答案 2 :(得分:0)
您是否只是将c分配给getchar函数的地址值。这可能不是你想要的但不是非法的。
gcc -g -o test test.c
test.c: In function ‘count_lines’:
test.c:7:15: warning: assignment makes integer from pointer without a cast [enabled by default]
while ((c = getchar) != EOF) // compiles as getchar instead of getchar()