目录
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
char a,b,c;
...
a = b + c;
//b和c的值被提升为普通整型,然后再执行加法运算。
//加法运算完成之后,结果将被截断,然后再存储于a中。
如何进行整体提升呢?
整形提升是按照变量的数据类型的符号位来提升的
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 的结果是真. 所程序输出的结果是:
分析:
首先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;
}
分析:
实例2中的,c只要参与表达式运算,就会发生整形提升
表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字 节.
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节
但是 sizeof(c) ,就是1个字节
2.2算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
但是算术转换要合理,要不然会有一些潜在的问题。
float f = 3.14;
int num = f;//隐式转换,会有精度丢失
感谢您的支持,以上便是今天全部内容,希望对你有所帮助。