操作符和表达式求值

目录

1.运算符的优先级和结合性

1.1运算符的优先级

1.2结合性

2.操作符的使用最终带来的是一个表达式的值

2.1.隐式类型转换(整型提升)

2.1.1整形提升的例子

2.2算术转换


1.运算符的优先级和结合性

  • 运算符是编程语言中的基本元素之一,主要是为了让程序可以对数据进行各种各样的操作和计算。运算符可以用来进行算术运算、比较、逻辑判断、赋值等操作,可以让程序更加灵活和高效。
  • 例如,算术运算符可以用来进行加、减、乘、除等数学运算,比较运算符可以用来比较两个数的大小关系,逻辑运算符可以用来进行与、或、非等逻辑判断,赋值运算符可以用来将数据保存到变量中等。
  • 因此,运算符是编程语言中非常重要的组成部分,它们可以让程序可以更加方便、快速地处理数据和实现各种算法和逻辑。

1.1运算符的优先级

运算符一览表中,运算符越靠上,优先级越高。例如,进行乘除法运算的★和/比进行加减法运算的+和--优先级高,这与我们实际生活中使用的数学规则是一样的。

例如:a +b * c

会被解释为a + (b * c),而不是(a + b) * c。虽然+写在前面,但还是先进行*的运算。

1.2结合性

这里有必要对结合性作一下说明。假如用〇表示需要两个操作数的双目运算符,那么对于表达式

a O b O c

左结合运算符会将表达式解释为:

(a O b) O c

右结合运算符会将表达式解释为:

a O (b O c)

也就是说,遇到优先级相同的运算符时,结合性指明了表达式应从左往右运算还是从右往左运算。

例如,执行减法计算的双目运算符--是左结合性的,所以:

5 - 3 - 1→(5 - 3) - 1 /*左结合性*/

如果为右结合性,就会解释为5-(3-1),答案就不正确了。执行赋值操作的简单赋值运算符=是右结合性的,所以解释如下:

a = b = 1 →a = (b = 1) /*右结合性*/

2.操作符的使用最终带来的是一个表达式的值

2.1.隐式类型转换(整型提升)

C的整型算术运算总是至少以缺省整型类型的精度来进行的。

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

整型提升的意义:

cpp 复制代码
//实例1
char a,b,c;
...
a = b + c;
//b和c的值被提升为普通整型,然后再执行加法运算。
//加法运算完成之后,结果将被截断,然后再存储于a中。

如何进行整体提升呢?

整形提升是按照变量的数据类型的符号位来提升的

2.1.1整形提升的例子

例1:

cpp 复制代码
//实例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;
}

实例1中的a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式 a==0xb6 , b==0xb600 的结果是假,但是c不发生整形提升,则表 达式 c==0xb6000000 的结果是真. 所程序输出的结果是:

分析:

首先a的二进制表示如下:

char a=-74 原码:1011 0110(有符号数,第八位为符号位)

得到其补码:1100 1010------>(整型提升)------> 111111111111111111111111 11001010(补码)该补码表示的数字是 -54!=-74.

同方法可得出前两个if判断都为假

只有最后为int类型的c不会发生整型提升,因此判断为真输出结果为c。


例2:

cpp 复制代码
//实例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个字节

2.2算术转换

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

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

但是算术转换要合理,要不然会有一些潜在的问题。

cpp 复制代码
float f = 3.14;
int num = f;//隐式转换,会有精度丢失

感谢您的支持,以上便是今天全部内容,希望对你有所帮助。

相关推荐
bst@微胖子43 分钟前
Python高级语法之selenium
开发语言·python·selenium
Paddi9301 小时前
Codeforces Round 1004 (Div. 1) C. Bitwise Slides
c++·算法
王小义笔记1 小时前
Postman如何流畅使用DeepSeek
开发语言·测试工具·lua·postman·deepseek
java1234_小锋3 小时前
一周学会Flask3 Python Web开发-request请求对象与url传参
开发语言·python·flask·flask3
流星白龙5 小时前
【C++】36.C++IO流
开发语言·c++
诚信爱国敬业友善6 小时前
常见排序方法的总结归类
开发语言·python·算法
靡不有初1116 小时前
CCF-CSP第31次认证第二题——坐标变换(其二)【NA!前缀和思想的细节,输出为0的常见原因】
c++·学习·ccfcsp
nbsaas-boot7 小时前
Go 自动升级依赖版本
开发语言·后端·golang
架构默片7 小时前
【JAVA工程师从0开始学AI】,第五步:Python类的“七十二变“——当Java的铠甲遇见Python的液态金属
java·开发语言·python
不只会拍照的程序猿8 小时前
从插入排序到希尔排序
java·开发语言·数据结构·算法·排序算法