cout的输出顺序
int c = 5;
在編譯階段已經(jīng)被翻譯為:?
這里有個陷阱,看下面的程序:?
輸出為什么是4,0而不是期望中的4,3???就在于sizeof在編譯階段處理的特性。由于sizeof不能被編譯成機(jī)器碼,所以sizeof作用范 圍內(nèi),也就是()里面的內(nèi)容也不能被編譯,而是被替換成類型(也就是說括號內(nèi)的表達(dá)式不會運(yùn)算)。=操作符返回左操作數(shù)的類型,所以a=3相當(dāng)于int,而代碼也被替換為:?
所以,sizeof是不可能支持鏈?zhǔn)奖磉_(dá)式的,這也是和一元操作符不一樣的地方。?
結(jié)論:不要把sizeof當(dāng)成函數(shù),也不要看作一元操作符,把他當(dāng)成一個特殊的編譯預(yù)處理。?
int f1() {printf("f1()\n");return 1; }int f2() {printf("f2()\n");return 2; }int f3() {printf("f3()\n");return 3; }int main(void) { int i = 0;int j = 0;//printf("%d %d\n",i,i++);//0 0//cout<<j<<" "<<j++<<endl;//0 0//printf("%d %d\n",j++,j);//0 0//cout<<i++<<" "<<i<<endl;//0 1//printf("%d %d\n",i,++i);//1 1//cout<<j<<" "<<++j<<endl;//1 1//printf("%d %d\n",++j,j);//1 1//cout<<++i<<" "<<i<<endl;//1 1/*printf("%d,%d,%d\n",f1(),f2(),f3());cout<<f1()<<f2()<<f3()<<endl;*///printf("%d \n", i++);//0printf("%d %d\n",++i, i++);//1 0cout<<++j<<" "<<j++<<endl;//1 0return 0; }
?cout<<(c = 2)<<" "<<(c = 3)<<" "<<(c = 1)<<endl;
cout是從右到左依次求解,再輸出的
2 2 2
? int a = 1;
? ?cout<<a++<<" "<<a<<endl;
? ??
? ?int b = 1;
? ?cout<<++b<<" "<<b<<endl;
output:
1 2
2 2
如果是
cout << sizeof(a++) << a << endl
output:
4 1
?sizeof更像一個特殊的宏,它是在編譯階段求值的。舉個例子:
| cout<<sizeof(int)<<endl; // 32位機(jī)上int長度為4 cout<<sizeof(1==2)<<endl; // == 操作符返回bool類型,相當(dāng)于 cout<<sizeof(bool)<<endl; |
在編譯階段已經(jīng)被翻譯為:?
| cout<<4<<endl; cout<<1<<endl; |
這里有個陷阱,看下面的程序:?
| int a = 0; cout<<sizeof(a=3)<<endl; cout<<a<<endl; |
輸出為什么是4,0而不是期望中的4,3???就在于sizeof在編譯階段處理的特性。由于sizeof不能被編譯成機(jī)器碼,所以sizeof作用范 圍內(nèi),也就是()里面的內(nèi)容也不能被編譯,而是被替換成類型(也就是說括號內(nèi)的表達(dá)式不會運(yùn)算)。=操作符返回左操作數(shù)的類型,所以a=3相當(dāng)于int,而代碼也被替換為:?
| int a = 0; cout<<4<<endl; cout<<a<<endl; |
所以,sizeof是不可能支持鏈?zhǔn)奖磉_(dá)式的,這也是和一元操作符不一樣的地方。?
結(jié)論:不要把sizeof當(dāng)成函數(shù),也不要看作一元操作符,把他當(dāng)成一個特殊的編譯預(yù)處理。?
int f1() {printf("f1()\n");return 1; }int f2() {printf("f2()\n");return 2; }int f3() {printf("f3()\n");return 3; }int main(void) { int i = 0;int j = 0;//printf("%d %d\n",i,i++);//0 0//cout<<j<<" "<<j++<<endl;//0 0//printf("%d %d\n",j++,j);//0 0//cout<<i++<<" "<<i<<endl;//0 1//printf("%d %d\n",i,++i);//1 1//cout<<j<<" "<<++j<<endl;//1 1//printf("%d %d\n",++j,j);//1 1//cout<<++i<<" "<<i<<endl;//1 1/*printf("%d,%d,%d\n",f1(),f2(),f3());cout<<f1()<<f2()<<f3()<<endl;*///printf("%d \n", i++);//0printf("%d %d\n",++i, i++);//1 0cout<<++j<<" "<<j++<<endl;//1 0return 0; }
一般來講是,從右向左,依次壓入棧中,然后再依次彈出
但是對于i,++i,之類的,的確沒有什么規(guī)律。。。
總結(jié)
- 上一篇: 旋转有序数组的二分查找
- 下一篇: perl基本语法