关于c语言循环与布尔运算的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于c语言循环与布尔运算的问题相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
int main(void)

long num;
long sum = 0L;
_Bool input_is_good;
printf("Please enter an integer to be summed ");
printf("(q to quit): ");
input_is_good = (scanf_s("%ld", &num) == 1);
getchar();
while (input_is_good)

sum = sum + num;
printf("Please enter next integer (q to quit): ");
input_is_good = (scanf_s("%ld", &num) == 1);
getchar();

printf("Those integers sum to %ld", sum);
getchar();
return 0;

为什么这个代码不论输入1还是0还是2等整数,都无法跳出循环?
而用下面的这个,可以正常运行。
#include <stdio.h>
int main(void)

long num;
long sum = 0L;
_Bool input_is_good;
printf("Please enter an integer to be summed ");
printf("(q to quit): ");
scanf_s("%ld", &num);
getchar();
input_is_good = num == 1;
while (input_is_good)

sum = sum + num;
printf("Please enter next integer (q to quit): ");
scanf_s("%ld", &num);
getchar();
input_is_good = num == 1;

printf("Those integers sum to %ld", sum);
getchar();
return 0;

P.S. 我用的是vs2017
还有为什么输入字母就能结束循环?

input_is_good = (scanf_s("%ld", &num) == 1);

只要scanf_s完成一次成功的整形输入,input_is_good就为true

MSDN对scanf_s返回值的解释:

Returns the number of fields successfully converted and assigned; the return
value does not include fields that were read but not assigned. A return value of
0 indicates that no fields were assigned.也就是只有一个变量都没有赋值就才会返回0,只有这种情况才会使得input_is_good 为假

参考技术A 这跟bool逻辑没关系,而是你不了解scanf。scanf的返回值不是被输入参数(实际上也不可能做到这一点)。而是成功赋值参数的个数。你很有探究精神,发现输入字母会退出,这是因为输入字母导致匹配%d失败返回0导致的。反之,不论你输入的是0还是1还是2,都属于赋值成功,所以返回1追问

那为什么第一种不论输什么数字都在循环里,而第二种输入非1的数字就能跳出循环,这两种不应该本质上是一样的吗?

追答

仔细读我的回答,您会发现本质差很多。我的回答对于您的这个问题来说已经足够到位了,当然,如果您对我的回答的理解有问题的话请务必留言。不一定能马上解答,但是一定会回答的。

追问

为什么 input_is_good = (scanf_s("%ld", &num) == 1); 读取scanf的返回值,
而 scanf_s("%ld", &num);
getchar();
input_is_good = num == 1; 读取的就是输入的参数。
十分感谢!

参考技术B 和函数的返回值有关系 参考技术C


如图

以上是关于关于c语言循环与布尔运算的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于c语言中enum类型与循环

C语言中位移位运算符?

C 语言高效编程与代码优化

C 语言高效编程与代码优化

C语言一个符号问题!!

c语言:关于scanf()语句与while循环的问题