本文主要是記錄一些初級的但是有時候我自己容易忽略或者忘記東西,僅作備忘錄之用
1)、銜接符 \
\ 在c++中可以作為銜接符(忘了規(guī)范的術(shù)語是不是這么叫了, 汗自己一個~),例如:
//this is memo\
this is memo too
上面兩行在c++中,編譯器會認為是一行。
不過\一般只在宏定義中使用,因為如果是字符串,那么別寫分號就行,如:
char *s = "How "
"are "
"you?";
如果是一般的語句,那么就直接換,比如:
int sum = i +
j;
2)##
## 叫做指令粘貼符,它的英文術(shù)語叫做token-pasting operator,主要在宏定義中使用。使用例子如下:
#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;
用如下方式調(diào)用宏,
paster( 9 ); //輸出: taken9 = 9
上面的宏此時等價于
printf( "token" "9" " = %d", token9 );
結(jié)果就是:
printf( "token9 = %d", token9 );
3) C++函數(shù)參數(shù)入棧順序--從右到左
下面的例子用來驗證C++函數(shù)參數(shù)入棧順序:
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);
則輸出結(jié)果為:i1=3, i2=2, i3=1
4)一個有趣的小問題--表達式與算符結(jié)合順序
在VC論壇里看到有人對下面的表達式計算結(jié)果有點迷惑,
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)里面編譯, 執(zhí)行結(jié)果k=10;
綜合其他人的一些看法和我自己的測試,得出結(jié)論:
k= (++i)+(++i)+(++i);//等價于++i,++i,k = i+i + (++i);也就是 k = 3 + 3 + 4 = 10。
因此,k2的結(jié)果為6。
當(dāng)然,這個沒有進行語法上的深層次分析,有興趣的朋友可以自己分析一下C++的相關(guān)語法。
4)下面先看問題:
////bowex ()///////////////////////////////////////////////////////
char uu[3][2];
CString s;
for(int i=0;i<3;i++)
{
s="我";
strcpy(uu[i],s);
}
運行完以上程序后為何數(shù)組uu中的內(nèi)容是
uu[0] --- > 我我我
uu[1] --- > 我我
uu[2] --- > 我
而不是
uu[0] --- > 我
uu[1] --- > 我
uu[2] --- > 我 為何? 奇怪! 多謝
////////////////////////////////////////////////////////////////////
網(wǎng)友“QunKangLi(維護成本與程序員的創(chuàng)造力的平方成正比)”給出解釋:
“char uu[3][3];//這樣就行了,字符串結(jié)束符占一個字符寬度?!?/p>
這個解釋是很對,不過我還是要強調(diào)一下這種情況可能產(chǎn)生的嚴(yán)重后果:
像這種情況讓我想起了strcpy函數(shù)可能引起非法內(nèi)存訪問,也就是說,如果
strcpy拷貝的目的地址分配的空間不夠,那么strcpy會把空間后面的地址也占用,
這樣就可能使某些數(shù)據(jù)被意外修改,從而導(dǎo)致程序崩潰或者數(shù)據(jù)異常。之所以有
這種感受,是因為以前碰到有個程序,就發(fā)生這樣的錯誤,就是因為strcpy拷貝的內(nèi)容
過長從而把數(shù)據(jù)結(jié)構(gòu)中緊接其后的成員的數(shù)據(jù)變?yōu)?了,結(jié)果程序當(dāng)然出現(xiàn)意外。
假設(shè)把上面的for循環(huán)用下面的語句代替 那么結(jié)果就更加荒唐, 因為會出現(xiàn)亂碼。
char uu[3][2];
CString s;
s="我";
strcpy(uu[2],s);
strcpy(uu[1],s);
strcpy(uu[0],s);
大家可以編譯一下上面的代碼,運行程序 你可以看到uu數(shù)組中有亂碼。
如果輸出的話,應(yīng)該是這樣的,
uu[0] --- > 我
uu[1] --- > (空串)
uu[2] --- > (空串)
是什么原因大家應(yīng)該一目了然了吧。