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