#include关键字//双斜杠为注释,头部文件比有 int main() //main函数必有,程序必有 { //(),{},[],""必须成对出现,且是英语符号 printf("hellow cn"); //语句一定要以分号结束 return 0; }
用于定义变量或者类型
类型 变量名;
char 、short、int 、long 、float、double、
struct、union、enum 、signed、unsigned、void
register、static、const、auto、extern
if 、else 、break、continue、for 、while、do、switch case、goto、default
sizeof、typedef、volatile
char 字符型 用来定义字符型变量 占一个字节 char ch=‘a’;
short 短整型 用来定义短整型变量,占连个字节 short a=11;-32768 - —32767
int 整形 定义整形变量 在32 位系统下占4 个字节,在16 平台下占2 个字节 int a=13;-20 亿—20 亿
long 长整形 定义长整型变量,在32 位系统下占4 个字节,long int a=45;
float 单浮点型, 定义的变量是单浮点型的实数,占4 个字节 float a=1.2f;
double 双浮点型,定义的变量是双浮点型的实数,占8 个字节 double a=3.4;
struct 定义结构体类型
union 与共用体(联合体)相关
enum 与枚举类型相关
signed 有符号的意思,正负,在定义char 、整型(short int long) 数据的时候用signed 修饰,默认是已经加上修饰了,即定义整形数据时默认是有符号的数据。
unsigned 无符号的意思,在定义char 、整型(short 、int、long) 数据的时候用unsigned 修饰,修饰定义数据时,数据只能是正数和0;
void 不能定义变量,没有void 类型的变量,void 是用来修饰函数的参数或者返回值
register 是寄存器的意思,用register 修饰的变量是寄存器变量
static 静态,可以修饰全局变量、局部变量、函数
const 常量,修饰的变量是只读的,不能修改它的值
auto 关键字现在基本不用
extern 是外部的意思,一般用于函数和全局变量的声明
sizeof 使用来测变量、数组的占用存储空间的大小(字节数)
typedef 重命名相关的关键字
volatile 易改变的意思,定义的变量,是易改变的,即告诉cpu 每次用volatile 变量的时候,重新去内存中取保证用的是最新的值,而不是寄存器中的备份
变量命名规则:在c 语言中给变量和函数起名的时候,由字母、数字、下划线构成
必须以字母或者下滑线开头
char 、short int 、int、long int、float、double
字符与字符串;‘a’是字符,”a“是字符串,双引号的字符串自动的添加一个结束标志位’ ’,即“a”包含两个字符‘a’和’ ’
指数形式:123e3 代表123*10 的三次方,123e-3代表123*10-3次方,
float与double:不以f 结尾的常量是double 类型,以f 结尾的常量(如3.14f)是float 类型
格式化输出字符%d 十进制有符号整数 %u 十进制无符号整数 %x, 以十六进制表示的整数 %o 以八进制表示的整数 %f float 型浮点数 %lf double 型浮点数 %e 指数形式的浮点数 %s 字符串 %c 单个字符 %p 指针的值
%3d:要求宽度为3 位,如果不足3 位,前面空格补齐;如果足够3 位,此语句无效 %03d:要求宽度为3 位,如果不足3 位,前面0 补齐;如果足够3 位,此语句无效 %-3d: 要求宽度为3 位,如果不足3 位,后面空格补齐;如果足够3 位,此语句无效 %.2f:小数点后只保留2 位数据类型的自动转换
数据转换的方向:内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换
当表达式中出现了char 、short int 、int 类型中的一种或者多种,没有其他类型了
参加运算的成员全部变成int 类型的参加运算,结果也是int 类型的
当表达式中出现了带小数点的实数,参加运算的成员全部变成double 类型的参加运算,结果也是double 型。
当表达式中有有符号数也有无符号数,参加运算的成员变成无符号数参加运算结果也是无符
号数.(表达式中无实数)
在赋值语句中等号右边的类型自动转换为等号左边的类型
数据类型的强制转换通过类型转换运算来实现,把表达式的运算结果强制转换成类型说明符所表示的类型:(类型说明符) (表达式)
(float)a; // 把a 的值转换为float型
(double)(x+y); // 把x+y 的结果值转换为double型
#include运算符typedef short int int16; int main() { char a = 'j'; //char a='12'是不对的12占两个字符 char b[] = "caixukun"; //定义字符串 int16 c = -14; float d = 4.3f; double e = -4.3; //默认定义的是有符号数 unsigned int f = 12; printf("a=%c,%dn", a,sizeof(a)); printf("b=%s,%dn",b,sizeof(b)); //9个字节包含结尾的 ’ printf("c=%d,%dn", c, sizeof(c)); printf("c=%f,%dn", d, sizeof(d)); //4字节 printf("c=%lf,%dn", e, sizeof(e)); //8字节 printf("%dn",5/2); //5/2的实际类型为int printf("%lfn", 5.2/2); //5.2/2的实际类型为double printf("%dn", (c + f)); //值是-2 if (c+f<0) { printf("c和f的和是负数"); } else { printf("c和f的和是正数"); //if语句输出是正数,说明表达式最后得到一个无符号数 } return 0; }
单目运算符:参加运算的操作数只有一个
++自增运算符给变量值+1;–自减运算符给变量值减一
#includeint main() { int a; int num; a = 1; //num = (a++) + (a++) + (a++); //printf("%dn", a); 结果是4,a的数值变化是2,3,4 //printf("%dn",num); 结果是3,(a++)先去出a的值,先取值1+1+1,后++的运算 printf("%dn%dn%dn", (a++), (a++),(a++));//3,2,1 //printf("%dn%dn%dn", (++a), (++a),(++a));4,4,4 return 0; }
双目运算符:即参加运算的操作数有两个例如+ - * /
三目运算符:即参加运算的操作数有3 个;(a)?(b):©,a条件为真,提供b的结果,否则提供c的结果
算数运算符:+ - * / %(取余) += -= *= /= %=
a*=2 就是a=a*2
关系运算符:>、<、= =、>=、<=、!= (不等于)
逻辑运算符:&& 逻辑与;|| 逻辑或;! 逻辑非
位运算符:&按位与,| 按位或,~ 按位取反,^ 按位异或
>>右移
逻辑右移高位补0,低位溢出;
算数右移高位补符号位,低位溢出(有符号数
左移<< 高位溢出,低位补0
正数在内存中以原码形式存放,负数在内存中以补码形式存放 正数的原码=反码=补码 负数的反码是将原码中,除符号位(最高位)以外,每一位取反。负数的反码+1 就是补码。 如int型数值2的占4个字节,原码为 0000 0000 0000 0000 0000 0000 0000 0010 (2) -2的反码为 1111 1111 1111 1111 1111 1111 1111 1101 -2的补码为 1111 1111 1111 1111 1111 1111 1111 1110 (ff ff ff fe) #includeint main() { printf("%xn", 2); //2 printf("%xn", -2); // ff ff ff fe return 0; }
优先级
if语句几种形式
形式1
if(判断语句)
{
语句A;
}
形式2
if(判断语句)
{
语句A;
}
else
{
语句B;
}
形式3
if(判断语句)
{
语句A;
}
else if(判断语句)
{
语句B;
}
… //可多个else if
else
{
语句n
}
在使用if判断的时候,从上往下判断,一旦有成立的表达式,执行对应的复合语句,
下边的就不再判断了,各个条件判断是互斥的
#includeint main() { int a = 4; if (a>=5) { printf("a是大于等于5的数"); } else if (a>3) { printf("a大于3,小于5"); } else { printf("小于等于3"); } return 0; }
也可以if里面嵌套if
int main() { int a = 4; if (a<=5) { if (a==3) { printf("a等于3"); } else if (a==4) { printf("a=4"); } } else { printf("a大于5"); } return 0; }switch 语句
switch(表达式)//表达式只能是字符型或整型的(short int int long int)
{
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
default:语句3;break;
}
#includefor循环int main() { int a = 1; switch (a) { case 5: printf("a是5"); break; case 2: printf("a是2"); break; case 1: printf("a是1"); break; default: printf("不知道a是几"); break; } return 0;
形式
for(表达式1;表达式2;表达式3)
{//复合语句,循环体
}
执行表达式1,表达式1 只执行一次,
表达式2,每次循环前执行表达式2,判断表达式为真时才执行循环体
执行完循环体后,执行表达式3
#includeint main() //1到5的和 { int i, sum = 0; for (i = 0; i <= 5; i++) { sum = sum + i; } printf("%dn", sum); }
for循环嵌套
#includebreak与continueint main() { int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { printf("%d*%d=%dt", j, i, j * i); } printf("n"); } return 0; }
#includewhile循环int main() { int i, sum = 0; for (i = 0; i <= 5; i++) { if (i == 2) { //break; //中断循环 continue; //中断本次循环,开始下一循环 } printf("%dn", i);//break语句i只输出到1输出(0,1),continue语句会跳过输出2,输出(0,1,3,4,5) } }
形式1
while(条件表达式)
{//循环体,复合语句
}
#includeint main() //1到100的和 { int i = 1, sum=0; while (i<=100) { sum = sum + i; i++; } printf("%d", sum); }
形式2
do
do{//循环体
}while(条件表达式);
#includeint main() { int i = 1, sum=0; do { sum = sum + i; i++; } while (i <= 100); printf("%d", sum); }
区别:do执行循环体在判断是否执行第二次循环体,while先判断
goto跳转#includeint main() { printf("1n"); printf("2n"); goto tiaozhuan; //跳过打印4,5 printf("4n"); printf("5n"); tiaozhuan: printf("6n"); printf("7n"); printf("8n"); }