学习自狄泰软件学院唐佐临老师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++这样写法。
上面程序加上空格后