在这里学习了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;
}
~~~
- 前言
- 实例一:HelloWorld
- scanf函数学习
- 实数比较
- sizeof()保留字获取类型的大小
- 自增/自减学习
- C学习if条件判断和for循环
- C实现的九九乘法表
- C实现一个比较简单的猜数游戏
- 使用C模拟ATM练习switch..case用法
- 记录一个班级的成绩练习一维数组
- C数组实现矩阵的转置
- C二维数组练习
- 利用数组求前n个质数
- C实现万年历
- C实现数组中元素的排序
- C实现任意进制数的转化
- C判断一个正整数n的d进制数是否是回文数
- C使用递归实现前N个元素的和
- 钢材切割问题
- 使用指针比较整型数据的大小
- 指向数组的指针
- 寻找指定元素
- 寻找相同元素的指针
- 整数转换成罗马数字
- 字符替换
- 从键盘读入实数
- C实现字符行排版
- C实现字符排列
- C实例--判断一个字符串是否是回文数
- 通讯录的输入输出
- 扑克牌的结构定义
- 使用“结构”统计学生成绩
- 报数游戏
- 模拟社会关系
- 统计文件中字符个数
- C实现两个文件的内容输出到同一个屏幕