Printf的结果(“%d”,&a)

我有一个C代码。

int a; a =10; printf ("%d", &a); 

我想知道是否会打印一些垃圾或显示错误信息。 基本上我有兴趣了解printf的工作原理。 它是否有表格中的变量列表。 如果有一个表,那么它将采用&a的值

这是一个初学者的问题,值得正确回答。 (我被downvotes和非建设性评论吓到了)

让我一行一行地走一走:

 int a; 

第一行声明一个名为a的变量。 该变量的类型为integer并带有普通编译器(Windows上为Microsoft Visual C ++,Linux上为GCC,Mac上为Clang),通常为32位宽。 整数变量已签名,因为您未指定unsigned。 这意味着它可以表示从-2,147,483,648到2,147,483,647的值。

 a =10; 

第二行将值10赋给该变量

 printf ("%d", &a); 

第三行是您获得惊人结果的地方。 "%d"是“格式字符串”,它定义了如何格式化并随后打印作为进一步参数给出的变量。 格式字符串包括普通文本(将正常打印)和控制序列。 控制序列以字符%开头,以字母结尾。 该字母指定了预期的参数类型。 在上述情况下, d需要一个整数值。

您的代码的问题是您没有指定itenger值,您给出一个整数值的地址(使用地址&运算符)。 正确的陈述是:

 printf ("%d", a); 

简单。

我建议您阅读一本好的C书。 我推荐来自该语言原作者的“C编程语言”。 你在亚马逊上找到这本书,但你也发现它也在网上 。

您可以在标准中找到相同的答案。 但说实话,这些文件并不容易阅读。 您可以在此处找到C11标准的草稿。 格式化选项的说明从第309页开始。(草稿通常足以用于编程目的,并且通常可免费提供)。

这是未定义的行为 。

如果你是C的新手,这可能是一个惊喜。 但是,C规范定义了某些程序的行为(称为“正确的程序”)。 如果您不遵守规范中的规则,那么您的程序是不正确的,并且确实可能​​发生任何事情。 以上链接更详细。

您的程序不遵循规则,因为printf%d格式说明符必须具有int类型的相应参数(在默认参数提升之后),而是传递int *类型的参数。

由于它是未定义的行为,输出是没有意义的,通常不值得研究。

它将打印变量’a’的地址。 请记住,&运算符返回操作数的地址。