操作符和表达式求值

目录

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的整型算术运算总是至少以缺省整型类型的精度来进行的。

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

整型提升的意义:

操作符和表达式求值_第1张图片

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

如何进行整体提升呢?

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

操作符和表达式求值_第2张图片

2.1.1整形提升的例子

例1:

//实例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 的结果是真. 所程序输出的结果是:

操作符和表达式求值_第3张图片

 分析:

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

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

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

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

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


例2:

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

操作符和表达式求值_第4张图片

 分析:

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

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

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

但是 sizeof(c) ,就是1个字节

2.2算术转换

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

操作符和表达式求值_第5张图片

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

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

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

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

你可能感兴趣的:(c语言,c++,开发语言)