看别人的博客,看了半天拿他的示例代码在vsc++程序上一跑才发现他给的结果不对,再在java上一跑结果又变回去他的结果了,具体就是对于初始i=0,for循环i=i++这个语句之后java中i=0,c++中i的值会不断累加,再看另外一个相关博客据说是编译器的原因,不多想了就记住c++的原理吧……
i++:返回i的值,然后i=i+1
++i:返回i+1的值,然后i=i+1
例1:
int main() { int i = 3, j, k; cout << i++ << endl;//第1步 cout << i++ << endl;//第2步 cout << ++i << endl;//第3步 system("pause"); return 0; }
输出为:
解析:
第一步i++:返回i的值为3,i=i+1后i为4
第二步i++:返回i的值为4,i=i+1后i为5
第三步++i:返回i+1的值为6,然后i=i+1后i为6
例2:
int main() { int i = 0; for (int n = 0; n < 3; n++) { i = i++; } cout << i << endl; system("pause"); return 0; }
输出为:3.
解析为:
i=0
i=i++:i被赋值为0,然后i=i+1为1
i=i++:i被赋值为1,然后i=i+1为2
i=i++:i被赋值为2,然后i=i+1为3
即:i=3.
例3:
int a = 2; int b = (3 * a++) + a; cout << a << " " << b << endl;
输出为:3 8
int a = 2; int b = (3 * ++a) + a; cout << a << " " << b << endl;
输出为:3 12
解析:
b=(3*a++)+a; a以变化之前的值2代入计算,为3*2+2=8
b=(3*++a)+a; a以变化之后的值3代入计算,为3*3+3=12
例4:
int i = 1; int j = 1; int k = i++ + ++i + ++j + j++; cout << k << endl;
输出结果为8.
解析:
k = i++ + ++i + ++j + j++;
这一行代码,第一个i++执行后1代入计算,但是i为2,然后++i,3代入运算,i为3,++j2代入运算,j为2,j++2代入运算,j为2.
即k=1+3+2+2=8
程序员面试宝典中的题如下:
1.程序代码如下:
int i = 3,j = 4; i ? i++:++j; printf("%d%d\n",i,j);
解析:
i?i++:j++表示如果?前是真则进行i++,否则进行j++。因为i=3是真,执行i++
,j不变化,输出为:i=4,j=4.
如果换作是0?i++:j++,输出则为i=3,j=5.因为判断不为真,所以执行冒号后面的操作。
2.代码如下,求程序代码输出:
int i= 1,j = 2; int k = i+++j; cout<<k<<endl;
解析:
i+++j首先结合i++,然后再+j,但是i++是事后计算的,先计算i+j并赋值给k,然后i再自加,所以k的值是1+2=3,然后i才自加到2.
扩展:
int k = ++i+j,则i先自增为2然后加j得到4赋给k,k=4.
3.x=x+1,x+=1,x++,哪个效率最高?
解析:
x=x+1效率最低,它的执行过程如下:
(1)读取右x的地址
(2)x+1
(3)读取左x的地址
(4)将右值传给左边的x(编译器不认为左右x的地址相同)
x+=1其次,其执行过程如下:
(1)读取右x的地址
(2)x+1
(3)将得到的值传给x(因为x的地址已经读出)
x++效率最高,其执行过程:
(1)读取右x的地址
(2)x自增1
综上,x++效率最高,x+=1其次,x=x+1效率最低。
3.代码如下,求输出:
#define product(x) (x*x) int main() { int i = 3, j, k; j = product(i++); k = product(++i); printf("j=%d,k=%d\n", j, k); system("pause"); return 0; }
解析:
product(i++)=i++*i++;i=3,所以j=9,此时i已经累加到5.
product(++i)要求先累加i,累加后i=7,所以product(++i)的结果是49.