关于C语言中对整个表达式强制转换为float的执行逻辑疑问
嵌入式C代码运算规则疑问解答
先明确代码上下文:
int buffer[100]; buffer[0] = ((float)(( buffer[0] + buffer[1])/3)+0.8);
针对你的两个疑问解答如下:
这种写法不会让所有运算都当作float处理
buffer[0]和buffer[1]都是int类型,它们的加法buffer[0] + buffer[1]会以整数运算执行,结果还是int;- 接着除以3的操作
/3也是整数除法,会直接截断小数部分,结果依然是int; - 只有当这个整数结果被强制转换为float后,后续的运算才会涉及浮点类型,但和0.8相加时,因为0.8默认是double类型,float会被提升为double进行运算,最后再被外层的
(float)转换回float,最终赋值给int类型的buffer[0]时,还会再次截断小数转成整数。
是的,括号内的表达式会先执行整数运算
(buffer[0] + buffer[1])/3会优先按照整数运算规则执行:先做整数加法,再做整数除法,完全截断小数部分得到一个int值;- 这个int值随后被强制转换为float,再和double类型的0.8相加(此时float自动提升为double);
- 相加后的double结果被外层的
(float)转换为float,最后赋值给int类型的buffer[0]时,截断小数部分得到最终的整数值。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

