C基础第17课 ++和--操作符分析

学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。


在这里插入图片描述

在这里插入图片描述

实验1

#include <stdio.h> 

int main()
{
    int i = 0;
    int r = 0;

    r = (i++) + (i++) + (i++);

    printf("i = %d\n", i);
    printf("r = %d\n", r);

    r = (++i) + (++i) + (++i);

    printf("i = %d\n", i);
    printf("r = %d\n", r);

    return 0;
}

在VC编译器中:

在这里插入图片描述

    r = (i++) + (i++) + (i++);

vc编译器 是将i的值 先取出来,连续的取三次,每次都是0,再进行加法运算,所以r结果是0,最后又连续的做三次自增1的操作,所以i的值就成了3

在这里插入图片描述


 r = (++i) + (++i) + (++i);

在这里插入图片描述

VC编译器将i这个变量先自增了三次,变成了6,后面做 6+6+6 的加法 r 为 18


在GCC 编译器中

在这里插入图片描述

    r = (i++) + (i++) + (i++);

在这里插入图片描述

vc编译器 是将i的值 先取出来,连续的取三次,每次都是0,再进行加法运算,所以r结果是0,最后又连续的做三次自增1的操作,所以i的值就成了3


r = (++i) + (++i) + (++i);

在这里插入图片描述
先做两次自增,5+5 ,再做第三次自增 10+6

在这里插入图片描述
注意:在C语言中,只规定了++和–这两个操作符所对应的指令的相对执行次序,那么也就是说对于前置的++或者–操作符而言,我们的自增1或者自减1必须先做,之后再做取值就可以了,他只规定了这样的相对执行次序,并没有规定这两条指令必须连续的运行,也就是可以说被打断!!!!

在这里插入图片描述

在这里插入图片描述

实验 :贪心法

#include <stdio.h>

int main()
{   
    int i = 0;
  //  int j = ++i+++i+++i;// ++i++ ==> 1++ error 编译器不理解 1++这样写法
    //1++; //error
    int a = 1;
    int b = 4;
    int c = a+++b;// a+++b; ==> 1+4=5  a=2
    
    int* p = &a;
    
    b = b/*p;

    printf("i = %d\n", i);
    printf("j = %d\n", j);
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
      
    return 0;
}

// int j = ++i+++i+++i;// ++i++ ==> 1++ error 编译器不理解 1++这样写法
首先 编译器读取第一个 +,编译器发现一个 + 没有意义,所以继续读,又读到了一个+,变成了++,这时候编译器认识到 这肯定是一个前置运算符++操作,那显然这时候后面需要一个变量啊,所以很贪心的继续读入i,此时就变成了 ++i 了,理论上这个时候编译器就应该去计算这个 ++i 的值了,但是编译器很贪心 没有去处理,而是再去读了一个 +进来,变成了 ++i+,可以理解为 前置后再加一个值啊,所以编译器又继续读 读入了一个+,变成了 ++i++,这时候编译器就认为再继续读字符也不可能组成有意义的字符了,所以开始计算读入的字符。1++ error 编译器不理解 1++这样写法。

在这里插入图片描述

在这里插入图片描述
上面程序加上空格后
在这里插入图片描述

在这里插入图片描述

发布了192 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/103654415
今日推荐