int c = 5;
在编译阶段已经被翻译为:
这里有个陷阱,看下面的程序:
输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范 围内,也就是()里面的内容也不能被编译,而是被替换成类型(也就是说括号内的表达式不会运算)。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为:
所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。
结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。
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位机上int长度为4 cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl; |
在编译阶段已经被翻译为:
cout<<4<<endl; cout<<1<<endl; |
这里有个陷阱,看下面的程序:
int a = 0; cout<<sizeof(a=3)<<endl; cout<<a<<endl; |
输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范 围内,也就是()里面的内容也不能被编译,而是被替换成类型(也就是说括号内的表达式不会运算)。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为:
int a = 0; cout<<4<<endl; cout<<a<<endl; |
所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。
结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。
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++);//0
printf("%d %d\n",++i, i++);//1 0
cout<<++j<<" "<<j++<<endl;//1 0
return 0;
}
一般来讲是,从右向左,依次压入栈中,然后再依次弹出
但是对于i,++i,之类的,的确没有什么规律。。。