C语言第三课--课程总结(2)
  uUWKQE7Avyk4 2023年11月02日 26 0

一.有关原码、反码、补码的补充

1.只要是整数,在内存中都是存储的二进制补码

2.正数的原码、反码、补码相同

3.负数同理存储的也是补码,但需要计算出补码,具体计算过程可以参考上一期博客

二.C语言中常见关键字

1.auto 翻译为自动,如以下代码

#include<stdio.h>
int main(void)
{
int a = 10;
return 0;
}

其中a被称为局部变量也可以被称为自动变量(自动创建自动销毁的变量),在局部变量中应在数据类型前面添加auto,变成:auto int a =10;  但是可以省略,所以一般不写auto

2.break 与 case 

break与case常用于循环语句中,break是结束循环,case用于指定多个分支条件

3.char

用于创建字符/字符串类型

4.const

用于修饰变量,使变量的值不可修改,但是需要注意使用const语句修饰的变量其本质仍然是变量,并不是常量

5.continue

用于循环语句

6.default

用于switch循环语句中

7.do

长于while语句搭配使用,搭配方法为do····while

8.double

代表双精度浮点型数据类型

9.else

一般用在判断语句中,当条件不再满足if语句的入口条件时则跳转至else语句执行

10.enum

枚举类型

11.extern

引入外部符号

12.float

代表单精度浮点数据类型

13.for

用于for语句中

14.goto

用于goto语句中

15.if

用于if判断语句中

16.int

代表整型数据类型

17.long

代表长整型数据类型

18.register

寄存器关键字,用于存储数据,以下是计算机存储数据的几种方式:

C语言第三课--课程总结(2)_生命周期

其中寄存器访问速度>高速缓存>内存>硬盘,所以如果一个变量需要频繁的使用,则可以将其定义为寄存器变量,但是register只是建议将变量存寄存器中,是否将变量a放入寄存器中最终由编译器进行判断,如以下代码所示:

#include<stdio.h>
int main(void)
{
regsiter int a = 10;
return 0;
}

19.return

return语句

20.short

代表短整型数据类型

21.signed

代表有符号数据类型,如以下代码:

#include<stdio.h>
int main(void)
{
int a = 10;
a =-20;
return 0;
}

以上代码中可以把10赋值给变量a,也可以将-20赋值给a,证明int类型定义的变量是有符号的(signed),只是将signed进行了省略,所以 signed int = int

22.unsigned

代表无符号数据类型,如以下代码:

#include<stdio.h>
int main(void)
{
unsigned int a = 10;
a = -20;
printf("a=%u\n",a);
getchar();
return 0;
}

unsigned为无符号数据类型,其定义的变量为非负数,即使变量的值为负数,也会被unsigned当作非负数

23.sizeof

计算数据类型/变量/数据所占用的内存大小(单位:字节)

24.static

25.struct

为结构体关键字

26.switch

用于switch语句中

27.typedef

类型定义关键字

28.union

联合体/共用体的关键字

29.void

表示无/空

30.volatile

31.while

用于while循环语句中

总结:上述的词中为C语言的部分关键字,当定义变量时变量名不能与上方31个关键字相同,否则出错,如图所示:

C语言第三课--课程总结(2)_作用域_02

所以我们在定义变量名称的时候应避免出现上述31个关键字

三.常见关键字的解释

(1.typedef --- 类型重定义关键字,如下代码:

#include<stdio.h>
int main(void)
{
typedef unsigned int u_int;
u_int a = 20;
printf("a=%d\n",a);
return 0;
}

代码第四行中使用typedef给unsigned int类型取了一个u_int的别名所以typedef被称为类型重定义,当使用u_int定义变量时其效果与unsigned int一样

(2.static --- 用于修饰变量与函数,如下代码:

#include<stdio.h>
void text(void)
{
int a = 1;
a++;
printf("a=%d\n",a);
}
int main(void)
{
int i = 0;
while(i<5)
{
text();
i++;
}
getchar();
return 0;
}

程序最终的输出为五个a=2,让我们来逐句解读这个段代码,首先我们自定义了一个text()函数,随后定义并赋值给变量a,使a=1,然后使用a++使a进行自增,这时的a=2,最后调用printf()函数将a的值进行输出,变量a的值被销毁,解读完text()函数,我们来看一下main()函数中的代码,第十行定义并赋值给变量i,使得i=0,随后使用while语句,当i<5的时候则调用text()函数中的内容,然后将变量i进行自增,重复执行,直到i的值不再满足while循环的入口条件,跳出循环,我们再来看一段代码:

#include<stdio.h>
void text(void)
{
static int a = 1;
a++;
printf("a=%d\n",a);
}
int main(void)
{
int i = 0;
while(i<5)
{
text();
i++;
}
getchar();
return 0;
}

程序的运行结果为23456 这次第四行代码在int前增加了static关键字,这使得变量a变成一个静态的局部变量当未使用static关键字时局部变量a当生命周期到达后会自动销毁,但加入static关键字后当a生命周期到达后不会自动销毁,a的值将被保存,我们打开VS自带的代码调试中的监视功能,按下F10,监视名称输入变量名a与i 如图所示:

C语言第三课--课程总结(2)_生命周期_03

每按下F10代码将往前执行一行,在text()函数处停住,按下F11使监视程序进入自定义函数中执行,如图所示:

C语言第三课--课程总结(2)_static_04

在自定义函数中按F10进行代码调试,当执行完成自定义函数时,重复上述操作,在text()函数处按下F11,进行自定义函数的调试,重复上述操作后可以看到监视窗口中,变量a的值一直在发送改变,并没有被销毁,i的值随着循环的次数也在自增,最终当i不满足循环条件时,跳出循环,如图所示:

C语言第三课--课程总结(2)_static_05

所以我们得出结论:当static修饰局部变量的时候,局部变量的周期将被延长

static也可以修饰全局变量,如以下代码:

#include<stdio.h>
int main(void)
{
extern int a;
printf("%d\n",a);
getchar();
return 0;
}

随后再新建一个源文件,使用VS的朋友可以按下快捷键Ctrl+Shift+A,进行创建

在新建的源文件中写入以下代码:

int a = 2023;  //定义了一个全局变量

如图所示:

C语言第三课--课程总结(2)_static_06

这时候我们按下F5运行程序,会输出变量a的值,这里用到了extern关键字

extern的作用是声明外部符号,int则表明了数据类型为整型,但是我们更改一下code2.c源文件中的内容,使其变成 static int a = 2023;接下来我们运行程序,会发现编译器无法编译,并报了错误,如图所示:

C语言第三课--课程总结(2)_关键字_07

由此得出结论:static修饰全局变量的时候改变了变量的作用域,让静态的全局变量只能在源文件内部使用,出了源文件则无法使用

用static修饰函数与修饰变量相似,在code.c源文件输入如下代码:

#include<stdio.h>
extern Add(int x,int y);
int main(void)
{
int a = 10;
int b = 20;
int sum = Add(a,b);
printf("sum=%d\n",sum);
return 0;
}

再在刚刚创建的code2.c中输入以下代码:

int Add(int x, int y)
{
int z = x + y;
return z;
}

程序的运行结果为30,程序可以正常运行,但是我们在code2.c的源文件中的第一行在int前面加上static进行修饰,会发现程序运行出错,原因是static修饰改变了函数的链接属性,一个普通的函数如果没有static进行修饰则具备外部链接属性,当被static修饰时则变成了内部链接属性

                                                                                 2023/7/15

                                                                                   王起舟

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

uUWKQE7Avyk4