改变格式说明符的位置如何改变c程序的输出?
我的代码是:改变格式说明符的位置如何改变c程序的输出?,c,pow,C,Pow,我的代码是: #include<stdio.h> #include<math.h> int main() { int c = pow(3,2); printf("%f %f %d \n\n",pow(3,2),c,c); printf("%f %d %f \n\n",pow(3,2),c,c); return 0; } 有人能解释为什么在输出的第一行而不是在输出的第二行打印9(就像它在输出的第二行一样)打印42006
#include<stdio.h>
#include<math.h>
int main()
{
int c = pow(3,2);
printf("%f %f %d \n\n",pow(3,2),c,c);
printf("%f %d %f \n\n",pow(3,2),c,c);
return 0;
}
有人能解释为什么在输出的第一行而不是在输出的第二行打印9(就像它在输出的第二行一样)打印4200688(可能是垃圾值)?您提到的代码有未定义的行为。阅读
pow
功能的手册页,检查其原型。上面说
双功率(双x,双y)
在这份声明中
int c = pow(3,2);
在使用-Wall
标志编译时,请使用正确的格式说明符,不要使用编译器警告,请倾听警告
来自C99标准第7.19.6.1节
如果任何参数不是相应的
转换规范,行为未定义
使用正确的格式说明符。Period我特意使用%f作为格式说明符之一,以了解仅仅通过位置的改变,这两行中的输出会发生多大的变化。那么,您的目的是错误的。我的目的是了解格式说明符位置的变化如何导致不一致的结果。第二个输出是否也应该是9.0000垃圾值0.000000请在C编程语言中查找有关“未定义行为”概念的信息。这可能是一个很好的起点。基本上,我从讨论中推断,如果我的任何格式说明符在一行代码中不正确,那么我的程序对那段代码的输出永远无法预测,它是完全随机的。那么我的程序对那段代码的输出永远无法预测,它是完全随机的?C标准将其定义为未定义的行为。实际上,您不应该在代码中编写任何导致UB的内容。@csfander“我的程序对该代码段的输出永远无法预测”-->C没有指定输出是不可预测的。该行为未定义。“我的程序对那段代码的输出…是完全随机的”-->C没有指定输出是随机的。该行为未定义。关键是,结果没有定义,没有定义为不寻常的东西。
int c = pow(3,2);
warning: format ‘%f’ expects argument of type ‘double’, but argument 3 has type ‘int’ [-Werror=format=]
printf("%f %f %d \n\n",pow(3,2),c,c);
warning: format ‘%f’ expects argument of type ‘double’, but argument 4 has type ‘int’ [-Werror=format=]
printf("%f %d %f \n\n",pow(3,2),c,c);