并未要求一次性将所有的变量声明或者定义,只要求在使用某个变量之前先定义。变量的定义风格利弊如下:
1、变量在函数开头定义:便于修改。
2、变量就近定义:便于阅读。
3、变量在块语句的开头定义:有的临时变量放在语句块开头,可以不用在函数开头定义,并且在使用完毕后释放空间,可以这么做,但不要无故添加花括号来提高代码的结构。
一般的,为了要达到最大的兼容跨平台性,还是放在函数开头定义。因为C89规定,在任何执行语句之前,在块的开头声明所有局部变量。
如以下代码:
会报错信息:error C2065: 'salary' : undeclared identifier。
在C99以及C++中则没有这个限制,即在首次使用之前,可在块的任何位置都可以声明变量。
扩展资料:
c语言变量定义和保存格式的关系:
1、源文件保存为.c格式的话变量只能定义在最前,若保存为.cpp格式的话,变量定义较为灵活,不用在最前。
2、在C语言里,变量只能在函数的开头处声明和定义。在函数里要用到的变量必须要在开头处声明定义。声明定义的前面不能有任何其他非声明定义的语句。全局变量在函数体的外部声明定义。
而C++里(.CPP文件是按C++标准编译的),只要在用到变量前对该变量进行声明定义就行了,位置不做特别要求。而C语言的就定了在一个模块里(函数、循环体等)先声明一切所需变量后才能进行相关操作的规定。
参考资料:
百度百科--C语言
可以这样理解:定义就是分配内存空间!定义了一个变量后,那么在内存里就有一段空间属于这个变量。
对变量的值进行操作,就是对内存中的内容进行操作。
整型变量,其实可以理解成整数,包括负整数
零
正整数。
比如:
int
data
//
定义一个整型变量,变量的名字为
data
。
相应的,系统就会有
4
个字节的内存存储这个变量。
data
=
1
对变量的操作就会修改内存中的内容。
规定“所有用到的变量要先定义后使用”,编译器处理起来比较方便,不会有歧义。因为 C++ 里面,相同名字的变量在【不同的作用域】里面,是可以重复声明的。
注:每一对"{}"就是一个作用域。
比如下面的程序是可以编译通过的:
#include
using namespace std
int main(int argc, char *argv[])
// 作用域 1 开始
{
int a = 1
// 作用域 2 开始
{
cout <<a <<endl// 输出语句 1
int a = 2
// 作用域 3 开始
{
cout <<a <<endl// 输出语句 2
int a = 3
// 作用域 4 开始
{
cout <<a <<endl// 输出语句 3
int a = 4
cout <<a <<endl// 输出语句 4
}
}
}
return 0
}
输出结果为:
1
2
3
4
--------------------------------------------------------------------------------
如果【没有】规定“所有用到的变量要先定义后使用”,上面的程序会怎么样呢?
那么上面这个程序就乱套了。因为可以先使用,再定义,
输出语句1~4 就不知道自己该用哪个变量 a 了(这里有4个不同的 a)。
因为不需要“先定义,后使用”,输出语句1~4可以使用定义在任何地方的哪个变量 a 。
这样,编译器就无法确定,也就无法编译了。
--------------------------------------------------------------------------------
如果规定“所有用到的变量要先定义后使用”,上面的程序会怎么样呢?
那么上面这个程序可以正常运行:
1)在输出语句1的位置为止,只有【作用域 1 】定义了一个 a : int a=1 ,因此输出 1 。
2)在输出语句2的位置为止,【作用域 1 】和【作用域 2】分别定义了一个 a :
int a=1
int a=2
根据就近原则,使用最内层作用域的 a ,【作用域 2】里面的 a ,输出 2 ;
3)在输出语句3的位置为止,【作用域 1 】【作用域 2】和【作用域 3】分别定义了一个 a :
int a=1
int a=2
int a=3
根据就近原则,使用最内层作用域的 a ,【作用域 3】里面的 a ,输出 3 ;
同理可以分析输出语句4。
这就是为什么规定“所有用到的变量要先定义后使用”的原因之一吧。