c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换

本文详细介绍了C++中的算术、赋值、逻辑、比较和三目运算符,以及逗号运算和数据类型转换。强调了C++在公司产品开发中的实际应用,特别是在需要高性能和硬件部署的场景下。同时,文章指出掌握C++对于应对经济寒冬和找到工作的重要性,尤其是在算法岗位竞争激烈的当下。

c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换

2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c++的话,
我所知道的周边的会c++的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg
提示:系列c++学习的基础和高阶知识,用于公司生产实践中,实实在在的公司部署产品要用的,因为c++速度快,
而java和Python速度慢,自然往硬件里面部署算法啥的,都得用c++或者c,因此本科学的c很重要,后来的Python或者java就没有那么重要了,
c/c++系列文章:
【1】c++:c语言优缺点,visual studio2019如何新建项目,写hello world程序
【2】c/c++:gcc安装,gcc编译hello world文件,system函数调用系统命令,sleep函数
【3】linux下gcc的编译过程和功能,预处理,编译,汇编,链接,.c预处理为.i文件.s文件.o文件.exe文件
【4】c/c++:windows平台下依赖的动态库,c底层是汇编语言,程序断点调试,反汇编,vs快捷键
【5】c/c++:数据类型,常量变量,标识符,有符号整型,无符号unsigned,字符类型,字符串类型,实数类型,浮点型,科学计数法
【6】c/c++:2进制、8进制、10进制、16进制和进制之间的转换,c语言输出匹配格式%
【7】c/c++:原码,反码,补码和常见的数据类型取值范围,溢出
【8】c/c++:类型限定符,printf输出格式,putchar,scanf,getchar


c/c++:算术运算符

在这里插入图片描述
位运算是很重要的。

后续重点才说

在这里插入图片描述
加减乘除咱们不多说

*乘法
/除法
除法看你打印什么?%d的话,它就取整
%f才会有小数点吧
不对,是定义数据类型为double才会有小数

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

//很多库后续调用各种函数都需要用的

void f14(void)//这同一个工程下面函数还不让重名呢
{
	int a = 10 / 20;//自动就取整了

	printf("%d\n", a);
	printf("%f\n", 10 / 20);//还是自动取整了

	double b = 10;
	double c = 20;
	printf("%f\n", b / c);
}


int main(void)
{
	f14();

	system("pause");
	return 0;
}

在这里插入图片描述
取余运算,好说
除模取余
10%3
商3,取余为1
好说

++自增++

–自减–
=++a,先a+1,再赋值给前面的等号
=a++,先赋值给前面的等号,再a+1
在这里插入图片描述


void f15(void)//这同一个工程下面函数还不让重名呢
{
	int a = 10;

	int b = ++a;//a=11,a要先自己增加哦,b=11

	printf("%d\n", a);
	printf("%d\n", b);
}

在这里插入图片描述

`
void f15(void)//这同一个工程下面函数还不让重名呢
{
int a = 10;

//int b = ++a;//a=11,a要先自己增加哦,b=11
int b = a++;//b=10,然后才是a自己增加哦,a=11

printf("%d\n", a);
printf("%d\n", b);

}`在这里插入图片描述
看懂了吗,++a是a先自增
a++是a后自增

同理
–a也是a先自减
a–是a后自减


void f16(void)//这同一个工程下面函数还不让重名呢
{
	int a = 10;

	int b = --a;//a=11,a要先自己减哦,b=11
	//int b = a--;//b=10,然后才是a自己减哦,a=11

	printf("%d\n", a);
	printf("%d\n", b);
}

在这里插入图片描述

void f16(void)//这同一个工程下面函数还不让重名呢
{
	int a = 10;

	//int b = --a;//a=11,a要先自己减哦,b=11
	int b = a--;//b=10,然后才是a自己减哦,a=11

	printf("%d\n", a);
	printf("%d\n", b);
}

在这里插入图片描述

赋值运算符=,等号是==

在这里插入图片描述
a+=10等价于
a=a+10
加减乘除模都一样

比较运算符

在这里插入图片描述

==等于
!=不等于
在这里插入图片描述

逻辑运算符:与或非

逻辑非!取反
在这里插入图片描述
0为假
非0为真【1到无穷大都是真】


void f17(void)
{
	int a = 1;
	printf("%d\n", !a);
}

在这里插入图片描述
逻辑与&&好说,全真才真,有假全假
逻辑或||好说,全假才假,有真全真
在这里插入图片描述

运算符优先级

最好是()来区分
其他的都是容易混淆的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
整体来说,记住特定,由高到地
[]
()
++自增,
–自减
强转类型
sizeof

先乘除
取余
后加减

逻辑运算

三目运算符,条件运算

赋值运算

逗号,最次
那些写代码不加小括号的是垃圾程序员。
那些写代码不加小括号的是垃圾程序员。
那些写代码不加小括号的是垃圾程序员。

最好写小括号,否则别人怎么记忆。

三目运算符?:

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

表达式1:是判别条件表达式
如果为,三目运算取值为表达式2
如果为,三目运算取值为表达式3

void f18(void)
{
	int a = 10;
	int b = 20;

	int flag = a > b ?  1 : 2;
	//试问a>b吗?是真,则flag取1
	//否则,flag取2

	printf("%d\n", flag);
}

在这里插入图片描述
这再python和java中,我已经用很多了
哟其实java中练习数据结构与算法时搞的

void f18(void)
{
	int a = 10;
	int b = 20;

	int flag = a > b ?  1 : 2;
	//试问a>b吗?是真,则flag取1
	//否则,flag取2

	printf("%d\n", flag);
	printf("%s\n", a > b ? "a>b" : "a<b");
}

在这里插入图片描述
很简单的,当初第一次我学习这个玩意时还不熟悉,不习惯,经常记不住。

在这里插入图片描述
写代码加括号!!
不要漏掉括号,否则优先级很难看
虽然理论上没错,但是我们是人,写代码方便给人看
不是装逼

在这里插入图片描述

逗号运算符,

写逗号,的程序员
没有意义,就是炫技,仅此而已,装逼而已


void f19(void)
{
	int a=10, b=20, c=30;

	int x = (a = 1, b = 2, c = 5);
	//我的理解是不是a=1赋值,然后b=2,c=5已经赋值好了
	//然后a赋值给x,然后是b,然后是c
	//,因为逗号最晚发生,所以赋值一定是逗号最后的

	printf("%d\n", x);
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);
}

在这里插入图片描述
调换bc位置


void f19(void)
{
	int a=10, b=20, c=30;

	int x = (a = 1, c = 5, b = 2);
	//我的理解是不是a=1赋值,然后b=2,c=5已经赋值好了
	//然后a赋值给x,然后是b,然后是c
	//,因为逗号最晚发生,所以赋值一定是逗号最后的

	printf("%d\n", x);
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);
}

在这里插入图片描述

数据类型转换

隐式类型转换,编译器自动悄悄干
或者赋值时,自动转

int r = 3;
float s = 3.14*r*r;//面积求出来是double,最后隐式转换为float

显示类型转换,
在这里插入图片描述
double表达范围最大了
long和float类似长
无符号大于有符号范围

void f20(void)
{
	int a = 321;
	char ch = a;

	printf("%c\n", ch);//超过128了哦,gg


在这里插入图片描述
char最大范围128
你321
不行哦

这样就65是咋来的呢
321搞成二进制,放入char
8bit,7位有效位,最高是0
在这里插入图片描述

丢了1
懂了没

所以为啥说范围小的类型,可以转范围大的
而范围大的没法转范围小的,会出错

强制数据类型的格式:
(目标数据类型)待转换的变量/表达式

void f20(void)
{
	float a = 3.6;
	int weight = 4;

	double price = a * weight;

	printf("价格%lf\n", price);//

}

在这里插入图片描述
要不你抹零

void f20(void)
{
	float a = 3.6;
	int weight = 4;

	double price = a * weight;

	printf("价格%d\n", (int)price);//

}

在这里插入图片描述


void f20(void)
{
	float a = 3.6;
	int weight = 4;

	double price = a * weight;
	int p2 = (int)(a * weight);

	printf("价格%d\n", (int)price);//
	printf("价格%d\n", p2);//

}

在这里插入图片描述
后面的括号不加的话,强制类型转换 的优先级要比 加减乘除 高哦

往往用于函数调用时,实参给形参传递值时,需要匹配数据类型,强行搞一把

后续malloc返回值是void*
它是泛型
任意一种数据即可,你可以赋值给*p地址,我们就需要强转它【malloc表达式】为整型指针类型。
在这里插入图片描述

在这里插入图片描述


总结

提示:重要经验:

1)
2)学好c++,即使经济寒冬,手握10个大厂offer绝对不是问题!
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

<think>嗯,用户让我总结并牢记C++的各种运算符运算规则、优先级、结合性以及混合运算的相关内容。我需要先理清楚C++中的运算符分类,然后逐一说明它们的规则和优先级。首先,用户可能是在学习C++的基础,特别是在掌握表达式和运算符的使用,这对于编写正确的程序非常重要。 用户的需求很明确,就是要一个系统性的总结,方便记忆和应用。可能的深层需求是希望有一个结构化的资料,帮助他们在编程时避免因为运算符优先级或结合性的错误导致的bug。同时,他们可能希望了解常见的陷阱和易错点,以便在编码时注意。 接下来,我需要组织内容。通常运算符分为算术、关系、逻辑、位运算赋值、条件、逗号等。每个类别要列出运算符,说明运算规则、例子,然后整体给出优先级和结合性的表格。此外,混合运算中的类型转换和求值顺序也是重点,特别是未定义行为的情况,比如i++ + ++i这样的表达式,需要提醒用户避免。 还要考虑用户可能对结合性不太理解,比如左结合和右结合的区别,需要举例说明,比如赋值运算符是右结合,所以a = b = c会被解析为a = (b = c),而算术运算符左结合,所以a + b + c是(a + b) + c。 另外,常见的错误点,如逻辑运算符的短路特性,可能用户需要知道&&和||在遇到条件满足时会停止计算后面的表达式,这在某些情况下可以优化代码,也可能导致意料之外的结果。 最后,总结部分需要强调优先级和结合性的重要性,并给出记忆方法,比如口诀或者分类记忆,帮助用户更好地掌握这些规则。同时,提醒在不确定的情况下使用括号来明确运算顺序,避免依赖记忆错误。</think>以下是C++运算符规则与混合运算的总结,结合示例和分类帮助记忆: --- ### 一、运算符分类及运算规则 #### 1. **算术运算符** - **单目**:`+`(正号)、`-`(负号) ```cpp int a = -5; // 对5取负 ``` - **双目**:`+`(加)、`-`(减)、`*`(乘)、`/`(除)、`%`(取模) ```cpp int x = 7 / 2; // 结果为3(整数除法) int y = 7 % 2; // 结果为1 ``` #### 2. **关系与逻辑运算符** - **关系**:`>`、`<`、`>=`、`<=`、`==`、`!=` ```cpp bool flag = (3 == 5); // 结果为false ``` - **逻辑**:`&&`(与)、`||`(或)、`!`(非) ```cpp bool res = (a > 0) && (b < 10); // 短路特性:若a<=0则直接返回false ``` #### 3. **位运算符** - `&`(按位与)、`|`(按位或)、`^`(异或)、`~`(取反)、`<<`(左移)、`>>`(右移) ```cpp int mask = 0b1010 & 0b1100; // 结果为0b1000(二进制) ``` #### 4. **赋值运算符** - 基本赋值:`=` - 复合赋值:`+=`、`-=`、`*=`、`/=`、`%=`、`&=` 等 ```cpp a += 3; // 等价于a = a + 3 ``` #### 5. **其他运算符** - **条件运算符**:`? :`(三目运算符) ```cpp int max = (a > b) ? a : b; ``` - **逗号运算符**:`,`(返回最后一个表达式值) ```cpp int x = (a=3, b=5, a+b); // x=8 ``` - **自增/自减**:`++`、`--`(注意前缀与后缀区别) ```cpp int i = 5; int j = i++; // j=5,i=6(后缀:先赋值后自增) int k = ++i; // k=7,i=7(前缀:先自增后赋值) ``` --- ### 二、优先级与结合性规则 #### 1. **优先级总表(从高到低)** | 类别 | 运算符 | 结合性 | |------------------|-------------------------------|----------| | 作用域、括号 | `::` `()` `[]` `.` `->` | 左→右 | | 单目运算符 | `!` `~` `++` `--` `+` `-` `*` `&` | 右→左 | | 乘除取模 | `*` `/` `%` | 左→右 | | 加减 | `+` `-` | 左→右 | | 移位 | `<<` `>>` | 左→右 | | 关系 | `<` `<=` `>` `>=` | 左→右 | | 相等 | `==` `!=` | 左→右 | | 位与 | `&` | 左→右 | | 异或 | `^` | 左→右 | | 位或 | `\|` | 左→右 | | 逻辑与 | `&&` | 左→右 | | 逻辑或 | `\|\|` | 左→右 | | 条件 | `?:` | 右→左 | | 赋值 | `=` `+=` `-=` 等 | 右→左 | | 逗号 | `,` | 左→右 | #### 2. **结合性示例** - **右结合性**:赋值运算符 ```cpp a = b = c; // 等价于a = (b = c) ``` - **左结合性**:算术运算符 ```cpp a + b - c; // 等价于(a + b) - c ``` --- ### 三、混合运算关键点 1. **隐式类型转换** 不同类型运算时自动转换(如`int + double`转为`double`): ```cpp int a = 5; double b = 3.14; auto c = a + b; // c为double类型 ``` 2. **求值顺序不确定性** 以下行为未定义(避免使用): ```cpp int i = 0; int x = i++ + ++i; // 结果不可预测! ``` 3. **括号明确优先级** 建议复杂表达式显式加括号: ```cpp bool res = (a > 0) && (b < 5 || c != 10); // 避免歧义 ``` --- ### 四、记忆技巧 1. **口诀记忆** "单目乘除位关系,逻辑条件赋值逗"(按优先级顺序简化)。 2. **分类分层** 将运算符分为:括号/单目→算术→关系→逻辑→赋值逗号。 3. **常见陷阱** - `a & b == 0` 实际等价于 `a & (b == 0)`(因`==`优先级高于`&`) - `i++ + i++` 结果未定义(修改同一变量多次) --- **总结**:掌握运算符优先级与结合性是避免逻辑错误的核心。在复杂表达式中优先使用括号明确意图,同时避免依赖未定义行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值