【操作符的分类】

操作符的分类

1 算术操作符

2 移位操作符

3 位操作符

4 赋值操作符

5.复合操作符

6 单目操作符

7 关系操作符

8逻辑操作符

9 条件操作符

10 逗号操作符

11下标引用、函数调用和结构成员

各种操作符的介绍

1.算术操作符

算术操作符有五个,+    -     *    /   %

除了%以外的其他四个,都可作用于整数和浮点数,只要有一个数是浮点型,就执行浮点型的加减乘除。%只能作用于浮点数,两个数必须均为整数。

2.移位操作符

<<  左移操作符
>>  右移操作符

左移操作符的具体用法

int num = -1;
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
左移一位,左边丢弃,右边补0
左移:11111111 11111111 11111111 11111110
减一再取反就能得到原码
减一:11111111 11111111 11111111 11111101
取反:10000000 00000000 00000000 00000010
能得出取反后的十进制数字为-2
所以,-1左移一位后为-2,是原来的二倍

右移操作符的具体用法

int num = -1;
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
在这里介绍一下,右移操作符分为算术右移和逻辑右移
算术右移是右边丢弃,左边补原符号位
逻辑右移是右边丢弃左边补0,下面演示的是算术右移
减一:11111111 11111111 11111111 11111110
取反:10000000 00000000 00000000 00000001
所以,-1算术右移一位后为-1,没有发生变化

3.位操作符

&    按位与:有0出0,同时为1出1
|   按位或:有1出1,同时为0出0
^   按位异或:相同为0,相异为1
举个栗子:
1的补码:00000000 00000000 00000000 00000001
-2的原码:10000000 00000000 00000000 00000010
-2的反码:10000000 00000000 00000000 00000011
-2的补码:11111111 11111111 11111111 11111100
1&-2为: 00000000 00000000 00000000 00000000 全零
1 | -2为: 11111111 11111111 11111111 11111111 全一
1 ^ -2为: 11111111 11111111 11111111 11111111 全一

4.赋值操作符

a = 10;把10赋值给a
赋值操作符是最基本的语句,刚开始接触编程时都会遇到。
看下面一个例子:
a = x = y + 1;
这样的连续赋值是正确的,从右向左赋值,不过在我们写代码时要尽量避免这样写因为这样会增加阅读障碍。另外强调一点的是在 = 的左右两端最好都加上空格,这样看起来更美观,详情请参考《高质量c c++编程》

5复合赋值符

+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=

这些运算符都可以写成复合的效果

6.单目操作符

!   逻辑反操作
-   负值
+   正值
&   取地址
sizeof  操作符的类型长度(以字节为单位)
~   对一个数的二进制位按位取反
--  前置(后置)--
++  前置(后置)++
*   间接访问操作符(解引用操作符)
(类型)强制类型转换
具体讲解:
+  正值,一般都省略掉
&  取地址,目前所见的代码中,scanf中用到了 scanf(“%d”,&a);
sizeof 
下面讲一下sizeof和数组
1. sizeof(数组名)——数组名表示整个数组,sizeof(数组名)求的是整个数组的大小,单位是字节
2. &数组名——数组名也表示整个数组,所以&数组名,取出的是整个数组的地址
3. 除此之外,所有遇到的数组名都是首元素地址。

7.关系操作符

>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”`

在关系运算符中,要细心一些,注意== 和= 运用的场合

8.逻辑操作符

&& 逻辑与:有一个为假全为假,两个同时为真才是真
||逻辑或:有一个是真就为真,两个同时为假才为假
注意:
逻辑与和按位与
逻辑或和按位或

9.条件操作符

exp1 ? exp2 : exp3
举个栗子:

if(a >5)
      b = 3;
else
      b = -3;`

如果要转换成条件表达式则为:int max = (a>5) ?(3) : (-3)

10逗号表达式

exp1, exp2, exp3, … expn
逗号表达式就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行,最后一个表达式的结果就是整个表达式的结果

11下标引用、函数调用和结构成员

1.下标引用[ ]
int arr[10]//创建数组
arr[9] = 10;
[ ]的两个操作数是arr和9
2.( )函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩下的操作数就是传递给函数的参数

#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)//*str与test2中的字符串对应
{
printf("%s\n",str);
}
int main()
{
test1();//使用()作为函数调用操作符,注意函数调用后有‘;’
test2("hello  world");
return 0;
}

3.访问一个结构的成员

#include <stdio.h>
struct Stu
{
char name[20];
short int age;
char id[15];
char sex[6];
};//创建一个结构体类型,不占用内存空间
int main()
{
struct Stu s;//通过前面的类型创建了s这个变量
strcpy(s.name,"张三");//s.name是一个地址
s.age = 20;
strcpy(s.sex,"男");
printf("%s\n",s.name);
printf("%d\n",s.age);
printf("%s\n",s.sex);
return 0;
}

结构体指针->成员名

void test(struct Stu *ps)//传址时,以指针接收
{
strcpy((*ps).name,"李四");//可以写成strcpy(ps->name,"李四");
(*ps).age = 30;//可以写成ps->age = 30;
}
int main()
{
struct Stu s;
test (&s);//有时只拿到了s的地址,传参时只能传址
printf("%s\n",s.name);
printf("%d\n",s.age);
}

猜你喜欢

转载自blog.csdn.net/zhang_ting0020/article/details/80093427