c语言关键字总结

以下是阿鲤对c语言中关键字的总结复习,希望对大家有所帮助

1:auto     

2:const     

3:break continue

4:switch case default

5:char int long float double

6:while do

7:if else

8:for

9:enum

10:extern

11:go to

12:register

13:return

14:signed unsigned

15:sizeof

16:static

17:struct union

18:typedef

19:volatile


一:auto:

1:auto可以声明一个变量为自动变量,也就是申明一块临时的变量内存(栈上)。

2:但是在C语言中局部变量是默认auto属性的所以一般不使用

3:可以不初始化,默认为int类型

4:auto不可以修饰全局变量(全局变量存储在全局区)

eg:

#include
#include

int main()
{
	auto int v1 = 66;
	auto v2 = 88;//auto默认为int类型
	auto v3;//c中的auto可以不初始化
	printf("%d %d\n", sizeof(v1), v2);
	system("pause");
	return 0;
}

二:const:

1:可以定义const常量,具有不可变性。
例如:const int Max=100; Max++会产生错误; 

2:便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改; 

3:可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
如(1)中,如果想修改Max的内容,只需要它修改成:const int Max=you want;即可!

4:可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错;

例如: void f(const int i) { i=10;//error! }

5:可以节省空间,避免不必要的内存分配。 例如: 

#define PI 3.14159 //常量宏
const double Pi=3.14159; //此时并未将Pi放入RAM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。 

6.6:提高了效率。
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

二:break continue:

break:

1:当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。

2:它可用于终止 switch 语句中的一个 case

3:如果是多层嵌套循环就会跳出最内层的循环

#include
#include

int main()
{
	int a = 1;
	switch (a)
	{
	case 1:
		printf("a == 1", a++);
	case 2:
		a++;
		break;
	case 3:
		printf("a == 1", a++);
	default:
		break;
	}
	system("pause");
	return 0;
}

continue:

1:C 语言中的 continue 语句有点像 break 语句。但它不是强制终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

四:switch case default

switch(n){
    case a:
       //输出语句
       break;
    case b:
       //输出语句
       break; 
   default ://输出语句
}

1:上面的n可以是一个数字、数组、字符串。

2:当n与a匹配上的时候,则执行当前case下面的输出语句,如果有break存在,name在输出之后会马上跳出当前switch语句,若当前case输出语句后面没有break,则输出当前case语句之后继续执行判断,直到break跳出当前switch。

3:case可以有很多个,可以根据需要在适当的case后面加入break执行是否结束switch判断。

4:一般情况下,会在switch里面加上default,如果case后面的值没有与变量相等的时候,就执行default,并输出结果。

5:default一般写在switch最后,作为结束语,而且default不需要break语句。

五:char int long float double longlong short

这是五种数据类型,分别代表不同的数据,多种数据类型可以更丰富的表达生活中的各种值

类型 的大小
char 1byte
int 4byte
long 4byte
float 4byte
short

2byte

longlong 8 byte
double

8byte

 六:while do

while:

while (表达式)
{
        语句;
}

当表达式为真,则执行下面的语句;语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句;然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。这个就是 while 的执行顺序。

do:

do与while组成的语句为do-while语句

do{
    语句;
}while(Exp_cntrl);//分号不可丢

do-while 循环的执行流程是:首先无条件地执行一次循环体,然后再根据循环控制表达式的值来判断是否继续执行循环体。若为真,则继续执行;若为假,则停止执行,退出 do-while 循环。也就是说,do-while 循环至少执行一次循环体。

while和do-while的区别:do-while 循环和 while 循环的主要差别是:前者至少执行一次循环体,后者有可能一次也不执行循环体。

七:if else

if (条件表达式)
{
    复合语句A;
}

 

if(条件1)
{
    如果条件1为真,执行这里;(条件为真才执行);
}
else if(条件2)
{
    否则,当条件2为真执行这里。(当条件1不为真,条件2为真执行这里);
}
else
{
    条件1,条件2都不为真,执行这里;
}

注:if else语句中,至多完成一个条件

八:for

for(单次表达式;条件表达式;末尾循环体)
{
    中间循环体;
}

其中,表示式皆可以省略,但分号不可省略,因为“;”可以代表一个空语句,省略了之后语句减少,即为语句格式发生变化,则编译器不能识别而无法进行编译。

九:enum

枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。

枚举语法定义格式为:

enum 枚举名 {枚举元素1,枚举元素2,……};

eg:

#include
 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
 
int main()
{
    enum DAY day;
    day = WED;
    printf("%d",day);
    return 0;
}

输出结果:3

十:extern

我们知道,程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量则称为外部变量,外部变量也就是我们所讲的全局变量。它的存储方式为静态存储,其生存周期为整个程序的生存周期。全局变量可以为本文件中的其他函数所共用,它的有效范围为从定义变量的位置开始到本源文件结束。

然而,如果全局变量不在文件的开头定义,有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字 extern 对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

eg:

#include 
int max(int x,int y);
int main(void)
{
    int result;
    /*外部变量声明*/
    extern int g_X;
    extern int g_Y;
    result = max(g_X,g_Y);
    printf("the max value is %d\n",result);
    return 0;
}
/*定义两个全局变量*/
int g_X = 10;
int g_Y = 20;
int max(int x, int y)
{
    return (x>y ? x : y);
}

代码中,全局变量 g_X 与 g_Y 是在 main 函数之后声明的,因此它的作用范围不在 main 函数中。如果我们需要在 main 函数中调用它们,就必须使用 extern 来对变量 g_X 与 g_Y 作“外部变量声明”,以扩展全局变量的作用域。也就是说,如果在变量定义之前要使用该变量,则应在使用之前加 extern 声明变量,使作用域扩展到从声明开始到本文件结束。

不过,需要特别注意的是,由于用 extern 引用外部变量,可以在引用的模块内修改其变量的值,因此,如果有多个文件同时要对应用的变量进行操作,而且可能会修改该变量,那就会影响其他模块的使用。因此,我们要慎重使用。

十一:go to

C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。

注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法;goto语句往往使用在多层循环退出的情况

C 语言中 goto 语句的语法:

goto label;
..
.
label: statement;

十二:register

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对

因为,如果定义了很多register变量,可能会超过CPU的寄存器个数,超过容量。所以只是可能。

 1.register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。    

  2.因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。由于寄存器的数量有限,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销。

  3.早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定那些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令

 register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码,

  #ifdef NOSTRUCTASSIGN

  memcpy (d, s, l)

  {

       register char *d;

      register char *s;

      register int i;

      while (i--)

          *d++ = *s++;

  }

十三:return

1:使用return 语句可以返回一个变量内的值或一个指针,也可用return0,表示返回为空。

2:return   代表调到函数外,

3:return 0代表函数正常终止

4:return 1代表函数非正常终止

5:return 关键字的作用是返回程序流程的控制权!其副作用是返回一个值。

十四:signed unsigned

1:signed是默认的,表示这个变量是有符号的,可以存储整数和负数。

2:unsigned则需要显示给出表示这个变量,没有符号值能存储数的大小,而且不能表示正负。

3:signed存储符号是有代价的,代价就是存储空间中的一个比特位专门用来存储符号,这一位不能表示数值。一般来说,同类型的signed能够存储的数的绝对值大小要小于undigned。

4:unsigned的作用就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。

5:signed在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。

6:各种类型均默认signed类型

十五:sizeof

1:定义

sizeof是一个操作符(operator)。

其作用是返回一个对象或类型所占的内存字节数。

2.      语法

sizeof有三种语法形式:

1)  sizeof (object);  //sizeof (对象)

2)  sizeof object;   //sizeof 对象

3)  sizeof (type_name);  //sizeof (类型)

对象可以是各种类型的变量,以及表达式(一般sizeof不会对表达式进行计算)。

sizeof对对象求内存大小,最终都是转换为对对象的数据类型进行求值。

sizeof (表达式); //值为表达式的最终结果的数据类型的大小

3:eg:

int i;  
sizeof(int); //值为4  
sizeof(i); //值为4,等价于sizeof(int)  
sizeof i; //值为4  
sizeof(2); //值为4,等价于sizeof(int),因为2的类型为int  
sizeof(2 + 3.14); //值为8,等价于sizeof(double),因为此表达式的结果的类型为double  

char ary[sizeof(int) * 10]; //OK,编译无误

十六:static

不加static修饰,函数或者代码块中的变量在函数或者代码块执行完毕后就直接回收销毁了,每次执行都会重新分配内存,每次都会销毁。
加 static 修饰,函数或者代码块中的变量在函数或者代码块执行第一次初始化分配内存后,就算函数或者代码块执行完毕,该变量也不会被回收 销毁,直到程序结束 static 变量才会被回收。
当 static 作用于函数定义时,或者用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性。外部链接属性变为内部链接属性,标识符的存储类型和作用域不受影响。也就是说变量或者函数只能在当前源文件中访问,不能在其他源文件中访问。
当static 作用于代码块内部的变量声明时,static关键字用于修改变量的存储类型。从自动变量变为静态变量,变量的属性和作用域不受影响。
特点: static局部变量的”记忆性”与生存期的”全局性”
所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值.

  作用域 生命周期 默认值
普通全局变量 整个工程 程序运行到程序结束 0
静态全局变量 当前文件 程序运行到运行结束 0
普通局部变量 函数内 函数运行到运行结束 随机值
静态局部变量 函数内 程序运行到运行结束 0

注意事项:
1. “记忆性”, 程序运行很重要的一点就是可重复性, 而static变量的”记忆性”破坏了这种可重复性, 造成不同时刻至运行的结果可能不同.
2. “生存期”全局性和唯一性. 普通的local变量的存储空间分配在stack上, 因此每次调用函数时, 分配的空间都可能不一样, 而static具有全局唯一性的特点, 每次调用时, 都指向同一块内存, 这就造成一个很重要的问题 —- 不可重入性


十七:struct union

介绍链接

十八:typedef

介绍链接

十九:volatile

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去优化这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

你可能感兴趣的