目录
位-字节-字
都是描述计算机数据单元或储存单元的术语
最小的储存单位是位(bit),1字节(byte)等于8位,字(word)是64位[word取决于计算机,word从最开始的8位增至目前的64位]注:小数点也占一位。
声明与定义
变量定义:用于为变量分配储存空间,还可以为变量指定初始值.程序中,变量有且仅有一个定义.
变量声明:用于向程序表达变量的类型和名字.
定义也是声明,但extern声明不是定义(通过使用extern关键字声明变量而不是定义它.
[注意]
1.变量在使用前就要被定义或声明.
2.在一个程序中,变量只能定义一次,却可以声明多次.
3.定义分配储存空间,而声名不会
常量
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。常量可以直接在代码中使用,也可以通过定义常量来使用。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
整型常量
(1).八进制整型常量必须以0开头,十六进制的整型常量必须为0X或0x。
(2)十进制无符号整型常量的范围为 0~65535,有符号数为-32768~+32767。八进制无符号数的表示范围为0~0177777;十六进制无符号数的 表示范围为0X0~OXFFFF 或0X0~OxFFPF。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀L或1来表示的。例如:
十进制长整型常量:
327L、856000L、63653L
八进制长整型常量:
036L、057L、0277777L
十六进制长整型常量:
OX1AL、OXBCSL、OX1FFFFL
说明
长整型常量327L和基本整型常量327在数值上并无区别,但对327L,因为是长整型常量,C编译系统将为它分配4个字节存储空间;而对327,因为是基本整型,只分配2个字节的存储空间。
(3).无符号数也可用后缀表示,整型常量的无符号数的后缀为U或u。例如:
212u 0X25ABu 056u212u、
前缀、后缀可同时使用以表示各种类型的数。例如,0523Lu 表示八进制无符号长整数 523,其十进制为339。
(4)整型数据在内存中是以二进制的形式存放,数值是以补码表示的。一个正数的补码和其原码的形式相同;一个负数的补码是将该数绝对值的二进制形式,按位取反再加1。
浮点型常量(实型常量)
浮点型常量的基本形式是:有符号的数字(包括小数点)
正号可以省略。可以没有小数点(如,2E5)或指数部分(如,19.28),但是不能同时省略两者。
可以省略小数部分(如,3.E16)或整数部分(如,.45E-6),但是不能同时省略两者。
注:e前面必须有数字,e后面的指数必须为整数。
字符型常量
字符型常量是用单引号括起来的一个字符。例如'a'
在C语言中,字符型常量具有以下特点:
1.宇符型常量只能用单引号括起来,不能用双引号或其他括号。
2.字符型常量只能是单个字符,不能是字符串。
3.字符可以是字符集中的任意字符,但数字被定义为字符型之后则不能参与数值运算。
字符串常量
1.字符串常量的概念和字符串长度
字符串常量是用一对双引号括起来的若干字符序列。
字符串中字符的个数称为字符串长度。长度为0 的字符串(即一个字符都没有的字符串)称为空串。例如,"welcome to our school"、“hello girl"等都是字符串常量,其长度分别为21和10(空格也是一个字符)。
2.字符串的存储 C语言规定:在存储字符串常量时,由系统在字 符串的末尾自动加一个”\0"作为字符串的结束标志.("\0"也要储存,而ASCII码不用储存这个结束标志"\0").
变量
1.什么是变量:通俗地说:变量是用于存放数据的容器,我们通过变量名获取数据,甚至数据可以修改.
2.本质:变量是程序在内存中申请的一块用来存放数据的空间.
参数
参数:传递给函数的信息,分为形参(例如:x)和实参(例如:2)
例如:printf("Hello, pal.")函数调用有一个参数:"Hello,pal."。
一个字符串就是一个参数
printf("%d cats ate %d cans of tuna\n",cats,cans);中cats and cans也都是参数。
scanf("%d",&weight)函数调用有两个参数:"%d"和&weight。
进制
1、八进制数是一种逢八进一的计数体制,基数是8,用0~7表示,如077
2、八进制数以数字0开头。
3、十六进制数是一种逢十六进一的计数体制,基数是16,用0~9,A~F表示,如0xFF或0XFF
以十进制显示数字,使用%d;
以八进制显示数字,使用%o;
以十六进制显示数字,使用%x;
但是,要把各进制的前缀显现出来就要加点前缀
八进制:%#o;
十六进制:%#x,%#X;
标识符
指常量,变量,语句标号以及用户自定义函数的名称。
一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。(不能是关键字)
C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言
关键字
下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
关键字 | 说明 |
---|---|
auto | 声明自动变量 |
break | 跳出当前循环 |
case | 开关语句分支 |
char | 声明字符型变量或函数返回值类型 |
const | 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变 |
continue | 结束当前循环,开始下一轮循环 |
default | 开关语句中的"其它"分支 |
do | 循环语句的循环体 |
double | 声明双精度浮点型变量或函数返回值类型 |
else | 条件语句否定分支(与 if 连用) |
enum | 声明枚举类型 |
extern | 声明变量或函数是在其它文件或本文件的其他位置定义 |
float | 声明浮点型变量或函数返回值类型 |
for | 一种循环语句 |
goto | 无条件跳转语句 |
if | 条件语句 |
int | 声明整型变量或函数 |
long | 声明长整型变量或函数返回值类型 |
register | 声明寄存器变量 |
return | 子程序返回语句(可以带参数,也可不带参数) |
short | 声明短整型变量或函数 |
signed | 声明有符号类型变量或函数 |
sizeof | 计算数据类型或变量长度(即所占字节数) |
static | 声明静态变量 |
struct | 声明结构体类型 |
switch | 用于开关语句 |
typedef | 用以给数据类型取别名 |
unsigned | 声明无符号类型变量或函数 |
union | 声明共用体类型 |
void | 声明函数无返回值或无参数,声明无类型指针 |
volatile | 说明变量在程序执行中可被隐含地改变 |
while | 循环语句的循环条件 |
数据类型
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
基本数据类型由11个关键字组成:int,long,short,unsigned,char,float,double,signed,_Bool,_Complex,_Imaginary。
C 中的类型可分为以下几种:
序号 | 类型与描述 |
---|---|
1 | 基本数据类型 格据定义,int类型不小于16位,short类型至少占16位,long类型至少占32位,Long long类型至少占64位,char类型表示一个字符要占一字节内存。 |
2 | 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 |
3 | void 类型: 类型说明符 void 表示没有值的数据类型,通常用于函数返回值。 |
4 | 派生类型: |
5 _Bool类型:
用于表示布尔值,即逻辑值ture和false。1代表ture,0代表false。(实际上也是一种整数类型)
6 可移植类型:
stdint.h and inttypes.h
7 复数和虚数类型
C语言有三种复数类型:float_Complex,double_Complex, long double_Complex
例如,float_Complex类型的变量应包括两个float类型的值,分别表示复数的实部和虚部。
类似地,C语言的三种虚数类型是:float_Imaginary,double_Imaginary,long double_Imaginary.
如果包含complex.h头文件,便可用complex代替_Complex,用imaginary代替_Imaginary,还可以用
I(i的大写)代替-1的平方根。
8 有符号类型和无符号类型
在整数类型前加上关键字signed(符号类型)或unsigned(无符号类型)
有符号类整数型:可以用于表示正整数和负整数。
无符号整型:只能用来表示零和正整数。在整型类型前加上关键字unsigned表明该类型是无符号整型:unsignedint , unsigned long等。单独的unsigned相当于unsignedint。
打印类型大小
精度
float最多能表示小于8388607的小数点后7位,但绝对能保证的为6位,也即float的十进制的精度为为6~7位。
double数据类型绝对值最小可以取到2^-1024,精度则为2^52-1=4503599627370495,为16位。所以精度最高位16位,一定可以保证15位。
未规定long double的确切精度。(不少于double的精度,但不会大多少)
变量的存储类型
变量的存储类型决定变量什么时候被分配到指 定的内存空间中,以及在什么时候释放存储空间。变量的存储类型分为两种,即动态存储和静态存储。
用户的存储空间可以分为3个部分,即程序区、静态存储区和动态存储.要理解动态存储和静态存储方式,首先要了解 一下内存中用户存储空间的基本情况。
程序区
用来存放用户要执行的程序段,数据分别放在静态存储区和动态存储区中。
静态存储区
静态存储的变量位于内存的静态存储区,全局变量都保存在静态存储区中。因此,全局变量从程序执行时开始分配存储单元,直到程序终止时,才释放其所占的存储单元。
动态存储区
在动态存储区中存储与堆栈操作相关的数据, 住栈中的数据随着进栈出栈操作而变化,当变量被弹出堆栈以后,其生存周期也就结束了。在调用函数时其局部变量也被保存到动态存储区中,当函数结束执行,返回到主调函数时,变量所占用的空间将被释放,此时局部变量也将消失。由此可见,如果一个函数被调用了两次,其中变量的存储空间可能为不同的地址。
使用auto关键字声明变量
自动变量的类型声明符为auto。auto 存储类是所有局部变量默认的存储类。
自动变量属于局部变量,其作用域仅限于定义这个变量的函数或者是符合语向内。自动变量价结方式属于动态存储方式。定义在函数中的变量默认为 auto 存储类,这意味着它们在函数开始时被创建,在函数结束时被销毁。
使用Static关键字声明变量
在编写程序时,有时需要在调用函数中的某个局部变量以后,该变量的值不消失,并且保持原值不变,也就是该变量所占用的存储空间不被释放,在下次调用该函数时,变量中的值仍是上次调用说函数结束时变量的值。这时使用的变量类型是静态变量,使用static 关键字进行声明。静态变量属于静态存储方式。
定义变量时,使用static 关键字就可以将其定义为静态变量。格式如下:
static 类型声明符 变量1,变量2,···
用static 关键字声明外部变量,会得到静态全局变量。当用 static 关键字定义内部变量时,会得到静态局部变量。
使用register关键字声明寄存器变量
定义寄存器类型变量的格式如下:
register 类型声明符变量1,变量2,
对于循环次数较多的循环控制变量以及循环体内反复使用的变量,可以将其定义为寄存器变量,这样编译器就可以将变量存储到寄存器当中,提高运算效率。
注意:
(1)寄存器类型变量属于动态存储方式。只有局部变量,才能被定义为寄存器变量。静态存储类型的变量不能被定义为寄存器变量。
(2)将变量定义为寄存器类型以后,就不能对该变量使用取地址(&)的操作了,因为寄存器是没有内存地址的。
(3)计算机中寄存器的数目是有限的,不能将所有的变量都定义为寄存器变量。不同的系统对寄存器变量的处理方法也是不同的,有些 系统将寄存器变量当作自动变量进行处理,为其分配内存单元。
在实际的应用中,register类型变量应用得不多,在某些编译系统中会自动地将使用频繁的变量放入到寄存器中,无须编程人员指定。
使用extern 关键字声明外部变量
外部变量(也称全局变量)是在函数的外部定义的变量,其作用域是从变量的定义处开始,到程序文件的结尾处结束。外部变量可以被其作用域中的所有函数调用.在编译时,编译器将其存储在静态存储器区中。
说明:如果变量不是定义在程序文件开始处,那么其作用域就是从定义他的位子开始,到程序文件的结束为止。如果想被变量定义以前的函数调用,则需要在变量声明前添加extern关键词,这样声明的变量就可以被其他的外部函数所调用。
寄存器与储存器
寄存器(register)
容量最小,速度最快,但数据在断电后会丢失。
在计算机中,寄存器就像是计算机的“手”,用于暂存中间结果,让程序更快地运行
储存器
存储器容量比寄存器大,读写速度慢,但数据可以持久保存。
RAM
RAM可以读写数据,但数据在断电后会丢失;
ROM
ROM只能读取数据,数据可以长期保存。
其实RAM和ROM都是属于存储器,RAM代表随机存储器,ROM代表只读存储器。
ROM表示的是只读存储器,即:它只能读出信息,不能写入信息,计算机关闭电源后其内的信息仍旧保存,一般用它存储固定的系统软件和字库等。RAM表示的是读写存储器,可其中的任一存储单元进行读或写操作,计算机关闭电源后其内的信息将不在保存,再次开机需要重新装入,通常用来存放操作系统,各种正在运行的软件、输入和输出数据、中间结果及与外存交换信息等,我们常说的内存主要是指RAM
它们的特性不同,在计算机系统中分别扮演不同的角色。
寄存器通常用于存储CPU内部的临时数据和控制指令。
存储器被用来存储计算机程序和数据,包括操作系统、应用软件和用户数据等。
RAM用于存储需要频繁读写的数据,例如程序运行中的变量和缓存等。
而ROM则被用来存储固化的程序和数据,例如BIOS、固件、启动程序等
C储存类
字符
字符
日常使用的数字、字母、文字、标点符号,图形符号等都称作字符。
字符集
由很多个字符组成的集合叫做 字符集 。 可以人为的根据某个规则将一些符号归纳为一组集合,这些文字符号的集合就称为一个字符集。一个汉字或中文标点符号通常被计算为两个字符,因为它的存储空间占用2个字节。
字符串
(英语:string),是由零个或多个字符组成的有限序列。
字符常量
用单引号括起来的单个字符被称为字符常量
Char grade=’A’;
编译器一发现’A’就将其转换成相应的代码值(代码值是指ASCII码表中各个字符对应的数值)
如果省掉单引号,编译器认为A是一个变量名;
如果把A用双引号括起来,编译器则认为”A”是一个字符串.
转义序列
在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。
把转义序列赋给字符变量时,必须用单引号把转义序列括起来.例如: char nerf='\n';
稍后打印变量nerf的效果是相当于\n;
下表列出了一些这样的转义序列码:
转义序列 | 含义 |
---|---|
\\ | \ 字符 |
\' | ' 字符 |
\" | " 字符 |
\? | ? 字符 |
\a | 警报铃声 |
\b | 退格键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ooo | 一到三位的八进制数 |
\xhh . . . | 一个或多个数字的十六进制数 |
C 运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
运算符优先级
注: x *= y // x = x * y
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- |
() | 圆括号 | (表达式)/函数名(形参表) | -- | ||
. | 成员选择(对象) | 对象.成员名 | -- | ||
-> | 成员选择(指针) | 对象指针->成员名 | -- | ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ | 按位取反运算符 | ~表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | |||
-- | 自减运算符 | --变量名/变量名-- | |||
* | 取值运算符 | *指针变量 | |||
& | 取地址运算符 | &变量名 | |||
! | 逻辑非运算符 | !表达式 | |||
(类型) | 强制类型转换 | (数据类型)表达式 | -- | ||
sizeof | 长度运算符 | sizeof(表达式) | -- | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | |||
% | 余数(取模) | 整型表达式%整型表达式 | |||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | |||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | |||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | |||
< | 小于 | 表达式<表达式 | |||
<= | 小于等于 | 表达式<=表达式 | |||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | |||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- |
/= | 除后赋值 | 变量/=表达式 | -- | ||
*= | 乘后赋值 | 变量*=表达式 | -- | ||
%= | 取模后赋值 | 变量%=表达式 | -- | ||
+= | 加后赋值 | 变量+=表达式 | -- | ||
-= | 减后赋值 | 变量-=表达式 | -- | ||
<<= | 左移后赋值 | 变量<<=表达式 | -- | ||
>>= | 右移后赋值 | 变量>>=表达式 | -- | ||
&= | 按位与后赋值 | 变量&=表达式 | -- | ||
^= | 按位异或后赋值 | 变量^=表达式 | -- | ||
|= | 按位或后赋值 | 变量|=表达式 | -- | ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | -- |
说明:
同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
算术运算符
-
下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 描述 实例 % 取模运算符,整除后的余数 B % A 将得到 0 ++ 自增运算符,整数值增加 1 A++ 将得到 11 -- 自减运算符,整数值减少 1 A-- 将得到 9 -
如果i++或者++i单独为一条指令,则效果并没有什么区别,都是令i = i + 1;但是如果和其它的运算符结合,则二者还是有区别的。具体来说,i++ 是先使用 i,然后执行 i = i + 1;而 ++i 则是先执行 i = i + 1,然后再使用 i 。举个例子看下:
int i = 0;
printf("i++ is: %d\n", i++); // 先使用i,即打印 i++ is: 0;然后i = i + 1,即i的值变成1
printf("i is: %d\n", i); // 打印 i is: 1
printf("++i is: %d\n", ++i); // 先对i自增,即i = i + 1,令 i 的值变成2;然后打印,即 ++i is: 2
printf("i is: %d\n", i); // 打印 i is: 2 -
关系运算符
关系运算符包括大于、大于等于、小于、小于等于、等于和不等于
注意:符号“>=”(大于等于)与“<=”(小于等于)的意思分别是大于或等于、小于或等于。
逻辑运算符
操作符 | 含义 |
---|---|
&& | 与 |
|| | 或 |
! | 非 |
优先级:逻辑非 ! 的优先级最高,逻辑与 && 次之,逻辑或 || 优先级最低。
1,逻辑与 “&&” ,读作: “and” \n通俗解释:两个条件必须满足.\n比如:丈母娘说你想娶我女儿,必须有房且有车: —–有房 && 有车;
2,逻辑或 “||” ,读作: “or”\n通俗解释:两个条件满足其一就可以.\n比如:丈母娘说你想娶我女儿,要么得有房要么得有车: —–有房 || 有车;
3,逻辑非 “!”, 读作:”not”\n通俗解释:反着问.\n比如:\n你是不是不抽烟? —- !抽烟\n你是不是不喝酒? —- !喝酒
位运算符
赋值运算符
”=“
杂项运算符
%类型
%d整型输出(%ld长整型输出)
[格式化字符中每个%d都与待打印标量列表中相应的int值匹配.这个值可以是int类型的变量,int类型的常量或其他任何值为int类型的表达式.(例如: int ten=10;int two=2;printf("%d minus %d is %d",ten,2,ten-tow);)]
%f以小数形式输出,默认情况下保留小数点6位
[%.2f中的.2用于精确控制输出,指定输出的浮点数只显示小数点的后两位]
这里是引用
%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。
常用形式:
%————取余数
%d —— int 类型
%ld —— long 类型
%lld —— longlong 类型
%f —— float 类型
%lf —— double 类型
其他形式:
%d ——整型常量,十进制形式
%o —— 整型常量,八进制形式
%x —— 整型常量,十六进制形式
%s —— 字符常量,字符串形式(“a”)
%c —— 字符常量,字符形式(‘a’)
%f —— 实型常量,保留6位小数
%e —— 实型常量,科学计数,13位,小数6位,e是5位
%p 指针的值(打印指针地址)
%zd 通常用于sizeof和strlen()返回的实际类型(通常是unsugned或unsigned long)。
%u以十进制数输出unsigned型数据(无符号数)。注意:(%d与%u有无符号的数值范围,也就是极限的值,不然数值打印出来会有误)
%%代表%[由于 printf() 函数使用%符号来标识转换说明,因此打印 % 符号就成了个问题。如果单独使用一个 % 符号,编译器会认为漏掉了一个转换字符。使用两个 % 符号就行了]
%m.nf,%m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。%m.n在浮点数中,m也表示宽度;n表示小数的位数。
1、printf(\"%2.3f\\n\", 12.34); 输出为12.340。
&
e/E
3.16e7=3.16*10^7(表示3.16乘以10的7次方)
==
代数式中的运算符和表达式中的运算符是不同的。代数式中的等号是”=“,而表达式中的等号是”==“
”==“是在表达式中用来比较两个对象的运算符。如果两个对象相等,这关系表达式为真;如果不相等,则关系表达式的值为假。
i==5是逻辑关系等于,一般用于判断 i 的值是不是5,i=5是赋值,使i 的值等于5。
表达式
表达式(Expression):表达式是由变量、常量、运算符和函数调用等组成的一系列代码,用于计算并生成一个值。
赋值运算表达式
由赋值运算符”=”所组成的表达式称为赋值表达式
复合的赋值运算符
在“=“之前加上其他的运算符,可以构成复合的赋值运算符
例如,a+=3等价于a=a+3. a*=b+c等价于a=a*(b+c)
关系表达式
用关系运算符将两个表达式连接起来的式子
一般格式为:表达式 关系运算符 表达式
a>b该表达式是一个关系表达式,当a的值大于b的 值时,该表达式的值为真;否则为假。表达式的值的类型为布尔型。
说明:布尔型(bool)数值只有两个值,即真和假。0为假,非0则为真
逻辑表达式
C语言编译系统在给出逻辑运算结果时,以1代表”真“,0代表”假“。但反过来,在判断一个量是为”真“还是假时,以0代表假,以非0的值为真。例如,由于5和3均为非0.因此5&&3的值为真,返回值为1。
小知识:使用逻辑表达式需要注意的几点
1)逻辑运算符两侧的操作数,除可以是0和非0的整数外,也可以是其他任何类型的数据,如实型、字符型等。
2)在计算逻辑表达式时,计算机会按照优先级逐个判断子表达式的真伪。当通过某分子式就能够判断整个逻辑的真伪时,后边的子式就不会被解析。(以下两点解释)
1.对于逻辑与运算,如果第一个操作数被判定为“假”系统将不再判定或求解第二个操作数。
2.对于逻辑或运算,如果第一个操作数被判定为“真系统将不再判定或求解第二个操作数。
语句
语句是用来向计算机系统发出指令的。C程序的执行部分是由语句组成的,所以一个程序应当包含了若干语句;程序的功能是有执行语句实现的。
C语句可分为五类:表达语句,函数调用语句,控制语句,复合语句和空语句。
表达语句
表达语句有表达式加上分号";"组成。其一般格式为:
表达式;
函数调用语句
即由函数名,实际参数加上分号组成。一般格式为:
函数名(实际参数);
执行函数语句就是调用函数体,并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求函数值。例如:
printf("hello world");
就是一个函数调用语句,printf函数是函数库中已有的函数,不需用用户自定义。
控制语句
C语言程序从执行方式看,可以分为顺序,选择和循环3种基本结构。一般都是这三种结构的复杂组合。C语言中规定了9种控制语句,用于实现选择结构与循环结构。它们可以分为以下三类:
1.条件判断语句:if语句,switch语句。
2.循环执行语句:do-while语句,while语句,for语句。
3.转向语句:break语句,goto语句,continue语句,return语句。
复合语句
把多个语句用花括号“{}”括起来组成的一条语句称为复合语句,在程序中应把复合语句看作是单条语句,而不是多条语句。例如:{ t=a;
a=b;}
空语句
只由分号“;”组成的语句叫空语句。
;
(什么也不执行的语句)
控制结构
分为三种:顺序结构、分支结构和循环结构。
顺序结构
顺序结构是最简单的程序结构,计算机从程序的第一条语句开始执行,一直到结束,中间没有分支跳转,也没有循环结构。
分支结构
单分支结构: 只有一个条件,符合就执行 双分支结构: 有两个条件,符合哪个就执行哪个语句块 。
循环结构
缓冲区
缓冲区是内存中的一段储存区域,用来临时存放一些数据。
当一个程序开始运行时,系统会自动给键盘和显示器分配缓冲区。键盘缓冲区是用来存放用户从键盘输入数据,当用户输入完数据并按Enter键时,这些数据才会被送入缓冲区。
注:用户输入的任何数据都是作为一个个字符存放在缓冲区的。例如(输入ABC并按下Enter键,则送入缓冲区的是'A','B','C','\n'4个字符,如果输入12,则是‘1’、‘2’、'\n'3个字符。)
混合运算
当各种不同的数据类型进行混合运算时,需要进行数据类型的转换。各种不同的数据类型需要先转换为同一种数据类型,然后再进行运算。将低等级的数据类型转换为高等级的数据类型,这种转换称为自动类型转换,是由编译器自动完成的。
例如,如果int 类型的变量与double 类型的变量进行运算,首先需要将int类型的变量转换为double类型,然后对两个double 类型变量进行运算。
自动类型转换遵循以下规则:
(1)如果参与运算的数据类型不相同,则首先将其转为相同的数据类型,然后再对两个相同教据类型的数据进行运算。
(2)在进行数据类型转换时,要向数据长度增的方长向进行转换,以保证转换以后数据的精度不降低。例如,float 类型和double 类型进行运算时,需要将float 类型转换为double类型再进行运算。
(3)char类型和 short 类型进行运算时,需要 将其先转换为int类型,然后再进行下一步操作
(4)字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。
(5)short型转换为int型(同属于整型) 。
(6)float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型) 。
具体规则如下图所示:
数组
可以把它看作是一行连续的多个储存单元。更正式的说法是同类型数据元素的有序序列。
C语言中的字符串一定以空字符(\0)结束这意味着数组的容量必须至少比待储存的字符串的字符数多一。例如:char name [40];
C预处理器
格式:#define 符号常量名 值
例如(#define TAXPATE 0.015) 注意[无等号=,无;]
在编译程序时,程序中所有的TAXPATE都会被替换为0.015,这一过程被称为”编译时替换”
这样定义的常量也称为明示常量。为什么TAXPATE要用大写?用大写表示符号常量是C语言一贯的传统。这样,在程序中看到全大写的名称就立刻明白这是个符号常量,而非变量。但全用小写来表示符号常量,程序也能运行。
#define指令还可以定义字符和字符串常量。
EOF
while(scanf("%d",&number)!=EOF)
这段代码的意思就是,当数据输入结束,自动退出循环,EOF就像是一个判断条件,判断scanf的返回值,对,没听错,scanf是有返回值的。
while(1){//死循环,一直读入
c=getchar();//单个字符的读入
if(c==EOF)//如果已经到文件末尾
break ;//跳出死循环(不在读入)
其实EOF在程序中的默认值是-1,所以将EOF替换成-1也是对的。