#include <stdio.h>
#include <cs50.h>
int main(void)
{
do
{
//ask for input with 1-8
int height = get_int("Height: ");
}
while (height > 0);
}
我得到了错误代码:使用未声明的标识符“height”(在 while 语句中) 我对编程完全陌生,我不知道如何解决这个问题。有人可以帮忙吗?
变量 height
的
scope是
do
..while
循环的主体。 此循环的条件在循环体之外,因此 height
不在循环条件的范围内。
将
height
的定义移到循环之外。
int height;
do
{
//ask for input with 1-8
height = get_int("Height: ");
}
while (height > 0);
do
主体块的右大括号之后,高度不可见(也不存在)。 您必须在循环之外声明它。我在下面的评论中标记了
height
不再存在的点:
int main(void)
{
do
{
//ask for input with 1-8
int height = get_int("Height: ");
} // <- the scope and visibility of height ends here
while (height > 0); // ... so it doesn't exist here.
}
解决方案是在
height
关键字之前声明 do
,如下所示:
int main(void)
{
int height;
do
{
//ask for input with 1-8
height = get_int("Height: ");
}
while (height > 0); // now, height is visible here.
} // <-- visibility and scope of height ends here.
另一件事是,如果你的目的是询问高度并重复问题直到
height > 0
,那么你应该写while (height <= 0)
,(你重复问题而答案不正确)
您似乎在范围方面遇到了问题。通过在 do-while 循环内定义数据类型 (int),您以后将无法调用它。除了到计算机的循环之外,它“不存在”。
尝试在循环之外声明它:
// Declaring the variable globally
data type <name>;
do
{
<name> = <reassignment>;
}
while (<condition not satisfied>)
编辑:有人向我指出我误读了你的循环的终止条件。 (对不起,失眠了。)
当我读到它时,您似乎想要重复使用height
的
正值做某事,并在给出无效值时终止。
要实现这一点,正确的想法应该是:
因此:
while (true)
{
int height = get_int("Height: ");
if (height <= 0) break; // invalid height terminates loop
// use height here //
}
如果您希望重复询问高度,直到用户为您提供有效值才能继续,那么唯一的答案是将值声明移出循环,因为循环本地声明的任何内容都将不可用循环外:
int height;
do {
height = get_int("Height: ");
} while (height is not valid);
// use height here //
这正是Luis Colorado所解释的,因为他足够清醒,可以正确读取您的循环条件。
由于我之前误读了如果
height
变为零则终止的解决方案(涉及整数的家庭作业问题的常见信号量),并且因为 C++ 人员也会找到这个答案,所以我还给出了一个 C++ 解决方案,其中条件和主体共享地点如下:
在当前版本的 C++ 中,您可以将变量集成到循环条件中:
while (int height = get_int("Height: "))
{
// use height here //
}
我认为这对于C++11或更高版本来说是正确的,但它可能已经在C++14中引入了,IDK并且不关心查找它。这些天你应该使用不低于 C++17 的东西......
此解决方案仅适用于可以转换为真值的变量 - 在这种情况下,当
height
为零时循环终止。
在OP的特殊情况下,这是行不通的。
现在去投票支持科罗拉多先生的答案,因为它更好地解释了局部性问题。