当我跟随时:
#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语言。
答案 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
}
虽然这样做可能不太常见。与一些流行的看法相反,函数的开始并不是唯一可以声明自动变量的地方。更常见的是,使用作为if
或for
构造的一部分引入的现有语句块,而不是创建虚拟块。
将case
块括在{...}中是很有用的,即使通常不是必需的,这样您就可以引入临时的特定于案例的变量:
switch( x )
{
case SOMETHING :
{
int case_local = 0 ;
}
break ;
...
}
答案 2 :(得分:0)
在C90中,局部变量必须 all 在 function 块的开头声明。
答案 3 :(得分:0)
Microsoft决定不支持更新的C语言版本,因此您无法混合代码和声明。使用MSVC,你基本上坚持使用C90,尽管支持一些选定的功能(例如long long
,restrict
)。
我的建议是切换到C ++或使用不同的编译器,如MinGW edition of GCC。
答案 4 :(得分:0)
另一个观察结果。 scanf()想要目的地的ADDRESS,而不是它的值。
在上面的示例中,您省略了 scanf(“%d”,val1); 中的&amp; 。在底部示例中,它包含 scanf(“%d”,&amp; val1);
“val1”vs“&amp; val1”
不应该改变变量'c'的问题,但可能会在某处导致语法错误?