重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
前面我们对C语言的一维数组、二维数组的有了一定的了解,今天带大家了解C语言中的操作符。
我们先来看看操作符都有那些>
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
我们来逐个探讨探讨>
操作符详解 算术操作符+ - * / %
%
操作符之外,其他的几个操作符可以作用于整数和浮点数。/
操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。%
操作符的两个操作数必须为整数。返回的是整除之后的余数。我们来用代码演示一下>
#includeint main()
{//+ - * / %
int a = 4;
int b = 2;
printf("%d\n", a + b);
printf("%d\n", a - b);
printf("%d\n", a * b);
printf("%d\n", a / b);
printf("%d\n", a % b);
return 0;
}
移位操作符移(2进制)位操作符(整数)
<<
左移操作符>>
右移操作符
注:移位操作符的操作数只能是整数。
补充>
2进制:
整数的2进制表示形式,其实有三种
原码
反码
补码
内存中存储的其实是:补码的二进制
所以在参与移位的时候,移动的都是补码
eg:
12-数值
2进制:1100
8进制:14
10进制:12
16进制:c
int main()
{//按照一个属的正负,直接写出它的二进制表示形式得到的就是原码
//正数
//正数的原码、反码、补码是相同的
//负数的原码、反码、补码要经过计算
//反码是符号位不变,其他未按位取反,就是反码
// 补码是反码+1
//整形占4个字节(32bit)
//00000000000000000000000000001010-原码
//00000000000000000000000000001010-反码
//00000000000000000000000000001010-补码
int a = 10;
//10000000000000000000000000001010-原码
//11111111111111111111111111110101-反码
//11111111111111111111111111110110-补码
int b = -10;
return 0;
}
原、反、补的计算方法
移位规则:
左边抛弃、右边补0
int main()
{int a = 10;
int b = a<< 1;
//00000000000000000000000000001010-补码
printf("%d\n", b);
printf("%d\n", a);
return 0;
}
再举一个负数的案例
int main()
{int a = -10;
//10000000000000000000000000001010
//11111111111111111111111111110101
//11111111111111111111111111110110-补码
int b = a<< 1;
printf("b=%d\n", b);//-20
printf("a=%d\n", a);//-10
return 0;
}
我们可以发现左移一次反有一个*2
的效果。
移位规则:
首先右移运算分两种:
- 逻辑移位
左边用0填充,右边丢弃- 算术移位 (平常见到)
左边用原该值的符号位填充,右边丢弃
int main()
{int a = -1;
//10000000000000000000000000000001
//11111111111111111111111111111110
//11111111111111111111111111111111
int b = a >>1;
printf("b=%d\n", b);
printf("a=%d\n", a);
return 0;
}
那在编译器中到底是算术右移还是逻辑右移呢,两者区别是左边补的符号位不同,假如结果跟原来的符号相同,那么就是算术右移,反之就是逻辑右移。
我们来看看运行结果>
很显然在我们vs编译器中是算术右移。警告⚠
:
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num>>-1;//error
位操作符位操作符有:
& //按位与
| //按位或
^ //按位异或
//注:他们的操作数必须是整数。
这些操作符也是对二进制进行操作的&
操作符
int main()
{int a = 3;
//00000000000000000000000000000011
int b = -5;
//10000000000000000000000000000101
//11111111111111111111111111111010
//11111111111111111111111111111011-补码
int c = a & b;
//00000000000000000000000000000011
//11111111111111111111111111111011
//00000000000000000000000000000011
printf("%d\n", c);//3
return 0;
}
|
操作符
int main()
{int a = 3;
//00000000000000000000000000000011
int b = -5;
//10000000000000000000000000000101
//11111111111111111111111111111010
//11111111111111111111111111111011-补码
int c = a | b;
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111011
printf("%d\n", c);//-5
return 0;
}
对应的二进制位有1则为1,两个同时为0则为0^
操作符
//对应的二进制位:相同为0,相异为1
int main()
{int a = 3;
//00000000000000000000000000000011
int b = -5;
//10000000000000000000000000000101
//11111111111111111111111111111010
//11111111111111111111111111111011-补码
int c = a ^ b;
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111000
printf("%d\n", c);//-8
return 0;
}
对应的二进制位:相同为0,相异为1
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。
复合赋值符
+=
-=
*=
/=
%=>>=
<<=
&=
|=
^=
这些运算符都可以写成复合的效果。
比如:
int x = 10;
x = x+10;
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁。
小结今天我们学习了算术操作符、移位操作符、位操作符、赋值操作符,相信大家看完有一定的收获。
种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波~~~,本文中也有不足之处,欢迎各位随时私信点评指正!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧