二、运算符

文章目录

      • 运算符
        • 1. 运算符
          • 1.1 算术运算符
          • 1.2 增强版算术运算符
          • 1.3 自增自减运算符
          • 1.4 自增自减运算符面试题
          • 1.5 关系运算符
          • 1.6 逻辑运算符
          • 1.7 逻辑运算符短路原则
          • 1.8 位运算符【重点】

运算符

1. 运算符

主要包括,算数运算符,条件判断,条件组合,以及二进制操作相关运算符

1.1 算术运算符

算术运算符主要包括:+ - * / () = %

  • 注意事项:
    1. 先乘除后加减
    2. 有括号优先处理小括号以内的内容
    3. 整个表达式基本顺序是从右至左
    4. 除数不能为 0
  • 取余 % :
// 在不考虑小数和分数的情况下
152 = 7 ··· 1
// 针对于开发 以上表达式 15 % 2 目标结果为 1
// 针对于开发 以上表达式 15 / 2 目标结果为 7
  • = 赋值号

    赋值号将右侧的数据,赋值给左侧的变量

#include 

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 

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 

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 

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 

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

二、运算符_第1张图片

你可能感兴趣的:(c语言,学习)