C 这个值是多少?
然后我也得到了“17661648”和类似的东西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进
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);