目录
算术操作符
+ - * / %
1.除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2.对于 / 操作符如果两个操作数都是整数运算时执行整数除法,则运算结果为整型数据(即若为小数时,只取整数部分),而只要有浮点数执行的就是浮点数除法,运算结果为浮点型数据。
3.%操作符的两个操作数必须为整数,运算结果是整除之后的余数。
移位操作符(移的是二进制位)
<< 左移操作符
>> 右移操作符
1.移位操作符的操作符只能是整数。
左移操作符
移位规则:左边抛弃、右边补0
#include <stdio.h>
int main()
{
int x , y = 0;
scanf("%d", &x); //18
//00000000 00000000 00000000 00010010 x在内存中的二进制
// 0000000 00000000 00000000 000100100 x左移一位产生的结果
//36 对应的十进制数字
y = x << 1;
printf("%d", y);
return 0;
}
右移操作符
移位规则:
1.算术右移:右边丢弃,左边补原符号位
2.逻辑右移:右边丢弃,左边补0
(通常见到的都是算术右移,大家可以在自己编译器上试一下看是哪种右移方式)
#include <stdio.h>
int main()
{
int x , y = 0;
scanf("%d", &x); //-18
//00000000 00000000 00000000 00010010 x在内存中的二进制
// 100000000 00000000 00000000 0001001 x右移一位产生的结果 算术右移 负数符号位为1
//-9 对应的十进制数字
// 000000000 00000000 00000000 0001001 逻辑右移 右边丢弃,左边补0
//9 对应的十进制数字
y = x >> 1;
printf("%d", y);
//我的这个编译器输出结果为-9,该编译器右移方式是算术右移
return 0;
}
位操作符(二进制位)
& 按位与 (有假即假,有0即0,全1为1)
| 按位或 (有真即真,有1即1,全0为0)
^ 按位异或 (对应二进制位相同,异或结果为0;对应的二进制位相异,异或结果为1)
1.他们的操作数必须是整数。
#include <stdio.h>
int main()
{
int a = 21;
int b = 5;
//a 00000000 00000000 00000000 00010101
//b 00000000 00000000 00000000 00000101
//a&b 00000000 00000000 00000000 00000101 5
//a 00000000 00000000 00000000 00010101
//b 00000000 00000000 00000000 00000101
//a|b 00000000 00000000 00000000 00010101 21
//a 00000000 00000000 00000000 00010101
//b 00000000 00000000 00000000 00000101
//a^b 00000000 00000000 00000000 00010000 16
int c, d, e;
c = a & b;
d = a | b;
e = a ^ b;
printf("a&b=%d\n", c);
printf("a|b=%d\n", d);
printf("a^b=%d\n", e);
return 0;
}
相关例题:
1.不引入第三个变量,实现两个整数的交换
#include <stdio.h>
int main()
{
int a = 21;
int b = 5;
printf("交换前:a=%d b=%d\n", a, b);
//a 00000000 00000000 00000000 00010101
//b 00000000 00000000 00000000 00000101
//a^b 00000000 00000000 00000000 00010000 16 c
//c 00000000 00000000 00000000 00010000
//b 00000000 00000000 00000000 00000101
//c^b 00000000 00000000 00000000 00010101 21 a
//c 00000000 00000000 00000000 00010000
//a 00000000 00000000 00000000 00010101
//c^a 00000000 00000000 00000000 00000101 5 b
a = a ^ b; //c
b = a ^ b; //a
a = a ^ b; //b
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
2.编写代码实现:求一个整数存储在内存中的二进制中1的个数
整数存储在内存中的二进制中1的个数,也就是所对应补码的1的个数
#include <stdio.h>
int main()
{
int num=0;
int count = 0;
scanf("%d", &num);//26
//00000000 00000000 00000000 00011010
int i = 0;
//32个bit位
//num&1==1 则最后一位数为1;num&1==0 则最后一位数为0;
for (i = 0; i < 32; i++)
{
//num = num >> i; 这样写不行,这样改变了num 的数,下一次for循环时的num就不是原来输入的数字了
if (((num>>i) & 1) == 1)
{
count++;
}
}
printf("%d\n", count);//3
return 0;
}
赋值操作符
=
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
这些很容易理解,就不过多阐述了。
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位) 即变量空间的大小
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
1.前置++,--
a++(--):先使用a的值之后,再对a进行++(--);
++(--)a:先对a进行++(--)之后,再使用++(--)之后的a;
2.! 逻辑反操作
例:43
!(43)=0;
!0=1;
关系操作符
>
>=
<
<=
!=
==
逻辑操作符
&& 逻辑与
|| 逻辑或
1.区分逻辑与和按位(二进制位)与
1&2 --------> 0
00000001&00000010 --------> 00000000
1&&2 --------> 1
2.区分逻辑或和按位(二进制位)或
1|2 --------> 3
00000001|00000010 --------> 00000011
1||2 --------> 1
3.逻辑运算的短路特性: (表达式1)&&(表达式2) 如果表达式1为假,则表达式2不会进行运算,即表达 式2“被短路” (表达式1)||(表达式2) 如果表达式1为真,则表达式2不会进行运算,即表达式2“被短路”.
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
//i = a++ && ++b && d++; //有0即0
//此处只运行了a++=0(直接可以得到最终的结果0,所以后边的++b,d++都未运行)
// a=1
i = a++||++b||d++; //有1即1
//a++=0,++b=3;程序只进行到这里,有非0数,则最终结果必为1;后边直接不用计算
//a=1,b=3
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
条件操作符
exp1 ? exp2 : exp3
1.exp1成立,取exp2,否则取exp3。
逗号表达式
exp1,exp2,exp3,...expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
//(0,12,12,13)
printf("%d\n", c);//13
return 0;
}
下标引用、函数调用和结构成员
1.[ ] 下标引用操作符
操作数:一个数组名+一个索引值
int arr[10];
arr[9]=10;
[ ]的两个操作数是arr和9
2.()函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3. 访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
两个相邻的操作符先运算哪个,取决于他们的优先级。