必须包含头文件才能使用printf,否则编译失败;格式符须与参数类型严格匹配,C++推荐类型安全的std::cout替代printf。

用 printf 输出格式化字符串需要包含 <cstdio></cstdio>
直接写 printf("hello %d", 42); 会编译失败,因为 C++ 默认不暴露 C 标准库的函数。必须显式引入头文件:
#include <cstdio>注意不是
<stdio.h></stdio.h>(虽然它通常也能用),C++ 推荐用带 c 前缀、无 .h 的版本,这样符号进入 std 命名空间(不过 printf 是特例,仍可在全局作用域直接调用)。
printf 的格式符必须和参数类型严格匹配
常见错误是整数用 %f、浮点数用 %d,或 64 位整数漏写 ll 前缀,导致输出乱码或崩溃:
-
int x = 123;→ 用%d,不能用%ld(除非你明确声明为long) -
long long y = 1234567890123LL;→ 必须用%lld,%d或%ld都错 -
double z = 3.14159;→ 用%f或%.2f,不用%lf(C++ 中%lf和%f等价,但语义上float才该用%f,double用%f即可) - 字符串指针用
%s,不是%c;单个字符才用%c
C++ 更推荐用 std::cout 而不是 printf
虽然 printf 短小高效,但它不类型安全:编译器无法检查格式串和参数是否匹配,出错只能靠运行时行为判断。而 std::cout 是类型安全的:
int a = 42;<br>double b = 3.14;<br>std::cout << "value: " << a << ", pi ≈ " << b << std::endl;
不需要记格式符,不会因类型错配崩溃;配合 <iomanip></iomanip> 也能做对齐、精度控制(如 std::setprecision(2))。只有在性能极端敏感、且格式固定(比如日志批量输出)的场景下,才值得回到 printf。
立即学习“C++免费学习笔记(深入)”;
混合使用 printf 和 std::cout 可能导致输出顺序混乱
两者默认使用不同的缓冲机制:printf 缓冲在 C 运行时层,std::cout 在 C++ I/O 流层。如果没手动同步,输出可能错序:
printf("first");<br>std::cout << "second";<br>// 实际输出可能是 "secondfirst"
解决办法有三个:
- 统一用一种方式(最稳妥)
- 调用
std::ios_base::sync_with_stdio(false)关闭同步(但之后不能再混用 C 和 C++ I/O) - 手动刷新:
fflush(stdout)或std::cout
真正写项目时,几乎没人刻意混用——这不是功能问题,而是维护成本和可读性的隐形陷阱。


















