建设网站建设多少钱,wordpress回收站在哪,营销型网站设计论文,中国新闻社招聘公示引言#xff1a;在笔试中#xff0c;有一类的题目#xff0c;题目给出代码#xff0c;要求分析得出输出结果。这类题目更加考察我们对于运算顺序和运算类型转换的理解。文章介绍了隐式类型转换和操作符注意点#xff0c;希望增加读者对于表达式求值的理解。
1.隐式类型转…引言在笔试中有一类的题目题目给出代码要求分析得出输出结果。这类题目更加考察我们对于运算顺序和运算类型转换的理解。文章介绍了隐式类型转换和操作符注意点希望增加读者对于表达式求值的理解。
1.隐式类型转换 1.1.整形提升 C语言中运算总是至少以缺省默认整型类型的精度来进行的意思就是再做算术运算的时候如果是charshort类型这样精度所占字节数的数据小于int类型数据的精度会在计算之前被转换为普通整形有符号参与运算。这样做的根本原因是CPU运算器无法处理8比特数据直接运算。注意这里的运算包括算数运算比较运算赋值运算等等。 1.2.赋值的规则 当高精度向低精度赋值时多余部分直接舍去截断 比如char a-1-1为整型所以其补码有32个比特位 原码10000000 00000000 00000001 反码11111111 11111111 11111110 补码11111111 11111111 11111111 而char类型只有1字节8比特位所以直接进行截断11111111截取最后八位存储在a中。 1.3.提升的规则
shortchar提升为int高位直接补充符号位也就是补充8个比特位中的首位补充到32位例如char a-1a中储存的是11111111在运算的时候补充为11111111 11111111 11111111。unsigned char/short提升为int直接补充0 如下列代码在注释中演示了提升截取打印。
char a 1, b 127;//截取之后内存中a的补码01111111
//截取之后内存中b的补码00000001//提升之后a的补码00000000 00000000 01111111
//提升之后b的补码00000000 00000000 00000001//相加之后 的结果: 00000000 00000000 10000000char c a b;//截取之后内存中c的补码10000000//打印时,提升之后的补码11111111 11111111 10000000
// 求得提升之后的原码10000000 00000000 10000000printf(%d, c);
//打印结果-128 1.4.算数转换 如果运算时出现精度更高的转化为精度最高的数据类型之后再进行运算。比如下面代码中计算a-b那么需要先将a提升为float类型之后才进行下一步运算。
int a 1;
float b 3.15;//int 提升为 float 化整补0
b a;
printf(%f\n, b); //1.000000//float 转化为 int 直接舍去小数部分
a b;
printf(%d, a); //1
2.操作符注意点 2.1操作符的优先级两个相邻的操作符谁会先执行。 2.2操作符的结合性相邻的操作符相同执行方向是什么。 2.3是否控制求值顺序语句的执行顺序
具体优先级顺序参考优先级表C语言运算符优先级超详细_和的。运算优先级-CSDN博客
对于结合性说明比如abc相邻的两个操作符都是所以考虑结合性的结合性是从左至右所以先算ab再算abc。
对于求值顺序说明在C语言中||逗号表达式具有求值顺序。比如ab执行该语句先计算a当a为0假的时候b不会计算a为1真时才会计算b的值 || 同理。对于逗号表达式从左至右依次执行最后表达式是整个表达式的值。
注意问题表达式执行顺序不唯一的表达式。在实际使用时要避免产生这样的表达式不然会使得编译器凌乱。比如a*1b2c*3d4e*5f执行的顺序可以是1,3,5,2,4也可以是1,3,2,5,4编号代表运算符这样做的影响是什么顺序不唯一可能每个表达式a也可以代表表达式之间有关联这样顺序不唯一的操作下可能致使结果不唯一。比如如下代码每个编译器的结果都不一样。
int fun(void)
{static int count 1;return count;
}
int main()
{int answer;answer fun() - fun() * fun();printf(%d\n, answer);//输出多少return 0;
}