操作符
算术操作符
除法
/(除法)得到的商
整数除法不会得到小数(5/2=2)
浮点数除法得到浮点数(5.0/2=2.500000 5/2.0=2.500000)
取模
%左右两边必须是整数
位运算
位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。
移位操作符(只作用于整数)
>>--右移操作符(有除2的效果)
1.算术右移;
右边丢弃,左边补原符号位(
编译器通常采用此方式
);
2.逻辑右移
右边丢弃,左边补0;
ps:整数在内存中以补码的形式存储。
<<--左移操作符(有乘2的效果)
右边补0,左边丢弃
异或:
数字1^数字2=数字3
则有数字3^数字2=数字1
数字3^数字1=数字2
不创建第三个变量,实现a,b变量之间的交换;
加减法(可能会溢出,a很大,b也很大,加在一起就溢出了)
a=a+b;
b=a-b;
a=a-b;
异或法(异或不会使数字进位,所以不会溢出)
a=a^b;
b=a^b;
a=a^b;
注意:逻辑短路。
单目操作符
sizeof(单位为字节)
int main()
{
int a=4;
short s=0;(short占2个字节)
printf("%d\n",sizeof(s=a+5));
printf("%d\n",s);
return 0;
}
输出:2
0
sizeof()括号内的表达式不进行运算,所以s还是0;
s=a+5 s在赋值表达式的左边,a+5降精度为char(隐式转化)
前置++:先++,再使用。
后置++:先使用,后++
*p++=i--先将i赋值给*p,p再加加。
int num=p++;
先把p赋值给num,p再加一
int num=++p;
p先加一,再赋值给num
条件操作符
int i=(exp1?exp2:exp3)
return exp1?exp2:exp3
exp1为真,exp2计算并输出
exp1为真,exp3计算并输出
逗号表达式
case1:判断语句的括号内加逗号的表达式属于逗号表达式,逗号表达式的规则是从左往右依次执行语句,并返回最后一个语句的结果,如果计算到最后的表达式的值为真,则整个逗号表达式为真,否则为否。
case2:逗号表达式用于赋值,从左往右依次执行,整个表达式的结果是最后一个表达式的结果。
逗号表达式有副作用:
#include
<stdio.h>
int
main()
{
int
m = 1;
int
n = 2;
if
(n += m, n > m)
{
printf(
"%d\n"
, n);
}
printf(
"%d\n"
, n);
return
0;
}
输出:
3
3
结构成员
结构体操作符
. ->
输出:
张三
20
2019010305
结构体指针->成员名
令struct* ps=&s1
有printf("%s\n",(*ps).name);等价于printf("%s\n",s1.name);等价于printf("%s\n",ps->name);