以下代码以意外的方式获取输入
The following code takes input in an unexpected way
scanf("%d%dn",&x,&y);
有人可以解释编译器如何编译代码行并向我解释吗?
有人可以解释编译器如何编译代码行并向我解释吗?
- 它将源文件加载到内存中(可能是部分(。
- 词法分析器将行分解为预处理器标记。
- 预处理器尝试使用适当的宏扩展
scanf
、x
和y
,希望这些宏没有定义,所以这是一个 NOP。 - 预处理器令牌将转换为令牌,分析器将分析该行。
- 它进行名称查找以匹配
scanf
、x
和y
到先前声明的符号。 - 它将上面的行转换为抽象语法树或某种其他形式的中间表示。
- 它进行类型检查。
- 它执行高级优化,例如内联。
- 后端将中间表示转换为机器代码,可能会对机器代码进行更多优化。
- 结果将写入对象文件,该文件稍后将传递给链接器。
当然,这是非常近似的,这个过程有很多变化。
现在,您不了解其中的哪一部分?
这是对 scanf 函数的调用。第一个参数是一个格式%d%dn
,意思是"期望两个十进制数后跟一个换行符"。
那里的每个%d
都希望在某个地方将结果写入内存中。 &x
和&y
基本上意味着"将其写入x
和y
变量的地址"。
它们是通过地址(&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");
这会给你加瓦斯价值
相关文章:
- 如何从用户那里获取输入并将其存储在向量中?
- 代码在执行之前终止,并且没有从用户那里获取输入
- 从用户获取输入/输出
- TFLite 隔离错误,通过获取C++输入和输出
- 如何使 std::istream 从键盘获取输入(如 std::cin)?
- 使用 qt 或 c++ 从桌面获取输入和输出
- 您如何在C++中不断获取输入?
- 从源代码本身C++获取输入
- 函数,从问题中获取输入,并在主函数中使用该输入
- 当我们声明 cin 为 int 并从 cin 中获取输入并在 cout 中打印 cin 时会发生什么?
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- 有没有办法将 getline() 与外部文本文件一起使用,然后重新获得 cin 的控制权以从控制台获取输入?
- 从用户获取输入
- 我需要编写一个代码,从用户那里获取输入(句子)并停止在@处
- C 程序在获取输入[控制台应用程序]时跳过行
- 我在C++从函数中的用户获取输入、添加到数组和打印该数组时遇到问题
- 从用户那里获取输入,直到他输入一个数字
- 如何使用数组获取输入,并将其存储在record.h类的主类中的变量中
- getline 语句未获取输入
- 用户定义的功能用于竞争编程中,以获取输入