【发布时间】:2020-06-25 17:47:35
【问题描述】:
我的代码:
while(scanf("%f", &number) && number > 0)
while(scanf("%f", &number) == 1 && number > 0)
== 1 是什么意思,这有必要吗?
【问题讨论】:
标签: c loops while-loop scanf
我的代码:
while(scanf("%f", &number) && number > 0)
while(scanf("%f", &number) == 1 && number > 0)
== 1 是什么意思,这有必要吗?
【问题讨论】:
标签: c loops while-loop scanf
正如Weather Vane 在comments 中所说,如果scanf() 返回EOF(文件结束或-1),则==1 很重要,这将被评估为true,并且由于number 与上一次迭代保持不变,while 循环的条件将被评估为 true。
这是不合适的,因为我们在扫描过程中出现错误,条件应该是false 或0。
【讨论】:
在这种情况下,scanf 将返回三个 int 值之一。
EOF:流结束或读取错误的负值,(如果要区分后一种情况,请参阅 ferror(stdin) 或 !feof(stdin),在符合 POSIX 的系统上,将设置 errno, )0:匹配错误,并且1:一个成功匹配的浮点数,存储在number中。因此,
while(scanf("%f", &number) && number > 0)
while(scanf("%f", &number) == 1 && number > 0)
第一个scanf("%f", &number) [!= 0] && ... 将在[0] 上返回false,在[EOF, 1] 上返回true。在1 上,对于一个变量,它会按预期工作,但在EOF 上,它会沿着短路继续从未初始化的内存中读取;在下一次调用scanf 时,它可能会挂起等待来自stdin 的输入(很可能)已关闭。
第二个scanf("%f", &number) == 1 && ... 将在[EOF, 0] 上返回false,在[1] 上返回true。这明确确认在继续下一条语句之前已写入变量。这更健壮,可以同时处理匹配和读取错误,并且可以正常工作到第二个谓词以检查它是否在域中。
但是,它并没有记录循环停止的原因,后续的读取可能会出现问题。要获取该信息,可以将一个变量分配给scanf 的返回值。
【讨论】: