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 值)永远不会等于通常定义为 -1
的 EOF
。 (或像其他一些负值)。
我正试图读取这样的文件:
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 值)永远不会等于通常定义为 -1
的 EOF
。 (或像其他一些负值)。