Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-在函数中使用未声明的标识符。CS50_C_Function_Validation_Cs50 - Fatal编程技术网

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

C-在函数中使用未声明的标识符。CS50,c,function,validation,cs50,C,Function,Validation,Cs50,我正在重写我的CS50学分解决方案以使用函数。 定义readCardNumber()时出错 有经验的人能解释一下这里的问题吗?我确实在代码的开头声明了函数,并在函数中声明和初始化了结果。 验证该数字的更好方法是什么 -我正在尝试返工的解决方案规范。在do…while块中声明result变量。它在块外不可见,块外包括while的条件 您需要将变量定义移到循环之外: long long result; do { result = get_long_long("Enter card numbe

我正在重写我的CS50学分解决方案以使用函数。 定义readCardNumber()时出错

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


-我正在尝试返工的解决方案规范。

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

您需要将变量定义移到循环之外:

long long result;
do
{
    result = get_long_long("Enter card number to verify: \n");
    if (result < 0)
    {
        printf("Retry: \n");
    }
}
while (result < 0);
long-long结果;
做
{
结果=get_long_long(“输入要验证的卡号:\n”);
如果(结果<0)
{
printf(“重试:\n”);
}
}
而(结果<0);
这是一个范围问题。在C语言中,作用域由
{
}
定义。变量在其声明的范围结束时停止存在。(好吧,静态变量不会,但它们会变得不可访问。除非你有指向它们的指针。)

您需要做的是将声明移出循环


不过,我想强调的是,在使用变量的范围内声明变量是一种非常好的做法。它显著降低了bug的风险。如果变量仅在循环内使用,则在循环内声明它。这与除非必要,否则不应使用globals的原因基本相同。

您确实
返回结果
结果
超出范围时。但是您的代码包含冗余:您测试
结果<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);
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)
作为一种“惯用”方式来表达从中间退出的循环。其他人可能更喜欢(;)或
while(1)
,因此完全避免使用
do/while
语句。

C
和大多数编程语言中,在
{…}中声明一个变量
将不允许该变量对代码库的其他部分可见。在这种情况下,在整个循环之后需要变量“result”,因此此建议不起作用。
long long result;
do
{
  result = get_long_long("Enter card number to verify: \n");
  if (result < 0)
    printf("Retry: \n");
}
while (result < 0);
do
{
  long long result = get_long_long("Enter card number to verify: \n");
  if (result >= 0)
    break;

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