【发布时间】:2020-06-23 10:54:03
【问题描述】:
下面是我的 C++ 代码。这里在函数“temp”中,首先声明“ch”的值然后打印(第一次“ch”没有初始化,所以“ch”有未定义的值)。然后“if”条件满足(在里面“如果”没有工作完成)。然后函数结束并返回到函数调用的下一行(增量'i')。然后下一次迭代也以与上一次调用相同的方式进行。相同的循环一直持续到按键被按下。当一个键被按下时(例如“a”被按下),“else”被执行并且被按下的键被 getch() 获取。然后函数结束并返回到函数调用的下一行(i++),然后在所有即将到来的下一次迭代中,当调用一个函数时,'ch' 被分配为前一个按键被按下('a')并打印该字符('一种')。它继续打印'a',直到按下另一个键。 为什么以及如何为 'ch' 分配上一个函数调用的值。上一次调用的变量值是否存储在堆栈中并将其分配给下一次调用的变量?
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
int flag = 0,i = 1;
void temp()
{
char ch;
cout<<ch;
if(!_kbhit())
{
}
else{
ch=_getch();
}
}
int main()
{
while(flag!=1)
{
temp();
i++;
}
return 0;
}
【问题讨论】:
-
如果您从遇到这种情况的构建中查看反汇编,那么您会发现这可能就是正在发生的事情。在 C/C++ 方面,行为是未定义的,而
temp()简单地使程序崩溃的汇编代码也是有效的(与任何其他temp()代码一样,因为行为毕竟是未定义的)。 -
在
char ch; cout<<ch;,ch未初始化...导致UB。 -
请提供您的全部输入和实际输出。然后解释你认为输出有什么问题。我不清楚你在问什么。也许整个例子不是很好选择要求你想要的东西。尝试将其最小化并指定问题。
-
回答你的问题标题:可以。该变量需要使用
static进行限定,但恐怕这不是您所要求的。