do while 循环中未声明的标识符,C

问题描述 投票:0回答:4
#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 语句中) 我对编程完全陌生,我不知道如何解决这个问题。有人可以帮忙吗?

c do-while cs50 undeclared-identifier
4个回答
4
投票

变量 height

scope
do
..
while
循环的主体。 此循环的条件在循环体之外,因此
height
不在循环条件的范围内。

height
的定义移到循环之外。

int height;
do
{
    //ask for input with 1-8
    height = get_int("Height: ");
}
while (height > 0);

3
投票

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)
,(你重复问题而答案不正确


0
投票

您似乎在范围方面遇到了问题。通过在 do-while 循环内定义数据类型 (int),您以后将无法调用它。除了到计算机的循环之外,它“不存在”。

尝试在循环之外声明它:

// Declaring the variable globally

data type <name>;

do
{
    <name> = <reassignment>;
}
while (<condition not satisfied>)

-1
投票

编辑:有人向我指出我误读了你的循环的终止条件。 (对不起,失眠了。)

可能的答案1

当我读到它时,您似乎想要重复使用height

值做某事,并在给出无效值时终止。

要实现这一点,正确的想法应该是:

  1. 获取值
  2. 如果值为零,则终止循环
  3. 否则用价值做事

因此:

while (true)
{
  int height = get_int("Height: ");
  if (height <= 0) break; // invalid height terminates loop

  // use height here //
}

可能的答案2

如果您希望重复询问高度,直到用户为您提供有效值才能继续,那么唯一的答案是将值声明移出循环,因为循环本地声明的任何内容都将不可用循环外:

int height;
do {
  height = get_int("Height: ");
} while (height is not valid);

// use height here //

这正是Luis Colorado所解释的,因为他足够清醒,可以正确读取您的循环条件。

对于仅通过标题找到此内容的 C++ 人员来说很有用

由于我之前误读了如果

height
变为零则终止的解决方案(涉及整数的家庭作业问题的常见信号量),并且因为 C++ 人员也会找到这个答案,所以我还给出了一个 C++ 解决方案,其中条件和主体共享地点如下:

在当前版本的 C++ 中,您可以将变量集成到循环条件中:

while (int height = get_int("Height: "))
{
  // use height here //
}

认为这对于C++11或更高版本来说是正确的,但它可能已经在C++14中引入了,IDK并且不关心查找它。这些天你应该使用不低于 C++17 的东西......

此解决方案仅适用于可以转换为真值的变量 - 在这种情况下,当

height
为零时循环终止。

在OP的特殊情况下,这是行不通的。

现在去投票支持科罗拉多先生的答案,因为它更好地解释了局部性问题。

© www.soinside.com 2019 - 2024. All rights reserved.