1.第五章-第六章

1. ++i和i++

函数参数从右到左压栈,计算顺序也是从右到左。i++会产生未变化的临时变量i,再改变内存中的i为i+1。++i不产生临时量直接使用内存中的i。

        int i=1;
	
	switch (i++){
		default: break; 
		case 2: cout << "2" <<endl;
		case 1: cout << "1" <<endl;
		case 3: cout << "3" <<endl;
		
	} 
	/*output:
		1
		3
	*/
void f(int a, int b)
{
	
	cout << "i=" << a << endl;
	cout << "i=" << b << endl;
	return;
 } 
int main()
{
	int i=0;
        f(++i, i++);
	/*output:
		i=2
		i=0
	*/
	cout <<  endl; 
	i=0;
	f(i++, ++i); //右边i要等左边计算完使用使用内存中的i,而无临时变量
	/*output:
		i=1
		i=2
	*/
        return 0;
}

2.  比较语句使用:

char a;
'A' == a;

3. X86是小端模式:低地址存低字节;无论是多少位系统始终是一个地址指向一个字节

参数处理顺序,及类型转换

        unsigned int a = 0xfffffff7;
	unsigned char b = a;
	char c = a;
	printf("%08x, %08x", b, c);//printf默认输出int,所以类型会自动转化对于有符号数要注意符号继承
	/*
		000000f7, fffffff7
	*/
        unsigned char a=0xA5;
	unsigned char b=~a>>4+1;//~a时首先会把a转换为有符号int类型, + 优先级高于>>
	printf("%d\n", b);

4. C++中使用C语言为什么要声明,因为C++支持函数重载,所以函数被编出来的so文件命名方式和C不同。通过声明告诉编译器解决命名转换问题。

void f(int, int)
在C中可能编成 f.so
在C++中可能是 f_int_int.so

5. static和const

static变量必须初始化,如果静态成员数据设为私有可以通过共有static成员函数访问。

C++中建议使用const代替define, C中const成员仍能被改变。

const 常亮声明时,必须初始化

const int* a = &b;
int const *a = &b;
//前两个功能相同,表示a指向的内容不可变
int* const a = &b;//表示指针a不可再指向其他地方
const在函数前面表示返回值是const类型变量
class A
{
   public:
       int geta() const; //const函数表示不修改类中数据成员
   private:
       a = 1; 
};
int A::geta() const
{
    return a;
}


6. 对齐问题, 默认为结构中最大成员的整数倍

class A{
	public:
		double d;
		float a;
		int f;
		char c;
		A();
		~A();
	
};
int main()
{
	cout << sizeof(A);//输出为24而不是20
        return 0;
}

7. sizeof 和strlen

strlen的参数只能是char*, 而且必须以'\0'结尾,计算结果不包括'\0'。对函数取sizeof取的是返回值类型大小。数组名是固定的地址,返回所有成员使用内存大小。

        int** a[3][4];
	cout << sizeof(a)<<endl; //96 
	
	char *s1 = "1234";
	char s2[] = "1234";
	cout << sizeof(s1)<<endl;//8 s是指针,64位系统 
	cout << sizeof(s2)<<endl;//5
	
	string t[] = {"12", "3333", "434aaaaaaaaaaa3555"};
	cout << sizeof(t)<<endl;//24=3*8 看作二级指针
	cout << sizeof(string)<<endl;//8 64位系统 

猜你喜欢

转载自blog.csdn.net/qq_23084801/article/details/81057285