国外著名网站建设公司,四川百度推广和seo优化,动漫制作,海外版tiktok免费入口目录 前言一、隐式类型转换1.1 整型提升 二、算术转换三、操作符的属性四、问题表达式总结 前言
表达式求值的顺序一部分由操作符的优先级和结合性决定。 有些表达式的操作数在求值的过程中可能需要转换为其他类型 一、隐式类型转换
隐式类型转换是在编译器自动进行的类型转换… 目录 前言一、隐式类型转换1.1 整型提升 二、算术转换三、操作符的属性四、问题表达式总结 前言
表达式求值的顺序一部分由操作符的优先级和结合性决定。 有些表达式的操作数在求值的过程中可能需要转换为其他类型 一、隐式类型转换
隐式类型转换是在编译器自动进行的类型转换无需显式地指定转换操作。 常见的隐式类型转换情况
将小范围类型赋值给大范围类型例如将int赋值给long将浮点类型赋值给整数类型例如将float赋值给int整数和浮点数之间的运算例如int与float进行加减乘除运算
1.1 整型提升
c语言的整型算术运算总是以缺省整型类型的进度来进行的。 为了保证计算的精度表达式的字符和短整型操作数在使用之前被转换成普通整型这个过程称为整型提升。 整型提升的原因 表达式的整型运算要在CPU的相应运算器件内执行CPU内整型运算器ALU的操作数字节长度一般就是int的字节长度同时也是CPU的通用寄存器的长度。 当两个char类型的值相加在CPU执行时实际要先转换为CPU内整型操作数的标准长度。 通用CPU是难以直接实现两个8比特位直接相加运算。所以表达式各种长度可能小于int长度的整型值都必须转换为int或unsigned int 然后才 能送入CPU去执行。 分析下面的运算结果
char a 5;
char b 126;
char c a b;
printf(%d,c);当进行 ab时a和b需要进行整型提升 当输出c时需要进行整型提升,并且由于整型提升后最高位为1符号位1则需要补码转换原码才能输出。
图1.1 整型提升过程图 二、算术转换
如果某个操作符的各个操作数属于不同的类型那么除非其中一个操作数的转换为另一个操作数的类型否则操作无法进行。下面的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int如果某个操作数的类型在上面这个列表中排名较低那么首先要转换为另一个操作数的类型后执行运算。 具体例子如下如图1.2所示
图1.2 算术转换代码 代码分析 全局变量i的初始值为0进行i–后i的值变为-1,i的类型为int sizeof(i)的结果为4类型为size_tsize_t的类型为unsigned int if条件判断-1是否小于4; 结果分析 结果输出了说明在进行条件判断时判断结果为真。(-1 4)这个表达式为何为真 原因 在进行关系运算之前由于i的类型为int, sizeof(i)的返回值类型为unsigned int两个操作数的类型不一致需要进行算术转换由上面的层次体系可知int需要转换为unsigned int ,则i的值会变成一个非常大的无符号整数。 算术转换的过程如图1.3所示
图1.2 算术转换过程 三、操作符的属性
复杂表达式的求值有三个影响的因素
操作符的优先级操作符的结合性是否控制求值顺序
两个相邻的操作符先执行哪个取决于他们的优先级。 如果两者的优先级相同则取决于他们的结合性。
四、问题表达式
如果不能根据操作符的属性确定唯一的计算路径那这个表达式就是存在问题的。 下面是问题表达式的例子
表达式一
c --c表达式二
int main()
{
int i 0;
i i-- - --i * (i -3) * i i;
printf(%d,i);
return 0;
}表达式 三
int main()
{
int a 1;
int b (a)(a)(a);
printf(%d,b);
return 0;
}表达式四
int fun()
{
static int count 1;
return count;
}
int main()
{
int answer;
answer fun() - fun()*fun();
printf(%d,answer);
return 0;
}总结
本篇文章介绍了c语言中的表达式求值。包括隐式类型转换算术转换和操作符的属性。