c - &符号在scanf的PlaceHolder?
问题描述
以下代码的输出将是什么?
#include <stdio.h>
int n;
int main() {
scanf("&d", &n);
switch (n) {
case 1:
printf("hello\n");
break;
case 2:
printf("good\n");
break;
default:
printf("Morning\n");
break;
}
return 0;
}
大多数人预计会有一个错误,但在执行时,Morning
无论给出什么输入,它总是输出。
解决方案
输出将始终为Morning
.
scanf("&d")
期望输入两个字符&
and d
,字面意思。如果您键入其他任何内容,scanf
呼叫将失败。但是,您的代码不会检查 的返回值scanf
,因此没有区别。
&n
参数 to被忽略,scanf
因为格式字符串中没有“转换规范”(那些是以 开头的东西%
)。因此(正如 C 标准所说 (C99, 7.19.6.2 The fscanf
function / 2)):
如果格式已用尽而参数仍然存在,则评估多余的参数(一如既往),否则将被忽略。
scanf("&d", &n)
因此等价于scanf("&d")
。
switch (n)
检查时n
,它仍将包含初始化时使用的值。没有显式初始化程序,因此将其设置为0
(因为它是一个全局变量(特别是因为它具有静态存储;参见 C99,6.7.8初始化/10))。
没有case 0:
标签,所以default:
开始了。
推荐阅读
- mongodb - 在 mongodb 中遇到条件问题
- arrays - JSX:.map 不是函数
- ruby-on-rails - 方法在 Rails 控制台中工作 - 在视图中引发错误
- reactjs - 在反应中导入类
- python - 使用 Python 进行本地开发的无服务器 Lambda 层
- angular - 如何使用此处的地理编码和从具有 API 密钥的角度服务中搜索 api
- excel - Excel - 删除单元格右侧的零
- python - Pandas to_csv 方法的选项 quoting=csv.QUOTE_MINIMAL 不起作用
- javascript - HTML5 嵌套 DnD 界面仅允许使用 sortable.js 在表单字段中放置嵌套元素
- node.js - 从请求中获取主机 WITH PORT