局部变量是在程序运行时分配的他存在栈区,有些书中讲局部变量的作用域是在函数中,在函数调用时全部入栈,其实这种理解只在c89的标准下是对的,在c99中局部变量是可以在函数的任何地方声明的,他的左右域也可是复合语句 , 下面我们就来了解一下,复合语句和局部变量问题。
1. 函数中定义的变量他的作用域只在该函数内。
2. 函数的形参属于被调函数的局部变量,而实参则是主调函数的局部变量。
3. 允许在不同的函数中使用相同的变量名,他们之间互不干扰。
4. 在复合语句中可以定义变量(该变量名可以和其他复合语句相同,他们互不干扰)他的作用域只在复合语句内。
例如:
int getTheName(int num)
{
int i=0,n=30;
for(i=0;i<n;i++)
{
int i = 3; //这里的i是合法的
if(i==num)
return i;
}
return 0;
}
既然提到了在复合语句中就可以定义变量,那么什么是复合语句呢。
复合语句就是{ } 括起来,他由若干个表达语句组合成的,复合语句只是表明程序的作用域而已,在c中允许小括号扣起来的语句出现在一个表达式中,因此一个变量可以赋值一个复合语句例如 int a=({ int i=0; char b; if(b=='a') { i = 3}}) 这个表达语句的值就是复合语句最后一个表达式的值,注意最后一个表达式的类型一定要和变量相同。再举个例子:
再次注意,例子中a的值是复合语句中最后一个语句的值,并且要用()括起来,并且它的数据类型与最后一个语句的数据类型相匹配,这里除了宏定义, 如果时出现在赋值表达式中最后一个表达式一定是一个不同表达式而不能使(循环,条件,switch 语句,这样c99无法编译通过)
这种特性 在Linux内核中常被用于宏的定义中。