昨日回顾:
基本数据类型
运算符:算术运算符,关系运算符,逗号运算符
printf(),scanf()
========================================
今日内容
1.类型转化
(1)隐式转化
当赋值号 "=" 两边类型不同时,自动转化为精度较高的类型。
格式
foloat = int1 / int2
例
5/3 = 1.00000
9.120000/5 = 1.824000
(2)显式转化
强制类型转化。
float = (float)int1 / int2
最终并不改变变量数据类型,只临时做一次类型转化。
2.位运算符
(1)二进制数:
由0和1组成。
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
128 64 32 16 8 4 2 1
例
0101010 = 42 11111 = 31 10101 = 21
(2)八进制数:
由0~7组成的,八进制数开头时数字0,以区分八进制数。
例
0345 0123 0765 0765
(3)十六进制数:
由 0~9 和字母 a~f 或 字母 A~F 组成的,并且以 0x 或 0X 开头。
例
0x123 0xab34 0xABf35 0XFFF
(4)汇总
每位十六进制数,一一对应四位的二进制数。
每位八进制数,一一对应三位的二进制数。
二进制 十进制 八进制 十六进制
0000 0 0(000) 0
0001 1 1(001) 1
0010 2 2(010) 2
0011 3 3(011) 3
0100 4 4(100) 4
0101 5 5(101) 5
0110 6 6(110) 6
0111 7 7(111) 7
1000 8 8
1001 9 9
1010 10 a/A
1011 11 b/B
1100 12 c/C
1101 13 d/D
1110 14 e/E
1111 15 f/F
例
10101011 = 171, 0253, 0xab(0XAB,0xAB)
0123 = 001 010 011
0xa45 = 1010 0100 0101
(6)位操作
&: 位与
将十进制数,八进制数,十六进制数转化为对应的二进制数,进行位与计算,对应位同时为1时,结果为1,否则为0!!
例
4 & 3 = 0100 & 0011 = 0000 = 0
0100
& 0011
------------------
0100
12 & 7 = 1100 & 0111 = 0100 = 4
|: 位或
按位相或,对应位为1,只要有1,则为1;同时为0,才为0!!
4 | 3 = 0100 | 0011 = 0111 = 7
0100
| 0011
------------------
0111
13 | 9 = 1101 | 1001 = 1101 = 13
023 | 5 =010 011 | 101 = 027 = 23
~: 非
方法一
计算机是补码存储,原码输出!!!!!
原码:
正数的原码是其本身
负数的原码是在正数原码的基础上符号位为1
反码:
正数的反码是其本身
负数的反码是在其原码的基础上,符号位(最高位)不变,其余位按位取反。
负数的反码实在其原码的基础的上,符号位(最高位)不变,其余各位取反。
补码:
正数的补码是其本身
负数的补码是在其原码的基础上,符号位不变,取余各位取反然后加1,即反码的基础上加1。
例
0001 0111 //十进制:23
1110 1000 //按位取反,补码
1110 0111 //反码,减一
1001 1000 //原码输出,
-001 1000` //十进制:-24
方法二
取负减一
~023 = ~19 = -19 - 1 = -20
^: 异或
对应位不同为1,相同为0。
例
4 ^ 7 = 100 ^ 111 = 011 = 3
5 ^ 3 = 101 ^ 011 = 110 = 6
100
& 111
------------------
011
<<:左移
方法一
即转化为二进制,然后左移2位,低位补0。
8 << 2 = 32
1000
100000
方法二
左移几位,即乘2的几次方!!
8 × 2^2 = 32
>>:右移
方法一
(同左移)即转化为二进制,然后 右移2位 。
例1:
8 >> 2 = 32
1000
10
例2
9 >> 2 = 2 //相当于取商
1001
10
方法二
左移几位,即除以2的几次方!!
8/ 2^2 = 4
2.赋值操作符
赋值号:=
+= num += i num = num + i
-= num -= i num = num - i
*= num *= i num = num × i
/= num /= i num = num / i
%= num %= i num = num % i
&= num &= i num = num & i
|= num |= i num = num | i
>>= num >>= i num =( num >> i) //底层硬件使用较多
<<= num <<= i num =( num << i)
4.逻辑运算符和条件运算符
(1)逻辑运算符
&&:逻辑与
表达式1 && 表达式2
当表达式1和表达式2同时为真时,结果为真。
注意,当表达式1为假时,结果直接为0。
||:逻辑或
表达式1 || 表达式2
表达式1,表达式2只要有一个为真时,结果为真。
注意,当表达式1为真时,结果直接为1。
!:非
! 表达式1
若表达式1为真时,结果为假。
若表达式1为假时,结果为真。
(2)条件运算符
?:
表达式1 ? 表达式2 : 表达式3 //若表达式1为真,则执行表达式2,否则执行表达式3
例
a>b?a:b //比较a、b大小
a>b?(a>c?a:c):(b>c?b:c) //比较a、b、c大小
5.运算符的优先级
括号成员第一,全体单目第二,乘除余三,加减四,
位移五,关系六,等与不等排第七,
位与异或位或八九十,逻辑或与十二十一,
条件高于赋值,逗号运算最低!
6.C语言的三大结构
顺序结构,分支结构,循环结构
1.分支结构
(1) 简单if语句
if(表达式)
{
}
如果表达式为真,执行{}内语句。
如果表达式为假,则不执行
(2)if...else语句
if
{
}
else
{
}
(3) 多重if语句
if
{
}
else if
{
}
else if
{
}
......
else
{
}
(4)嵌套
if
{
if
{
....
}
else
{
}
}
else
{
}
练习:
输入成绩并分类
90~100:优秀
80~90: 良好
60~80: 一般
0~60: 不及格
注意数据有效性问题,即输入数据要在0~100之间。
(5)使用if注意事项
80 < num <=90 //错误
num > 80 && num <=90 //OK!
** if条件句后面只有一条语句时,可以不加{},
但此语句不能是变量定义语句。**
例:
if(1)
printf("hello\n");
printf("world!\n"); // if的有效语句只有:printf"hello\n")
在if的{}里面定义的变量,只能在{}中使用,在外则无效!!
例:
if(1)
{
printf("hello\n");
int num = 10;
printf("num = %d\n", num);
}
printf("num = %d\n", num); //错误
2.switch...case:
(1)switch...cas语句
switch (operation)
case operation:
break;
...
case operation:
break;
default:
break;
根据option的值选择执行case语句,若没有与之对应的case语句则执行default语句!
(2)注意:
default语句可以放在switch{}里的任意位置;
case语句后的{},可以省略不写,当case后的执行语句超过3条,建议加{}!!
(3)case语句中的break值情况而定
若case语句中无break,则顺次执行所有case语句,直到执行完所有case语句,退出switch。
90~100
80~89
70~79
60~69
3.循环结构
while( ) 、 do{}while( )、 for(;;)
(1)while( )先判断后执行
while(表达式)
{
执行语句 //循环体
} //无;!!
先判断条件是否满足执行条件,满足则执行循环体,不满足则退出循环!
若条件满足,则执行循环体,每执行一次循环体,进行一次条件判断。
(2)break/contiune
break:跳出循环!
continue:跳出本次循环,执行下一次循环。
(3)do{ }while( ) 先执行,后判断!!
do
{
执行语句 //循环体
}while(表达式); //有;!!
if 语句和while语句 后有 “;” 不会报错!有时会陷入死循序。
(4)for(;;)
for(表达式1;表达式2;表达式3)
{
执行语句 //循环体
}
表达式1:循环条件初始化。
表达式2:循环结束条件或者循环执行条件。
表达式3:循环步长或者变量值的更新。
注:表达式1,2,3可以任意省略,或全部省略
!!!但是 “;;”不可省略!!!
上课记完笔记,晚上花时间浪费在排版上无意义。