更多精彩内容,请见:http://www.16boke.com
by zxy,Java/C++编程交流群:168424095
char *GetString(void)
{
charp[] = "hello world";
return p; // 编译器将提出警告
}
内存在函数结束时自动消亡。
charch[2];
memset(ch,0,sizeof(ch));
strcpy(ch,"123456");
编译不报错,有警告,运行会有问题。考虑使用strcpy_s函数。
chara[] = "hello";
a[0] ='X';
cout <<a<< endl;
char *p ="world"; // 注意p指向常量字符串
p[0] ='X'; // 编译器不能发现该错误
cout<< p << endl;
字符数组a的容量是6个字符,其内容为hello\0。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。
# include<iostream>
usingnamespacestd;
voidoutput(int x); // 函数声明
voidoutput(float x); // 函数声明
voidoutput(int x)
{
cout <<"output int " << x <<endl ;
}
voidoutput(float x)
{
cout <<"output float " << x<< endl ;
}
voidmain(void)
{
int x = 1;
floaty = 1.0;
output(x); // outputint 1
output(y); // outputfloat 1
output(1); // output int 1
output(0.5); // error! ambiguous call, 因为自动类型转换
output(int(0.5)); // output int 0
output(float(0.5));// output float 0.5
}
第一个output函数的参数是int类型,第二个output函数的参数是float类型。由于数字本身没有类型,将数字当作参数时将自动进行类型转换(称为隐式类型转换)。语句output(0.5)将产生编译错误,因为编译器不知道该将0.5转换成int还是float类型的参数。隐式类型转换在很多地方可以简化程序的书写,但是也可能留下隐患。
C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。
在C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。例如
#define MAX(a, b) (a) > (b) ? (a) : (b)
语句: result = MAX(i, j) + 2 ;
将被预处理器解释为: result = (i) > (j) ? (i) : (j) + 2 ;
由于运算符‘+’比运算符‘:’的优先级高,所以上述语句并不等价于期望的: result = ( (i) > (j) ? (i) : (j) ) + 2 ;
如果把宏代码改写为:#defineMAX(a, b) ( (a) > (b) ? (a) :(b) )
则可以解决由优先级引起的错误。但是即使使用修改后的宏代码也不是万无一失的,例如语句:result = MAX(i++, j);
将被预处理器解释为:result= (i++) > (j) ? (i++) : (j);
对于C++ 而言,使用宏代码还有另一种缺点:无法操作类的私有数据成员。
更多精彩内容,请见:http://www.16boke.com