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语言——操作符笔记 -> 正文阅读

[C++知识库]C语言——操作符笔记

前言

本文是对操作符笔记,包含左值右值、左右结合性、优先级等内容

操作符的分类

  1. 算数操作符
  2. 移位操作符
  3. 位操作符
  4. 赋值操作符
  5. 单目操作符
  6. 关系操作符
  7. 逻辑操作符
  8. 条件操作符
  9. 逗号表达式
  10. 下标引用、函数调用和结构成员

算数操作符

+ - * / %

这里需要注意的是,

  • 除了%操作符,其余几个操作符既适用于浮点类型,又适用于整数类型。
  • 当/操作符两边都是整数时执行整除运算(如果有一个操作数是负数,结果取决于编译器),其他情况下执行浮点数除法。
  • %只接受两个整型操作数

移位操作符

左移操作符:<<
右移操作符:>>

  • 左移时,移出左边界的那几个位丢失,右边空出来的位补0
  • 右移时,分为
    1. 算数右移:移出右边界的位丢失,左边界补原先该值的符号位
    2. 逻辑右移:移出有边界的位丢失,左边界补0

注:多数编译器采用算数右移;不要移动负数位,标准未规定移动负数位的后果;移位不同于++、–操作符,其结果需要赋值给其他变量。


位操作符

按位与:&
按位或:|
按位异或:^

&对应位均为1则为1否则位0
|对应位至少有一个1则为1否则为0
^对应位相同则为0,相异则为1(不用第三个变量交换两个整数的例子)
注:位操作符的操作数必须是整数;按位取反~被归类到单目操作符;


赋值操作符

=

复合赋值符

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


单目操作符

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

注:
sizeof不是函数,因为不用函数调用操作符()也可以计算变量的大小;
数组名在经过传参之后再使用sizeof操作,得到的是一个指针的大小,而非数组大小,注意和strlen区别;未传参前用sizeof操作得到的是数组的大小


关系操作符

>
<
>=
<=
!=
==


逻辑操作符

逻辑与&
逻辑或||

注意这两个操作符会控制求值顺序,即“短路求值”


条件操作符

exp1?exp2:exp3

此操作符也会控制求值顺序


逗号表达式

exp1,exp2,……,expN

从左向右依次执行,整个表达式的结果是最后一个表达式的结果
应用例子

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[ 操作数2]

比如数组,需要注意的是顺序可以颠倒,如下

#include<stdio.h>
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	printf("%d\n", 4[arr]);
	return 0;
}

在这里插入图片描述

函数调用

函数名(参数列表)

访问结构成员

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


左值(L-value)和右值(R-value)

左值就是那些可以出现在赋值号左边的东西。右值就是那些可以出现在赋值号右边的东西。
左值标识了一个可以储存结果的地点;右值指定了一个值。
表达式也可能可以作为左值,比如:

int a[30];
a[b+10]=0;

下标引用实际上是一个操作符,所以表达式的左边其实是一个表达式。


表达式求值

表达式的求值顺序主要由它所包含的操作符的优先级和结合性决定:

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序

相邻两个操作符先执行那个取决于他们的优先级,如果优先级相同则看操作符的结合性
但是只靠操作符的优先级和结合性并不能唯一确定表达式的求值顺序,对于有些复杂的表达式,其结果在不同编译器下的结果会不同。

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

隐式类型转换

C的整形算数运算总是至少以缺省整形类型的精度来进行的。为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转换为普通整形,这种转换称为整形提升(integral promotion)

算数转换

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

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

操作符的属性(优先级、结合性、控制求值顺序)

复杂表达式的求值顺序是由3个因素决定的:

  1. 操作符的优先级
  2. 操作符的结合性
  3. 操作符是否控制求值顺序

简单来说,

  • 优先级就是相邻两个操作符哪个先执行取决于它们的优先级;
  • 结合性就是一串操作符是从左向右执行还是从右向左执行;
  • 控制求值顺序就是有4个操作符可以对整个表达式的求值顺序加以控制,它们或者保证某个子表达式能够在另一个子表达式的所有求值过程完成之前进行求值,或者可能使某个表达式被完全跳过不再求值。

注意不要混淆结合性和准备操作数,结合型不决定什么时候准备操作数。

C标准的规则是

两个相邻操作符的执行顺序由它们的优先级决定。如果它们的优先级相同,则执行顺序由它们的优先级和结合性决定。除此之外,编译器可以自由决定使用何种顺序对表达式进行求值,只要它不违背逗号、&&、||和?:操作符施加的限制即可。

例子有

a*b+c*d+e*f//这里不确定e*f什么时候执行,虽然对结果无影响
c+--c;//无法得知加法操作符的左操作数是在右操作数之前还是之后求值

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:03:37  更:2021-08-09 10:03:43 
 
开发: 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年5日历 -2024/5/9 22:11:19-

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