操作符分为算术操作符、移位操作符、位操作符、赋值操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式以及下标引用、函数调用和结构成员。下面进行逐个介绍:
1.算数操作符
+ - *
/:算术除法(只要有一个数是浮点数,结果必是浮点数)
%:算术取余(只用来求两个整数之间的余数,不可作用于整数和浮点数)
2.移位操作符(移动的是二进制位,不要移动负数位)
<< :左移操作符(左边抛弃,右边不零)
>> :右移操作符算术右移(右边丢弃,左边补符号位)
逻辑右移(右边丢弃,左边补零)
例1:
//#include<stdio.h>
//#include<stdlib.h>//int main()
//{
// int n = -1;
// //10000000000000000000000000000001源码
// //11111111111111111111111111111110反码
// //11111111111111111111111111111111补码
// //左移
// //11111111111111111111111111111110左移1
// //10000000000000000000000000000001取反
// //10000000000000000000000000000010补码
// //右移
// //11111111111111111111111111111111
// //10000000000000000000000000000000
// //10000000000000000000000000000001
//例2:
// int n=10;
// int m = n << 1;//向左一位// printf("%d %d\n", n, m);//10 20(1010,10100)
// system("pause");
// return 0;
//}
例:3:计算二进制数中1的个数?
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num;
printf("Please input a number:");
scanf("%d", &num);
int count = 0;
//方法1:
while (num)
{
if (num % 2 == 1) //测试:对2取余是否正确
{
count++; //正确则计数
}
num = num / 2; //按二进制循环
}
//方法2:可计算负二进制数中1的个数
for (int i = 0; i < 32; i++)
{
if (((num >> 1) & 1) == 1) //判断二进制数按位右移,和1相与是否正确
{
count++;
}
}
//方法3::更高效
while (num)
{
count++;//计数
num = num&(num - 1); //判断num和num-1按二进制位与是否正确(即是否都为1),正确则继续循环
}
printf("1的个数为%d\n", count);
system("pause");
return 0;
}
他们的操作数必须为整数:
&(按(二进制)位与)
|(按(二进制)位或)
^(按(二进制)位异或)
{a=a^b;b=a^b;a=a^b} //可实现a、b交换
4.赋值操作符
=(最好不要连续赋值,看起来比较乱)
复合操作符:
+=,-=,*=,/=,>>=,<<=,%=,&=,|=
5.单目操作符
!(逻辑反操作),~(按二进制位取反),+(正值),-(负值),
&(取地址)&arr数组名是首元素&arr[0]的地址,&arr是数组的地址
sizeof(操作数的类型长度(以字节为单位))
写法:sizeof(a) sizeof a;
sizeof(int) sizeof int; //sizeof 为操作符可以不带括号
对于数组:sizeof(arr):计算整个数组arr的大小;sizeof(arr[0])为计算首元素的大小;
注意:sizeof内部表达式不参与运算;
++,--(自增,自减)
a++,a--:表示先使用,后自增(减);
++a,--a:表示先自增(减),后使用;
*(间接访问(解引用操作符))
例如指针: int *p=&a;
(类型)(强制类型转换)
例如: (int)a:将a转换我I整型;
6.关系操作符
> < >= <= !=(测试不相等) ==(测试相等)
7.逻辑操作符
&&(逻辑与) ||(逻辑或)
8.条件操作符
例如:a > b ? c : d
9.逗号表达式
(ex1,ex2,……exN)(逗号隔开,逐步计算,输出值取最后一个表达式的结果)
10.下标引用、函数调用和结构成员
1、[ ]:一个数组名+一个索引值
int arr[10];arr[9]=10;
2、():函数调用操作符(接受一个或多个操作符)
3、访问一个结构的成员
.结构体.成员名
->结构体指针->成员名
例如:
struct Stu //前加typedef可将类型重命名
{
char name[20];
int age;
char sex;
}//这里加重命名后的名字 ;(分号不可丢)
int main()
{
struct Stu S; //创建S,申请内存空间
strcpy(S.name, "Lida"); //将数据拷贝到空间中
strcpy(S.sex, "female");
//指针
struct Stu* ps = &S;
(*ps).age = 20;
strcpy((*ps).name, "koko");
strcpy(ps->name, "haha"); //->指针指向name空间,将数据拷贝进去
}