一、编写C语言程序一些注意点:
1.#include<stdio.h>头文件包含,一定要有;
2.每一个c语言中有且只有一个main函数,这是整个程序开始位置;
3.C语言中(),{},[],“”,‘’,都必须成对出现,必须使用英文符号;
4.C语言语句要以分号结束;
5.//为注释;
二、关键词
C语言中定义好了一些C语言,可以直接拿过来用,不需要再次定义
2.1数据类型相关的关键字
char:定义的变量是字符型变量,占1个字节;
short int:定义的变量是短整型变量,占2个字节;
int :定义的变量是整型变量,占4个字节;
long int:定义的变量是长整型变量,在32位操作系统下占4个字节,在64位操作系统下占8个字节;
float:定义的变量是单浮点型的实数,占4个字节;
double:定义的变量是双浮点型的实数,占8个字节;
struct:定义的变量是与结构体相关的;
union:定义的变量是与共用体相关的;
enum:定义的变量是枚举类型相关的;
signed:修饰char,short,int,long类型的数据,代表有符号的意思(正负)
*默认情况signed可以省略不写;
unsigned:修饰char,short,int,long类型的数据,代表无符号的意思(只能保存正数和0)
void:空类型关键字
void一般用于修饰函数的参数或返回值,代表函数没有参数或者返回值;
2.2存储类型相关的关键字
register:寄存器类型,修饰的变量是寄存器变量
*在编译的时候告诉编译器这个变量是寄存器变量,尽量将存储空间分配在寄存器中;
*(1)定义的变量不一定真的放在寄存器中(如果空间不够时,不会放在其中)
(2)cpu读取数据的时候去寄存器中拿比去内存中拿数据要快;
(3)register只能修饰字符型,整形变量,不能修饰浮点型;
(4)寄存器比较宝贵,不能修饰寄存器数组;
(5)不能对寄存器变量去地址,因为只有存放在内存中的数据才有地址;
static:静态的意思
static主要修饰全局变量,局部变量,函数
static修饰的变量,保存在静态全局区;
const:常量的意思
const修饰的变量只可读,不可修改
extern:外部的意思
一般用于声明函数和全局变量
2.3控制语句相关的关键字
if,else,switch,case,default,break,for,while,do,goto,continue;
条件控制语句:if,else;
switch,case, break,default;
循环语句:for;while do;goto;
2.4其他关键词
sizeof;typedef;volatile;
sizeof:测量数据所占存储空间大小(字节数)
typedef:重命名相关关键词,给一个已有的类型,重新起一个名字,并没有创造一个新的类型;
volatie易改变的意思,即告诉CPU每次使用volatile修饰的变量时候,重新去内存中去,保证每次取的都是新的值,而不是寄存器中的备份;
三,数据类型
3.1基本的数据类型;
char,short,int,long,float,double;
*浮点型默认保留小数点后六位,并且四舍五入;
3.2构造类型
由一些相同类型或者不同类型的数据组成的集合,这种数据类型成为构造体类型;
数组;结构体;共用体;枚举;
3.3常量和变量
3.3.1常量
在程序运行过程中,其值不可改变的量
分类:字符型:‘b’,‘a’;
字符串;“hello world”,“1234”;
整型:99,100,-100,0;
实型:3.1415,-3.14159;
因为计算机只能识别二进制数,也就是数字,对于非数值型的数据,需要一个数值型的数据进行表示,此时需要使用ASCII码表;
3.3.2变量
其值可以改变的量,成为变量;
变量定义方式:存储类型 数据类型 变量名(标识符)=变量或者常量;
标识符规则:(1)只能由数字,字母,下划线组成
(2)首字母不能是数字;
(3)不能与关键词相同;
3.3.2.1整型数据:整型常量,整形变量;
整型常量:(按进制分)
十进制:以正常数字开头1-9,456,789;
八进制:以0开头,0123;
十六进制:以0X开头,0X1e;
整形变量;(数据类型)
有无符号的短整型 2个字节
有无符号的整型 4个字节
有无符号的长整型 4个字节(32位处理器)
3.3.2.2实型数据
实型常量:成为实数或者浮点数
十进制形式:数字和小数点组成,3.14,0.2;
指数形式:123e3,123e-3,代表123*10*10*10;
以f结尾的是float类型,例如3.14f;
不以f结尾的是double类型;
实型变量;
单精度和双精度类型
float:占四个字节
double:占八个字节
3.3.2.3字符数据;
字符常量:直接常量:用单引号括起来,‘a’,‘b’;
转义字符:“\“以反斜杠开头,后面跟一个或者几个字符,如'\n','\t',分别代表换行,横向跳格;
字符变量:用char定义的,每个字符分配一个字节的内存空间;
字符值以ASCll值的形式存在变量的内存空间中;
3.3.3.4字符串
字符串常量:由双括号括起来的字符序列:”hello“,”哈哈哈“;
字符串常量与字符常量的区别:‘a’ 为字符常量
“a”为字符串常量,字符串的结尾,编译器会自动添加一个结束标志位“\0”,所以字符串包含俩个字符“a”包含了俩个字符‘a'和’\0';
3.4格式化输出字符
与printf函数一起使用,输出一个指定数据类变量所存储的值
3.4.1普通字符
%d:输出十进制有符号的整数;
%ld:输出long有符号的整数;
%u:输出十进制无符号的整数;
%o:输出八进制表示的整数;
*%#o:输出八进制前导符
%x:输出十六进制表示的整数;
*%#x:输出十六进制前导符
%c: 输出单个字符;
%s:输出字符串;
%p:输出指针的值;
%e:输出指数形式的浮点数;
%f: 输出float型浮点数;
%lf:输出double型浮点数;
3.4.2特殊类型的格式化
%3d;要求宽度为三位,如果不足三位,前面空格补齐,如果足够三位,则此语句无效
%-3d;要求宽度为三位,如果不足三位,后面空格补起,如果足够三位,则此语句无效
%03d;要求宽度为三位,如果不足三位,前面0补起,如果足够三位,则此语句无效
%.2f;保留小数点后两位;
3.5类型转换
数据有不同的类型,不同类型的数据进行混合运算时,必然涉及daodao 类型转换
转换的方法有两种:第一种自动转换:遵循一定的原则,由编译系统自动完成
转换原则:1.占用内存字节数少的类型,向占用内存字节数大的类型转换,以保证精度不降低;
2.
第二种强制转换:
通过类型转换运算来实现:
(类型说明符)(表达式)
(float)a:把a的值转换为实型;
*类型转换符必须加括号
实例:
四、运算符
4.1运算符的概念
通过运算符将运算对象连接起来的,符号C语法规则的式子,称为C表达式;
运算对象包括:常量,变量,函数;
4.2运算的分类
单目运算符:参加运算的操作数只有一个;
++自增运算符 --自减运算符
a++
双目运算符:参加运算的操作数有两个;
+,-,*,/,%,+=,-+,*=,/=,%=(算数运算符)
a+b
a+=5 <----->a=a+5;
*%代表去余的意思,(10%3)==1(只有整数才可以取余)
三目运算符:参加运算的操作数有三个;
(表达式1)?(表达式2):(表达式3)
如果表达式1成立,则执行表达式2,如果不成立,则执行表达式3
4.3算数运算符
+,-,*,/,%,+=,-+,*=,/=,%=
4.4关系运算符
<,>,==,<=,>=,!=(不等于)
一般用于判断条件是否满足或者循环语句
*条件运算结果只有俩个,真或者假,0为假,非0为真;
*==与=的区别:==表示左右两边相等,=表示把右边的值赋给左边;
4.5逻辑运算符
4.5.1&&逻辑与
俩个条件都为真,结果为真
if((a>b)&&(a<c))
*不能写程if(b<a<c)这样的形式,因为会先判断a和b的值,然后的出来结(0/1)果后,在和C判断.
4.5.2||逻辑或
俩个条件至少有一个真,则为真
if((a>b)||(a<c))
4.5.3!逻辑非
如果原本的表达式为真,则为假,如果原本的表达式为假,则为真
if(!(a>b))
逻辑与和逻辑或的短路原则:
逻辑与短路原则:当第一个表达式为假,则整体表达式为假,后面的所有表达式不会被执行;
逻辑或短语原则:当第一个表达式为真,则整体表达式为真,后面的所有表达式不会被执行;
4.6位运算符(十六进制)
4.6.1&按位 与
任何值与0得0,与1保持不变
0101 1011 &
1011 0100
0001 0000
4.6.2 |按位 或
任何值与1的1,与0保持不变
0101 0011 |
1011 0100
1111 0111
4.6.3 ~按位取反
1变0,0变1
0101 1101~
1010 0010
4.6.4 ^按位异或
相异得1,相同得0
1001 1100 ^
0101 1010
1110 0110
4.6.5位移
>>右移
<<左移
注意区分:右移分为逻辑右移和算数右移
4.6.5.1右移
逻辑右移,高位补0,低位溢出
0101 1010 >>3
0000 1011
算数右移,高位补符号位,低位溢出
1010 1101 >>3
1111 0101
*最高位决定符号,为正则0,为负则为1;
总结:1.逻辑右移,高位补0,低位溢出,有无符号均是如此;
2.算数右移,高位补0,低位溢出,有符号是如此,无符号高位补0,低位溢出;
4.6.5.2左移
高位溢出,低位补0
4.7条件运算符号
()?():()
如果?之前表达式成立,则整个表达式的值是?和:之间的表达式的结果,否则是:之后表达式的结果;
A?B:C
先判断A的结果,如果A为真,则执行B,如果A为假,则执行C;
*本质是一个if else语句
if(A)
{B}
else
{C}
\
4.8逗号运算符
(.....,.....,.....)使用逗号隔开的表达式,以此从左向右执行,最后的表达式,是整个运算的结果
A=(B,C,D);
先执行表达式B,在执行表达式C,最后执行表达式D,A的结果为表达式D的值
4.9自加自减运算符
++,--
4.9.1将++放在变量后面
先使用,在++或者--
4.9.2将++放在变量前面
先++,在使用
4.10运算符优先级
五、控制语句
5.1选择控制语句
5.1.1if语句
形式1:if(条件表达式)
{
//复合语句若干语句集合
语句1;
语句2
}
形式2:
:if(条件表达式)
{
//复合语句若干语句集合
语句1;
语句2;
}
else
{
//复合语句若干语句集合
语句3;
语句4;
}
形式3:
:if(条件表达式)
{
//复合语句若干语句集合
语句1;
语句2;
}
else if(条件表达式2)
{
//复合语句若干语句集合
语句3;
语句4;
}
else if(条件表达式32)
{
//复合语句若干语句集合
语句5;
语句6;
}
...
else
{
语句块
}
5.1.2switch语句
switch(表达式)//表达式只能是字符型或者整型
{
case 常量表达式1:
语句1;
break:
case 常量表达式2:
语句2;
break:
case 常量表达式3:
语句3;
break:
......
default
语4;
break:
}
运行顺序:将常量表达式与switch后面表达式的值对比,如果刚好等于case后面的某一个值就会立即执行case后面的语句,如果都不是则会执行default;
*(1)switch后面只能跟整型,不能是浮点型;
(2)如果case后面的常量表达式与switch表达式的值都不一样,则执行default后面的语句;
(3)每一个case执行结束后要跟一个break,目的是为了跳出整个switch语句;
(4)case后面语句有很多,则不需要大括号;
5.2 循环控制语句
5.2.1for循环
for(表达式1;表达式2;表达式3)
{
//复合语句
语句1;
语句2;
......
}
执行顺序:先执行表达式1,然后执行表达式2,如果表达式2成立,则执行语句块,当语句块执行完毕后,在执行表达式3,然后在执行表达式2,如果表达式2成立,接着执行语句块,以此类推,直到表达式2不成立
使用for循环求1到100累加
5.2.3while循环
形式1:
while(条件表达式)
{
//复合语句块
语句块
}
执行顺序:首先判断while后面的条件表达式,如果表达式成立(为真),则执行语句块,执行完毕后,再执行条件表达式,直到条件表达式为假,循环结束;
使用while循环求1到100累加
形式2:
do
{
//复合语句块
语句块
}
while(条件表达式);
执行顺序:首先执行do后面的语句块,然后判断while后面的条件表达式,如果表达式成立(为真),则执行do后面的语句块,执行完毕后,再执行条件表达式,直到条件表达式为假,循环结束;
*不管表达式是否成立,do后面的语句块都会执行以此;
*while后面必须加一个分号
5.2.3goto循环
主要实现在一个函数里面代码的跳转
用goto实现1累加100