广西电力工程建设公司网站,用校园网如何搭建WordPress,网站的模版可以换吗,专业做网站建设公司有哪些#x1f6a9;纸上得来终觉浅#xff0c; 绝知此事要躬行。 #x1f31f;主页#xff1a;June-Frost #x1f680;专栏#xff1a;C语言 #x1f525;该篇将探讨 操作符 和 类型转换 对表达式求解的影响。 目录#xff1a; 隐式类型转换算术转换操作符的属性❤️ 结语 隐… 纸上得来终觉浅 绝知此事要躬行。 主页June-Frost 专栏C语言 该篇将探讨 操作符 和 类型转换 对表达式求解的影响。 目录 隐式类型转换算术转换操作符的属性❤️ 结语 隐式类型转换 C的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。为了获得这个精度表达式中的字符和短整型操作数在使用之前被转换为普通整型这种转换称为整型提升。 整型提升规则 整形提升是按照变量的数据类型的符号位来提升的。 如果是无符号的整形提升那么高位补0。 为了更好的理解这样的概念将举一个例子来解释
#includestdio.h
int main()
{char a 5;char b 127;char c a b;printf(%d\n, c);return 0;
}char a 5; 5是整型类型32个bit补码是00000000 00000000 00000000 00000101将5存储到a中a是有符号char类型只有8个bit所以要发生截断将低位的 00000101 存储到a中。 char b 127 同理127的补码是 00000000 00000000 00000000 01111111 存储b时发生截断所以将低位的 01111111 存储到b中。 char c a b; 这里的操作数 a 和 b 是字符类型所以要发生整型提升。 printf(%d\n, c); %d - 10进制的形式打印有符号的整数 , 而c是字符类型所以再次发生整型提升。
由于这种转换是隐式的也无法监控到那如何证明确实有这样的转换呢 1. 当判断 a 0xb6 时a会发生整型提升由 10110110 变为 11111111 11111111 11111111 10110110 本质上 0xb6 是个数值 可以看作 00000000 00000000 00000000 10110110 这自然是不同的,所以结果是假b同理但是c是整型不需要整型提升所以表达式 c0xb6000000 的结果是真 。 2. c 和 -c 参与了表达式运算发生了整型提升转化为了普通整型。
通过以上两个例子可以看出在表达式求解过程中有着整型提升的参与。
整型提升有两个意义 1.表达式的整型运算要在CPU的相应运算器件内执行CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度同时也是CPU的通用寄存器的长度。因此即使两个char类型的相加在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
2.通用CPUgeneral-purpose CPU是难以直接实现两个8比特字节直接相加运算虽然机器指令中可能有这种字节相加指令。所以表达式中各种长度可能小于int长度的整型值都必须先转换为int或unsigned int然后才能送入CPU去执行算。 当表达式中有char 和 short 时需要整型提升当表达式中没有这两个类型只剩下别的类型时就会有算术转换的参与。 算术转换 如果某个操作符的各个操作数属于不同的类型那么除非其中一个操作数的转换为另一个操作数的类型否则操作就无法进行。下面的层次体系称为寻常算术转换。 例如 int a 0; float b 5.5; 如果要执行 a b , a 会在计算的时候临时转化为float类型与 b 相加后得到一个 float 类型的结果。 操作符的属性
复杂表达式的求值有3个影响因素 1.操作符的优先级 2.操作符的结合性; 3.是否控制求值顺序;
两个相邻的操作符先执行哪个取决于他们的优先级。如果两者的优先级相同取决于他们的结合性。
操作符属性表优先级从上至下
操作符描述用法示例结果类型结合性是否控制求值顺序聚组表达式与表达式同N/A否函数调用rexprexp…,rexprexpL-R否[ ]下标引用rexp[rexp]lexpL-R否.访问结构成员lexp.member_namelexpL-R否-访问结构指针成员rexp-member_namelexpL-R否后缀自增lexp rexpL-R否–后缀自减lexp –rexpL-R否!逻辑反! rexprexpR-L否单目表示正值 rexprexpR-L否-单目 表示负值- rexprexpR-L否前缀自增 lexprexpR-L否–前缀自减– lexprexpR-L否*间接访问* rexplexpR-L否取地址 lexprexpR-L否sizeof取其长度 以字节表示sizeof rexp sizeof(类型)rexpR-L否(类型类型转换(类型) rexprexpR-L否*乘法rexp * rexprexpL-R否/除法rexp / rexprexpL-R否%整数取余rexp % rexprexpL-R否加法rexp rexprexpL-R否-减法rexp - rexprexpL-R否左移位rexp rexprexpL-R否右移位rexp rexprexpL-R否大于rexp rexprexpL-R否大于等于rexp rexprexprexp否小于rexp rexprexpL-R否小于等于rexp rexprexpL-R否等于rexp rexprexpL-R否!不等于rexp ! rexprexpL-R否位与rexp rexprexpL-R否^位异或rexp ^ rexprexpL-R否I位或rexprexprexpL-R逻辑与rexp rexprexpL-R是II逻辑或rexprexprexp? :条件操作符rexp? rexp : rexprexpN/A是赋值lexp rexprexpR-L否以…加lexp rexprexpR-L否-以…减lexp - rexprexpR-L否*以…乘lexp * rexprexpR-L否/以…除lexp / rexprexpR-L否%以…取模lexp % rexprexpR-L否以…左移lexp rexprexpR-L否以…右移lexp rexprexpR-L否以…与lexp rexprexpR-L否^以…异或lexp ^ rexprexpR-L否I以…或lexp I rexprexpR-L否,逗号rexp rexprexpL-R是
❗️但是就算操作符有这些属性也不一定会使得表达式有着唯一的求解路径例如 例1
a* b c * d e * f;两种求解路径 例2
int c 3;
c --c;这样的表达式有两种路径 操作符的优先级只能决定自减–的运算在的运算的前面但是我们并没有办法得知操作符的左操作数的获取在右操作数之前还是之后所以结果是不可预测的是有歧义的。
⚠警告 表达式如果不能通过操作符的属性确定唯一的计算路径那这个表达式就是存在问题的。
❤️ 结语 文章到这里就结束了如果对你有帮助你的点赞将会是我的最大动力如果大家有什么问题或者不同的见解欢迎大家的留言~