之前『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 之类的转义字符也同样会计入字符个数中。