1. *(p++) 等价于*p++,先取*p再p++
*(++p) 先p++,再*p
-i++ 等价于-(i++),先取-i,再i++,如果按(-i)++是不对的,而且-i是一个表达式,是常量,常量是不能自增的
a=f1()+f2(),并不是所有的编译器都是先执行f1再执行f2。
i=3, (i++)+(i++)+(i++)=? 有歧义,应避免。有些系统中是3+4+5,每个括号中自加一次然后i=6;有些是3+3+3,然后i自加三次 i=6,如Turbo C,VC6.0
i+++j = (i++)+j 因为编译器总是尽可能多地(自左而右)将若干个字符组成一个运算符
2. 15%(-7)=1 (-7)%15=-7
(-15)%7=-1 7%(-15)=7
(-15)%(-7)=-1 (-7)%(-15)=-7
由此可知,求模运算的结果正负由被除数决定,结果的绝对值等于被除数绝对值和除数绝对值的求模结果
实在不行,用 余数=被除数-(商*除数)
关于商,在多数C编译系统中,如果除数或被除数中有一个负值,其商向零取整。-5/3=-1.666,向零取整即为-1.
注意:%运算两个操作数都必须为整型。
3. ~8=-9 -> ~0000 0000 0000 1000 = 1111 1111 1111 0111,后者正是-9的补码形式
负数的补码表示为其绝对值的二进制取反加1. 查看一个补码形式的二进制数是负几,可以将其取反加1.
4. 不同类型的数据混合运算
double <---- float,int <---- char、short,这两组是必定的转换
即使float+float,两者也要都转换为double再运算
int ----> unsigned ----> long ----> double,从左到右,级别越来越高
5.
void cat(int x, int y)
{
cout<<x<<" "<<y<<endl;
}
int i=3;
以下情况:
cout<<i<<" "<<i++<<endl; // 4 3 顺序为从右到左,第一个数为i自增后的结果,说明cout<<i++算是对i的一次使用
cout<<i<<" "<<++i<<endl; // 4 4 证明顺序为从右到左
cat(i,++i) 或 cat(i++,++i) //4 4 证明参数传递顺序为从右到左
cat(++i,++i) //5 4 证明参数传递顺序为从右到左
cat(i, i++) 或 cat(i++,i++) 或 cat(i++,i) // 3 3 既然顺序为从右到左,为啥前两个的x不是4,说明这一个语句才算是对i的一次使用,使用完才自增
cat(++i,i++) //4 3 证明参数传递肯定不是从左向右
printf输出语句跟函数调用情况一样
函数的默认形参必须从最右边的形参向左依次声明,不能间隔,即最左边的默认形参右边不能出现没有默认值的参数
解释为函数调用时参数传递从左至右
这是为何?求解
6. 0的ASCII码为48, A的为64+1,B的为64+2..... a的为96+1,b的为96+2......
7. VC6.0环境下不同变量的所占的字节数
char:1 short:2 int:4 long:4 float:4 double:8
整数默认为long型,浮点数默认为double型
8. 运算符的左结合性,即结合方向从左至右,右结合性相反。
减号为左结合性,所以a-b+c,减号先结合a,计算a-b。赋值运算符为右结合性,a=5.
9. (int)x+y = ((int)x)+y 强制类型转换得到的是一个所需类型的变量,原变量的类型没变
10. x *= a+b <=> x = x*(a+b)
11. (a=3*5,a*4), a+5 的值为20. 逗号运算符级别最低。可以有多个逗号,表达式的值为最后一个表达式的值
12. int、short、long都默认为带符号型。无符号型需指定unsigned。unsigned int 可简写为unsigned
13. unsigned char为8位,取值为0~255,如果赋值超出这个范围,将其对256求模后再赋值。-2:254 300:44
14. float只能保证6位有效数字,在很多程序中这不够用,而double型至少可以保证10位有效数字
15. 如果成员函数在基类中被声明为虚函数,它就一直为虚函数,派生类无法改变这一事实。派生类重定义虚函数时,virtual关键字可用可不用
16. 覆盖虚函数机制:可用作用域操作符强制指向派生类对象的基类指针调用基类中的虚函数,而不是派生类中重新定义的
Item_base *baseP = &derived;
baseP->Item_base::function_name(...);
17. 函数(包括主函数)内声明的局部变量如果不进行初始化,则没有缺省值,如int i; cout<<i;这是不行的,但静态变量除外,不论函数内外的,都有缺省值。
全局变量 (所有函数外声明的)也有缺省值。
18. 全局变量(外部变量)的一个特点是它的定义和说明是两种不同的概念。
全局变量的定义不但对全局变量(外部变量)的类型加以说明,而且还为它分配存储空间;可以不赋值,因为为缺省值。int i 等价于 int i=0
全局变量的说明则是在其他源文件中使用该变量之前再次对变量性质的说明。extern int i; 这时不能赋值,但可以稍后赋值 i=5
在一个程序中全局变量只能定义一次,但是可以在不同函数和源文件中说明多次,在使用该变量时即应说明。
全局变量可在其中任何一个但也只有一个源文件中定义,而可在其他多个源文件中说明。
全局变量被定义后,即同时被初始化,因此它具有缺省值如下:char型变量为空,int型变量为0,浮点型变量为0.0。
一般说来,在使用已定义的全局变量之前需要加以说明,特别是下述两种情况必须说明:
①对于同一个源文件中的全局变量,如果使用在先,定义在后,则使用前必须进行说明。
②当在程序中的一个源文件中使用该程序的另一个源文件中定义的全局变量时,则在使用之前必须说明。
如果一个全局变量在同一个源文件中先定义而后再使用,也可以不说明。
第一种情况的示例:
void main()
{
extern int a; //虽然还没定义,但是只要先声明了,就能用
int fun(int); //fun函数也可以在主函数中声明,反正在使用前确保声明过就行了
cout<< fun(a) <<endl;
}
int a = 5;
int fun(int x) {.....} //fun函数定义,如果其中用到了a,则可以不用声明,因为已经定义过了19.