1.类型转化
5/3=1
9.120000/7.000000=1.302857
隐式转化:
float_f=int t/int t1
当赋值号两边类型不同时,自动转化为精度较高的类型。
5/3=1.000000
强制类型转化,并不改变变量的类型,只临时作一次类型转化
float f=(float)int t/int t1
#include<stdio.h>
int main()
{
int num=4;
int num1=3;
float dev;
//隐式转化
dev=num/num1;
//显示转化
float dev1=(float)num/num1;
printf("%f %f\n",dev,dev1);
}
2.进制转换
(1)二进制数:由0和1组成
2^0 2^1 2^2 2^3 2^4 2^5 2^6 2^7 (这是代表2的n次方)
1 2 4 8 16 32 64 128
0101010 11111 10101
(10101)=12^0+021+1*22+02^3+12^4
(2)八进制数:由0~7组成的,八进制数开头是数字0,以区分八进制数
0345 0123 0765 0765 八进制不能有8 0987 这就是错的
(3)十六进制数:由数字0~9和字母a~f或者A~F组成,
并且以0x或者0X开头
0x123 0xab34 0xABf35
(4)进制数的转化关系
二进制数:1111
十进制数:8421
3.位操作 (先转化为二进制)
&:位与 (对应位同时为1,结果为1,否则为0!!!)
4&3=0100&0011= 位与位乘=00,10,01,01=0000=0
12&7=1100&0111=10,11,01,01=0100=4
|:位或 (对应位有1为真)
4|3=0100|0011=0111=7
13|9=1101|1001=1101=13
023|5=0001 0111|0000 0101=0001 0111=23
~:非(取反)
~23: -23-1=-24 就这样理解 任何数以负数减一
^:异或 (对应位不同为1,相同为0)
53=01010011=0110=6
#include<stdio.h>
int main()
{
int num=4^7;
printf("num=%d\n",num);
}
<<:左移
即转化为二进制,然后左移2位,低位补0
左移几位,则乘以2的几次方!!!
8*2^2=32
8<<2 =1000=100000=32
>>:右移
与左移相反
8/2^2
9>>2 =2 高位溢出
8>>2 =1000=0010=2
4.赋值操作符
=: 赋值号(把右侧值赋给左侧值)
+=:num+=i------->num=num+i
-=:
*=:
/=:
%=:
&=:
|=:
. >>=:
<<= : num>>=i------->num=(num>>i)
#include<stdio.h>
int main()
{
int num=12;
printf("num=%d\n",num);
num=12;// 这里要赋值 不然结果会累加
num+=23;
printf("num+=23:%d\n",num);
num=12;
num*=2;
printf("num*=2:%d\n",num);
num=12;
num<<=2;
printf("num<<=2:%d\n",num);
}
5.逻辑运算符和条件运算符
(1) &&:逻辑与
表达式1 && 表达式2; 表达式同时为真,结果为真
注意:当表达式1为假时,表达式2无需运算,真题结果为假
||:逻辑或
表达式1 || 表达式2; 一个表达式为真,结果为真
注意:当表达式1为真时,表达式2无需运算,真题结果为真
!:非
!表达式 ; 表达式为真,结果为假
#######include<stdio.h>
int main()
{
int num=2;
printf("%d\n",num>3&&8>num); =0
printf("%d\n",num>10||num<3); =1
printf("%d\n",!(num>3)); =1
}
#include<stdio.h>
int main()
{
int num=3;
(num+=3)>9&&(num-=3)<8; 赋值不是条件 遇到不成立的条件就停止运算 =6
printf("num=%d\n",num);
}
(2)条件运算符
?: a>b?a:b
表达式1?表达式2:表达式3
若表达式1为真,则执行表达式2 否则执行表达式3
#include<stdio.h>
int main()
{
int num=6;
int num1=2;
int sum=num>num1?num:num1;
printf("max=%d\n",max); =6
}
a,b,c ------>三个数求max;
a>b?(a>c?a:c):(b>c?b:c)
#include<stdio.h>
int main()
{
int a,b,c,max;
printf("输入数:\n");
scanf("%d %d %d",&a,&b,&c);
max=a>b?(a>c?a:c):(b>c?b:c);
printf("max=%d\n",max);
}
6.运算符的优先级
括号成员第一,全体单目第二,乘除余三,加减四;
位移五,关系六,等于不等排第七;
位与,异或和位或八九十;
逻辑或和与十二与十一;
条件高于赋值,逗号运算最低;
二.c语言的三大结构
顺序结构、分支结构、循环结构
1.顺序结构
(1) if (表达式) 这里条件为真(1)就执行花括号里面的内容 为假(0)则不执行
#include<stdio.h>
int main()
{
int num =8;
if(1) //这里条件为真(1)就执行花括号里面的内容 为假(0)则不执行
{
printf("num=%d\n",num);
}
printf("hello,world\n");
}
(2) if.......else....(if成立就执行 否则执行else)
#include<stdio.h>
int main()
{
int num=0;
printf("input num:\n");
scanf("%d",&num);
if((num%3==0) && (num%5==0))
{
printf("%d 是3和5的倍数\n",num);
}
else
{
printf("%d 不是3和5的倍数\n",num);
}
}
#include<stdio.h>
int main()
{
int num;
printf("input num:\n");
scanf("%d",&num);
if(num>10)
{
printf("num>10\n");
}
else
{
printf("num<10\n");
}
}
(3) if....else if .....else...
else if 可以有多个后面跟条件
else 结尾 不能跟条件
#include<stdio.h>
int main()
{
int num =0;
printf("input num:");
scanf("%d",&num);
if(num==100)
{
printf("该数是100\n");
}
else if(num>100)
{
printf("%d>100\n",num);
}
else
{
printf("%d<100\n",num);
}
}
练习:
90--100:优秀
80--90: 良好
60--80: 一般
0--60 :不及格
#include<stdio.h>
int main()
{
int a =0;
printf("input a :");
scanf("%d",&a);
if(a>=90)
{
printf("优秀\n");
}
else if(a>=80)
{
printf("良好\n");
}
else if((a>=60)&&(a<80)) //这里的里面的
括号为表示一个表达式为
一个整体 不加也行
{
printf("一般\n");
}
else
{
printf("不及格\n");
}
}
(5) 使用if的注意事项
1.判断一个区间的写法
80<num<=90 这种写法错误
num>80 && num<=90 这种写法正确
2.if条件句后面只有一条语句时,可以不加{}
if(1)
printf("hello\n"); 在不加花括号
的情况下 if条件成立 只执行这一条语句
printf("world\n"); 这条不执行
有效语句只有:printf("hello\n");
3.if条件句后面只有一条语句时,可以不加{};但此语句不能为变量定义语句
#include<stdio.h>
int main()
{
if(1)
{
printf("hello\n");
nt num =10; // 定义在此处会报错
他只能执行到花括号里面
printf("world\n");
}
printf("%d",num); //把这层移到花括号里面才能执行
}
在if的{}里面定义的变量,只能在{}中使用,在{}之外无效!!
2.分支结构 switch....case
(1) switch(option)
{
case :
{
语句1
break;
}
case :
{
语句2
break;
}
default:
{
语句;
}
}
根据option 的值选择执行case语句,若没有与之对应的case语句,则执行default
default 可以放在任意位置 但里面要用break 跳出
break作用 若不加 则会按顺序输出所有case里面的语句直到遇到break为止
若没有break 便会全部输出
#include<stdio.h>
int main()
{
char ch;
printf("input ch:");
scanf("%c",&ch);
switch (ch)
{
case 'l':
{
printf("linux\n");
break;
}
case 'w':
{
printf("windows\n");
break;
}
default:
{
printf("error\n");
}
}
}
3.循环结构
while() do{}while() for(;;)
(1) while (表达式)
{
//执行语句;
}
先判断条件是否满足执行条件,满足则执行循环体
不满足则退出循环
若条件满足。则执行循环体,每执行一次循环体
进行一次条件判断
#include<stdio.h>
int main()
{
int num =5;
printf("input num:");
scanf("%d",&num);
while(num>5)
{
printf("num=%d\n",num--); 每执行依次
就要回到条件语句进行判断
}
printf("hi,shanghai");
}
#include<stdio.h>
int main()
{
int sum =0;
int i =1;
while(i<=100)
{
sum+=i;
i++;
}
printf("%d\n",sum);
}
(2) break/continue
break:
跳出当前循环 结束整个循环
continue:
跳过本次循环,进行下一次循环
#include<stdio.h>
int main()
{
int num=4;
while(num>3)
{
printf("num=%d\n");
continue;只执行这句前面的语句 并进行死循环,
不执行continue下面的语句
printf("===========\n");
}
}
练习: 1--100的和把尾数为四的数去掉
#include<stdio.h>
int main()
{
int sum=0;
int i=1;
while(i<=100)
{
i++;
if(i%10==4)
continue;
sum+=i;
}
printf("%d\n",sum);
}
(3)do
{
}while(); 先执行后判断
#include<stdio.h>
int main()
{
int i=0;
int sum=0;
do
{
sum+=i;
i++;
}while(i<=100); 注意这里有分号
printf("sum=%d\n",sum);
}
(4) for(表达式1;表达式2;表达式3)
{
//循环体;
}
表达式1:循环条件初始化
表达式2:循环结束条件或者循环执行条件
表达式3:循环步长或者变量值的更新
注:表达式1,2,3可以任意省略,或全部省略
但是,“;;”不能省略!!!!!
#include<stdio.h>
int main()
{
int sum=0;
int i=1;
for(;i<=100;++i)
{
sum+=i;
}
printf("sum=%d\n",sum);
}