c语言操作符汇总及其运用

目录

文章目录

前言

一、操作符的分类

二、操作符的具体用法

1.算术操作符

2.移位操作符

3.位操作符:

4.赋值操作符:

5.单目操作符:

6.关系操作符:

7.逻辑操作符:

8.条件操作符:

9.逗号表达式:

10.下标引用:

11.函数调用:

12.结构成员访问:

总结


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这里是一篇关于c语言操作符的分类汇总及其如何运用的文章,希望对读者有一定的帮助作用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、操作符的分类

算术操作符:+ 、-、*、/、%

移位操作符:<<、>>

位操作符:&、|、^

赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=

单目操作符:!、++、--、&、*、+、-、~、sizeof、(类型)

关系操作符:>、<、>=、<=、==、!=

逻辑操作符:&&、||

条件操作符:exp1?exp2:exp3

逗号表达式:exp1,exp2,exp3,...expn

下标引用:[ ]

函数调用:()

结构成员访问:. 、—>

二、操作符的具体用法

1.算术操作符

符号解释:

‘+’ 用于整数及浮点数之间的加法运算

‘-’ 用于整数及浮点数之间的减法运算

‘*’ 用于整数及浮点数之间的乘法运算

‘/’ 用于整数及浮点数之间的除法运算(当使用该运算符时,如果两个操作数均为整数,则计算结果也应该为整数,如果其中一个操作数为浮点数,则计算结果也应该是浮点数

‘%’ 用于返回两个整数相除得到的余数(该运算符只能用于两个整数之间相除

2.移位操作符

<< 左移操作符
移位规则:左边抛弃、右边补0
#include <stdio.h>
int main()
{
 int num = 10;
 int n = num>>1;
 printf("n= %d\n", n);
 printf("num= %d\n", num);
 return 0;
}

左移操作符演示:

int num=10;
00001010

   num的2进制表示

00010100
   num<<1的结果,但是num的值是不变的
>> 右移操作符
移位规则:首先右移运算分两种:
  1. 逻辑右移:左边用0填充,右边丢弃
  2. 算术右移:左边用该值的符号位填充,右边丢弃
#include <stdio.h>
int main()
{
 int num = 10;
 int n = num>>1;
 printf("n= %d\n", n);
 printf("num= %d\n", num);
 return 0;
}

逻辑右移1位演示:

int num=-1;
11111111

   num的2进制表示(内存中补码)

01111111
   num<<1的结果

算术右移1位演示:

int num=-1;
11111111

   num的2进制表示(内存中补码)

11111111
   num<<1的结果

注意:

  1. 移位操作符的操作数只能是整数。
  2. 对于移位操作符,不要移动负数位,这个是标准未定义的。

3.位操作符:

符号解释:

“&”按位与(有0出0)

“|”按位或(有1出1)

“^”按位异或(相同为0,相异为1)

4.赋值操作符:

“=”(进行简单赋值操作)

比如:

int x =3;

x=10;

+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=(进行复合赋值操作)

比如:

int x=3;

x+=5;

其他复合赋值符用法相同,不再一一列举。

5.单目操作符:

!(逻辑反操作)

++(前置、后置++)

--(前置、后置--)

&(取地址)

*(解引用)

+(正值)

-(负值)

~(对一个数的二进制数码按位取反)

sizeof(操作数的类型长度,单位是字节)

(类型)(强制类型转换)

6.关系操作符:

>(判断大于)

<(判断小于)

>=(判断大于等于)

<=(判断小于等于)

==(判断等于)

!=(判断不等于)

7.逻辑操作符:

&&(逻辑与操作:只要有一个表达式为假则为假,不再执行后面的表达式)

||(逻辑或操作:只要有一个表达式为真则为真,不再执行后面的表达式)

8.条件操作符:

exp1?exp2:exp3

三目表达式,若表达式exp1为真,则返回表达式exp2,负责返回表达式exp3

9.逗号表达式:

逗号表达式,就是⽤逗号隔开的多个表达式。逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果

//代码1 
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式 
c是多少?//c=b=13
//代码2 
if (a =b + 1, c=a /2, d > 0)
//代码3 
a = get_val();
count_val(a);
while (a > 0)
{
 //业务处理 
 a = get_val();
 count_val(a);
}
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
 //业务处理 
}

10.下标引用:

[ ](下表引用操作符)

操作数:一个数组名+一个索引值

int arr[10];//创建数组 
arr[9] = 10;//实⽤下标引⽤操作符。 
[]的两个操作数是arr和9。

11.函数调用:

“()”接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。

#include <stdio.h>
void test1()
{
 printf("hehe\n");
}
void test2(const char *str)
{
 printf("%s\n", str);
}
int main()
{
 test1();//这⾥的()就是作为函数调⽤操作符。 
 test2("hello word.");//这⾥的()就是函数调⽤操作符。 
 return 0;
}

12.结构成员访问:

结构体:C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类 型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问 题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。

结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚⾄是其他结构体。

结构体的声明:

struct tag
{
 member-list;
}variable-list;

描述一个学生:

struct Stu
{
 char name[20];//名字 
 int age;//年龄 
 char sex[5];//性别 
 char id[20];//学号 
};//分号不能丢 

结构体变量的定义和初始化:

//代码1:变量的定义 
struct Point
{
 int x;
 int y;
}p1; //声明类型的同时定义变量p1 
struct Point p2; //定义结构体变量p2 
//代码2:初始化。 
struct Point p3 = {10, 20};
struct Stu //类型声明
{
 char name[15];//名字 
 int age; //年龄 
};
struct Stu s1 = {"zhangsan", 20};//初始化 
struct Stu s2 = {.age=20, .name="lisi"};//指定顺序初始化 
//代码3 
struct Node
{
 int data;
 struct Point p;
 struct Node* next; 
}n1 = {10,{4,5}, NULL};//结构体嵌套初始化 
struct Node n2 = {20,{5,6}, NULL};//结构体嵌套初始化

结构成员访问操作符:

结构体成员的直接访问:

结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数,如下所示:

#include <stdio.h>
struct Point
{
 int x;
 int y;
}p = {1,2};
int main()
{
 printf("x: %d y: %d\n", p.x, p.y);
 return 0;
}

使用方式:结构体变量 成员名

结构体成员的间接访问

有时候我们得到的不是一个结构体变量,而是得到了一个指向结构体的指针。如下所示:

#include <stdio.h>
struct Point
{
 int x;
 int y;
};
int main()
{
 struct Point p = {3, 4};
 struct Point *ptr = &p;
 ptr->x = 10;
 ptr->y = 20;
 printf("x = %d y = %d\n", ptr->x, ptr->y);
 return 0;
}

使用方式:结构体指针->成员名

综合举例:

#include <stdio.h>
#include <string.h>
struct Stu
{
 char name[15];//名字 
 int age;//年龄 
};
void print_stu(struct Stu s)
{
 printf("%s %d\n", s.name, s.age);
}
void set_stu(struct Stu* ps)
{
 strcpy(ps->name,"李四”);
 ps->age = 28;
}
int main()
{
 struct Stu s = {“张三”,20};
 print_stu(s);
 set_stu(&s);
 print_stu(s);
 return 0;
}

总结

操作符的属性:优先级、结合性

C语⾔的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。

 优先级:

 优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是 不⼀样的。

例: 3 + 4 * 5;

该⽰例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法 的优先级⾼于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4 。

结合性:

如果两个运算符优先级相同,优先级没办法确定先计算哪个,这时候就看结合性了,则根据运算符 是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右 结合(从右到左执⾏),⽐如赋值运算符( = )。

例: 5 * 6 / 2;

该⽰例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 5 * 6 , 再计算 6 / 2 。 运算符的优先级顺序很多,下⾯是部分运算符的优先级顺序(按照优先级从⾼到低排列),建议⼤概记住这些操作符的优先级就⾏。

  • 圆括号( () )
  • ⾃增运算符( ++ )⾃减运算符( -- )
  • 单⽬运算符( + 和 - )
  • 乘法( * ),除法( / )
  •  加法( + ),减法( - )
  • 关系运算符( < 、 > 等)
  •  赋值运算符( = )

由于圆括号的优先级最⾼,可以使⽤它改变其他运算符的优先级。 

 以上就是文章的全部内容,有些操作符举例简单,之后读者如果有需要我会进行补充。

 

 

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值