思维导图链接boardmix
+ - * / %(取余 取模)
注意:取模运算必须对整数进行操作,
int a = 5; int b = 2; int c = a%b; // --> 1
- 除数不能为0
- 整型与整型计算结果必然是整型
- 浮点类型与整型计算结果是浮点类型
int d = 5/2; //5整型,2整型,整型与整型计算结果必然是整型
printf("d = %d\n", d); //2
float f = 5/2; //5整型,2整型,整型与整型计算结果必然是整型2, 将结果强转成浮点类型2.0
printf("f = %f\n", f); //2.0
float g = (float)5/2; //5.0/2 -->浮点类型与整形计算,结果是浮点类型
printf("g = %f\n", g); //2.5
手动指定强转过程:
c = 5%(int)2.5; //2.5强转成int, 直接取整变成2,不是四舍五入
- 浮点类型与整型计算结果是浮点类型
- 整型的有符号数和无符号数计算,结果是无符号数!!
- 当字节数少的数据类型强制转换成字节数多的数据类型的时候,补码高位补符号位
char c = -2; -->源码:1000 0010
--->反码:1111 1101
---> 补码: 1111 1110
int a = c; --> 补码 11111111 11111111 11111111 11111110
--> 反码 11111111 11111111 11111111 11111101
--> 源码 10000000 00000000 00000000 00000010 ===》 -2
%d--->源码 ---》-2
= += -= *= /= %= ...... 将右边的值赋值给左边,简称为 将右值赋给左值,
int x=100;
x=5;
x+=5;
x=x+5
x-=5;
x=x-5;
x*=5;
x=x*5;
特性:从右往左计算,又称之为左结合
注意:左值只能是变量
> < ==(相等) >= <= !=
关系运算符一般与条件判断语句一起使用。作为条件判断真假
注意:
- 浮点类型不能使用 == !=号,而要设法转换成>=
- 判断两个浮点数是否相等时,判断这两个数是否落在一个区间内,该区间:
- 单精度--》正负1e-6 。(1*10-6)
- 双精度--》正负1e-15。(1*10-15);
&& || !
格式: 条件1 && 条件2 当条件1和条件2均为真,则结果为真 当条件1或者条件2有一个为假,则结果为假
注意:当条件1为真,才会执行条件2;
格式: 条件1 || 条件2 当条件1或者条件2有一个为真,则结果为真 当条件1和条件2均为为假,则结果为假
注意:当条件1为真是,不执行条件2
格式: !条件 若条件为真,则!条件为假 若条件为假,则!条件为真
功能:计算数据类型或者变量在内存空间中所占的大小,以字节为单位.
格式:
sizeof(变量名); --->该变量在内存空间中的大小
sizeof(数据类型); --->该数据类型定义的变量在内存空间中的大小;
int a = 10;
sizeof(a);
sizeof(int);
printf("%ld %ld\n", sizeof(int), sizeof(a)); //4 4
思考,如何判断这个ubuntu是64位还是32位操作系统?
答:sizeof计算long int类型的大小,如果是4就是32位操作系统,如果是8就是64位操作系统
格式: ++ --
int i = 5; ++: 后置++ : i++; 先返回i的值,然后i自增1; 前置++ : ++i; 先i自增1,然后返回i的值;
#include
int main(int argc, const char *argv[])
{
int i = 5;
int a = i++; //先返回i的值,然后i自增1;
printf("a=%d i=%d\n", a, i); //a=5 i=6;
i = 5;
int b = ++i; //先i自增1,然后返回i的值;
printf("b=%d i=%d\n", b, i); //b=6 i=6;
i = 5;
printf("i=%d\n", i++); //5
printf("i=%d\n", i); //6
i=5;
printf("i=%d %d\n", i, i++); //6 5 ,因为printf是从右往左计算的
//不要将带有赋值属性的运算放在printf函数中,否则结果可能很难理解
return 0;
}
? : 格式: 条件语句?返回值a:返回值b; 如果条件语句为真,则返回a; 如果条件语句为假,则返回b;
& | ^ ~ << >>
格式 : a & b
同为1,结果为1;
有一个位0,结果为0;
3 & 9: 3 = 0000 0011
9 = 0000 1001
---------------
0000 0001 = 1;
格式 : a | b
同为0,结果为0;
有一个为1,结果为1;
3 | 9: 3 = 0000 0011
9 = 0000 1001
---------------
0000 1011 = 11;
格式: ~a 3 = 0000 0011 ~3 = 1111 1100
格式: a^b 相同为0,不同为1; 3^9 = 0000 0011 0000 1001 ---------- 0000 1010
格式:
x << 指定位数 低位补0,高位溢出
unsigned char c = 3;
c = c<<1 ==> c<<=1
c=3 ==> 0000 0011<<1 ==> 0000 0110==6
0000 0110<<1 ==> 0000 1100==12
0000 1100<<1 ==> 0001 1000==24
0001 1000<<3 ==> 1100 0000==24*2*2*2=192
-------------------------------------
在高位没有溢出的情况下,左移一位相当于是*2.
1100 0000<<1 ==> 1000 0000==128
格式:
x >> 指定位数
若x是有符号数,则补码高位补符号位。
unsigned char c = 192;
c = c>>1 ==> c>>=1
c=192 ==> 1100 0000>>1 ==> 0110 0000==96
0110 0000>>1 ==> 0011 0000==48
0011 0000>>3 ==> 0000 0110==6 48/2/2/2
0000 0110>>1 ==> 0000 0011==3
0000 0011>>1 ==> 0000 0001==1
-------------------------------------
在低位没有溢出的情况下,右移一位相当于是/2.
有符号的数据,右移的时候,补码高位补符号位!!!
char c = -64 ==> 1100 0000源码
1011 1111反码
1100 0000补码
1100 0000>>1 ==>高位补符号位==>1110 0000 补码 -->1101 1111 反码--> 1010 0000 源码 == -32
1110 0000>>1 ==> 1111 0000补码 --> 1110 1111反码 --> 1001 0000源码 = -16
清0,用&
置1,用|
部分取反,用^
全部取反,用~
左移一位,相当于乘以2
右移一位,相当于除以2
(式子1, 式子2)
- 逗号运算符会将多个表达式连接在一起,用小括号将整个表达式包含起来;
- 运算顺序:从左往右
- 返回的是最后一个表达式的值,但是前面的表达式也会运行。
括号优先级最高:() []
赋值运算符优先级倒数第2:= += -= *= /=
逗号优先级最低:,
哪部分要先计算,就用括号括起来