我想编写一个C程序,对从1到5的整数的阶乘进行评估,并以表格格式打印它们。但是,我在所有方面都得到一个奇怪的数字。这是代码:
#include <stdio.h>
int main()
{
int factorial;
printf("X\t Factorial of X\n");
for(int x=1; x<=5; x++)
{
factorial = 1;
for (int j=1; j<=x; j++)
{
factorial *=j;
}
printf("%d\t %d\n", &x, &factorial);
}
return 0;
}
这是此代码的结果:
X Factorial of X
6356768 6356772
6356768 6356772
6356768 6356772
6356768 6356772
6356768 6356772
我的代码有什么问题?结果应该是这样的:
X Factorial of X
1 1
2 2
3 6
4 24
5 120
删除&
,它代表地址。您正在打印变量的地址,而不是其值。
printf("%d\t %d\n", x, factorial);
[当使用printf
(和相关的[[output函数]时),%d
格式说明符期望int
作为相应的参数。在printf("%d\t %d\n", &x, &factorial);
中,传递x
和factorial
变量的地址。
&
(的地址)运算符:printf("%d\t %d\n", x, factorial);
!对于scanf
(和其他input函数),%d
说明符需要一个指向其目标变量的指针这一事实,您可能会感到困惑。
scanf
不同,格式为printf()
的%d
需要整数值,而不是地址(&x
是包含整数的地址,因此指向类型为int *
的整数的指针)。正确的表达式是
printf("%d\t %d\n", x, factorial);
为什么先前的表达式错误?使用
printf("%d\t %d\n", &x, &factorial);
,您要打印f以分别打印x
和factorial
地址的十进制表示形式。由于这个原因,
6356768
和6356772
曾经用来打印的值并不奇怪:是大数,是4的倍数(因为它们寻址整数,大小为4字节,并且在像您这样的32位体系结构中对齐到4的倍数的内存位置)
- 它们是内存位置,即使更改了内容,其地址也不会改变
printf
文档here。