1.當n是short int ,m是long long int時,語句m=4*n,使用GNU,得到的m是short int的範圍,因此當n稍大時,m就可能溢出。
2.輸出字符串時,遇到‘\0’結束輸入,如果沒有適當地設置'\0',可能會出現問題。比如有
struct node
{
char s[10];
}n[2];
如果w[0].s中沒有‘\0’,則scanf("%s",n[0].s)不會只輸出n[0]中字符數組s中的內容,因爲這一個輸出語句是輸出以n[0].s爲首地址直到'\0'爲止的內容。
3.當用memset給char型以外的數組初始化時,只能初始化爲0或-1。計算機中數字以補碼形式存儲,只有兩種數值:0和1,0和-1的補碼分別是0和1.
4.i*=2+1;的含義是i=i*(2+1)而不是i=i*2+1.
5.創建類的指針時不伴隨內存分配,比如有類ClassA,創建指針:ClassA *p;則*p沒有分配到一片大小爲sizeof(ClassA)的內存空間。
6.有程序:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
s[0]='1';
s+="234";
cout<<s<<endl;
return 0;
}
輸出“1234”?NO!輸出“234”。
7.string str; str="1"+"12";s="1";s+="234"; 可以;s="",s+="1",s+="234"也可以。
8.getchar()能接收回車和空格
9.scanf("%d%c", &n, &c);輸入1然後回車,輸出空行,表示c接收了空行;但是以下語句:
scanf("%d %c", &n, &c);//只是%d和%c之間多了個空格,c就不會接收空格了!、
10.如果輸出字符串時莫名地多了一個空格,可能使'\0'作祟,因爲執行cout << '\0';正正輸出一個空格。執行以下命令cout << '\0' << 1 <<endl << " " << 1;就可以很清楚地看出輸出'\0'和輸出" "的效果一樣。
11.if(...)
if(...)
{
....
}
else(...){}
else應該是和第一個if對應的,但是我在使用GNU編譯器時運行結果卻是和第二個if對應,導致出錯。注意!!!改爲
if(...)
{
if(...)
{
....
}
}
else{...}
12.有程序:
#include <iostream>
using namespace std;
struct A
{
int a;
A *link;
};
int main()
{
struct A *n;
//struct A m;
//n = &m;
cin >> n->a;
cout << n->a;
return 0;
}
運行程序,輸入1,內存就出錯。這是因爲,n只是一個struct A型的指針,只能儲存結構體變量的地址,加上註釋的部分代碼就能正常運行。又或者給n動態分配內存:
#include <iostream>
using namespace std;
struct A
{
int a;
A *link;
};
int main()
{
struct A *n;
n = new struct A; //添加的部分
cin >> n->a;
cout << n->a;
return 0;
}
13.
#include <iostream>
using namespace std;
struct A
{
int a;
A *link;
A(){link = NULL;}
};
int main()
{
struct A *t;
//t = new struct A;
delete t;
return 0;
}
運行以上程序會出錯,原因是t尚未分配到內存不能delete。加上註釋掉的那部分程序就ok