C语言: 操作符详解

目录

操作符主要分为:

1、算术操作符

2、移位操作符

3、位操作符

4、赋值操作符

 5、单目操作符

 6、关系操作符

7、逻辑操作符

8、条件操作符

9、逗号表达式

10、下表引用、函数调用和结构成员



C语言: 操作符详解_第1张图片

 

操作符主要分为:

算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下表引用、函数调用和结构成员
 

1、算术操作符

+    -    *    /    %
加 减   乘  除  取余
用法:
1、除了%之外,其他几个操作符能用作整数和浮点数。%只能用于整数
2、对于/操作符,如果两个操作数都是整数,那就是整数运算。如果有浮点数,那就是进行浮点数除法。
3、%得到的是整除之后的余数。 例如:5%2的值为1。

2、移位操作符

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

 

左移操作符的移位规则:左边的抛弃、右边的空位由0补足。

C语言: 操作符详解_第2张图片

 右移操作符的移位规则分为两种:

1、逻辑移位:左边空位用0补足,右边的直接丢弃。

2、算术移位:左边用符号补足,右边的直接丢弃。

警告:对于移位运算符,不要移动负数位,这个是标准未定义的。

  C语言: 操作符详解_第3张图片

 

3、位操作符

&  --按位与        |  --按位或    ^  --按位异或

按位与是两个二进制代码如果对应位上的数字都为1,那么得1,否就得0。

按位或是两个二进制代码如果对应位上的数字有一个为1,那么得1,否则得0。

按位异或是两个二进制代码如果互不相同,那么得1,否则得0。

C语言: 操作符详解_第4张图片

 这道题中b最后和a的数值是互换了,因为a^a^b=b , b^b^a=a。两个相同的数字异或是0

 

4、赋值操作符

我们通常用=号来给变量赋值。

复合赋值符:

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

 5、单目操作符

!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof      操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
*           间接访问操作符(解引用操作符)
(类型)       强制类型转换

值得一提的是,++和--符分为前置和后置,前置是先使用后操作,后置是先操作后使用。

例如:

int a=10;
int b=a++;
printf("%d %d\n",a,b);

这其中打印的b的值为10,而a为11

就是因为在先使用了a赋值给b再实现自增。

强制类型转换()的使用方法:

这样得到的a是3

 

 6、关系操作符

>
>=
<
<=
!=       用于测试不相等
==      用于测试相等

  

注意:很多人在比较的时候容易将“==”打成“=”,这样就由比较变成赋值了,是一个比较容易犯的错误。

 

7、逻辑操作符

&&  --逻辑与                 ||  --逻辑或           

360曾经的一道笔试题

C语言: 操作符详解_第5张图片输出的结果是1  2 3 4和 1 3 3 4

因为逻辑与在从左向右判断的时候碰到假项后就不再执行。

逻辑后则是再判断的时候碰到真项之后就不再判断。              

 

8、条件操作符

exp1 ? exp2 : exp3

如果表达式1成立那么实现表达式2,否则实现表达式3。

  

9、逗号表达式

exp1, exp2, exp3, …expN

从左向右执行

 

10、下表引用、函数调用和结构成员

1、下标引用操作符 [ ]

操作数:一个数组名 + 一个索引值
int arr[10];//创建数组
 arr[9] = 10;//实用下标引用操作符。
 [ ]的两个操作数是arr和9。

数组名传的是第一个下标,所以

C语言: 操作符详解_第6张图片

上面两行打印效果相同,都是打印了同一个地址

C语言: 操作符详解_第7张图片

 上面的效果也相同,都是打印了同一个元素。

 

  

函数操作符()

在函数名之后

#include 
 void test1()
 {
 printf("hehe\n");
 }
 void test2(const char *str)
 {
 printf("%s\n", str);
 }
 int main()
 {
 test1();            //实用()作为函数调用操作符。
 test2("hello bit.");//实用()作为函数调用操作符。
 return 0;
 }

 

 

结构成员访问

. 结构体.成员名
-> 结构体指针->成员名
#include 
struct Stu
{
 char name[10];
 int age;
 char sex[5];
 double score; };
void set_age1(struct Stu stu) {
 stu.age = 18; }
void set_age2(struct Stu* pStu) {
 pStu->age = 18;//结构成员访问
}
int main()
{
 struct Stu stu;
 struct Stu* pStu = &stu;//结构成员访问
 
 stu.age = 20;//结构成员访问
 set_age1(stu);
 
 pStu->age = 20;//结构成员访问
 set_age2(pStu);
 return 0; }

你可能感兴趣的:(C语言,后端,开发语言,c语言)