前言
用算术运算符将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式 运算对象包括常量、变量、函数等
例如: a*b/c-1.5 + ‘a’
提示:以下是本篇文章正文内容,
运算符的分类
双目运算符
——即参加运算的操作数有两个
例:+
a+b
单目运算符
——参加运算的操作数只有一个
例:+ +自增运算符,给变量值+1,- -自减运算符
int a=10;
a++;
三目运算符
即参加运算的操作数有 3 个
( ) ? ( ) : ( )
算数运算符
运算符 | 程序符号 |
---|---|
加 | + |
减 | - |
乘以 | * |
除以 | / |
取余 | % |
其他:+=、-=、*=、 /= 、%=
10%3 表达式的结果为 1 复合运算符:
a += 3 相当于 a=a+3
a*=6+8 相当于 a=a*(6+8)
关系运算符
(>、<、= =、>=、<=、!= )
!=为不等于
一般用于判断条件是否满足或者循环语句
逻辑运算符
1、&& 逻辑与,两个条件都为真,则结果为真
if((a>b) && (a<c))
if(b<a<c) //这种表达方式是错误的
2、|| 逻辑或
两个条件至少有一个为真,则结果为真
if((a>b) || (a<c))
3、! 逻辑非
if(!(a>b))
{
}
位运算
1、&按位与
任何值与0得0,与1保持不变使某位清 0
0101 1011
&
1011 0100
--------------------
0001 0000
2、| 按位或
任何值或1得1,或0保持不变
0101 0011
|
1011 0100
--------------------
1111 0111
3、~ 按位取反
1变0,0变1
0101 1101
~
--------------------
1010 0010
4、^ 按位异或
相异得 1,相同得 0
1001 1100
^
0101 1010
---------------------
1100 0110
5、位移
>>右移, << 左移
注意
右移分:逻辑右移、算数右移
-
右移
逻辑右移 高位补0,低位溢出
算数右移 高位补符号位,低位溢出 (有符号数)
-15
1000 1111
1111 0000
1111 11 00 -4- 逻辑右移
低位溢出、高位补0
0101 1010 >>3
0000 1011 - 算数右移
对有符号数来说,低位溢出、高位补符号位。
1010 1101 >> 3
1111 010 1
0101 0011 >>3
0000 1010
总结 右移:
1、逻辑右移 高位补0,低位溢出
注:
无论是有符号数还是无符号数都是高位补 0,低位溢出
2、算数右移 高位补符号位,低位溢出 (有符号数)
对无符号数来说,高位补 0,低位溢出
对有符号数来说,高位补符号位,低位溢出
在一个编译系统中到底是逻辑右移动,还是算数右移,取决于编译器 - 逻辑右移
//判断右移是逻辑右移还是算数右移
#include <stdio.h>
int main( ) {
printf("%d\n",-1>>3);
return 0;
} //如果结果还是-1 证明是算数右移
- 左移<< 高位溢出,低位补 0
5<<1
条件运算符号
( ) ? ( ) : ( )
A ? B : C ;
如果 ? 前边的表达式成立,整个表达式的值,是?和:之间的表达式的结果 否则是:之后的表达式的结果
#include <stdio.h>
int main( ) {
int a;
a=(3<5)?(8):(9);
printf("a=%d\n",a);
return 0;
}
逗号预算符
( ) , ( )
#include <stdio.h>
int main(int argc, char *argv[]) {
int num;
num=(5,6);
printf("%d\n",num);
return 0;
}
注意: 逗号运算符的结果是,后边表达式的结果
注意: 逗号运算符的优先级最低
运算符总结:
运算符不仅有优先级还有结合型
2+3+9+10 左结合性
a=b=c=d=100 右结合性
优先级高的先于优先级低的先运算。
3+4*7
优先级一样的按结合性来运算
左结合性 从左往右运算
右结合性 从右往左运算
优先级表
优先级别 | 运算符 | 运算形式 | 结合方向 | 名称或含义 |
---|---|---|---|---|
1 | () [] . -> | (e) a[e] x.y p->x | 从左到右 | 圆括号 数组下标 成员运算符 用指针访问成员的指向运算符 |
2 | - + ++ - - ! ~ (t) * & sizeof | -e ++x 或 x++ !e ~e (t)e *p &e sizeof(e) | 从右到左 | 负号或正号 自增运算或自减运算 逻辑非 按位取反 类型转换 指针运算,由地址求内容 求某变量的地址 求某类型变量的长度 |
3 | * / % | e1*e2 | 从左到右 | 乘,除,取余 |
4 | + - | e1+e2 | 从左到右 | 加 减 |
5 | << >> | e1<<e2 | 从左到右 | 左移右移 |
6 | < <= > >= | e1 < e2 | 从左到右 | 关系运算符 |
7 | == != | e1 == e2 | 从左到右 | 等于,不等于 |
8 | & | e1&e2 | 从左到右 | 按位于 |
9 | ^ | e1 ^ e2 | 从左到右 | 按位异或 |
10 | | | e1 | e2 | 从左到右 | 按位或 |
11 | && | e1 && e2 | 从左到右 | 逻辑与 |
12 | | | | e1 | | e2 | 从右到左 | 逻辑或 |
13 | ? : | e1 ? e2 : e3 | 从右到左 | 条件运算符 |
14 | = += -= *= /= %= >>= <<= &= ^= |= | x = e x + = e | 从左到右 | 赋值运算符 符合赋值运算符 |
15 | , | e1, e2 | 从左到右 | 顺序求值运算 |
优先级例程
#include <stdio.h>
int main()
{
int i=3;
int num;
num=i++;
printf("num=%d,i=%d\n",num,i); //num=3 ,i=4
return 0;
}
++i 先加 ,后用
#include <stdio.h>
int main()
{
int i=3;
int num;
num=++i;
printf("num=%d,i=%d\n",num,i);//num=4,i=4
return 0;
}
优先级举例
#include <stdio.h>
int main( ) {
int i=3;
int num;
num = (i++)+(i++)+(i++);
printf("num=%d\n",num);
return 0;
}
#include <stdio.h>
int main( ) {
int i=3;
int num;
num = (++i)+(++i)+(++i);
printf("num=%d\n",num);
return 0;
}
结语
非常感谢您能看到这里,下一次是条件控制语句与循环控制语句