运算符
int val = 100;
赋值运算符
= 赋值 ; int a =100;
+= val +=10; ===> val(新) = val(当前) + 10; val新值为110
-= val -=10; ==》val = 100-10 ; val的值等于90
*= val *=10; ==》val = 100*10 ; val的值等于1000
/= val/=10; ==》val = 100/10 ; val的值等于10
val/=9; ==》val = 100/9; (9*11余1) val的值等于11
%= val%=9; ==》val = 100%9 ; (余1) val就为1
&= 位与之后赋值 val &= 0x01 ==> val = val &0x01
01100100 & 00000001 =00000000
|= 位或之后赋值 val |= 0x01 ==> val = val | 0x01
01100100 | 00000001 =01100101
^=
算术运算符
+ 加
- 减
* 乘
/ 整数相除得到整数部分取整
% 整数相除得到余数部分取余
++ 自加1 val++; ===> val = val +1 ; 也就是得到101
-- 自减1 val-- ; ===> val = val -1 ; 得到是的99
++val; 等同于 val ++;这两语句相同,同样是令val自增1
if( ++val) 先令val自增1,再判断新值是否为真(非0)
if(val++) 先判断val值是否为真, 不管结果如何再令val自增1
== 是否相等
!= 是否不相等
> a>b 判读a是否大于b
< a<b 判读a是否小于b
>= a>=b 判读a是否大于或等于b
<= a<=b 判读a是否小于或等于b
练习:test1
输入一个小写字符,‘a’ ‘z’
显示该字符对应大写字符,连续显示4次
输入‘a’ ,输出是AAAA
字符的输入和显示用%c
char c ;
scanf(“%c” , &c);
for( i=0; i<4; i++ )
逻辑运算符
逻辑与 &&
条件1&& 条件2
只有这两个条件都满足(条件为真)整个表达式才为真
只要有一个为假就是假
如果条件1已经是假,不会处理条件2
例:判断输入的是否为小写字符:
char c ;
scanf(“%c” , &c); // ‘a’ ‘z’ ‘z’ >= c >= ‘a’ 数学上写法
if( c >= ‘a’ && ‘z’ >= c )
逻辑或 ||
条件1 || 条件2
只有有一个条件满足(条件为真)整个表达式就为真
只有这两个条件都不满足(条件都为假)整个表达式才为假
如果条件1已经是真,不会处理条件2
if ( 小写字符 || 大写字符 )
‘a’ ~ ‘z’ ‘A’ ~ ‘Z’
判断一个字符是否为英文字符
if ( (c >= ‘a’ && ‘z’ >= c ) || (c >= ‘A’ && ‘Z’>= c ) )
练习 test2.c
输入一个字符,英文字符或者数字字符
如果是小写字符就显示该字符对应大写字符,连续显示4次
如果是大写字符或者数字字符就显示输入出错
----------------------------------------------------------------------------
scanf(“%c”, &ch) 不管键盘的缓冲区里面有什么数据都会读取之并当成是字符
如果需要清空缓冲区,常用
while(getchar() != ‘\n’) ;
// getchar()逐个字符取走,得到的就是字符本身
%d只取+-0123456789
%x只取xX0123456789abcdefABCDEF
%s 可以取键盘上所有键值,除了空格和回车
--------------------------------------------------------------------------
逻辑非 !
单目运算符
!条件 如果条件为真,整个表达式为假
如果条件为假,整个表达式为真
非零就是真
分析: !val
如果val 的值为1 ,请问 !val 判断结果为假
如果val 的值为0 ,请问 !val 判断结果为真
分析 ! (a>b)
如果a的值为10 ,b的值为12,
! (a>b) a>b不成立,这个表达式是真的
如果a的值为15 ,b的值为12,
! (a>b) a>b成立,这个表达式是假的
位运算符
针对bit做操作 1Byte有8bits
位与运算符 & 对应位相与都为1才为1 ,否则为0
如 unsigned char val = 10;
val & 0x01 ==》 0000 1010
& 0000 0001
0000 0000
1) 用于判断某一位是为1还是0
如判断一个unsigned char数据的最低位是否为1
unsigned char val ;
.........
如果 val &0x01 != 0 说明最后一位是1
如果 val &0x01 == 0 说明最后一位是0
2) 用来令某一位为0
如令unsigned char val 的第3位为0
val & 0b11110111
位或运算符 | 对应位相或都为0才为0 ,否则为1
如 unsigned char val = 10;
val | 0x01 ==》 0000 1010
| 0000 0001
0000 1011
用于把某一位置成1
如保证unsigned char val 的第4位为1
val | 0b00010000
左移运算 << 把数据按要求向左移动指定位数
直接把高位移走,低位补0
对数据逐位进行操作
在数据没有越界的情况下,左移n位就相当于乘以2n
右移运算 >> 把数据按要求向右移动指定位数
直接把低位移走,如果是带符号数高位补符号位(负数补1,正数补0)
如果是无符号数,直接高位补0
对数据逐位进行操作
在非负数进行操作的情况下,右移n位就相当于除以2n
位异或 ^
按二进制位进行比较,如果对应位不相同就为1,相同就为0
如 unsigned char val = 10;
val ^ 0x01 ==》 0000 1010
^ 0000 0001
0000 1011
unsigned char a = 0x12;
unsigned char b = 0xab;
unsigned char c = a^b ;===> ?
unsigned char d = c^b ; ===> ?
unsigned char e = c^d ;
见图
作用: 1)用来比较全部位数是否相同,只有有一位不相同返回的就是非0;
如果全部位都相同返回0;
2)可以实现两数交换
unsigned char a = 0x12;
unsigned char b = 0xab;
a= a^b ;// 新的a值为 0xb9
b= a^b; // 新b为0x12
a = a^b;// 新a为0xab
还可以写成:
a^=b;
b^=a;
a^=b;
思考:要实现两数的交换,可以想到几种方式?用代码确定效果(3~~4种)
int a = 0x12;
int b = 0xab;
1) 异或
a^=b ; b^=a;a^=b;
2) 使用额外变量暂存
3) 利用加减法
a = a+b;
b = a-b;
a = a-b;
4) 利用乘除法
a = a*b;
b = a/b;
a = a/b;
位反 ~
把数据的每一位都取反(注意不是反码)
char val = 100; // 0x64
~val ==> ~0110 0100 ==》 1001 1011
常和位与、位或操作配合使用
例:要保证val的第3位为0
val & 0b11110111 ======val &( ~0x08 )
其它运算符
sizeof() 计算对应的类型或者是变量所占用的空间大小,以字节为单位
printf( “int is %ld Btyet(s) \n”, sizeof(int)) ;
int a ;
printf( “int is %ld Btyet(s) \n”, sizeof(a))
确认所有基本数据类型所占用的空间大小
char 1
short 2
int 4
float 4
long 8
double 8
long double 16
bool 1 <stdbool.h>
常用于数组的大小、结构体等类型大小
? : C语言唯一的三目运算符
判断条件 ?条件为真时执行的语句 : 条件为假时执行的语句
例子:用一个表达式得到a和b中比较大的值
a>b ? a : b
a大于b吗?如果是则a : 否则b
就是 if ...else....的精简版
if(a>b)
max = a;
else
max = b;
练习:定义三个同类型变量a,b,c分别赋值;
通过一个表达式得到最大值,并打印出来
, 逗号
int a = (100 , 200);
最终a的值是200,因为()最后为200
运算符的优先级:
[ ] ( )
单目运算符
双目算术运算符和<< >>
双目关系运算符
双目位运算 ( i & 0x01) == 0
双目逻辑运算
三目运算符
赋值运算符
,