Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
改变格式说明符的位置如何改变c程序的输出?_C_Pow - Fatal编程技术网

改变格式说明符的位置如何改变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);