版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/44817199
在这里学习了C中的自增和自减,但是后面学习了前缀和后缀及其混合之后,发现使用不同的编译器,其中的规则是不一样的,而且平时我们书写程序的时候也不会写这样复杂的代码,例如i+++i+++i++等,这样一方面在可读性方面很差,另一方面就是在移植性方面,不同的编译器就会出现不同的结果,所以这样写是不理想的。
#include <stdio.h>
/**
* 自增/自减运算的应用
* @brief main
* @return
*/
int main(void)
{
int a = 5,b,c,i = 10;//变量定义及初始化
//将a赋值给b,然后自增1
b = a++; //b = 5,a = 6
//b先自增1,然后赋值给c
c = ++b; //b = 6,c = 6
printf("a = %d,b = %d,c = %d\n",a,b,c); //a=6,b=6,c=6
/**
* C函数参数的入栈顺序是从右向左的
* 主要是为了支持参数可变长度
* 则下面的输出为12,11,10
*/
printf("i,i++,i++ = %d,%d,%d\n",i,i++,i++); /**输出i,i++,i++**/
printf("%d\n",++i); //i自增1,然后输出i 13 i=13
printf("%d\n",--i); //i自减1,然后输出i 12 i=12
printf("%d\n",i++); //先输出i,然后i自增1 12 i=13
printf("%d\n",i--); //先输出i,然后i自减1 13 i=12
printf("%d\n",-i++); //i先取负,然后输出i,最后i自增1 -12 i=13
printf("%d\n",-i--); //i先取负,然后输出i,最后i自减1 -13 i=12
/**
* 有关于自增/自减问题的总结
*/
/*************************************/
/* 1:表达式中,一般情况下,是从左向右 */
/* 函数参数中,运算方向是从右向左 */
/************************************/
/*************************************/
/* 2:后缀,先取值,再自增 */
/************************************/
//例子
int m = 5,n;
n = m+++m+++m++; //相当于a=(m++) + (m++) + (m++);
//但由于是后缀,则先取值运算之后,在进行自增
//所以 n = m + m + m; m++; m++; m++;
//所以最后结果 n=15,m=8
printf("n = %d,m = %d",n,m);
/*************************************/
/* 3:前缀,前两个自增后取值 */
/* 后面的每个自增后都取值 */
/************************************/
//例子
int p,j=5;
p = ++j + (++j) + (++j);
//则根据规则,前两个自增之后再取值
//则变化之后 j=7 p = 7 + 7 + (++j);
//两个之后的所有前缀每一个都先自增接着取值
//则 j = 8, p = 7 + 7 +8;
// p = 22, j = 8
printf("p = %d,j = %d",p,j);
/*************************************/
/* 4:前缀,后缀混合情况 */
/************************************/
//学到这里我发现这个编译器不同,最后的结果也是不一样的,所以感觉很没有意义
return 0;
}