Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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 - Fatal编程技术网

C 这个值是多少?

C 这个值是多少?,c,C,然后我也得到了“17661648”和类似的东西 printf("%d", "10+10"); 这个值是多少? “1,0,+,1,0”之和“H,e,l,l,o”为十进制ASCII码?或者仅仅是一个垃圾值?根据C11标准(见其§7.21.6.1),您已经得到了(UB),该值也在文档或中记录。所以要非常小心,因为任意的坏事情可能会发生。因此,养成阅读您正在使用的每个函数的文档的习惯 如果您要求编译器反汇编程序的生成形式(例如,在Linux/x86-64上使用gcc-S-O-fverbose asm进

然后我也得到了“17661648”和类似的东西

printf("%d", "10+10");
这个值是多少?
“1,0,+,1,0”之和
“H,e,l,l,o”
为十进制ASCII码?或者仅仅是一个垃圾值?

根据C11标准(见其§7.21.6.1),您已经得到了(UB),该值也在文档或中记录。所以要非常小心,因为任意的坏事情可能会发生。因此,养成阅读您正在使用的每个函数的文档的习惯

如果您要求编译器反汇编程序的生成形式(例如,在Linux/x86-64上使用
gcc-S-O-fverbose asm
进行编译,如果您是gcc,则在Linux/x86-64上),您将发现字符串literal
“10+10”
的地址被传递(在64位上),然后被截断(在
printf
内部,因为
%d
)到
int
。因此17661648可以对应于该地址的最低32位

详细信息当然是特定于实现的(并且在每次运行时可能会有所不同,因为,这取决于编译器和目标系统)。要真正理解和解释这种行为,需要深入了解许多细节(您的特定计算机、特定的和标志、特定的、编译器生成的汇编程序和机器代码、特定的等等),而您不想这样做(因为这可能需要数年时间)

你应该花几个小时读更多的书。在用C编程时,这是一个必须理解的概念,您应该避免它


任何好的编译器都会向您发出警告,然后您应该改进代码以避免收到警告。如果使用GCC,请确保使用
GCC-Wall-Wextra-g
编译以获取所有警告和调试信息。然后了解程序在系统上的实际行为。在所有情况下,请确保将C编译器配置为启用所有警告和调试信息,并学习使用调试器。阅读。

像这样的东西应该有用:

printf("%d", "Hello");

垃圾值。您只能为
%d
提供
int
值,编译器应该警告您。可能是字符串文本的地址。我是C的初学者,对它了解不多。这就是为什么我不能理解你所有的评论,但我认为这对我真的很有帮助。谢谢你给我一个学习指南,我会按照你说的去做。你绝对需要阅读更多关于UB的内容。这是C编程中的一个基本概念,甚至对初学者也很重要。您应该养成编译所有警告和调试信息的习惯。因此,请阅读编译器和调试器的文档。任何警告都应理解为错误。
printf("Hello");
total = 20;
printf("10+10 = %d", total);