以下代码以意外的方式获取输入

The following code takes input in an unexpected way

本文关键字:获取 输入 方式 意外 代码      更新时间:2023-10-16
scanf("%d%dn",&x,&y);

有人可以解释编译器如何编译代码行并向我解释吗?

有人可以解释编译器如何编译代码行并向我解释吗?

  1. 它将源文件加载到内存中(可能是部分(。
  2. 词法分析器将行分解为预处理器标记。
  3. 预处理器尝试使用适当的宏扩展scanfxy,希望这些宏没有定义,所以这是一个 NOP。
  4. 预处理器令牌将转换为令牌,分析器将分析该行。
  5. 它进行名称查找以匹配scanfxy到先前声明的符号。
  6. 它将上面的行转换为抽象语法树或某种其他形式的中间表示。
  7. 它进行类型检查。
  8. 它执行高级优化,例如内联。
  9. 后端将中间表示转换为机器代码,可能会对机器代码进行更多优化。
  10. 结果将写入对象文件,该文件稍后将传递给链接器。

当然,这是非常近似的,这个过程有很多变化。

现在,您不了解其中的哪一部分?

这是对 scanf 函数的调用。第一个参数是一个格式%d%dn,意思是"期望两个十进制数后跟一个换行符"。

那里的每个%d都希望在某个地方将结果写入内存中。 &x&y基本上意味着"将其写入xy变量的地址"。

它们是通过地址(&x(而不是值(x(传递的,否则scanf将无法访问x的真实位置并能够写入它。

编译器如何编译

好吧,我现在没有资格这样做,但如果您对n字符感到困惑,我可以为您解开这个谜团。

在格式说明符之间,如果输入任何字符,则会将其用作输入中的分隔符。

scanf("%d%dn",&x,&y); 

这意味着,输入两个数字后,您必须按return键才能完成scanf

scanf("%dn%dn",&x,&y); 

这意味着,输入每个数字后,您必须按return键才能完成scanf

现在,关于&x, &y部分:

由于用户输入需要存储到内存中,因此应address要存储用户输入的变量。

在你的例子中,你想将第一个数字存储到 x 中;因此你传递了 x 的地址,即 &x .

我希望你明白这个想法。

将此

程序另存为 test.c 文件

   #include <stdio.h>
    int main(void){
    int x=0,y=0;
    scanf("%d%d",&x,&y);
    printf("x is %d, y is %d",x,y);
    }

编译方式

gcc test.c 

运行方式

./a.out
输入

10 并按 输入 键

再次输入20并点击 输入 键

输出将是

x 为 10,y 为 20

我认为您可能在打印这些值时犯了错误

而不是printf("x is %d, y is %d",x,y);你可能正在做

 printf("x is %d, y is %d");

这会给你加瓦斯价值