1、
#include <iostream>
using namespace std;
struct SimpleType
{
double db;
char sz;
int n;
};
void main()
{
SimpleType a;
int nSize = sizeof(a);
cout<<nSize<<endl;
}
//输出:nSize = 16
解析:这里nSize的值并非13,而是16。这设计结构体的字节对齐问题。编译器在为结构体变量分配空间时,保证下一个成员的偏移量应为该成员数据类型长度的整数倍。首先为db 成员分配空间,假设起始偏移位置从0开始,db 成员将占用0,1,2,3,4,5,6,7共8字节。接下来为成员变量sz 分配空间,由于char 类型占用1字节,sz 将占据8的位置,因为当前位置8与1是整除的。最后为n 成员分配空间,该成员为int 类型,占用4字节。当前偏移位置为9,并不是4的整数倍,因此需要空出3字节(9、10、11),n 从12的位置开始分配4字节的空间。这样就导致了实际分配的大小与“理论上”的大小不一致。
2、
#include <iostream>
using namespace std;
void OutputString(char data[])
{
int iSize = sizeof(data);
cout<<"iSize = "<<iSize<<endl;
}
void main()
{
int iLen = sizeof("家园");
cout<<"‘家园‘的大小为:"<<iLen<<endl;
OutputString("家园");
}
//输出:
//‘家园‘的大小为:5
//iSize = 4
解析:作为参数传递的数组其实是以指针的形式传递的,所以在使用sizeof获得数组参数的长度时是4,而不是数字长度。
3、
#include <iostream>
using namespace std;
void main()
{
int i = 2;
cout<<(i = 3 * 5, 2 * 4)<<endl;
cout<<i<<endl;
int x = 9, y = 7;
int n = x > y ? (x-y):(x+y); //三目元表达式
cout<<n<<endl;
}
//输出:
//8
//15
//2
解析:因为赋值运算符的优先级比逗号运算符的优先级高,所以在上面的代码中,会先计算赋值表达式的值,也就是i=3*5,然后再计算逗号表达式的值,所以 i 的值为15,而逗号表达式的值却是8.
又因为条件运算符的优先级高于赋值运算符,所以会先计算 x>y 的值,然后执行符合条件的表达式(x-y),最后将结果赋值给n。
4、
原文:http://my.oschina.net/Jacedy/blog/343692