1、以下代码中的两个sizeof用法有问题吗?
voidUpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for(size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if('a'<=str[i] && str[i]<='z' )
str[i]-= ('a'-'A' );
}
charstr[] = "aBcDe";
cout<< "str字符长度为: " <<sizeof(str)/sizeof(str[0]) << endl;
UpperCase(str );
cout<< str << endl;
答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回ABCDe。
2、
以下反向遍历array数组的方法有什么错误?
vectorarray;
array.push_back(1 );
array.push_back(2 );
array.push_back(3 );
for(vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array数组
{
cout<< array[i] << endl;
}
答:首先数组定义有误,应加上类型参数:vector<int>array。其次vector::size_type被定义为unsignedint,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。
3、
以下两条输出语句分别输出什么?
floata = 1.0f;
cout<< (int)a << endl;
cout<< (int&)a << endl;
cout<< boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
floatb = 0.0f;
cout<< (int)b << endl;
cout<< (int&)b << endl;
cout<< boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?
答:分别输出false和true。注意转换的应用。
(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。