首页 > 代码库 > C++进阶

C++进阶

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、

C++进阶