c - While 循环中表达式的双括号

标签 c while-loop char eof fgetc

我试图读取这样的文件:

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 类型的对象和定义为宏 EOFint 类型的对象。

但是通常 char 类型可以表现为 unsigned char 类型(取决于编译器选项或默认情况下),在这种情况下,由于整数提升char 类型的对象(存储非负值)永远不会等于通常定义为 -1EOF。 (或像其他一些负值)。

关于c - While 循环中表达式的双括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63476442/

相关文章:

objective-c - acosf() 返回 NaN

使用 scanf 询问输入时产生无限循环的代码

c++ - 从 char 字符串 c++ 中删除新行

python - 如何使用 Pandas 将字符串转换回列表

c - 我在哪里可以假定空字符将在 C 中自动添加?

c - 创建后 Lua c API 更改库

c# - C#游戏中While循环崩溃

javascript - 在 while 循环中定义变量

c - while(scanf ("%d",&n),n) 是什么意思?

c - 在字符指针数组中打印元素时未确定的行为?