前言
在讲这两个函数返回值之前我们先看下面这个代码:
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 <iostream>
#include <stdlib.h>
#include <string.h>
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语言最最主要的部分之后,可以适当的阅读一些封装好的源代码,来帮助自己更好的理解。
|