两个凡是:凡是在函数内部定义的变量存储在栈(.stack)区(加static除外),凡是定义在函数外部的变量存储在数据(.date)区。
1.可见性(作用域):
指标识符能够被使用的范围;只有在作用域内此标识符才能被使用,此阶段针对编译和链接过程;
1).函数中定义的标识符,包括形参和函数体中局部变量,作用域在该函数内,也叫函数域;
2).文件作用域也称全局作用域,定义在所有函数之外的标识符,具有文件作用域 ,作用域从定义到整个源文件结束,文件中定义的全局变量和函数都具有文件作用域;
2.生存期:
指标识符从程序开始运行时被创建,具有存储空间,到程序运行结束时消亡,释放存储空间,此阶段针对程序执行过程;
1).局部变量生存期,函数被调用,分配存储空间,函数执行结束后释放空间,存储于栈区;
2).全局变量生存期,从程序执行开始到结束,存储在数据区;
3).动态生存期暂不介绍;
3.“++”运算符
上篇博客简单介绍了取模运算符%和它的主要作用,又介绍了用辗转相除法求两个整数的最大公约数,今天来说一下“++”运算符,在这之前先说名一下几个概念:
操作数、左值和右值
a.操作数是程序操纵的数据实体,该数据可以是数值,逻辑值等,可以是常量也可以是变量;
b.左值可写,就是可以对其进行赋值,右值可读,不能对其赋值,但是可以读取它的值;
- 前置++:c=++a,先给变量a的值加1,再赋值给c,若a赋初值为0,则执行此语句后c的值为1,a的值也变为1;
- 后置++:c=a++,先将变量a的值赋给c,然后a的值再加1,若a赋初值为0,则执行此语句后c的值为0,a的值变为1;
拿例子说话:
#include<stdio.h>
int main()
{
int a=0,b=0,c1=10,c2=10;
c1=++a;
printf("c1=%d\n",c1);
c2=a++;
printf("c2=%d\n",c2);
return 0;
}
注:“--”同“++”;
4.关键字
在c语言中,公有32个关键字,根据关键字的作用可分为数据类型的关键字和控制语句关键字。
- 数据类型关键字:void char short int long float double signed unsigned truct union enum typedef sizeof auto static register extern const volatile
- 流程控制关键字:if else switch case default for do while return continue break goto
- C19新增关键字:inline restrict Bool Complex Imaginary
在这里将主要介绍一下标红的关键字typedef static sizeof extern const
- sizeof:计算类型大小或变量的大小,就是字节个数;
#include<stdio.h>
int main()
{
printf("char :%d\n",sizeof(char));
printf("int :%d\n",sizeof(int));
printf("short :%d\n",sizeof(short));
printf("double :%d\n",sizeof(double));
printf("float :%d\n",sizeof(float));
return 0;
}
- typedef:在计算机编程语言中用来为复杂的声明定义简单的别名,本身是一种关键字,与aut、extern、mutable、static、register等关键字不能出现在同一表达式中。
#include<stdio.h>
typedef unsigned char uc;
typedef unsigned int ui;
typedef unsigned long long ull;
typedef int* ti;
int main()
{
uc a='a'; //等价于unsigned char a='a';
ui b=1; //等价于unsigned int b=1;
ull c=5; //等价于unsigned long long c=5;
ti d; //等价于int * d;
}
-
extern:用于全局变量或函数的声明前,用来说明“此变量/函数已在别处定义,要在此处引用”。
text1.cpp //此程序没有实际意义,只用来说明extern
#include<stdio.h>
int c=0;
void fun(int a,int b)
{
int c=a>b?a:b;
return c;
}
text2.cpp
#include<stdio.h>
extern int c;
extern void fun();
int main()
{
printf("c=%d\n",c); //之前已用extern声明,可在此处直接调用c;
int d=5;int e=23;
int max1=fun(d,e); //之前已用extern声明,可在此处直接调用fun();
printf("max2=%d\n",max2);
}
-
static:可修饰全局变量、局部变量、函数。
局部变量前加static改变生存期(由栈区变为数据区),不改变其可见性(本身只在本文件中可见),全局变量前加static改变可见性(加static后只在本文件中可见),不改变其生存期(仍在数据区);函数前加static后不能用extern在另一文件中调用;
text1.cpp
#include<stdio.h>
static int a=10; //静态全局变量
int b=5; //全局变量
void fun1() //函数
{
printf("a=%d\nb=%d\n",a,b);
}
static void fun1() //静态函数
{
printf("a=%d\nb=%d\n",a,b);
}
text2.cpp
#include<stdio.h>
extern int a; //error
extern int b;
extern void fun1();
extern void fun2(); //error
int main()
{
printf("a=%d\n",a); //error
printf("b=%d\n",b); //正确
fun1();
fun2(); //error
return 0;
}
- const:此关键字在c中用的较频繁,是定义只读变量的关键字,变量名前加const后可读不可写;可修饰变量、指针、数组;加const时一定要给变量初始化赋值,负责将出错,例:const int a=0;如果此时不给a赋值,则出错,因为加const之后a可读不可写不能再次被赋值;
注意:const int a=0;和int const a=0;是等价的。
#include<stdio.h>
const int a=0;
const int b; //error
int main()
{
const char c='a';
const int ar[5]={1,2,3,4,5};
const int br[5]={1,2,3}; //error
const int cr[5]={}; //正确,都赋初值为0;
return 0;
}
持续更新中……