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位系统