【发布时间】:2020-08-18 20:51:18
【问题描述】:
我正试图读取这样的文件:
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:运算符关联顺序,但不确定这里错误的根源。
【问题讨论】:
-
我不确定如何解释与
printf的区别,但char是c的错误类型;fgetc返回一个int,因为EOF不应与任何char冲突。 -
不是双括号有区别,而是
!=的higher precedence 比=多。 -
赋值表达式在赋值之后具有左操作数的值,这意味着 c = fgetc(fp) 将是 ascii 字符碰巧具有的任何值。尝试在条件之外做作业。
-
我无法重现这一点。它以
c=1为我进入循环,直到它到达EOF,此时它以c=0退出。你是如何确定没有进入循环的? -
@thatotherguy 这是我的错误。我在循环内打印字符以显示正在读取的内容。但是,我将它打印为
char,而实际上它正在评估为int,如前所述。所以我想我看到的是垃圾输出或什么都没有。诚然,这不是一个很好的测试方法。
标签: c while-loop char eof fgetc