C语言操作符——表达式求值
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
隐式类型转换
整型提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。什么意思呢?举个例子:
#include<stdio.h>
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d", c);
return 0;
}
在这段代码中,a+b是如何运算的呢?编译器会将char类型提升为int型,也就是说1个字节被扩充为4个字节,那么如何编程4个字节呢?如果是无符号类型,那么就在前面全补“0”,如果是有符号类型,正数就全补“0”,负数就全补“1”,就拿上述代码为例,a的二进制是00000011,是char类型,计算时需要变为int型,又因为正数,那么为00000000000000000000000000000011,同理b也是如此,如此在进行计算,得到c的值,但是c时char类型,所以会发生截断变成10000010,当打印时,又以整型打印所以再发生整型提升,又因为是负数,所以变成11111111111111111111111110000010,再将补码换算成原码,所以打印结果为-126。
算数转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。这种类型就不包括char和short类型。举个例子:
int main()
{
int a = 4;
float f = 4.5f;
float r = a + f;
return 0;
}
在这个运算中,我们会将int类型转化为float类型在进行数值上的运算,否则就无法进行。
总结:yuns
1、在进行类型short和char运算时(存储也是),会将这两种类型转化为int类型,然后在截断。这就叫做整型提升。
2、在其他类型运算时,会将精度低的类型转化为精度高的类型,来方便运算。这就叫做算数转换。
操作符的属性
操作符的优先级
关于操作符的优先级问题涉及的字符较多,就不细细说明。我们来看几个例子:
#include<stdio.h>
int main()
{
int a = 2;
int b = 4;
int c = a + b * 3;
return 0;
}
这就跟我们数学中是一样的,编译器会处理两个相邻的操作符,在这段代码中,计算机会先处理“*”在处理“+”
操作符的结合性
当操作符的优先级相同时,我们就需要考虑操作符的结合性。举个例子:
#include<stdio.h>
int main()
{
int a = 2;
int b = 4;
int c = a + b + 3;
return 0;
}
这段代码中,两个“+”的优先级是一样的,而“+”的结合性时从左向右的,也就是说,先算左边a+b,再算+3。
控制求值顺序
关于控制求值顺序,很简单,我们只需要知道逻辑或和逻辑与,还有条件操作符和逗号表达式有这种性质就行,什么意思呢?举个例子:在计算的的时候,我们直到逻辑与只要前面为假,后面就不会再运算了,而逻辑或则是前面为真,那么后面就不会运算了。这种性质就叫控制求值顺序。
标签:int,C语言,char,类型,操作符,整型,求值 来源: https://blog.csdn.net/qq_57563254/article/details/119293971
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。