本文主要是记录一些初级的但是有时候我自己容易忽略或者忘记东西,仅作备忘录之用
1)、衔接符 \
\ 在c++中可以作为衔接符(忘了规范的术语是不是这么叫了, 汗自己一个~),例如:
//this is memo\
this is memo too
上面两行在c++中,编译器会认为是一行。
不过\一般只在宏定义中使用,因为如果是字符串,那么别写分号就行,如:
char *s = "How "
"are "
"you?";
如果是一般的语句,那么就直接换,比如:
int sum = i +
j;
2)##
## 叫做指令粘贴符,它的英文术语叫做token-pasting operator,主要在宏定义中使用。使用例子如下:
#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;
用如下方式调用宏,
paster( 9 ); //输出: taken9 = 9
上面的宏此时等价于
printf( "token" "9" " = %d", token9 );
结果就是:
printf( "token9 = %d", token9 );
3) C++函数参数入栈顺序--从右到左
下面的例子用来验证C++函数参数入栈顺序:
void test(int i1, int i2, int i3)
{
printf(“i1=%d, i2=%d, i3=%d\n“,i1,i2,i3);
}
int i=0;
test(++i,++i,++i);
则输出结果为:i1=3, i2=2, i3=1
4)一个有趣的小问题--表达式与算符结合顺序
在VC论坛里看到有人对下面的表达式计算结果有点迷惑,
int i = 1;
int k = (++i) + (++i)+ (++i);
int i2 = 1;
int k2 = (++i2) + (++i2);
我也测试了一下,很多人一开始会以为 k = 2 + 3 + 4 =9;
但是事实上在VC, DevC++4.9(GCC)里面编译, 执行结果k=10;
综合其他人的一些看法和我自己的测试,得出结论:
k= (++i)+(++i)+(++i);//等价于++i,++i,k = i+i + (++i);也就是 k = 3 + 3 + 4 = 10。
因此,k2的结果为6。
当然,这个没有进行语法上的深层次分析,有兴趣的朋友可以自己分析一下C++的相关语法。
4)下面先看问题:
////bowex ()///////////////////////////////////////////////////////
char uu[3][2];
CString s;
for(int i=0;i<3;i++)
{
s="我";
strcpy(uu[i],s);
}
运行完以上程序后为何数组uu中的内容是
uu[0] --- > 我我我
uu[1] --- > 我我
uu[2] --- > 我
而不是
uu[0] --- > 我
uu[1] --- > 我
uu[2] --- > 我 为何? 奇怪! 多谢
////////////////////////////////////////////////////////////////////
网友“QunKangLi(维护成本与程序员的创造力的平方成正比)”给出解释:
“char uu[3][3];//这样就行了,字符串结束符占一个字符宽度。”
这个解释是很对,不过我还是要强调一下这种情况可能产生的严重后果:
像这种情况让我想起了strcpy函数可能引起非法内存访问,也就是说,如果
strcpy拷贝的目的地址分配的空间不够,那么strcpy会把空间后面的地址也占用,
这样就可能使某些数据被意外修改,从而导致程序崩溃或者数据异常。之所以有
这种感受,是因为以前碰到有个程序,就发生这样的错误,就是因为strcpy拷贝的内容
过长从而把数据结构中紧接其后的成员的数据变为0了,结果程序当然出现意外。
假设把上面的for循环用下面的语句代替 那么结果就更加荒唐, 因为会出现乱码。
char uu[3][2];
CString s;
s="我";
strcpy(uu[2],s);
strcpy(uu[1],s);
strcpy(uu[0],s);
大家可以编译一下上面的代码,运行程序 你可以看到uu数组中有乱码。
如果输出的话,应该是这样的,
uu[0] --- > 我
uu[1] --- > (空串)
uu[2] --- > (空串)
是什么原因大家应该一目了然了吧。