如何深入掌握C语言操作符及表达式求值(详解)(三)

简介: 本文章主要讲解点:​​​​​​​各种操作符的介绍 表达式求值

表达式求值


表达式求值顺序一部分是由操作符的优先级和结合性决定

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

隐式类型转换

  • 概念

C的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度

表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

  • 意义

表达式的整型运算要在CPU的相应运算器件内执行

CPU内整型运算器操作数字节长度一般就是int字节长度,也是CPU的通用寄存器的长度

两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度

通用CPU是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有相关指令)

所以表达式中长度可能小于int长度的整型值,都必须先转换为int或unsigned int才能执行运算


  • 例如
1. //实例1
2. char a,b,c;
3. ...
4. a = b + c;

注:b和c的值被提升为普通整型,然后再执行加法运算

加法运算完成之后,结果将被截断,然后再存储于a中

整型提升


  • 负数(有符号数)
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
  • 正数(有符号数)
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
  • 无符号数:高位补0

两个例子

//实例1
int main()
{
 char a = 0xb6;
 short b = 0xb600;
 int c = 0xb6000000;
 if(a==0xb6)
 printf("a");
 if(b==0xb600)
 printf("b");
 if(c==0xb6000000)
 printf("c");
 return 0;
}     //输出的结果:c


解释:实例1中的a,b要进行整形提升,但是c不需要整形提升

a,b整形提升之后,变成了负数,所以表达式 a==0xb6 , b==0xb600 的结果是假

但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真


//实例2
int main()
{
 char c = 1;
 printf("%u\n", sizeof(c));
 printf("%u\n", sizeof(+c));
 printf("%u\n", sizeof(-c));
 return 0;
}

实例2中c只要参与表达式运算,就会发生整形提升

表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节;

表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节;对于sizeof(c) ,就是1个字节

算术转换

如果操作符的各个操作数是不同的类型,那么需要其中一个操作数的转换为另一个操作数的类 型,才能进行操作

寻常算术转换体系
long double
double
float
unsigned long int
long int
unsigned int
int

低(在上面的列表排名低)类型应首先转为另一个操作数的类型

注:如果是高转低的话,则会有存在问题(精度缺失)

1. float f = 3.14;
2. int num = f;//隐式转换,会有精度丢失

操作符的属性

  • 复杂表达式的求值有三个影响的因素:

1. 操作符的优先级

2. 操作符的结合性

3. 是否控制求值顺序

注:两个相邻的操作符先执行优先级高的;如果优先级相同,取决于结合性

C语言运算符优先级

QQ图片20220418211229.png

注:简单来说就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符


相关文章
|
3月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
74 0
|
3月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
257 0
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
1月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
160 1
|
2月前
|
程序员 C语言
【C语言基础考研向】06运算符与表达式
本文介绍了C语言中的运算符分类、算术运算符及表达式、关系运算符与表达式以及运算符优先级等内容。首先概述了13种运算符类型,接着详细说明了算术运算符的优先级与使用规则,以及关系运算符和表达式的真假值表示,并给出了C语言运算符优先级表。最后附有课后习题帮助巩固理解。
104 10
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
384 8
|
1月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
171 0
|
2月前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
3月前
|
C语言
C语言------运算符与表达式
这篇文章是C语言运算符与表达式的实训教程,通过多个示例程序展示了如何使用算术运算符、关系运算符、逻辑运算符以及条件语句来解决实际问题,并介绍了如何通过函数库简化复杂数学运算。
C语言------运算符与表达式
|
3月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
45 6