i++和++i的区别及在for()循环语句中的应用细节
#include<stdio.h> #include<stdlib.h> int main() { int i,j; for (i=1; i <= 10; i++) printf("%d ", i); printf("\n i=%d \n", i); for (j = 1; j <= 10; j++) printf("%d ", j); printf("\n j=%d \n", j); system("pause"); return 0; }
#include<stdio.h> #include<stdlib.h> int main() { int i,j,x=1,y=1; for (i = 1; i <= 10; i++) { printf("x=%d \n", x); x++; } printf("\n i=%d \n\n", i); for (j = 1; j <= 10; j++) { printf("y=%d \n", y); ++y; } printf("\n j=%d \n", j); system("pause"); return 0; }
#include<stdio.h> #include<stdlib.h> int main() { int a = 5, b; b = a++; //我们可以这样理解该语句执行细节:步骤1、b=a; 步骤2、a=a+1=6 printf("\n a = 5 ,b未赋值,若 b = a++, 则有:b = %d,a = %d \n\n", b, a); //输出:b = 5,a = 6 int c = 5, d; d = ++c; //我们可以这样理解该语句执行细节:步骤1、c=c+1=6; 步骤2、d=c=6; printf("\n c = 5 ,d未赋值,若 d = ++c, 则有:c = %d , d = %d \n\n", c, d); //输出:c = 6 , d = 6 int e = 16, f; f = (e++) + ++e; /* 我们可以这样理解该语句执行细节: 步骤1、执行++e,e=e+1=17(因为这个表达式里面,++e的优先级最高,要先算它); 步骤2、f=17+17=34(这时候e=17); 步骤3、e=e+1=18; */ printf("\n e = 16 , f未赋值,若 f = e++ + ++e,则有e = %d,f = %d \n\n", e, f); //输出:e = 18,f = 34 int j = 16, k; k = ++j + j++; /* 我们可以这样理解该语句执行细节:步骤1、执行++j,j=j+1=16+1=17; 步骤2、k=17+17=34(这时候j=17),步骤3、j=j+1=17+1=18; */ printf("\n j = 16, k未赋值,若 k = ++j+ j++,则有j = %d ,k = %d \n\n", j, k); /* 输出:j = 18 ,k = 34 codeblocks输出:j = 18,k = 35 */ int m = 20, n; n = 1 + (m++); //我们可以这样理解该语句执行细节:步骤1、n=1+m=1+20=21;步骤2、m=m+1=20+1=21; printf("\n m = 20, n未赋值,若 n = 1 + m++,则有m = %d , n = %d \n\n", m, n); //输出:m = 21 , n = 21 int p = 50, q; q = 1 + ++p; //我们可以这样理解该语句执行细节:步骤1、p=p+1=50+1=51;步骤2、q=q+1=51+1=52; printf("\n p = 50, q未赋值,若q = 1 + ++p,则有p = %d , q = %d \n\n", p, q); //输出:p = 51 , q = 52 system("pause"); return 0; }/* 通过上述程序语句,我们可以这样理解:1、 含有++i的表达式,按照程序优先级(具体参见相关资料,一般先算i=i+1; 2、含有i++的表达式,i=i+1的优先级排在最后(哪怕是(i++)这种形式),是表达式语句最后执行的一个步骤 (在VS2017编译是这样,在codeblocks不是) 3、引申到for( ;判定语句;i++)和( ;判定语句;++i)的情况,这两种形式效果是一样的。因为无论是i++,还是++i, 它都是一个表达式,在这个表达式语句执行完之前,是不会执行判定语句的。也就是执行完i=i+1后(无论是i++,还是++i), 再将i代入判定语句(在VS2017和codeblocks都同样结果) */