我的代码:
printf("Enter a number : ");
scanf("%d", &number);
printf("%d is what I entered\n", &number);
Run Code Online (Sandbox Code Playgroud)
我输入了2,
预期产量: 2 is what I entered
实际产量: 2293324 is what I entered
这有什么问题?
Spi*_*rix 10
printf("%d is what I entered\n", &number);
Run Code Online (Sandbox Code Playgroud)
是错误的,因为%d(在printf)期望一个类型的参数int,而不是int*.这将调用未定义的行为,如C11标准草案(n1570)中所示(强调我的):
7.21.6.1 fprintf函数
[...]
- 如果转换规范无效,则行为未定义.282) 如果任何参数不是相应转换规范的正确类型,则行为未定义.
通过使用修复它
printf("%d is what I entered\n", number);
Run Code Online (Sandbox Code Playgroud)
那么,为什么在变量名之前scanf需要&?
请记住,当你使用number,你通过价值的变量number,当你使用&number,你通过了地址的number(&是地址运算符).
所以,scanf不需要知道它的价值number.它需要它的地址(int*在这种情况下),以便将输入写入其中.
printf另一方面,不需要地址.它只需要知道int要打印的值(在这种情况下).这就是您&在变量名称之前不使用的原因printf.
你正在使用operator& on number,意思是获取它的地址,所以你不打印它的值number,但它的地址,你应该:
printf("%d is what I entered\n", number);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |