C语言中,关于 scanf() 函数的返回值

起因

看到有一个问答贴,关于 ~符号的疑问,详情 goto 请教一下,scanf前面的~是什么意思啊?

基础知识

  • ~ 取反运算符;

    • 取反运算符公式: n=-(n+1)
    • 例如 2 的取反为 -3 ,-1的取反等于0,0的取反等于-1
  • C语言中,scanf()函数的返回值;假设返回值为 result

    • result > 0 , 表示正确输入参数的个数, 如题 scanf("%d %d", &a, &b),输入两个正确的int数字,则返回 2
    • result = 0,如果一个输入 整数1,一个输入字母a,这个时候返回 0
    • result = EOF,通常 EOF=-1,表示输入流已经结束;
      • 什么情况下会导致EOF ?
      • CTRL+D表示输入结束,或者CTRL+C ,具体可以尝试一下。
  • C语言中, scanf()函数的返回值的三种情况,对应的取反值

    • 输入正确的两个数字,scanf返回值=2,取反值=-3
    • 输入一个正确的数字,一个错误类型如英文字母,scanf返回值=0,取反值=-1
    • 执行Crtl + Cscanf返回值=-1,取反值=0
  • C语言中,关于 while(condition) 循环

    • condition 当为任意非零值时都为 true,也就是0为 false,其他数都是 true
    • 当条件为 true 时,执行循环
    • 当条件为 false 时,退出循环

示例代码

#include<stdio.h>
int main()
{
    int a,b;
    int result;
    while(1) {
        result = scanf("%d%d", &a, &b);
        printf("result=%d\n", result);
        printf("~result=%d\n", ~result);
        if(result == 0) {
           printf("Error:params error,not int.\n");
           break;
        }
        if(~result == 0) {
           printf("Exit:end of input stream.\n");
           break;
        }
        if(result == 2) {
           printf("a+b=%d\n",a+b);
        }
    }
    return 0;
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
明天我们吃什么 悲哀藏在现实中 Tacks
讨论数量: 2

关于上个帖子,我觉得真没必要搞这种操作。万一换到这种平台:

  • EOF != -1
  • 或,不用补码,而用原码、反码等来计算的

就要死循环了。

相比之下,while(scanf(...)) 都比 while(~scanf(...)) 好。。

至少 EOF != -1、原码、反码、补码,都能正常运行。。

1年前 评论
Tacks (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!