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