为什么我得到“错误未声明的标识符”,除非我在开​​头声明我的变量?

时间:2011-01-23 16:39:34

标签: c visual-studio-2010

当我跟随时:

#include "stdafx.h"
#include<stdio.h>
int main()
{

int val1,val2;

printf("Enter the first value");
scanf("%d",val1);
scanf("%d",&val2);
int c;
c=val1 + val2;
printf(" the value is : %d", c);



return 0; // 0 means no error

 }

我得到错误未声明的标识符c。另外,语法错误。失踪 ;在输入之前。

但是,如果我更改为以下错误消失。请帮忙

#include "stdafx.h"
#include<stdio.h>

int main()
{

int val1,val2,c;

printf("Enter the first value");
scanf("%d",&val1);
scanf("%d",&val2);

c=val1 + val2;
printf(" the value is : %d", c);



return 0; // 0 means no error

}

我在VS 2010中运行C语言。

5 个答案:

答案 0 :(得分:6)

在C中,至少在过去,变量声明必须位于块的顶部。在这方面,C ++是不同的。

编辑 - 显然C99在这方面与C90不同(在这个问题上C99与C ++基本相同)。

答案 1 :(得分:3)

对象只能在ISO C90中的语句块顶部声明。因此,您可以这样做:

#include<stdio.h>

int main()
{
    int val1,val2;

    printf("Enter the first value");
    scanf("%d",val1);
    scanf("%d",&val2);

    // New statement block
    {
        int c;
        c=val1 + val2;
        printf(" the value is : %d", c);
    }

    return 0; // 0 means no error
 }

虽然这样做可能不太常见。与一些流行的看法相反,函数的开始并不是唯一可以声明自动变量的地方。更常见的是,使用作为iffor构造的一部分引入的现有语句块,而不是创建虚拟块

case块括在{...}中是很有用的,即使通常不是必需的,这样您就可以引入临时的特定于案例的变量:

switch( x )
{
    case SOMETHING :
    {
        int case_local = 0 ;
    }
    break ;

    ...
}

答案 2 :(得分:0)

在C90中,局部变量必须 all function 块的开头声明。

答案 3 :(得分:0)

Microsoft决定不支持更新的C语言版本,因此您无法混合代码和声明。使用MSVC,你基本上坚持使用C90,尽管支持一些选定的功能(例如long longrestrict)。

我的建议是切换到C ++或使用不同的编译器,如MinGW edition of GCC

答案 4 :(得分:0)

另一个观察结果。 scanf()想要目的地的ADDRESS,而不是它的值。

在上面的示例中,您省略了 scanf(“%d”,val1); 中的&amp; 。在底部示例中,它包含 scanf(“%d”,&amp; val1);

“val1”vs“&amp; val1”

不应该改变变量'c'的问题,但可能会在某处导致语法错误?