While 循环中表达式的双括号

Double parenthesis around expression in While loop

我正试图读取这样的文件:

char c;
while ((c = fgetc(fp) != EOF)) { ... }

并且没有进入循环。为什么此代码不起作用?

我意识到错误是未能在与 EOF 的不等于比较之前放置环绕括号,因此:

char c;
while ((c = fgetc(fp)) != EOF) { ... }

但是,我不明白为什么第一个条件不起作用。我测试了它 printf("%d", c = fgetc(fp) != EOF),以及 returns 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的return类型可以return 值 EOF.

int c;
while ( ( c = fgetc(fp) ) != EOF ) { ... }

否则,您将比较 char 类型的对象和定义为宏 EOF.

int 类型的对象

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