gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:59:31 27 4
gpt4 key购买 nike

我试图读取这样的文件:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com