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++11并发编程关于原子操作atomic的代码示例

    C++11并发编程关于原子操作atomic的代码示例

    今天小编就为大家分享一篇关于C++11并发编程关于原子操作atomic的代码示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言中对于循环结构优化的一些入门级方法简介

    C语言中对于循环结构优化的一些入门级方法简介

    这篇文章主要介绍了C语言中对于循环结构优化的一些入门级方法,包括算法设计的改进来提高一些并行性等方法,要的朋友可以参考下
    2015-12-12
  • 详解C++中左值与右值的概念与应用

    详解C++中左值与右值的概念与应用

    左值(Lvalue)和右值(Rvalue)是C++和其他编程语言中用来区分表达式的概念。这篇文章主要为大家详细介绍了它们的概念与应用,需要的可以参考一下
    2023-03-03
  • Qt控件点击消息获取的方法详解

    Qt控件点击消息获取的方法详解

    本文将利用Qt中的QLabel、QPushButton这两个控件,为大家详细介绍一下Qt控件点击消息获取的方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-06-06
  • 输入一个字符串,取出其中的整数(实现代码)

    输入一个字符串,取出其中的整数(实现代码)

    输入一个字符串,内含所有数字和非数字字符。将其中连续的数字作为一个整数,依次存放到一个数组中,统计共有多少个整数,并输出这些数
    2013-09-09
  • C语言预编译#define(预处理)

    C语言预编译#define(预处理)

    这篇文章主要介绍了C语言预编译#define(预处理),#define 机制包括了一个机制,允许把参数替换到文本中,这种实现通常称为宏或者宏定义,下文更多的相关资料介绍需要的小伙伴可以参考一下
    2022-04-04
  • C语言各种操作符透彻理解下篇

    C语言各种操作符透彻理解下篇

    C 语言提供了丰富的操作符,除了上篇中的算术操作符,移位操作符,位操作符,赋值操作符外,还有单目操作符、关系操作符、逻辑操作符、条件操作符等等,让我们通读本篇来详细了解吧
    2022-02-02
  • socket编程的详细讲解

    socket编程的详细讲解

    本文详细讲解了socket编程,它是网络中经常使用的一门技术,该文章通过大量的代码来解释,大家可以参考参考
    2021-08-08
  • C语言实现控制台五子棋小游戏

    C语言实现控制台五子棋小游戏

    这篇文章主要为大家详细介绍了C语言实现控制台五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++ vector的介绍及常见功能实现

    C++ vector的介绍及常见功能实现

    这篇文章主要介绍了C++ vector的介绍及模拟实现,vector在实际中非常的重要,但在实际中我们只要熟悉常见的接口就可以了,最重要的是理解他的底层原理,要能够自己模拟实现出一个简单的vector,本文结合示例代码给大家详细介绍,需要的朋友可以参考下
    2023-05-05

最新评论