`
381573578
  • 浏览: 72190 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

C++ 一些应该注意的问题

    博客分类:
  • C++
阅读更多

1、字符数组是以\0为结束标志
char ca[100] = "Good\0Day!";
如果cout<<ca<<endl,那么结果为Good,并不会输出Day;
那么Day存在数组ca中吗?存在的ca[5]就是D,ca[6]就是a,ca[7]就是y.

2、假设输出cout<<"good" + 1<<endl;结果为ood
输出cout<<"good" + 2<<endl;结果为od
相当于指针问题

3、\r是回车符,是回到本行的最左边
cout<<"good\rxy"<<endl;
结果输出:xyod

4、unsigned int i =-1;
无符号数-1,也就是整数最大值

5、 cout<<sizeof(bool)<<endl;  //1
cout<<sizeof(char)<<endl;  //1
cout<<sizeof(unsigned char)<<endl; //1
cout<<sizeof(short)<<endl;  //2
cout<<sizeof(unsigned short)<<endl; //2
cout<<sizeof(int)<<endl;  //4
cout<<sizeof(unsigned int)<<endl; //4
cout<<sizeof(long)<<endl;  //4
cout<<sizeof(unsigned long)<<endl; //4
cout<<sizeof(float)<<endl;  //4
cout<<sizeof(double)<<endl;  //8
cout<<sizeof(long double)<<endl; //8

6、变量类型终身不变

7、移位运算符
<<左移,所有进制位依次向左移,左边的丢失,右边补0
  int i = 2;
  i=i<<2;
  cout<<i<<endl;
  那么输出结果为8.
>>右移,所有进制位依次向右移,右边的丢失,左边补0
无符号数补0,
有符号数 | 非负数 补0
    | 负数   补1
int i = -1;
cout<<(i>>5)<<endl;
结果为1
int i = 64;
cout<<(i>>2)<<endl;
结果为16

8、int i = 100;
   1<i<2为真还是假,结果为真,因为1<i,结果为真,那么表达式值为1
   然后1<2为真,那么结果为真

 

9、异或运算^
1^1 = 0;
1^2 = 3;
(a^b)^b = a;
(a^b)^a = b;

10、经典判断
int k = 10;
if(k=!2){k=!2结果为0,也就是假,因为!2为0,在赋值给k
}

11、不确定的值
int a = 10;
int b = (a = 5) + (++a);
cout<<b<<endl;
不同编译器不一样

12、switch语句比if else效率高,它会直接跳转到适当的位置。
数值是能比较的整型。
可以类型为整型,字符,枚举

13、int main()函数中return 0;可写可不写,不写默认会加上return 0;
而其他函数则不会

14、int f(int x = 1){
cout<<x<<endl;
return 0;
}
如果定义函数时,参数有值,那么就调用时,可以不传参数
例如:
int a = f();//这样就可以了

15、进行函数重载
int f(int x=1){
cout<<x<<endl;
return 0;
}
int f(){
cout<<"xxxxxs"<<endl;
return 0;
}
这样写法是错误的,要进行函数重载,f(int x=1);不要带默认参数,否则编译器解释不清楚。
因为f(int x=1),也可以int a = f();这样调用

16、cout<<sizeof(int [5])<<endl;
结果输出20

17、int a[5];
数组名表示第一个元素的地址
cout<<a<<endl;
cout<<&a[0]<<endl;
结果是一样的
为了兼容C,C++用cout输出字符变量和字符数组中元素的地址时,
改成输出从这个内存单元开始存放的一系列字符,到向后遇到第
一个'\0'为止。
例如:
char a = 'A';
cout<<&a<<endl;结果是未知的
只有使用printf("%d",&a);才是输出字符a地址的值
只有字符变量会出现这样的情况。

18、数组越界问题
#include <iostream>
using namespace std;
void main(){
int x = 10;
int y = 20;
int z = 30;
int a[5];
int k = 40;
a[5] = 100;
a[6] = 200;
a[7] = 300;
a[-1] = 400;
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"z="<<z<<endl;
cout<<"k="<<k<<endl;
}
x,y,z的结果会出现问题,可能已经不是原来的10,20了,可能为300,200,100;
也有可能不是,因为数组开辟空间时是要求连续的地址。
main()函数的压栈情况为:
a[0],a[1],a[2],a[3],a[4],z,y,x;
所以如果操作a[5]有可能就会改变z,操作a[6]有可能就会改变y,操作a[7]有可能就会改变x;
如果数组开辟的连续空间与z,y,x不在一起,那么不会改变。
数组的负下标也会越界,要注意。

19、费解的问题
#include <iostream>
using namespace std;
double score(double a[]){
cout<<"sizeof(a) = "<<sizeof(a)<<endl;
return 100.0;
}
int main(){
double b[5]={1,2,3,4,5};
cout<<"sizeof(b) = "<<sizeof(b)<<endl;
cout<<"score = "<<score(b)<<endl;
return 0;
}
这里输出结果:
sizeof(b) = 40
sizeof(a) = 4
score = 100
原因是这样的:把数组名当数值用的时候它仅仅是一个地址,而一个地址用4个字节保存,
所以结果为4。
sizeof(类型),因为第一次sizeof(b),b是double [5],所以结果为40
而score(b),传递的是数组的地址,所以在score()函数内部sizeof(a),结果为4

20、
#include <iostream>
using namespace std;
struct Student{
int sno;
char name[7];
};
int main(){
Student s1 = {100,"谭惟午"};
Student s2;
//s2 = {100,"谭惟午"};//这样写会出错
s2.sno = 200;
strcpy(s2.name,"马曼曼");

//给字符数组赋值使用strcpy来操作
cout<<s1.sno<<","<<s1.name<<endl;
cout<<s2.sno<<","<<s2.name<<endl;

return 0;
}

21、结构体大小问题:
#include <iostream>
using namespace std;
struct Student{
char name[20];
bool gender;
int age;
char addr[120];
double score;
};
int main(){
Student s1;
cout<<"sizeof(Student)="<<sizeof(Student)<<endl;
//结果是160,这是为什么呢?
//输出每个变量的地址,就可以知道内存分配问题
cout<<"&s1="<<&s1<<endl;
cout<<"&s1.name="<<&s1.name<<endl;
cout<<"&s1.gender="<<&s1.gender<<endl;
cout<<"&s1.age="<<&s1.age<<endl;
cout<<"&s1.addr="<<&s1.addr<<endl;
//这里addr定义大小为120,但实际上分配了124
cout<<"&s1.score="<<&s1.score<<endl;
return 0;
}
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics