C语言表达式求值中类型转换和优先级等问题详解

 更新时间:2023年05月30日 10:07:49   作者:夏微凉(●'◡'●)  
表达式求值是一个常见的问题,可以用C语言实现,下面这篇文章主要给大家介绍了关于C语言表达式求值中类型转换和优先级等问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

1.隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

整型提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。 因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长 度。 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转 换为 int 或 unsigned int,然后才能送入CPU去执行运算。

 如何进行整形提升呢?

整形提升是按照变量的数据类型的符号位来提升的

 负数的整形提升

 正数的整形提升

 无符号整形提升,高位补0

分析下面的代码:

 具体过程如下:

 程序输出结果:

 分析下面的代码:

 c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.

表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof(c) ,就是1个字节.

2.算数转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

3.操作符的属性

复杂表达式的求值有三个影响的因素。

1. 操作符的优先级

2. 操作符的结合性

3. 是否控制求值顺序。

两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。 操作符优先级

相邻操作符优先级高的先计算,低的后算。

相邻操作符的优先级相同的情况下,结合性起作用。

即使掌握了各种操作符的优先级和结合性,我们也可能回写出bug:

int main()
{
	int i = 10;
	i = i-- - --i * (i = -3) * i++ + ++i;
	printf("i = %d\n", i);
	return 0;
}

 这串代码再不同的编译器下可能会产生不同的结果。

下面的代码也是错误代码,再不同的编译器中的结果也有所不同:

 在vs编译器下ret的结果时12,而在gcc下ret的值时10

总结

到此这篇关于C语言表达式求值中类型转换和优先级等问题详解的文章就介绍到这了,更多相关C语言类型转换和优先级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现刮刮乐效果是示例代码

    C语言实现刮刮乐效果是示例代码

    这篇文章主要为大家详细介绍了如何C语言模拟实现刮刮乐的效果,只要按下鼠标左键并移动就可以刮开刮卡层,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-01-01
  • 用C语言实现2048游戏

    用C语言实现2048游戏

    这篇文章主要为大家详细介绍了用C语言实现2048游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 用C实现PHP扩展 Fetch_Url 类数据抓取的方法

    用C实现PHP扩展 Fetch_Url 类数据抓取的方法

    该扩展是基于libcurl基础实现的网页数据抓取
    2013-04-04
  • Cocos2d-x UI开发之菜单类使用实例

    Cocos2d-x UI开发之菜单类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之菜单类使用实例,本文的代码中含有详细注释,需要的朋友可以参考下
    2014-09-09
  • C语言 数据结构堆排序顺序存储(升序)

    C语言 数据结构堆排序顺序存储(升序)

    这篇文章主要介绍了C语言 数据结构堆排序顺序存储(升序)的相关资料,需要的朋友可以参考下
    2017-05-05
  • 关于C语言除0引发的思考

    关于C语言除0引发的思考

    很多 C 库都提供了一组函数用来判断一个浮点数是否是无穷大或 NaN。int _isnan(double x) 函数用来判断一个浮点数是否是 NaN,而 int _finite(double x) 用以判断一个浮点数是否是无穷大
    2013-08-08
  • C语言 struct结构体超详细讲解

    C语言 struct结构体超详细讲解

    C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型),下面这篇文章主要给大家介绍了关于C语言结构体(struct)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • C语言杨氏矩阵中查找元素的示例代码

    C语言杨氏矩阵中查找元素的示例代码

    本文主要介绍了C语言杨氏矩阵中查找元素的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++中std::optional的使用指南分享

    C++中std::optional的使用指南分享

    C++ 17 引入了std::optional,表示一个可能有值的对象,这篇文章主要来和大家聊聊std::optional的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06
  • C++实现简单BP神经网络

    C++实现简单BP神经网络

    这篇文章主要为大家详细介绍了C++实现简单BP神经网络,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论