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’的地址。 请记住,&运算符返回操作数的地址。