首页 > 解决方案 > &符号在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无论给出什么输入,它总是输出。

标签: cscanf

解决方案


输出将始终为Morning.

scanf("&d")期望输入两个字符&and d,字面意思。如果您键入其他任何内容,scanf呼叫将失败。但是,您的代码不会检查 的返回值scanf,因此没有区别。

&n参数 to被忽略,scanf因为格式字符串中没有“转换规范”(那些是以 开头的东西%)。因此(正如 C 标准所说 (C99, 7.19.6.2 The fscanffunction / 2)):

如果格式已用尽而参数仍然存在,则评估多余的参数(一如既往),否则将被忽略。

scanf("&d", &n)因此等价于scanf("&d")

switch (n)检查时n,它仍将包含初始化时使用的值。没有显式初始化程序,因此将其设置为0(因为它是一个全局变量(特别是因为它具有静态存储;参见 C99,6.7.8初始化/10))。

没有case 0:标签,所以default:开始了。


推荐阅读