文章目录
运算符
1. 运算符
主要包括,算数运算符,条件判断,条件组合,以及二进制操作相关运算符
1.1 算术运算符
算术运算符主要包括:+ - * / () = %
- 注意事项:
- 先乘除后加减
- 有括号优先处理小括号以内的内容
- 整个表达式基本顺序是从右至左
- 除数不能为 0
- 取余 % :
// 在不考虑小数和分数的情况下 15 ➗ 2 = 7 ··· 1 // 针对于开发 以上表达式 15 % 2 目标结果为 1 // 针对于开发 以上表达式 15 / 2 目标结果为 7
= 赋值号
赋值号将右侧的数据,赋值给左侧的变量
#include <stdio.h>
int main(int argc, char *argv[])
{
// 算数运算符演示
int num1 = 20;
int num2 = 30;
/*
* 关注点:
* 1. 关注变量在代码中的数据存储变化过程
* 2. 变量数据有且只有被赋值的情况下才会修改存储数据内容
* 3. 双目运算符,例如 + - * / % 要求运算符两端有空格
*/
num1 = num1 + num2; // nun1 = 50; num2 = 30
num1 = num1 * num2; // num1 = 1500; num2 = 30
num1 = num1 - num2; // num1 = 1470; num2 = 30
num1 = num1 / num2; // num1 = 49; num2 = 30
num1 = num1 % num2; // num1 = 19; num2 = 30
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
return 0;
}
1.2 增强版算术运算符
算术运算符的优化
// += -= *= /= %= int num1 = 10; int num2 = 30; // num1 += num2 num1 与 num2 相加和重新赋值给 num1 num1 = num1 + num2; <==> num1 += num2;
#include <stdio.h>
int main(int argc, char *argv[])
{
int num1 = 10;
int num2 = 20;
// 增强版算数运算符
num1 += num2;
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num1);
return 0;
}
1.3 自增自减运算符
自增自减运算符基本样式
- ++ or –
语法要求
自增自减运算符有且只能操作变量!!不可以操作常量
自增操作对于操作的变量是对其的内部数据进行 += 1 操作,
自减操作对于操作的变量是对其的内部数据进行 -= 1 操作。
【强烈推荐】在代码中使用 += 1 和 -= 1 替换自增自减运算符。增强代码的阅读性。
语法特征总计【歧义】
- 自增自减运算符在变量之后,首先取值变量数据参与代码运行,取值之后执行自增自减操作
- 自增自减运算符在变量之前,首先执行自增自减操作,执行之后取值变量数据参与代码运行
【使用建议】
- 自增自减运算符单独成行,不如其他代码混合,降低代码歧义性
- 自增自减运算符建议使用 += 1 和 -= 1 代替
#include <stdio.h>
int main(int argc, char *argv[])
{
int num = 10;
/*
自增自减运算符在变量之后,首先取值变量数据,参与当前行代码运 行,之 后执行自增操作。
第一行代码打印结果为 10,第二次打印结果为 11
*/
printf("num++ : %d\n", num++);
printf("num : %d\n", num);
/*
自增运算符在变量之前,首先执行自增操作修改变量存储的数据内容,之后 提取变量数据,参与代码运行。
*/
printf("++num : %d\n", ++num);
printf("num : %d\n", num);
return 0;
}
1.4 自增自减运算符面试题
面试题一:
int num = 5; int ret = num++ * ++num; ret = 35; num = 7; /* 解释: num 执行了两次自增操作,可以明确 num 的结果就是 7 ret = num++ * ++num; num++ 自增在后,先取值操作,再自增操作 num++ 对于表达式提供的数据为 5,num 存储数据自增为 6 ++num 自增在前,先自增执行,在取值操作 【重点】num 此时原始数据为 6 num 首先自增操作,修改为 7,提供 7 给予当前表达式 ret = 5 * 7 ===> 35; */
面试题二:
int num = 5; int ret = ++num++; ret = ?; num = ?; /* 语法错误 ++num++ 可以拆分成两部分 第一部分:++num 操作可正常执行,自增运算符在变量之前,操作的是一个变量; 第二部分:(++num的结果)++,即 6++,6 是一个常量,产生【语法错误】,无法正常运行自增自减运算符操作。 */
1.5 关系运算符
> < >= <= != == /* 关系运算符对外的数据结果都是真假关系 在 C 语言中结果为 0(假) 和 1(真) 在 C++ 中结果为 0(false) 和 1(true), C++ 存在 bool 类型,同时有 true 和 false 关键字 C/C++ 要求非 0 即 真 */
关系运算符经常用于条件判断,条件组合
#include <stdio.h> int main(int argc, char *argv[]) { /* * ret ==> result 结果,关系运算符对外结果是 0 or 1 * 使用 int 类型在 C 语言满足数据存储要求 */ int ret = 10 > 5; // ret = 1; printf("ret = %d\n", ret); ret = 10 < 5; // ret = 0; printf("ret = %d\n", ret); ret = 10 >= 10; // ret = 1; printf("ret = %d\n", ret); ret = 10 <= 15; // ret = 1; printf("ret = %d\n", ret); ret = 10 == 5; // ret = 0; printf("ret = %d\n", ret); return 0; }
1.6 逻辑运算符
包括 逻辑与、逻辑或和逻辑非,逻辑运算符对外的结果是真假关系 0 or 1
逻辑与 &&:同真为真,有假【即】假
逻辑或 ||: 有真【即】真,同假为假
取反!: 真为假,假为真
#include <stdio.h>
int main(int argc, char *argv[])
{
int ret = 10 > 5 && 5 > 1; // ret = 1
printf("ret : %d\n", ret);
ret = 10 > 15 && 5 > 1; // ret = 0
printf("ret : %d\n", ret);
ret = 10 > 15 || 5 > 1; // ret = 1
printf("ret : %d\n", ret);
ret = !(10 > 5); // ret = 0
printf("ret : %d\n", ret);
ret = !(10 > 15); // ret = 1
printf("ret : %d\n", ret);
ret = !(10 > 5) && 5 > 1; // ret = 0
printf("ret : %d\n", ret);
}
1.7 逻辑运算符短路原则
利用逻辑运算符短路原则优化条件并列和选择。需要考虑条件的权重和优先级的问题。
情况一:
int num = 10; int ret = 10 > 15 && ++num > 5; ret = ?; 0 num = ?; 10 /* 解释: 【逻辑与短路原则】 在逻辑 && 表达式中,出现了第一个 假条件(0 or false),整个逻辑与表达式结果已经明确为假(0 or false),计算机为了降低计算机逻辑复杂度,提升计算机效率,从第一个假条件开始,之后的内容不再执行。 */
情况二:
int num = 10; int ret = 10 > 5 || ++num > 5; ret = ?; 1 num = ?; 10 /* 解释: 【逻辑或短路原则】 在逻辑或 || 表达式中,出现了一个真条件(非0 or true),整个逻辑与表达式结果已经明确为真(非0 or true),计算机为了降低计算机逻辑复杂度,提升计算机效率,从第一个真条件开始,之后的内容不再执行。 */
1.8 位运算符【重点】
位运算符包括
- 与 &、或 |、异或 ^、取反 ~
- 移动
与 & :同 1 为 1, 有 0 则 0
或 | : 同 0 为 0, 有 1 则 1
异或 ^ : 不同为 1,相同为 0
取反 ~ : 1 为 0,0 为 1
左移:<<
<< n 当前数据乘以 2 ^ n
右移:>>
>> n 当前数据除以 2 ^ n