【c语言】-- 操作符汇总(万字详解)

这篇具有很好参考价值的文章主要介绍了【c语言】-- 操作符汇总(万字详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

📕博主介绍:目前大一正在学习c语言,数据结构,计算机网络。

c语言学习,是为了更好的学习其他的编程语言,C语言是母体语言,是人机交互接近底层的桥梁。

本章来学习操作符。

让我们开启c语言学习之旅吧

温馨提示:这篇文章干货非常多,感兴趣小伙伴一定要认真看完哦,越到后面越精彩。

目录

1.操作符分类

2.算术操作符

​​​​​​  3.移位操作符       

3.1右移操作符

3.2左移操作符

4.位操作符 

4.1按位与

​编辑

  

4.2按位或

 4.3 按位异或

5.赋值操作符

6.单目操作符 

6.1单目操作符介绍

  6.2详细介绍,前置(+ +,- -), 后置(+ +,- -)

6.3强制类型转换

7.关系操作符

8.逻辑操作符

9.条件操作符

10.逗号表达式 

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

1. [  ] 下标引用操作符

2.( )函数调用操作符

3.访问一个结构的成员

12.表达式求值

12.1隐式类型转换

12.2 算术转换

 12.3 操作符的属性

结语


1.操作符分类

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

本章就是围绕这些操作符来展开讲解。

2.算术操作符

+        -        *        /        % 

 1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
 2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
 3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

例如:

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

 注意:想要得到浮点数,两个操作数必须有一个为浮点数

​​​​​​  3.移位操作符       

<< 左移操作符
>> 右移操作符
 
注:移位操作符的操作数只能是整数。

移位操作符移动的是二进制(如果是负整数移动的是补码)

补码的详细讲解请看这篇文章:http://t.csdn.cn/GQF16

3.1右移操作符

#include <stdio.h>
int main()
{
	int a = 15;
	int b = a >> 1;
	return 0;
}

整个移位的操作是怎样完成的呢?结果又是怎样的呢?

请看图分析

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

移动规则:

首先右移运算分两种:

1.逻辑移位

   左边用零填充,右边丢弃

2.算术移位

   左边用该值的符号位填充,右边丢弃 

注:在c语言中没有明确规定是采用算术右移还是逻辑右移,一般编译器上采用的是算术右移 

上面这个问题是不能说明是算术右移还是逻辑右移

算术右移VS逻辑右移

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

3.2左移操作符

移动规则:左边丢弃,右边补0

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

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

int num = 10;
num>>-1;//error

4.位操作符 

位操作符

&   按位与
|     按位或
^    按位异或
注:他们的操作数必须是整数。


4.1按位与

规则:对应的二进制位有0为0,两个同时为1则为1

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

 程序分析

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

  


4.2按位或

   规则:对应的二进制位有1则为1,两个同时为0才是0

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

程序分析

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构


 4.3 按位异或

   规则:对应的二进制位相同为0,相异为1

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

程序分析

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构


来一道变态的面试题

不能创建临时变量(第三个变量),实现两个数的交换。

#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}

分享一下我的理解方法吧

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

在这个过程中他是没有进位的,所以根本不会产生数据溢出

5.赋值操作符

     赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。


赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?


那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。

符合赋值符

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

这些操作符该怎么用呢?

比如:

int x=10;
x=x+10;
可以写成
x+=10;

其他的运算符也是一样的道理,可以这样写更加简洁

6.单目操作符 

6.1单目操作符介绍

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

 单目操作符只有一个操作数。

注:sizeof不是函数,是一个操作符,是用来计算创建类型变量的大小,单位是字节。

  6.2详细介绍,前置(+ +,- -), 后置(+ +,- -)

这两个操作符在我们的程序中应用非常多,也非常容易出错。

我们用几个例子来介绍这两操作符

#include <stdio.h>
int main()
{
	int a = 1;
	int b = a++;   //计算规则:b=a,a=a+1
	printf("a=%d b=%d", a, b);
	return 0;
}

运行结果:a=2,b=1;

注:后置++,先使用,后++(后置- -同理)

#include <stdio.h>
int main()
{
	int a = 1;
	int b = ++a;   //计算规则:a=a+1,b=a
	printf("a=%d b=%d", a, b);
	return 0;
}

运行结果:a=2,b=2;

注:前置++,先++,后使用(前置- -同理)

6.3强制类型转换

C语言中的强制类型转换(Type Casting)是指将一个数据类型的值转换为另一个数据类型。有时候我们需要将一个表达式中的值转换成另一种数据类型,这种转换就称为强制类型转换。

 使用规则

#include <stdio.h>
int main()
{
	int a = (int)3.14;
	return 0;
}

把一个浮点型强制转换成整形

需要注意的是,强制类型转换可能会导致数据精度的损失或溢出

7.关系操作符

关系操作符就是用来比较关系的

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

这些关系运算符比较简单,但是在使用的时候要注意一些陷阱

警告:

在编程的过程中== 和=不小心写错,导致的错误。

8.逻辑操作符

逻辑操作符

&&(并且)   逻辑与
|| (或者)   逻辑或

两个同时满足(并且)

只要一个满足(或者) 

逻辑与和或的特点:

#include <stdio.h>
int main()
{
  int i = 0,a=0,b=2,c =3,d=4;
  i = a++ && ++b && d++;  结果为1,2,3,4


  i = a++||++b||d++;  结果为1,2,3,4
  printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
  return 0;
}

注:&&操作符左边为假,右边不再计算。

        ||操作符左边为真,右边不再计算。

 结果为真用1表示,结果为假用0表示。

9.条件操作符

条件操作符也称三目操作符(有三个操作数)

表达式1 ?表达式2 :表达式3

表达式1成立,执行表达式2,不执行表达式3。

表达式1不成立,不执行表达式2,执行表达式3.

使用方法:比如说我们要求两个数的最大值

【c语言】-- 操作符汇总(万字详解),c语言,c++,数据结构

你会发现这个表达式等价于if语言,完全可以把它转换成if语句的。

10.逗号表达式 

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

exp1, exp2, exp3, …expN

就像这么一个代码

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少?

c的结果是13,从左往右依次计算,最后把b=a+1的结果赋值给c。

注意:一定要从左往右计算,因为左边表达式的结果,会影响右边表达式的结果。 

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

1. [  ] 下标引用操作符

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

例如:

int  arr [10] ;     //创建数组

arr [9] = 10;      //实用下标引用操作符

[ ] 的两个操作数是arr和9。

2.( )函数调用操作符

接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

例如:

#include <stdio.h>
int main()
{
	int len = strlen("abc");   这个( )就是函数调用操作符 
	printf("%d", len);         操作数是:strlen  "abc"
	return 0;
}

函数调用操作符的操作数是:函数名 + 函数的参数 

3.访问一个结构的成员

 .   结构体 . 成员名
->  结构体指针 -> 成员名

结构体是一种自定义类型

#include <stdio.h>
struct Book
{
	char name[30];      //结构体成员
	char author[20];
	float price;
};
int main()
{
	struct Book b1 = {"c语言","小王",66.8f};  //结构体变量  
	struct Book b2 = {"数据结构","小李",88.8f};  //定义了一本书
	printf("%s %s %f\n", b1.name, b1.author, b1.price);   //结构体成员访问
	printf("%s %s %f\n", b2.name, b2.author, b2.price);
	return 0;
}

 操作数:结构体变量 . 成员名

#include <stdio.h>
struct Book
{
	char name[30];      //结构体成员
	char author[20];
	float price;
};
void print(struct Book * p)
{
	printf("%s %s %.1f\n", p->name,p->author,p->price);   //结构体成员访问
}
int main()
{
	struct Book b1 = { "c语言","小王",66.8f };  //结构体变量  定义了一本书
	print(&b1);
	return 0;
}

这样也能实现相同的效果

操作数:结构体指针 -> 成员名

12.表达式求值

表达式求值的顺序一部分是由操作符的优先级结合性决定的。

有些表达式的操作数在求值的过程中可能需要转换为其他类型。

12.1隐式类型转换

c的整型算术运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型,这种转换称为整型提升

整型提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。


因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。


通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

 实例

#include <stdio.h>
int main()
{
	char c1 = 5;
	char c2 = 127;
	char c3 = c1 + c2;
	printf("%d\n\n ", c3);
	return 0;
}

这个代码如何进行整形提升呢?

整形提升是按照变量的数据类型的符号位来提升的。

char c1 = 5

变量c1的二进制位(补码)中只有8个比特位:

00000101  -  c1里面放的值

因为 char  为无符号的  char

所以整形提升的时候,高位补充符号位,即为0

00000000000000000000000000000101   -  整形提升和的结果

char c2 = 127

变量c1的二进制位(补码)中只有8个比特位:

011111111    - c2里面放的值

因为  char  为无符号的  char

所以整形提升的时候,高位补充符号位,即为0

000000000000000000000000011111111    -  整形提升和的结果

char c3 = c1+c2;

00000000000000000000000000000101    - c1

000000000000000000000000011111111    - c2

00000000000000000000000010000100    - c1+c2的结果

10000100    -   c3(截断)

以%d的形式打印  (%d是10进制的形式打印有符号的整数)

打印的是整型,c3是char类型,又要发生整形提升

因为  char  为有符号的  char

所以整形提升的时候,高位补充符号位,即为1

11111111111111111111111110000100    -  提升后的结果(补码)

11111111111111111111111110000011     -  反码

10000000000000000000001111100     -   原码   (这就是最终的结果啦) 

所以这个程序的运行结果是:- 124.

12.2 算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

警告:
但是算术转换要合理,要不然会有一些潜在的问题。

float f = 3.14;
int num = f;//隐式转换,会有精度丢失

 12.3 操作符的属性

复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

结语

如果给篇文章对大家有帮助,希望大家点一个免费的赞作为鼓励。

谢谢大家!!!!

制作不易,如果有疑问评论区见。文章来源地址https://www.toymoban.com/news/detail-543491.html

到了这里,关于【c语言】-- 操作符汇总(万字详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言:“~”操作符详解

    ~:含义及用法举例 文章目录 前言 一、“~”是什么? 二、原码、反码及补码 1.简介 2.用法举例 ①正整数 ②负整数 ③零 三、“~”操作符 1.简介 2.用法举例 ①正整数 ②负整数 ③零 本文在简单介绍原码反码补码的基础上,介绍“~”操作符的用法。 ~:一种单目操作符,即对

    2024年02月10日
    浏览(41)
  • 【C语言】操作符详解

    👦个人主页:Weraphael ✍🏻作者简介:目前正在回炉重造C语言(2023暑假) ✈️专栏:【C语言航路】 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍 算术操作符 位移操作符 位操作符 赋值操作符 单目操作符 关

    2024年02月16日
    浏览(31)
  • C语言---操作符详解

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员。 移位操作符,移动的是二进制位。 警告:对于移位运算符,不要移动负位数,这个是标准定义的。 3.1.1、原码、反码、补码介绍 整数

    2024年02月07日
    浏览(30)
  • 【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    目录 一、^ 是什么(^称为异或) 二、^的规律(特点) 三、可利用^秒杀的常见例题(重点) 1、消失的数字  2、不一样的人生密码 3、交换两个数(不能创建中间变量) 4、找出只出现一个的两个数字 是一种操作符, 针对二进制异或而言的 ,两个数对应的二进制位相同,异或

    2024年02月16日
    浏览(57)
  • C语言操作符详解(下)

    在C语言操作符详解(上)中,已经详细系统的介绍了各种操作符及其使用场景。 接下来,本文将逐步介绍编译器执行这些代码背后所做的事情、操作符优先级、结合性以及求值顺序! 表达式求值的顺序一部分是由 操作符的优先级和结合性决定。 同样,有些表达式的操作数在

    2024年02月05日
    浏览(30)
  • c语言:操作符详解(上)

    算术操作符: + 、- 、* 、/ 、% 移位操作符: 位操作符: | ^ 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、= 、= 、= 、|= 、^= 单目操作符: !、++、–、、*、+、-、~ 、sizeof、(类型) 关系操作符: 、= 、 、= 、 == 、 != 逻辑操作符: 、|| 条件操作符:? : 逗号表达式: , 下标引用:

    2024年03月16日
    浏览(31)
  • 【 c 语言 】赋值操作符详解

    🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 引言: 在C语言编程中,赋值操作符是我们日常编程中不可或缺的一部分。它不仅是初始化变量、修改

    2024年04月09日
    浏览(28)
  • 初阶C语言——详解操作符(1)

    Hello,我们又见面了,最近不知道大家是否在持续输出代码呢?代码能力是否提高了呢?今天让我们来一起学习操作符,操作符在我们学习语言中很重要,我们要知道每个操作符的作用和用法,下面开始我们的学习。 操作符分类: 算术操作符 移位操作符 位操作符 赋值操作符

    2024年02月12日
    浏览(28)
  • 初阶C语言-操作符详解(上)

    “不飞则已,一飞冲天;不鸣则已,一鸣惊人。” 今天,我们一起来学习一下操作符的相关知识。 算术操作符 + - * / % 移位操作符 位操作符 | ^ 赋值操作符 = += -= *= /=... 单目操作符 ! sizeof ++ -- ... 关系操作符 = = == != 逻辑操作符 || 条件操作符 ? : 逗号表达式 , 下标引用、函数

    2024年02月13日
    浏览(27)
  • C语言最全操作符详解✌️

    C语言的一系列操作符中,其中一组叫双目操作符,也叫算数操作符。分别是:+,–,*,/,%。 ①+和– +和–的用途与数学中基本一致,用来做加法和减法。例如: 我们可以发现,他们之所以叫双目操作符,是因为他们的左边和右边一共有两个操作数。 ②* *运算符也与数学

    2024年02月21日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包