IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言基础-学习笔记(6)- 操作符详解 -> 正文阅读

[C++知识库]C语言基础-学习笔记(6)- 操作符详解

操作符和表达式

本章重点
1.各种操作符的介绍。
2.表达式的求值。

操作符

分类:

  • 算数操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号操作符
  • 下标引用、函数调用和结构成员

算数操作符

+ - * / %

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

移位操作符

<< 左移操作符
>> 右移操作符
int main() {
	int a = 2;
	//把a的二进制位向左移动一位
	int b = a << 1;
	//把a的二进制位向右移动一位
	int c = a >> 1;

	printf("b = %d\n",b);
	printf("c = %d\n",c);
	return 0;
}

警告:移位不能移动负数位;

在这里插入图片描述

位操作符

&  按位与
|  按位或 
^  按位异或
注:他们的操作数必须是整数
int main() {
	//3 - 00000000000000000000000000000011
	//5 - 00000000000000000000000000000101
	int a = 3;
	int b = 5;
	//& - 按(2进制)位与
	int c = a & b;
	// | - 按(2进制)位或 
	int d = a | b;
	// ^ - 按(2进制)位异或
	// 对应的二进制位进行异或
	// 规则:相同为0,相异为1
	int e = a ^ b;
	printf("c = %d\n",c);
	printf("d = %d\n",d);
	printf("e = %d\n",e);
	return 0;
}

练习:编写代码实现:求一个整数存储在内存中的二进制中1的个数。

赋值操作符

int weight = 100;
weight = 89;

复合操作符

+=
-=
*=
/=
%=
&=
|=
^=
>>=
<<=
int a = 10;
a = a + 10;
a += 10;//复合赋值 

单目操作符

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

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

sizeof是一个操作符,不是函数

int main() {

	short s = 5;
	int a = 10;
	//sizeof括号中放的表达式是不参与运算的!
	printf("%d\n",sizeof(s = a + 2));
	printf("%d\n",s);

	int a = 10;
	int arr[10] = {0};
	printf("%d\n",sizeof(arr));//单位是字节
	printf("%d\n",sizeof(int [10]));//40 - int [10]是arr数组的类型
	return 0;
}
int main() {
	int a = 4;
	//00000000000000000000000000000100 - 4
	
	//01111111111111111111111111111011 
	//00000000000000000000000000000100
	//00000000000000000000000000000101 - 5
	a = ~a;
	printf("%d\n",a);
	return 0;
}

//& 取地址

int main() {
	int a = 10;
	printf("%p\n",&a);// & - 取地址操作符
	int* pa = &a;//pa是用来存放地址的 - pa就是一个指针变量
	*pa = 20;	//解引用操作符 - 简介访问操作符
	printf("%d\n",a);//20
	return 0;
}

关系操作符

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

逻辑操作符

&&   逻辑与
||   逻辑或

区分逻辑与和按位与 区分逻辑或和按位或

1&2    ---> 0
1&&2   ---> 1

1|2    ---> 3
1||2   ---> 1

逻辑与和逻辑或的特点:

如果 a && b中,a=0,则b不参与运算。
如果a ||b中,a=1,则b不参与运算。

int main() {
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n",a,b,c,d);
	return 0;
}

三目操作符(条件操作符)

exp1 ? exp2 : exp3

练习:

int main() {
	int a = 0;
	int b = (a > 5 ? 1 : -1);
	
	printf("%d\n",b);
	return 0;
}

逗号表达式

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

int main() {
	int a = 5;
	int b = 3;
	int c = 0;
	//逗号表达式 - 要从左向右依次计算,但是整个表达式的结果是最后一个表达式的结果
	int d = (c = 1, a = c + 3,b = a - 4,c += 5);
	printf("d = %d\n",d);
	return 0;
}
//
a = get_val();
count_val(a);
while(a>0){
    a = get_val();
    count_val(a);
} 

//如果使用逗号表达式,改写:
while(a =  get_val(),count_val(a),a>0){
    
}

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

1.[ ] 下标引用操作符

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

int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n",arr[4]);// [] - 就是下标引用操作符
	// []的操作数是2个:arr , 4

	return 0;
}

2.() 函数调用操作符

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

3.访问一个结构的成员

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

//创建一个结构体
struct Book {
	//结构体的成员(变量)
	char name[20];
	char id[20];
	int price;
};

int main() {
	struct Book b = {"C语言","C20102",55};
	struct Book* pb = &b;

	//结构体变量名.成员名
	printf("书名:%s\n",b.name);
	printf("书号:%s\n",b.id);
	printf("价格:%d\n",b.price);
	//结构体指针->成员名
	printf("书名:%s\n", pb->name);
	printf("书号:%s\n", pb->id);
	printf("价格:%d\n", pb->price);

	return 0;
}

表达式求值

隐式类型转换

C的整形算数运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换成为整型提升
在这里插入图片描述
如何进行整型提升?

整型提升是按照变量的数据类型的符号位来进行提升的
在这里插入图片描述
在这里插入图片描述

整型提升的例子:

int main() {
	char a = 3;
	//00000000000000000000000000000011
	//00000011 - a
	char b = 127;
	//00000000000000000000000001111111
	//01111111 - b
	char c = a + b;
	//00000000000000000000000000000011
	//00000000000000000000000001111111
	//00000000000000000000000010000010

	//100000010 - c
	//11111111111111111111111100000010 - 补码
	//11111111111111111111111100000001 - 反码
	//10000000000000000000000011111110 - 原码
	//111111110
	//发现a和b都是char类型的,都没有达到一个int的大小
	//这里就会发生整形提升
	printf("%d\n",c);  // -126
	return 0;
}

算数转换

操作符的属性
复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级
  2. 操作符的结核性
  3. 是否控制求值顺序
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 10:59:24  更:2021-09-06 11:01:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:13:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码