之前『printf("%d", (1, 2), 3);』一文给大家讲解了一段有趣但是没什么卵用的代码,今天再来讲一个:
printf("%d", printf("%d%d", 1, 2));
老规矩,写个 Demo 跑一遍:
#include <stdio.h>
int main() {
printf("%d", printf("%d%d", 1, 2));
return 0;
}
打印的结果为 122
。
这次的代码相比之前的要复杂一丢丢,没关系,跟着我一步步来解释。
最外层是 printf()
函数,其值为后面表达式的值,因此需要先计算后面的表达式。
后面的表达式同样也是一个 printf()
函数,这个表达式就非常简单了,跟我们平常使用无差,就是 12
。
所以最外层的 printf()
函数获取的 %d
的值就是 2
。这时候你可能会有点儿懵,为什么程序不会报错呢?
我们经常使用的 printf()
是在 C 语言中产生格式化输出的函数,定义在「stdio.h」头文件中,虽然我们常常是直接写这一行就完事了,但实际上,printf()
是有返回值的,返回值的类型为 int
,和 %d
对应上了,因此程序可以正常运行不会报错。
那么这个返回值的含义是什么呢?我们可以写几个 Demo 来看看:
#include <stdio.h>
int main() {
int result = printf("%s", "ab");
printf("%d", result);
return 0;
}
打印结果为 ab2
,可以知道,打印字符串 ab
的返回值为 2
。
#include <stdio.h>
int main() {
int result = printf("%s", "abc");
printf("%d", result);
return 0;
}
打印结果为 abc3
,可以知道,打印字符串 abc
的返回值为 3
。
根据规律不难得出,该返回值实际上就是格式化数据替换后整个字符串的总字符个数,这也就解释了文章最开始时的程序输出结果。
最后再结合一下上次的文章,下面这段代码的打印结果是什么:
printf("%d", printf("%d", 1, 2));
结果是 11
,因为里层的 printf()
函数只打印了 1 个字符。
另外需要注意的是,像 \n
之类的转义字符也同样会计入字符个数中。