目录
一.常见运算符及分类
算数运算符 | + - * / % |
关系运算符 | < == > <= >= != |
位运算符 | << >> & | ^ ~ |
赋值运算符 | = += -= *= /= %= &= |
单目运算符 | ! - + &(取地址)~ -- ++ *(解引用) (类型)强制转换类型 |
逻辑运算符 | && || |
条件运算符 | ? : |
逗号运算符 | , |
二.运算符详解
1.算数运算符
+ - * / %
其中,/运算符两边的操作数如果是整数,执行整数运算。如果要计算出小数结果,两边操作数至少有一个为浮点数
%运算符,就是取模(取余),计算出的结果是整除后的余数
除了 % 运算符,其他的几个运算符可以作用于整数和浮点数
int main()
{
int ret = 10 / 3;
double ret2 = 10 / 3.0;
double ret3 = 2 * 2.0;
printf("%d\n", ret);
printf("%.5f\n", ret2);
printf("%.5f\n", ret3);
return 0;
}
3
3.33333
4.00000
2. 关系运算符
< == > <= >= !=
首先,容易混淆的是==和=运算符,我们要记住==是用来判断是否相等,而=是用来赋值
*比较两个字符串是否相同应该用strcmp()函数,而不是用==
strcmp()的原型
int strcmp ( const char * str1, const char * str2 )
其中,str1 是要进行比较的第一个字符串,str2 是要进行比较的第二个字符串
在比较时,实际上是按 ASCII 值大小进行比较
当返回值小于 0,表示 str1 小于 str2,当返回值大于 0,表示 str1 大于 str2,当返回值等于 0,则表示 str1 等于 str2
3. 位运算符
<< >> & | ^ ~
移位运算符的操作数只能是整数,都以二进制形式运算
<< 左移运算符
>> 右移运算符
& 按位与 对应位有0,结果为0。两个1,结果为1
| 按位或 对应位有1,结果为1。两个0,结果为0
^ 按位异或 相同时为0,相异为0
^ 按位取反 对一个数的二进制按位取反,包括符号位
3.1 左移运算符
移位原则: 无论算数左移还是逻辑左移,都是左边舍弃,右边缺多少补多少个0
3.2 右移运算符
右移运算符分为逻辑右移和算数右移
移位原则: 逻辑右移时, 左边用0填充,右边舍弃 。算术右移时,左边用原该值的符号位填充,右边舍弃
3.3 按位与
& 对应位有0,结果为0。两个1,结果为1
如,12 & 10 = 8 ,12的二进制为0000 1100,10的二进制为0000 1010,两个数相与结果为0000 1000,对应的就是8
3.4 按位或
| 对应位有1,结果为1。两个0,结果为0
如,12 | 10 = 14,0000 1100 | 0000 1010 = 0000 1110
3.5 按位异或
^ 相同时为0,相异为0
如,12 ^ 10 = 6, 0000 1100 ^ 0000 1010 = 0000 0110。1 ^ 1=0 , 0 ^ 1=1。
我们可以总结出两个规律:
1. a^a=0
2.a^0=a
还有一道经典的练习:
不创建临时变量(第三个变量),实现两个数的交换
不创建临时变量(第三个变量),也可以理解为不多占用内存空间
#include<stdio.h>
int main()
{
int a = 12;
int b = 23;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d\nb = %d\n", a, b);
return 0;
}
这里,a=a^b;b=a^b;那么可以得到 b=a^b^b,即b=a^0,可以得到b=a。a=a^b等价于a=a^a^b,即a=0^b,可得a=b。这样就完成了一次交换
缺点就是代码的可读性差
3.6 按位取反
~ 对一个数的二进制按位取反,包括符号位
当a=-1时,~a=0
原码 | 1000 0001 |
反码 | 1111 1110 |
补码 | 1111 1111 |
4.赋值运算符
= += -= *= /= %= &=
+= | a+=b等价于a=a+b |
-= | a-=b等价于a=a-b |
*= | a*=b等价于a=a*b |
/= | a/=b等价于a=a/b |
%= | a%=b等价于a=a%b |
&= | a&=b等价于a=a&b |
意思就是这个意思了,这些运算符用起来会简化表达,看起来更加简洁
5. 单目运算符
! - + &(取地址)~ -- ++ *(解引用) (类型)强制转换类型
!运算符常用于判断语句中,值得一提的是在c语言中,0表示假,!0表示真。c语言的逻辑运算值是0或1,0表示假,1表示真 ,非0值也表示为1
&运算符与*(解引用)运算符常常一起出现,&用于取出地址,*用于解引用
int main()
{
int a = 12;
int* pa = &a;
*pa =23;//解引用
printf("%d\n", a);
return 0;
}
打印结果就是23
++ --是自增自减,可前置可后置,区别是前置时先 增/减 后使用
类型)强制转换类型
例如:
int main()
{
float a = 9.9;
int b = 0;
b = (int)a;
printf("%d\n", b);
return 0;
}
6. 逻辑运算符
&& ||
&&为逻辑与运算符,||逻辑或运算符
运用这两个逻辑运算符能优化代码
如,解决闰年问题时
int main()
{
int year = 0;
for (year = 1000; year <= 2000; year+=4)
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{
printf("%d ", year);
}
}
return 0;
}
7. 条件运算符
? : 表达式1?表达式2:表达式3。意思是如果表达式1为真,就执行表达式2,否则就执行表达式3。就不用判断语句
简单举一个例子:
int main()
{
int a = 22;
int b = 33;
printf("max=%d", a > b ? a : b);
return 0;
}
结果为:max=33
8.逗号运算符
c语言中,我们把用 ,(运算符)连接起来的表达式叫做逗号表达式
如 表达式1,表达式2 其中逗号表达式的值为表达式2的值
int main()
{
int a = 5;
int b = (a+10, a + 5);
printf("%d\n", b);
return 0;
}
结果为 10
三.运算符的优先级
大致的优先级:
算数运算符>关系运算符>赋值运算符
其中,同一的优先级的运算符,运算时的顺序由结合方向决定
这次关于c语言运算符的内容就分享到这里了,若有补充或者发现错误,欢迎评论私信交流!
over