我试图读取这样的文件:
char c;
while ((c = fgetc(fp) != EOF)) { ... }
并且没有进入循环。为什么这段代码不起作用?
我意识到错误是未能在与 EOF
的不等于比较之前放置环绕括号,如下所示:
char c;
while ((c = fgetc(fp)) != EOF) { ... }
但是,我不明白为什么第一个条件不起作用。我测试了它
printf("%d", c = fgetc(fp) != EOF)
,返回 1
。所以问题一定与条件被包裹在 (...)
括号内有关,这似乎使它被评估为 while ( (1) )
.
我敢打赌我误解了 RE:运算符关联顺序,但不确定这里的错误根源。
最佳答案
条件表达式取决于操作的优先级。
事实上在这个while循环中
while ((c = fgetc(fp) != EOF)) { ... }
你可以删除一对外部括号
while ( c = fgetc(fp) != EOF ) { ... }
因为它们不会改变条件的语义。
现在根据运算符优先级,这个循环看起来像
while ( c = ( fgetc(fp) != EOF ) ) { ... }
内部括号 ( fgetc(fp) != EOF )
中的表达式被计算为整数 0 或 1 作为逻辑表达式。
所以结果你会得到任何一个
while ( c = 1 ) { ... }
如果表达式 ( fgetc(fp) != EOF )
的计算结果为逻辑真或
while ( c = 0 ) { ... }
如果表达式的计算结果为逻辑假。
注意变量c
应该声明为int
类型,因为它是函数fgetc
的返回类型可以返回值EOF
。
int c;
while ( ( c = fgetc(fp) ) != EOF ) { ... }
否则,您将比较 char
类型的对象和定义为宏 EOF
的 int
类型的对象。
但是通常 char
类型可以表现为 unsigned char
类型(取决于编译器选项或默认情况下),在这种情况下,由于整数提升char
类型的对象(存储非负值)永远不会等于通常定义为 -1
的 EOF
。 (或像其他一些负值)。
关于c - While 循环中表达式的双括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63476442/