打印上的输出
output on the printf
有没有人可以给我一个重要而简单的解释,我试图理解这个程序下面的关于 C 编程中的 printf 这里是代码......
#include <stdio.h>
int main()
{
int a,b;
float c;
a = 1;
b = 2;
c = 3.;
printf("%d %d %fn",a ,b , c);
printf("%d %f %fn",a ,b , c);
printf("%f %d %fn",a ,b , c);
printf("%d %d %dn",a ,b , c);
printf("%f %d %dn",a ,b , c);
return o;
}
输出为
1 2 3.000000
1 0.000000 0.000000
0.000000 0 0.000000
1 2 0
0.000000 0 1074266112
我非常清楚第一个 printf 的输出但是为什么第二个 printf 输出 1 0.000000 0.000000
而不是1 0.000000 3.000000
第三版0.000000 0 3.000000
第五版0.000000 2 0.000000
除第一个语句外,所有printf()
语句的行为都是未定义的。因此,您不能期望它们以任何特定方式行事。
若要解决此问题,需要将数值参数强制转换为printf()
,以便其类型与格式说明符匹配。编译器不会自动执行此转换,尽管一些好的编译器会发出警告以提醒您注意错误。
当你把一个int
传递给printf()
并告诉它把它当作一个float
时,你会得到与垃圾对应的垃圾(GIGO(。 基本上,printf()
和编译器都无法为您进行任何转换。你必须把它做好。 必须提供与格式规范匹配的参数。 这些注释适用于所有printf()
和scanf()
系列函数。
如果使用 GCC 和字符串文本作为格式字符串(如示例中所示(,您将收到有关类型不匹配的编译器警告。 注意并修复它们;编译器知道的比你多。 如果您使用的其他编译器不会发出此类警告,请找到一个给出此类警告的编译器(例如 GCC( 并使用它。 并确保打开警告 - 并且代码编译时不会发出任何警告。
您在第二个和后续语句中调用"未定义的行为",这意味着任何和所有答案(以及其他行为,包括崩溃和重新格式化磁盘(都是系统可接受的响应。
您遇到了未定义的行为。运行时期望一个float
,而你给它一个int
。
展开上面的答案,并给出导致未定义行为的原因的线索。 在你的平台上,浮点数与 ints 的大小不同,所以 printf(( 不仅关于其参数的类型是错误的,而且关于它们在内存中的位置也是错误的。 因此,在第二行中,printf 在打印第三个值时不会查看浮点数的开头;它正在寻找别的地方。
- 数组类 阵列的打印输出
- 我要求用户输入大小和数组,但是当我打印矢量时,它仅显示'0'作为输出
- 程序打印 % 后预期输出
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 为什么打印 c 样式字符串的'address of index n'会导致子字符串的输出
- 为什么打印"OK"会改变输出?
- 打印输出在主,而不是在函数中
- 该程序没有产生输出,而是卡在一个循环中,几秒钟后消失并打印被杀死?
- 存储和打印字符,但输出不是预期的
- 执行ls命令并打印输出
- 为什么如果我从键盘输入EOF克里昂不要在运行窗口打印程序的输出?
- 将C++输出打印到文本文件
- 如何仅使输出打印一次
- 以未格式化的输出 c++ 打印输出
- 如何将谷歌测试输出打印到文本文件
- 为类打印输出(打印调试信息)的最佳实践是什么?
- 将命令行输出打印到Linux(Ubuntu)的文本文件中
- 输出打印地址而不是3D数组指针中的值
- 将Qt C++输出打印到QML中写入的应用程序屏幕
- 多线程文本输出打印到dos控制台重叠/混乱输出