目录
赋值操作符:= += -= *= /= %= >>= <<= &= |= ^=
单目操作符:| - + & sizeof ~ -- ++ *
逗号表达式 exp1,exp2,exp3,.....expN
1.算术操作符:+ - * / % (加减乘除)
-
除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
-
对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
-
% 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.移位操作符: << >>(左移右移)
二进制位有三种:原码,反码,补码。二进制的第一位是符号位,负数是1,正数是0。左移右移是移动数字的二进制位--补码。正数的原码反码补码相同。
例如:-9
-9= -(2³+2零次方)
. | . | . | . | . | . | . | . | . | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 | |||||||||||||||||
原码 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
反码 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
补码 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
反码=原码符号位不变,其它位按位取反
补码=反码+1
1. <<左移:补码左n位抛弃,右边补n个0
补码 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
首位1丢弃,末尾补0
丢1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 补0 |
2.>>右移:
- 逻辑右移:右边n位丢弃,左边n位补0
- 算术右移:右边n位丢弃,左边原符号位填充,剩余补0(负数符号位是1,正数符号位是0)
逻辑右移
补码 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
补0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 丢1 |
算术右移
补码 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
补1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 丢1 |
3.位操作符: & | ^ (按位与,按位或,按位异或)
& 操作符两边对应的数的补码按位与,两者均为一,结果为一,否则为0
|
操作符两边对应的数的补码按位或,两者存在为一,结果为一,否则为0
^ 操作符两边对应的数的补码按位异或,相同为0,不同为1,0^n=n
例如:3^3=0;
3^5=2³+2²+2零次方=8+1=9
3=2一次方+2零次方
5=2²+2零次方
3的补码 | 0 | 0 | 1 | 1 |
5的补码 | 0 | 1 | 0 | 1 |
3^5 | 0 | 1 | 1 | 0 |
练习:如何让不创建中间变量,实现两个数的交换
提示:利用按位异或
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b; //a已经改变,b=a^b^b,b^b=0,a^0=a
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}
4.赋值操作符:= += -= *= /= %= >>= <<= &= |= ^=
i
nt x = 10;
x = x+10;
x += 10; 复合赋值
其他运算符一样的道理。这样写更加简洁。
5.单目操作符:| - + & sizeof ~ -- ++ *
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
前置++,--
++a 先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值
--a 先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值
后置++,--
a++ 先对a先使用,再增加
a-- 先对a先使用,再自减
sizeof有三种语法形式
1. sizeof( object ); // sizeof( 对象 );
2. sizeof( type_name ); // sizeof( 类型 );
3. sizeof object; // sizeof 对象;
所以,
int i;
sizeof( i ); √
sizeof i; √
sizeof( int ); √
sizeof int; ×
1. sizeof( object ); // sizeof( 对象 );
2. sizeof( type_name ); // sizeof( 类型 );
3. sizeof object; // sizeof 对象;
所以,
int i;
sizeof( i ); √
sizeof i; √
sizeof( int ); √
sizeof int; ×
数组的sizeof值等于数组所占用的内存字节数
6.关系操作符:> >= < <= != ==
注意:==相等,=赋值
7.逻辑操作符 && ||
&&逻辑与:有0结果为0
|| 逻辑或 : 有一个非0,结果为1
1 & 2 = 0 按位与1 && 2 = 1 逻辑与1 | 2 = 3 按位或1 || 2 = 1 逻辑或
练习#include <stdio.h>int main (){int i = 0 , a = 0 , b = 2 , c = 3 , d = 4 ;i = a ++ && ++ b && d ++ ;printf ( "a = %d b = %d c = %d d = %d " , a , b , c , d );return 0 ;}// 程序输出的结果是什么?a++为0,&&左侧出现0,则后面的++b,d++都为假,不计算,但此时输出时a进行了自增,为1输出:1234
#include <stdio.h>int main (){int i = 0 , a = 1 , b = 2 , c = 3 , d = 4 ;i = a++||++b||d++;printf ( "a = %d b = %d c = %d d = %d " , a , b , c , d );return 0 ;}//程序输出的结果是什么?a++为1,为真,||后面的均为真不继续计算,但此时a自增输出 :2234
8.条件操作符 exp1 ? exp 2 : exp3
a>5 ? 3 : -3等价于if ( a > 5 )b = 3 ;elseb = - 3 ;
9.逗号表达式 exp1,exp2,exp3,.....expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
10.下标引用、函数调用和结构成员[] () . _>
1. [ ]
下标引用操作符
操作数:一个数组名
+
一个索引值
int
arr
[
10
];
//
创建数组
arr
[
9
]
=
10
;
//
实用下标引用操作符。
[ ]
的两个操作数是
arr
和
9
。
2. ( )
函数调用操作符,接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include <stdio.h>void test1 (){printf ( "hello\n" );}void test2 ( const char * str ){printf ( "%s\n" , str );}int main (){test1 (); ()作为函数调用操作符。test2 ( "hello world" ); ()作为函数调用操作符。return 0 ;}
3.访问一个结构的成员
.
结构体
.
成员名
->
结构体指针
->
成员名
创建一个结构体类型 struct Stustruct Stu{char name[];int age;char id[];};int main(){int a=0struct Stu s1={李某某,26,142321995....};struct Stu*ps=&s1;printf("%s\n",ps->name);printf("%s\n",ps->age); 结构体指针->成员名printf("%s\n",s1.id); 结构体.成员名