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

时间:2012-01-22 13:00:29

标签: c++ c

scanf("%d%d\n",&x,&y);

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

4 个答案:

答案 0 :(得分:5)

  

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

  1. 它将源文件加载到内存中(可能是部分内容)。
  2. 词法分析器将行划分为预处理器令牌。
  3. 预处理器尝试使用适当的宏扩展scanfxy,希望这些未定义,因此这是一个NOP。
  4. 预处理器令牌转换为令牌,解析器解析该行。
  5. 进行名称查询,以便将scanfxy与先前声明的符号相匹配。
  6. 它将上述行转换为抽象语法树或其他形式的中间表示。
  7. 进行类型检查。
  8. 执行高级优化,例如内联。
  9. 后端将中间表示转换为机器代码,可能需要对机器代码进行更多优化。
  10. 将结果写入稍后传递给链接器的对象文件。
  11. 当然这是非常近似的,这个过程有很多变化。

    现在,你不明白哪一部分?

答案 1 :(得分:1)

这是对scanf功能的调用。第一个参数是格式%d%d\n,这意味着“期望两个十进制数后跟一个换行符”。

每个%d都希望在某处将结果写入内存。 &x&y基本上是指“将其写入xy变量的地址”。

他们是通过地址&x)而非价值(x)传递的,否则scanf将无法访问真实位置x并且能够写信给它。

答案 2 :(得分:0)

  

编译器如何编译

好吧,我现在没有资格参加,但如果你对\n字符感到困惑,我可以为你解决这个问题。

介于format specifiers之间,如果输入任何字符,则在输入中将其视为分隔符。

scanf("%d%d\n",&x,&y); 

这意味着,输入两个nums后,您需要点击return键才能完成scanf

scanf("%d\n%d\n",&x,&y); 

这意味着,在输入每个数字后,您需要点击return键才能完成scanf

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

由于用户输入需要存储到内存中,因此您应该在要存储用户输入的变量中放置address

在您的示例中,您希望将第一个num存储到x中;因此你传递了x的地址,即&x

我希望你明白这一点。

答案 3 :(得分:0)

将此程序保存为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并按Enter键

再次输入20并按Enter键

输出

x为10,y为20

我认为你在打印这些价值时可能会犯错误

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

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

将为您提供garvase值