C语言中-a++和-++a运算顺序实例解析

 更新时间:2022年11月08日 11:42:04   作者:懒笑翻  
C语言中的a++和++a的区别在于混合表达式中运算符的处理顺序,下面这篇文章主要给大家介绍了关于C语言中-a++和-++a运算顺序的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下

前言

-a++ ,如果a=3,那么-a++输出的结果是多少? -3还是-4?

一、首先

先来了解一下算术运算符的优先级和结合性:

运算符优先级结合性
++、--、+(正)、-(负)同级

^

|

|

右结合
*、/、%同级左结合
+(加)、-(减)同级左结合

右结合*、/、%同级左结合+(加)、-(减)同级左结合

在C语言中,计算表达式的值也需要按运算符的优先级从高到低的顺序进行计算。

例如,表达式 a+b*c 相当于 a+(b*c).

若操作数两侧运算符的优先级相同,则按结合性(结合方向)决定计算顺序,

若结合方向为“从左到右”,则操作数先与左边的运算符结合;

若结合方向为“从右到左”,则操作数先与右边的运算符结合;

例如,表达式-a++,- 与 ++ 同级,此时按结合方向决定计算顺序(右结合),相当于 -(a++)。

二、其次

我们来运行一下 -a++ 感受一下:

#include <stdio.h>
 
int main() {
    int a = 3;
    int b = 5;
    printf("%d\n",-a++);
    printf("%d\n",a);
 
    printf("%d\n",-++b);
    printf("%d\n",b);
    return 0;
}

在运行结果出来之前,我们先来猜猜输出结果是怎样的? -4  4 -6  6 ?如果是这样的话大概忘记了++前置和后置了?

运行结果:

使用的编译软件:CLion

~~~结果有疑惑?请看下方解惑~~~

(初学者提示:下图中左边箭头所指即当前程序运行到这一行,运行到当前行时右边会有变量当前取值。)

图1: 此时我们发现 -a++ 中,a的值还是3,这是因为 a++ ,++后置,

所以在这里print 输出结果是-3,

图2:在这第6行运行完后,a++生效,也就是a=a+1,这时候a=4,所以在这里第7行运行print输出的结果是4。

 图3:这里这个b是为了对比-a++的结果的。-++b,意思是 -(++b),++前置,那么我们先b=b+1,这时候b=6,再走-b的输出。也就是print 输出 -6。

 图4:这里输出b,此时我们从第9行时b已经++b,因此b=5+1=6,所以在这里输出为6。

补充:下面讲解下3-3的例题

int a = 100; 最开始时a是100。

打印 a++;  这个printf会打印a++的值,注意是a++表达式的值,看我前面的讲解,a++的值就是a的值,也就是100。 别忘了这语句结束后a的值就会自增1(也就是副作用发生了)。

打印 ++a;  目前a的值为101。现在要打印++a表达式的值,++a的值就等于a+1,所以会打印出102。 此语句后a=101+1=102。

打印 --a;  这次要打印--a表达式的值,同自增一个道理,--a的值等于a-1,所以会打印出101。 此语句后a=102-1=101。

打印 a--;  a--表达式的值就是a的值,所以打印出101。 此语句后a=101-1=100。

打印 a+1;  这表达式与自增无关,只是打印a+1的值,就是101。 对a本身的值没有影响(加法表达式没有副作用)。

打印 a;  这时a的值当然还是100了。

最后

综上,-a++ ,如果a=3,那么-a++输出的结果是-3,运算顺序还是 -(a++),只是++后置,此时a=a+1要在执行完这一行才执行,如果是++前置,那么也就是 -++a 的情况,那么输出的结果就是-4。

到此这篇关于C语言中-a++和-++a运算顺序的文章就介绍到这了,更多相关C语言-a++和-++a运算顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C语言示例讲解switch分支语句的用法

    C语言示例讲解switch分支语句的用法

    这篇文章主要为大家介绍了switch语句,switch语句是我们常见会用到的结构,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • C语言中结构体和共用体实例教程

    C语言中结构体和共用体实例教程

    这篇文章主要给大家介绍了关于C语言中结构体和共用体的相关资料,结构体是一种自定义的复合数据类型,共用体也叫联合体,使几个不同类型的变量共占一段内存(相互覆盖),需要的朋友可以参考下
    2021-06-06
  • C++中的重载、覆盖、隐藏介绍

    C++中的重载、覆盖、隐藏介绍

    这篇文章主要介绍了C++中的重载、覆盖、隐藏介绍,需要的朋友可以参考下
    2015-04-04
  • C++实现学生档案管理系统

    C++实现学生档案管理系统

    这篇文章主要为大家详细介绍了C++实现学生档案管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言超详细讲解循环与分支语句基础

    C语言超详细讲解循环与分支语句基础

    各位小伙伴们,今天给大家带来的是循环与分支语句,本篇将会向大家介绍这些语句的格式和使用的基本方法,感兴趣的朋友来看看吧
    2022-04-04
  • C++多态与虚拟之C++编译器对函数名的改编(Name Mangling)

    C++多态与虚拟之C++编译器对函数名的改编(Name Mangling)

    在Windows DLLs中,使用C++编写的DllMain()等callback函数需避免C++编译器进行name mangling,因此需使用extern "C",这篇文章主要介绍了C++多态与虚拟:C++编译器对函数名的改编(Name Mangling),需要的朋友可以参考下
    2024-04-04
  • C++基本用法实践之模板详解

    C++基本用法实践之模板详解

    C++的模板是泛型编程思想的一种实现,模板不光支持函数模板,还有类模板等,本文主要来和大家聊聊C++中模板的相关用法,需要的可以参考一下
    2023-07-07
  • VsCode搭建C语言运行环境详细过程及终端乱码问题解决方案

    VsCode搭建C语言运行环境详细过程及终端乱码问题解决方案

    这篇文章主要介绍了VsCode搭建C语言运行环境以及终端乱码问题解决,在VsCode中搭建C/C++运行环境需要先安装几个插件,具体插件文中给大家详细介绍,需要的朋友可以参考下
    2022-12-12
  • C语言常用的编辑器你知道几个

    C语言常用的编辑器你知道几个

    这篇文章主要为大家详细介绍了C语言常用的编辑器,中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++教程之进制转换的实现方法

    C++教程之进制转换的实现方法

    在C++中进行进制转换可以通过标准库函数或自定义算法实现,本文主要为大家整理了两种常见场景的转换方法及示例代码,有需要的小伙伴可以根据需求进行选择
    2025-04-04

最新评论