繁体   English   中英

C - 在函数中使用未声明的标识符。 CS50

[英]C - use of undeclared identifier in a function. CS50

我正在重写我的CS50信用解决方案以使用功能。 定义readCardNumber()时偶然发现错误。

long long readCardNumber()
{
    do
    {
        long long result = get_long_long("Enter card number to verify: \n");
        if (result < 0)
        {
            printf("Retry: \n");
        }
    }
    while (result < 0);

    return result;
}

我使用CS50.h https://reference.cs50.net/cs50/get_long_long来获取号码。 由于以下原因,我无法编译此解决方案:

error: use of undeclared identifier 'result'

有人可以体验一下这里的问题吗? 我在我的代码开头声明了函数,并在函数中声明和初始化结果。 验证该数字的更好方法是什么?

https://docs.cs50.net/2018/x/psets/1/credit/credit.html - 解决方案规范我试图重做。

result变量在do...while块内声明。 它在块外不可见,包括while的条件。

您需要在循环外部移动变量定义:

long long result;
do
{
    result = get_long_long("Enter card number to verify: \n");
    if (result < 0)
    {
        printf("Retry: \n");
    }
}
while (result < 0);

这是一个范围问题 在C中,范围由{}定义。 变量在声明范围的末尾不再存在。 (好吧,静态变量不会,但它们无法访问。除非你有指针。)

你需要做的是将声明移到循环之外。

但是,我想强调,在使用它们的范围内声明变量是一种非常好的做法。 它可以显着降低错误风险。 如果变量仅在循环内使用,则在循环内声明它。 除非必要,否则基本上与为什么不应该使用全局变量的原因相同。

你确实return result; result超出范围时。 但是您的代码包含冗余:您测试result < 0两次。 我建议更改结构以避免这种情况,并修复原始问题的副作用:

long long readCardNumber(void)
{
    for (;;)
    {
        long long result = get_long_long("Enter card number to verify: \n");
        if (result >= 0)
             return result;

        printf("Retry: \n");
    }
}

这是关于do/while语句的那些不方便甚至“不自然”的事情之一:你在循环体内声明的所有内容都不会对语句的while部分中的条件可见。 这些标识符的范围在结束}的前while部分。

这通常会迫使用户在循环之前声明变量

long long result;
do
{
  result = get_long_long("Enter card number to verify: \n");
  if (result < 0)
    printf("Retry: \n");
}
while (result < 0);

这个解决方案的代价是

  1. result范围的不必要扩展超出了周期
  2. 它不再可能在声明点有意义地初始化变量

对于我们中的许多人来说,这是非常令人不愉快的,我们宁愿切换到do/while(1)方法,在中间break以终止循环

do
{
  long long result = get_long_long("Enter card number to verify: \n");
  if (result >= 0)
    break;

  printf("Retry: \n");
}
while (1);

显然,这也不完美。 选择适合自己的方式,让自己更好。

在后一种情况下, do/while(1)用作表示从中间退出的循环的“惯用”方式。 其他人可能更喜欢for (;;)while(1)用于此目的,从而完全避免do/while语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM