后面两个转义符代码演示:
练一道笔试题
答案:14
分析: 算一个字符, 62算一个字符, 所以一共有14个字符。
5.3 注 释
- C语言风格的注释
- 缺陷:不能嵌套注释
- C++风格的注释 //xxxxxxxx
- 可以注释一行也可以注释多行
1.顺序结构顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行
2.选择结构顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用选择结构。选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。
特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
三个循环的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的; while循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。
定义函数:
C程序是由一组变量或是函数的外部对象组成的。 函数是一个自我包含的完成一定相关功能的执行代码段。我们可以把函数看成一个“黑盒子”,你只要将数据送进去就能得到结果,而函数内部究竟是如何工作的,外部程序是不知道的。外部程序所知道的仅限于输入给函数什么以及函数输出什么。函数提供了编制程序的手段,使之容易读、写、理解、排除错误、修改和维护。
返回类型 函数名(函数形式参数)
例: int Add (int x, int y)
函数的特点就是简化代码,代码复用。
arr[10] 数组中的10,表示要存储10个int类型的元素,当然不写也可以,程序会自动分配。
9.2 数组的下标
9.3 数组的使用
比较特别的是, 比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补0)位移。例如,将 11100011 右移 3 比特,算术右移后成为 11111100,逻辑右移则为 00011100。因算术比特右移较适于处理带负号整数,所以几乎所有的编译器都是算术比特右移。运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。
10.1 算术操作符+ - * / (得整数部分) %(取模,得余数)10.2 移位操作符
>> <<10.3 位操作符& ^ |10.4 赋值操作符= += -= *= /= &= ^ = |= >>= <<=a += 3 等同于 a = a + 3;
2.sizeof 的使用介绍
sizeof 也可用来统计数组的大小。
3. ++,-- 的使用
--的用法和++,同样的用法。
先说后置++,eg : a++, 后置++的原则:先使用,后++
前置++, eg : ++a, 前置++遵循一个原则:先++,后使用
4. 强制类型转换
10.6 关系操作符
exp1 ? exp2 : exp3
10.10 下标引用、函数调用和结构成员[] () . ->下标引用函数调用
- 关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字。例如关键字不能用作变量名、函数名等标识符由ISO标准定义的C语言关键字共32个:
- auto | double | int | struct | break | else | long | switch case | enum | register | typedef | char | extern | return | union const | float | short | unsigned | continue | for | signed | voiddefault | goto | sizeof | volatile | do | if | while | static | inlinerestrict _Bool _Complex _Imaginary _Generic
- 基本数据类型void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果。(C89标准新增)
- char:字符型类型数据,属于整型数据的一种。(K&R时期引入)
- int:整型数据,表示范围通常为编译器指定的内存字节长。(K&R时期引入)
- float:单精度浮点型数据,属于浮点数据的一种。(K&R时期引入)
- double:双精度浮点型数据,属于浮点数据的一种。(K&R时期引入)
- _Bool:布尔型(C99标准新增)
- _Complex:复数的基本类型(C99标准新增)
- _Imaginary:虚数,与复数基本类型相似,没有实部的纯虚数(C99标准新增)
- _Generic:提供重载的接口入口(C11标准新增)
- 类型修饰关键字short:修饰int,短整型数据,可省略被修饰的int。(K&R时期引入)
- long:修饰int,长整型数据,可省略被修饰的int。(K&R时期引入)
- long long:修饰int,超长整型数据,可省略被修饰的int。(C99标准新增)
- signed:修饰整型数据,有符号数据类型。(C89标准新增)
- unsigned:修饰整型数据,无符号数据类型。(K&R时期引入)
- restrict:用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。(C99标准新增)
- 复杂类型关键字struct:结构体声明。(K&R时期引入)
- union:联合体声明。(K&R时期引入)
- enum:枚举声明。(C89标准新增)
- typedef:声明类型别名。(K&R时期引入)
- sizeof:得到特定类型或特定类型变量的大小。(K&R时期引入)
- inline:内联函数用于取代宏定义,会在任何调用它的地方展开。(C99标准新增)
- 存储级别关键字auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配。与static相反。当变量未指定时默认为auto。(K&R时期引入)
- static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。(K&R时期引入)
- register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。(K&R时期引入)
- extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(K&R时期引入)
- const:指定变量不可被当前线程改变(但有可能被系统或其他线程改变)。(C89标准新增)
- volatile:指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止编译器把该变量优化成寄存器变量。(C89标准新增)
流程控制关键字
- 跳转结构return:用在函数体中,返回特定值(如果是void类型,则不返回函数值)。(K&R时期引入)
- continue:结束当前循环,开始下一轮循环。(K&R时期引入)
- break:跳出当前循环或switch结构。(K&R时期引入)
- goto:无条件跳转语句。(K&R时期引入)
- 分支结构if:条件语句,后面不需要放分号。(K&R时期引入)
- else:条件语句否定分支(与if连用)。(K&R时期引入)
- switch:开关语句(多重分支语句)。(K&R时期引入)
- case:开关语句中的分支标记,与switch连用。(K&R时期引入)
- default:开关语句中的“其他”分支,可选。(K&R时期引入)
编译
- #define预编译宏#if 表达式 #else if 表达式 #else #endif条件编译#ifdef 宏 #else #endif 条件编译#ifndef 宏 #else #endif 条件编译与条件编译
11.1 关键字typedef
11.2 关键字static
在C语言中:static是用来修饰变量和函数的
- 修饰局部变量-称为静态局部变量
- 修饰全局变量-称为静态全局变量
- 修饰函数-称为静态函数
11.2.1 static 修饰局部变量
输出:
分析:上面说过变量的生命周期从进入作用域开始创建,到出作用域销毁。
在第一遍调用test函数时,n这个变量从{开始创建,打印}出作用域开始销毁,然后中间n++,所以最终打印出来n=2,这个时候test函数调用完成,此时已经没有n这个东西了,因为已经销毁了,然后第二遍调用testh函数,然后从头开始创建n变量并赋值n=1,然后打印n=2,然后销毁n变量,所以最终打印效果:2 2 2 2 2 2 2 2 2 2.
下面时使用static关键词,来修饰局部变量:
对比代码 1 和代码 2 的效果理解 static 修饰局部变量的意义。结论:static修饰局部变量改变了变量的生命周期让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。总结:static修饰局部变量的时候,局部变量出了作用域,局部变量不会被销毁。
本质上,static修饰局部变量的时候,改变了变量的存储位置。
内存时一块比较大的存储空间,在使用内存是会划分不同的功能区域。
在学习编程语言的时候,栈区、堆区、静态区。
变量被staic修饰后,此变量就从栈区移动到了静态区,但代码这里n直接就是在静态区了,不存在转换,这里只是特殊说明一下,所以说static修饰局部变量的时候,改变了变量的存储位置。
11.2.2 修饰全局变量
test.c ------------------------------------------> test.exe
编译 -- 链接 -- 运行
- 一个全局变量在整个工程的其他文件内部能被使用,是因为全局变量具有(外部连接)属性.
- 当一个全局变量被 static 修饰的时候,这个变量的外部链接属性就变成了内部链接属性。
- 使得这个全局变量只能在自己所在的源文件内部使用,其他文件不能使用。
给我们的感觉是作用域变小了
11.2.3 修饰函数
结论:
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
& - 取地址操作符&a,取出的是所占4个字节空间的第一个字节的地址(地址小的那一个字节)。
13.2 指针变量的大小
14.1 用结构体类型来创建一个变量,并打印信息。
我们知道创建一个变量很简单,都是数据类型+变量名, 比如:
那同样上面的struct Stu 结构体也是个类型,然后他也能创建变量:struct Stu s,这个s就是变量,可以发现struct Stu{...} 和int 的效果一样,只不过int 是解决单一变量问题的,而struct Stu解决复杂变量问题的,所以说struct Stu{...}和int 一样是不占空间的,只有当struct Stu s动作发生,创建出来的s变量才占用一点空间。
那要如何使用变量呢?
14.2 能不能用指针去实现打印信息的效果。
代码如下:
15 【普及】关键字register - 寄存器
由于CPU处理数据速度非常之快,以至于内存赶不上CPU的速度,所以当处理数据时,内存中的数据向上一级存放,于是就放到高速缓存、寄存器里面。
那进入整体,在写代码时我们也可以写出寄存器变量:
当把'3' 数据存放在寄存器里面了,这样在读取此数据时会更快,但是需要注意一点,这里只是建议存放,那到底最后是否存放在寄存器里面时编译器说了算。
(1)C语言是一门通用计算机编程语言,广泛应用于底层开发。那么什么叫做底层开发呢?
一般我们所购买的电脑都是硬件设备,需要在电脑上安装操作系统,比如windows / Linux / macos等,但是操作系统并不是直接控制电脑硬件,而是通过中间层-- - 驱动(各种驱动软件),来间接操控硬件设备。在操作系统安装完成后,如果我们需要丰富多彩的体验和功能,就需要安装应用软件,比如社交聊天用的QQ、微信、网络资源管理和共享的云盘网盘、娱乐放松的电脑游戏,这些都存在与应用层。通常我们将应用层往下称为底层。
(2)常见文件后缀.c-- - 源文件 (c语言格式source).h-- - 头文件(head).cpp-- - 源文件(c++格式).exe-- - 可执行程序
(3)一个工程中有且仅能有一个main函数(主函数),一个工程中可以有多个.c源文件,多个.h头文件,但是多个.c文件中有且仅能有一个main函数。分析理解:main函数是整个工程程序执行的入口,如果出现了多个main函数,那么程序就不知道该从哪个入口进去,不知道执行哪个main函数,就会出错!
(4)变量的声明和定义、函数的声明和定义可以放到main函数外面,但是执行类的语句不能放到main函数外面
例如:全局变量a的声明和定义可以放到main函数外面,但是打印a的值这条执行语句不能放到main函数外面。
再补充:
C语言-格式输入输出中“%d,%o,%x,%e,%f等的含义
格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。
格式字符有d,o,x,u,c,s,f,e,g等。
如下所示:
%d - 整型输出,%ld - 长整型输出,
%o - 以八进制数形式输出整数,
%x - 以十六进制数形式输出整数,
%u - 以十进制数输出unsigned型数据(无符号数)。
%c - 用来输出一个字符,
%s - 用来输出一个字符串,
%f - 用来输出实数,以小数形式输出,(备注:浮点数是不能定义如的精度的,所以“%6.2f”这种写法是“错误的”!!!)
%e - 以指数形式输出实数,
%g - 根据大小自动选f格式或e格式,且不输出无意义的零。
scanf(控制字符,地址列表)
格式字符的含义同printf函数,地址列表是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。如scanf("%d%c%s",&a,&b,str);
以下是运算符的优先级表: