1.变量和基本数据类型
1.1 变量类型的概念
变量就是在程序中发生变化的量,变量有类型。
变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
1 字节(byte) = 8 位(bit)
1.2 定义格式
存储类型 数据类型 变量名;
例如:(auto) int a;
存储类型:变量存储的位置。
数据类型:名字 字节 取值范围
类型 | 存储大小 | 值范围 | |
char | 字符类型 | 1 字节 | -2^7 到 (2^7-1) |
unsigned char | 无符号字符类型 | 1 字节 | 0 到 (2^8-1) |
int | 整数类型 | 4 字节 | -2^31 到 (2^31-1) |
unsigned int | 无符号整数类型 | 4 字节 | 0 到 (2^32-1) |
short | 短整型 | 2 字节 | -2^15 到 (2^15-1) |
unsigned short | 无符号短整形 | 2 字节 | 0 到 (2^16-1) |
long | 长整型 | 4 字节 | -2^31 到 (2^31-1) |
unsigned long | 无符号长整形 | 4 字节 | 0 到 (2^32-1) |
float | 单精度浮点型 | 4字节 | 有效数据6-7位 |
double | 双精度浮点型 | 8字节 | 有效数据15-16位 |
64位操作系统:long类型是8字节
1.3 初始化格式
int a = 0;
(1)也可以先定义然后初始化
int a;
a = 0;
1.4 局部变量和全局变量
(1)生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。也就是存活的周期时间。时间维度。
(2)作用域:变量可以起作用的范围。空间维度。
(3)内存大致分配为五个区域:
局部变量 | 全局变量 | |
| 函数体内部 | 函数体外部 |
| 栈区 | 全局区 |
| 同函数体共存亡 | 同整个程序共存亡 |
| 作用于函数体内部 | 作用域整个程序 |
| 未初始化,值为随机值 | 未初始化时,值为0 |
当我们在定义变量时,选择正确合适的数据类型,既可以提高空间利用率,同时也可以避免溢出等问题的出现。
2.常量
2.1 概念
在程序中不会发生变化的量,存在常量区。
2.2 分类
2.2.1 字符型常量
类型为char,从ascii表中找的的字符都是字符常量,不可以改变。用单引号括起来的就是字符常量,例如'A'。
类型 | 存储大小 | 值范围 | |
char | 字符类型 | 1 字节 | -128 到 127 |
unsigned char | 无符号字符类型 | 1 字节 | 0 到 255 |
signed char | 带符号字符类型 | 1 字节 | -128 到 127 |
原码、反码和补码:
- 最高位表示符号位,正数是0,负数是1。
- 正数原码、反码和补码都是一样的。
- 负数要用补码来计算:
- 原码就是在数值前面直接加符号表示
- 反码等于原码的符号位不变其余按位取反
- 补码等于反码加一
例如: -5
原码:1000 0101
反码:1111 1010补码:1111 1011
用''括起来的就是字符常量:
'a' 字符a
'\0' 空字符
2.2.2 字符串常量
用""括起来的是字符串,'\0'是字符串结尾的标志
2.2.3 整型常量
整型就是类型为整数的常量,包括从负数到零到正数的所有整数。可以用二进制、八进制、十进制和十六进制表示。
2.2.4 浮点型常量
浮点型常量就是类型为浮点的常量,包括从负数到零到正数所有的浮点数。
2.2.5 指数常量
用科学计数法表示
2.5*10^-3 --> 2.5e-3
#include <stdio.h>
int main()
{
float a = 0.0025;
printf("%e \n",a);
return 0;
}
2.2.6 标识常量(宏定义)
宏定义:起到标识作用的
(1)只是单纯的进行文本替换,在预处理的时候进行。
(2)遵循标识符的命名规则
(3)一般大写表示
格式: #define 宏名 常量或表达式
特点:只能单纯替换,不要进行手动运算(原样替换,替换完了再计算)
#include <stdio.h>
#define N 2
#define M N+2
int main()
{
int a;
a = N + M / 2+1;//2+2+2/2+1
printf("%d \n",a);//6
return 0;
}
3.词法符号
词法符号若干字符组成的有意义的最小语法单位。按照词法符号在程序中的作用,可以分为:关键字、 标识符、运算符、分隔符和标点符号。
3.1 关键字
是由系统预定义的词法符号,有特定的含义,不允许用户重新定义。下面是一些基本关键字:
(1)存储类型:auto(自动型) static(静态) extern(外部引用) register(寄存器)
(2)数据类型:char(字符型) short(短整型) int(整型) long(长整型) float(浮点型) double(双精度浮点型) unsigned(无符号) signed(有符号)struct(结构体) union(共用体) enum(枚举) void(空类型)
(3)控制语句:if(条件语句) else(条件语句中否定分支) while(循环语句的循环条件) do(循环语句的循环体)for(一种循环语句) switch(开关语句) case(开关语句分支) default(开关语句中其他分支) break(中断循环) continue(继续下一轮循环) goto(跳转) return(返回)
(4)其他:sizeof(计算数据所占空间大小) const(声明只读变量)typedef(重命名) volatile(防止被编译器优化)
3.2标识符
是由程序员按照命名规则自行定义的词法符号,用于定义宏名、变量名、函数名和自定义类型名等。
C语言的命名规则如下:
1) 标识符由一个或多个字母、数字或下划线组成
2)标识符的第一个字符必须是字母或下划线
3)标识符不能与任何关键字相同
注意:大小写敏感,命名有一定含义,便于记忆,增加可读性。
3.3运算符
运算符是表示运算的词法符号,C语言有非常丰富的运算符,按功能可以分为:算术运算符、 逻辑运算符、关系运算符、位运算符、赋值运算符、其他运算符
(1)算术运算符:+,-,*,/,%,++,--
(2)逻辑运算符:!,&&,||
(3)关系运算符:<,>,>=,<=,==,!=
(4)位操作运算符:&,|,~,^,<<,>>
(5)赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=
(6)其他运算符:三目运算符, sizeof()
3.4 分隔符
是用来分隔其他的词法符号,主要包括: 空格符、制表符、换行符号、注释。
通过对分隔符的恰当运用,使得代码的外观格式更为清晰易读,还可以帮助分析程序中的语法错误
3.5 标点符号
C语言中的标点符号有逗号、分号、冒号、花括号、圆括号。标点符号的作用与分隔符相似,但用法非常严格,有着明确的语法规定。有些标点符号出现在表达式中时,当作运算符使用。
(1) 逗号
在定义变量语句中,用于分隔变量名
在函数的参数表中,用于分隔函数参数
(2)分号
用于表达式语句的结束
在for循环语句中,分隔括号内的三个表达式
单独出现,构成一条空语句
(3) 冒号
用于三目运算符
用于switch case语句中case块中
(4) 花括号
用做枚举类型定义的开始和结束
用做数组初始值定义的开始和结束
用做函数体的开始和结束
用做语句块的开始和结束
用做结构类型定义块的开始和结束
(5) 圆括号
用在函数头定义中,作为参数表的开始和结束
用在流程控制语句中,作为条件表达式的开始和结束
用在函数调用中,作为参数表的开始和结束
4.运算符和表达式
表达式语句的一般形式为:
表达式;
(2)运算符按功能分为:算数运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
4.1 算术运算符: + - * / % ++ --
(1)/: 整数相除,向下取整
int a=0;
a++; //相当于 a=a+1;
++a; //相当于 a=a+1;
(4)-- :自减
a--;
--a;
都相当于a=a-1;
和打印语句结合:
printf("%d\n",a++); //++在后,先打印,再自加
//先执行printf("%d\n",a); 再执行a=a+1;
printf("%d\n",++a); //++在前,先自加,再打印
//先执行a=a+1; 再执行printf("%d\n",a);
4.2 赋值运算符: = += -+ *= /=
int a=1;
(1)int b = ++a; //先自加然后再赋值
相当于:先执行a=a+1; 再执行 b=a;
(2)int b= a++; //先赋值再自加
相当于: 先执行 b=a; 再执行 a=a+1;
例如:
z = ++x + y++;
相当于:
x=x+1;
z=x+y;
y=y+1;
(3)a+=2;
相当于:a=a+2;
4.4 逻辑运算符:&& || !
C语言中非0代表真,0代表假
4.4.1 && (逻辑与)
全真则真,一假则假。
全是真的才是真,只要有假就是假。
4.4.2 || (逻辑或)
一真则真,全假则假。
只要有真的就是真,全都是假的才是假。
4.4.3 !(逻辑非)
非真为假,非假为真。
4.4.4 短路法则/截断法则
逻辑或||运算中: 如果前面的表达式为真,则后面的表达式不执行。
逻辑与&&运算中: 如果前面的表达式为假,则后面的表达式不执行。
4.5 位运算符:& | ^ ~ << >>
含义 | C语言 |
按位与 | a&b |
按位或 | a|b |
按位异或 | a^b |
按位取反 | ~a |
左移 | a<<b |
右移 | a>>b |
无符号右移 | / |
注意:负数都是用补码进行运算的
4.5.1 &(位与)
全1则1,有0则0。
例如:
1111 0101
& 1111 1101
1111 0101
4.5.2 |(位或)
有1则1,全0则0。
例如:
1111 0101
| 1111 1101
1111 1101
4.5.3 ^(异或)
不同为1,相同为0。
例如:
1111 0101
^ 1111 1101
0000 1000
4.5.4 ~(取反)
按位取反,0变成1,1变成0。
~15
正数原码:0000 1111
正数补码:0000 1111
取反~: 1111 0000
4.5.5 <<(左移)
左移几位,右边补几个零。
8<<2 = 32: 1000左移两位得到100000
-5<<3:
-5原码:1000 0101
反码: 1111 1010
补码: 1111 1011
<<3:(111)1101 1000(-40)
1010 0111 (符号位不变,其余按位取反)
1010 1000 (再上一步基础上+1,得到-40的原码)
4.5.6 >>(右移)
右移几位,左边补几个符号位,正数补0负数补1。
8>>2 = 2
==>0000 0010
-5 >> 3:
-5原码:1000 0101
反码: 1111 1010
补码: 1111 1011
>>3: 1111 1111 (补码)
1000 0000
1000 0001 (-1的原码)
4.5.7 置一公式和置零公式
置一公式: a | (1<<n)
置零公式: a & (~(1<<n))
4.6 特殊运算符
4.6.1三目运算符
表达式: 表达式1? 表达式2:表达式3
先求解表达式1,如果结果为真(非0)就把表达式2的值作为整个表达式的取值,否则(表达式1结果为假也就是0)那么讲表达式3的值作为整个表达式的结果。
4.6.2 sizeof()
sizeof运算符运算的格式:
sizeof(数据类型或变量名);