容易忽视CC++语言中的printf()函数和scanf

容易忽视CC++语言中的printf()函数和scanf,第1张

文章目录
  • 前言
  • 一、scanf()函数返回值
  • 二、printf()函数的返回值
    • 1.我们先看一下代码和结果
      • 代码
      • 程序结果
    • 2.这个返回值到底是什么?
    • 3.返回的值到底是什么?
      • 得到的结果
    • 4.解释一下最上面那个问题
  • 总结


前言

在讲这两个函数返回值之前我们先看下面这个代码:

  char a = 65;
  int x, y, z,k;
  z = scanf("%d", &y, &z);
  x = printf("%c,%d\n", a, k, a, x, y);

大家是觉得这个程序有错?还是程序正常运行?

这道题的结果和原因我会在下面解释

一、scanf()函数返回值
z = scanf("%d", &y);

这个返回值其实很理解,给你要输入的值分配空间,如果分配成功返回1,否则返回0;可以理解成bool类型。

二、printf()函数的返回值 1.我们先看一下代码和结果 代码
#include 
#include 
#include 
using namespace std;
int main()
{
  int k = 115;
  char a = 65;
  int x, y, z;
  x = printf("a,k value is:%c,%d\n", a, k);
  char str1[] = "a,k value is:%c,%d\n";
  string str2 = "a,k value is:%c,%d\n";
  printf("x value is:%d\n", x);
  printf("C string Length: %d\n", strlen(str1));
  printf("C++ string Length: %d\n", str2.length());
  system("pause");
  return 0;
}

解释一下,这里用的是C++,但C++理论上是完全兼容C语言。

用C++的原因是因为想知道字符串类型在C++中字符串所占的字节。



程序结果


相信看了代码和结果的你和我可能都会得出同一个结论:printf()函数的返回值就是print()函数中的第一个参数:字符数组的长度。


但事实真的如此吗?

2.这个返回值到底是什么?

我们来稍微改动一下上面的代码,我们将第七行的代码中的k赋值为15.我们再来看一下结果是什么?

x的值变成了18,但是字符串的长度依旧是19
这个结果直接否定了上面我们上面的结论


3.返回的值到底是什么?

结果查找书籍以及相关资料得到这样一个结论:**printf()的返回值是输出的字符串的字节数。

**是不是又觉得这句话和上面得出的结论有点像?
那该怎么理解呢?我们在之前的代码的第10行加两个汉字。

 x = printf("我们a,k value is:%c,%d\n", a, k);
得到的结果


这里X的值变成了22。

因为一个汉字在gbk编码下占两个字节,两个汉字也就是4个字节,22=18+4;
所以其实上面那句话简单的理解就是:
printf()函数返回的值其实是屏幕上输出的值所占的字节数(同时包括换行符等符号所占的字节数)
这里简单的提一下printf()函数的源代码:

初读这个源代码可能不能得到什么东西,唯一能看懂的可能就是返回值就是一个int类型,但是本质上它的返回值就是在屏幕上输出值所占的字节。


所以如果你用 *** 作运算符sizeof(这里是printf的返回值)得到的答案只与你 *** 作系统对int类型所分配的空间有关!!!



4.解释一下最上面那个问题

首先那个问题的答案:程序会正常执行,但只读到你所指定的值和类型
例如下面这两行执行之后结果就是:给y赋值成功就返回1,并不能给z赋值。

输出字符变量a,和整形变量k的值。

不会输出剩下的变量a,x,y的值。

 z = scanf("%d", &y, &z);
 x = printf("%c,%d\n", a, k, a, x, y);

但其实相信大家已经看到了上面源代码的截图,看到了其实就更好理解了。

注意看:
划线的部分,printf()函数的第二个参数并没有指定只有一个变量(scanf()函数的参数也是一样),所以后面不管是几个变量,只会匹配到你所指定的类型,剩余的没匹配上但程序也并不会报错。




总结

我们在初学C语言时对scanf()和printf()函数用的非常多,但是突然问你它们的返回值可能你就会很懵圈。

可能最简单的部分则是我们最容易忽视的点。

所以在学了c语言最最主要的部分之后,可以适当的阅读一些封装好的源代码,来帮助自己更好的理解。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/673363.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存