目录
新加:常量
%d输入或输出整型(有符号的整型就是int类型)
%ld
%c字符型
%u无符号整型 以上是十进制
%x十六进制 内存很大的时候用十六进制输出
%s输出字符串
%f输出单精度浮点数
%lf双精度
1.宏
原样替换
1.1基础应用
#define P 3.14 P是给宏起的名字 起名字起英文字段 给3.14这个字段起名字 就是用P替换3.14
宏=原样替换
%s输出字符串
const常量
要点:const关键字 常量
限定一个变量不允许被改变,产生静态作用。
如:
const int Max=100;
Max++;//会产生错误
1.2嵌套宏
1.3宏函数
要点:宏 函数
变量
1.变量的数据类型
1.1字符变量
//1.定义
char a;
//2.定义并初始化
char a = 'a';
//3.赋值
a ='b';
1.2整型变量
//1.定义
short a;
int b;
long c;
//2.定义并初始化
int b = 5;
//3.赋值
b = 1;
1.3浮点变量
//1.定义
float a;
double b;
//2.定义并初始化
float c = 5.5;
//3.赋值
c = 1.1;
静态全局变量、全局变量、静态局部变量、自动局部变量
vsp是在底行模式下可以再编辑另外一个文件
tail查看文件的内容
2.1数据类型上
能存储负数的叫有符号数 signed
无符号数(只能存储正数>=0) unsigned
构造类型(用户自定义的数据类型)
实型 float double 可以存小数
1.基本数据类型
逻辑类型。只有两个量true(条件成立)和false(表达式不成立),表示逻辑真值和逻辑假值。
整数类型。包括char,short,int和long。(char字符型可以是某种形式的整形)
浮点类型。包括float和double。
void类型。主要用于说明不返回值的函数指向 ( ) 类型的指针等。
(1)bool类型
(<stdbool.h>) (_Bool基本类型)
例如,
if(-1)
x=12;
else
x=18;
上面0.5是非零数值,逻辑值为真,所以x赋给的( )
C语言的数据类型 ctype
bool不是基本数据类型 所以要引入头文件
bool型要引入头文件 #include <stdbool.h>
预处理:gcc -E bool.c -o bool.i (就是把宏作为展开)
宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串。
C语言中,预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换,预处理过程还会删除程序中的注释和多余的空白符号。
_Bool 是C语言中的基本类型。不需要头文件。但是true和false是在这个(#include <stdbool.h>)头文件定义的如果代码中用true和false是要用到这个头文件的。bool的宏也是在这个头文件定义的。
true和false的值就是0和1 非零为真。
2.2数据类型下
(2)char类型(字符型)
sizeof(对用的环境进行常见的测试)
现在以32位系统为例给的数据
signed char 能存正数也能存负数
unsigned char 只能存正数
- 使用char数据类型的变量需要特备注意,防止数据超出值域,思考
- char c1 = 128; //出错,数据越界(-128)
- char c1 = 129; //出错,数据越界(-127)
- unsigned char c2 = -1;//出错,数据越界(255)
无符号数的范围[ -128,127 ]
-127 原 11111111
反 10000000
补 10000001
-128的补码是 10000000
+127 01111111
-1 原码 10000001
反码 11111110
补码 11111111
(3)short类型(整形)
<limits.h>(可以看几个类型的边界值)
可存负数
65535=16个1=10x10^7=2^16-1
(4)int类型(整形)
可存负数
0~2^32-1(就是4G的空间)
(5)浮点类型
float 是%f double 是 %lf
2.3常量
1.整形常量
如10,-1,245
常量是指在程序运行期间其数值不发生变化的数据。整形常量通常简称为整数。
整数可以是十进制数、八进制数和十六进制数。例如十进制的数值3356可以有下列两种不同的表示形式:
- 八进制数 06434 (0表示八进制) 八进制一个数对应三个二进制位
- 十六进制数 0xd1c(0x表示十六进制) 十六进制的一个数对应四个二进制位
2.浮点常量
浮点常量又称为实数,一般含有小数部分。
在C语言中,实数只有十进制的实数,分为单精度和双精度。实数有两张表示方法,即一般形式和指数形式。
(1)一般形式
一般形式的实数基本形式如下:
- 例如,3.5,-12.5,3.1415926
[+|-]M.N 形式
(2)指数常量(科学计数法)
指数形式的实数一般是由尾数部分、字母e或E和指数部分组成。当一个实数的符号为正好时,可以省略不写,其表示的一般形式如下:
- 1.176e+10 表示 1.176x10^10
- -3.5789e-8 表示 -3.5789x10^-8
- 通常表示特别大或特别小的数
[+|-]M.N <e|E> <+|->T
3.字符常量
‘\0’ 是 0 ‘\n’是10 空格SPACE是32 0 是48
字符常量是指一个单一字符,其表示形式是由两个引号包括的一个字符。
单引号引起来的都是一个字符 要用单引号引起来
在C语言中,字符常量具有数值。字符常量的值就是字符的ASCII码值。
可以把字符常量看做一个字节的正整数。
字符型常量 ch
大小写字母是32
字符0和数字0是48
4.字符串常量
字符串常量是指用双引号括起来的一串字符来表示的数据。(字符串以\0结尾) "9"就是 '9','\0'
字符串默认包含结束标志尾‘\0’,是转义字符,不显示
- "Hello!","StudentS","9","LINUX","李四"
- "北京海淀城府路***号","姓名:","****@163.com"," "
5.标识常量
标识常量是指用标识符代替常量使用的一种常量,其名称通常是一个标识符。
标识常量也叫符号常量,一般用大写英文字母的标识符。(就是宏)
在使用之前必须预先定义。说明形式为:
#define <标识常量名称>(或者叫符号常量或者叫宏的名称) <常量>
例如
#define MAX 50
#define PI 3.1415926
#define MULL 0
#define EOF -1
#define ERROR -1
- 其中,MAX、PI、NULL、EOF和ERROR都是标识常量,它们代替的常量分别是50、3.1415926、0、-1和-1。
- 一般情况,每个标识常量说明式子只能给出一个标识常量,并且占据一个书写行。
定义一个宏名字之后,可以在其他宏定义中使用,例如:
#define ONE 1
#define TWO ONE+ONE
#define THREE ONE+TWO
如果一个串长于一行,可以在行尾用反斜线“\”续行
#define LONG_STRING"This is a very very long \
String that is used as an example"
是原样替代 c = ONE + TWO * b + a 变成 1+1+1*20+10=32
如果想算出来要加括号()
宏运算规则原样展开
案例
一个水分子的质量约为3.0*10^-23g,1夸脱水大约有950g,编写一个程序,要求输入水的夸脱数,然后显示这么多水中包含多少水分子。
n*950/3.0*10^-23
编程:water.c
2.4变量一
1.变量的基础
变量在程序中用变量名表示。变量名由用户根据其用途任意命名。
变量名由字母、数字、下划线组成,不能以数字开头,不能和C的关键字重名。
在程序运行时,变量占据存储空间的大小由其数据类型决定。
变量在内存空间中的首地址,称为变量的地址。
(1)变量的说明
变量在程序中使用时,必须预先说明他们的存储类型和数据类型。
- 变量说明的一般形式是:
<存储类型><数据类型><变量名>
- <存储类型>是关键词auto(默认的)、register、static和extern
- 自动:auto(可以不写) 静态:static 寄存器:register 外部:extern(静态存储) 局部变量、全局变量、外部变量、静态局部变量
- <数据类型>可以是基本数据类型,也可以是自定义的数据类型
(2)变量的存储类型
1.auto说明的变量只能在某个程序范围内使用(局部),通常在函数体内或函数中的复合语句里。(默认是随机值)
在函数体的某程序段内说明auto存储类型的变量时可以省略关键字auto,如下:
- auto int k;
- int j;
- double x;
2.registet称为寄存器型(寄存器变量),register变量是想将变量放入CPU的寄存器中,这样可以加快程序的运行速度。
如申请不到就使用一般内存,同auto;
注意:register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度小于或者等于整形的长度。
不能用“&”来获取register变量的地址。
由于寄存器的数量有限,真正起作用的register修饰符的数目和类型都依赖于运行程序的机器。
2.5变量二
3.static变量称为静态存储类型的变量,既可以在函数体内(局部),也可以在函数体外(全局、)说明。(默认是0)
(可以修饰全局变量也可以修饰局部变量)
局部变量使用static修饰,有以下特点:
- 在内存中以固定地址存放的,而不是以堆栈方式存放
- 只要程序没结束,就不会随着说明他的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调用存入的函数值。
4.extern
当变量在一个文件中的函数体外(全局变量)说明,所有其他文件中的函数或程序段都可引用这个变量。(全局变量能被其它文件所访问)
extern称为外部参照引用型,使用extern说明的变量是想引用在其他文件中函数体外部说明的变量。
static修饰的全部变量,其它文件无法使用。
2.6运算符一
1.算数运算符(:%s/是全文替换 :%s/%d/%s/g)
C提供的算数运算符:+、-、*、/、%、++,如下:float/double不能取余(没必要做取余的操作)
例如,
int a=15,b=8,c;
double x=15,y=8,z;
c = a + b; c = a - b; c = a * b; c = a / b;//c赋值为
c = a % b; // c赋值为
z = x + y; // z赋值为
z = x - y; // z赋值为
z = x * y; // z赋值为
z = x / y; // z赋值为
z = x % y;
2.关系运算符
C语言的关系运算符如下:
3.逻辑运算符
C语言的逻辑运算符如下:(逻辑反也叫逻辑非)
逻辑与“&&”运算符的运算规则如下:短路特性-逢0截止
逻辑或"||"运算符的运算规律如下:短路-逢1截止
2.7 运算符二
4.位运算符
(1)位逻辑反
C语言的位运算符如下:
例如:
unsigned char x=0x17,y;
y = -x;
分析:
(1是 0 0 0 1 7是 0 1 1 1 17是0001 0111 这是x y是x取反 无符号数不分符号位
所以y是1110 1000 1110是E 1000是2^3=8 结果是0xE8)
计算机内存中的x内容如下:
0 0 0 1 0 1 1 1
y被赋值后计算机内存中的内容如下:
1 1 1 0 1 0 0 0
x代表十六进制 #代表打印结果时自动加上0x前缀
(2)位逻辑与
位逻辑与“&”运算符的运算规律如下:
例如,
unsigned char x=0126,y=0xac,z;z = x & y;
6是110 2是010 无符号数是八位再补两个0 a是1010 b是1011 c是1100
01010110
10101100
进行与运算时上下两个都是一的才是一
结果是0x04
(3)位逻辑或
位逻辑或“|”运算符的运算规律如下:
例如:
unsigned char x =076,y=0x89,z;
z = x | y;
(4)位逻辑异或
位逻辑异或“^”运算符的运算规律如下:(相异位真)
例如:
unsigned char x=75,y=0173,z;
z = x ^ y;
0x30
4.1位移位运算
位移位运算的一般形式:
<运算量><运算符><表达式>其中:
- <运算量>必须为整形结果数值;
- <运算符>为左移位(<<)或右移位(>>)运算符;
- <表达式>也必须为整形结果数值。
例如:
unsigned char a=0xe4,b;
b=a<<3;(b等于a左移3位)
如:
unsigned char a=0x4,b;
b=a<<1;
b=a<<2;
b=a<<3;
0x4是00000100 是4
<<1是1000 是8
<<2是10000 是16
所以左移是乘2的关系
2.8运算符三
题目
- 如何把一个无符号数的某位快速置1?
主要通过或运算来完成
- 如何把一个无符号数的某位快速清0?
与运算
- 如何利用位运算把一个十进制数转化成一个十六进制数?
转十六进制就是除以16
a/16(对十六取整) (位运算左移一位是乘2 除以16就是右移四位)
a%16(对十六取余)(16的余数是0~15 0到15相当于四个二进制位可以理解为一个数的 最后四位)
f是00001111
2.9运算符四
1.赋值运算符
赋值运算符为“=”,其运算的一般形式如下:
<左值表达式>=<右值表达式>
赋值复合运算符其运算的一般形式如下:
<变量><操作符>=<表达式>
案例
2. C语言的特殊运算符
(1).三目运算符
条件运算符“?:”
是三目运算符,其运算的一般形式是:
<表达式1>?<表达式2>:<表达式3>
(相当于if语句)
【if(表达式1) 表达式1如条件成立就取表达式2如果条件不成立就取表达式3
表达式2
else
表达式3】
例如:
int x=82,y=101;
x >= y ? x+18:y-100 //运算结果为1
x < (y-11) ?x-22:y-1 //运算结果为60
(2).逗号运算符
一般有圆括号,最后一个式子的值赋给等号左面
z1=15.7 z4=3
程序里面浮点数最后printf("x=%f")
(3). sizeof运算符
运算的一般形式:sizeof(<类型或变量名>)
注意:它只针对数据类型,而不针对变量!
例如:
sizeof(double)
sizelf(long)
3.C运算符的优先级
例如:
int x=1,y=0,z=0;
x++ && y++ || ++z //结果为1(2 1 1)
!(x+1>0) && y++ || ++z //结果为 1(1 0 1)
x += y ==z,y=x+2,z=x+y+x >0 //x为2,y为4,z为1
(逗号的优先级是最低的 大于号>等号>逗号 z得到的是布尔值是真值 所以z=1)