#include <iostream> using namespace std; //1.2 /* 问题1:使用实际函数调用发现,返回值并非数组的大小。调试发现,sizeof(num)在这里是指针num所占内存的大小,而非数组。 解决1:通过查阅c++primer page187:c++中传递参数有两种,一种叫做值传递,一种叫做引用传递。 值传递通过复制构造函数将实参的值拷贝到形参来实现的,这时对形参的改变不改变实参。 引用传递不会拷贝其值到形参,而是将形参作为实参的引用(别名),直接对实参进行读取,同时也节省来一部分计算时间。 教材书上往往推荐我们使用引用传递来避免复制构造函数的拷贝操作,或者有些数据结构不支持拷贝,也只能通过引用传递的方式才能实现。 在我们的代码中使用的是值传递。所以num只是一个值和原数组相同的指针。 可见,数组在传给函数的时候会被退化成一个指向其首元素的指针。这时数组的一些特性就会丢失,造成了sizeof(a)的值不一样。 */ template <class T> int Count(T *num)//sizeof(num)数字为8:指针占8个字节了 { return sizeof(num) / sizeof(*num); } template <class T> int Count1(T &num) { return sizeof(num) / sizeof(*num); } int main() { int array[] = {1,2,3,4}; int length = Count(array); cout << length << endl; length = Count1(array); cout << length << endl; system("pause"); return 0; }
我在重新梳理谭浩强c++第二版时注意到了一个原来并没有重视的问题。
首先,让我们来看一个简单的c++程序。
#include <iostream>
using namespace std;
int main()
{
unsigned short a;
short int b = -1;
a = b;
cout << a << endl;
return 0;
}
看到这个程序时,我很轻松的下了结论:运行结果为-1;
当然……真实运行结果是这样的
那么问题出在哪里呢?
毫无疑问,就在我们标题所说。
第一点,我们都清楚,修饰符signed代表有符号,也就是说,存储单元的最高位用来表示数值的符号。而unsigned当然与之对应的全部二进制位都用来表示数值本身。
第二点,c++程序中,正数以原码存储,负数以补码存储。(或者说正数的补码与原码相同,即它所代表的数的真值)
然后事情就很清楚了。
b值为-1,也就是原码为1000000000000001,对应补码为1111111111111111.
而当其值赋给a时,unsigned修饰符生效,原本代表符号的“1”现在真的代表了1,并且不再代表负数。
所以,本来说好的补码现在就是原码了。
那也就是说,现在的a值对应的数值原码为1111111111111111.也就是pow(2,15)-1,即65535.
size_t其实是一种类型,类似于无符号整形(unsignted int)。可以理解成unsignted int size,当unsignted int用就可以了。
size_t一般用于指明数一个组长度,所以必然是个正数。它有足够大的大小来储存可能的最大数组。比如要将下标赋值给数组a[array_size]的每个元素:
#include <iostream> using namespace std; //1.11 /* 问题1:使用实际函数调用发现,返回值并非数组的大小。调试发现,sizeof(num)在这里是指针num所占内存的大小,而非数组。 解决1:通过查阅c++primer page187:c++中传递参数有两种,一种叫做值传递,一种叫做引用传递。 值传递通过复制构造函数将实参的值拷贝到形参来实现的,这时对形参的改变不改变实参。 引用传递不会拷贝其值到形参,而是将形参作为实参的引用(别名),直接对实参进行读取,同时也节省来一部分计算时间。 教材书上往往推荐我们使用引用传递来避免复制构造函数的拷贝操作,或者有些数据结构不支持拷贝,也只能通过引用传递的方式才能实现。 在我们的代码中使用的是值传递。所以num只是一个值和原数组相同的指针。 可见,数组在传给函数的时候会被退化成一个指向其首元素的指针。这时数组的一些特性就会丢失,造成了sizeof(a)的值不一样。 */ template <class T> int Count(T *num)//sizeof(num)数字为8:指针占8个字节了 { return sizeof(num) / sizeof(*num); } template <class T> int Count1(T &num) { if ((sizeof(num) / sizeof(*num)) < 3) { throw range_error("数组n<3"); } return sizeof(num) / sizeof(*num); } int main() { int array[2] = { 0 }; int length = 0; try { //length = Count(array); length = Count1(array); cout << length << endl; } catch (range_error err) { cout << "没有意义的数组:" << err.what() << endl; } cout << "end" << endl; system("pause"); return 0; }
#include <iostream> using namespace std; //习题1.10 int main() { int a, b, c; cin >> a >> b >> c; try { if (a < 0 && b < 0 && c < 0) throw 1; if (0 == a && 0 == b && 0 == c) throw 2; } catch (int e) { if (1 == e) { cout << "发生异常a,b,c全小于0" << endl; } else { cout << "发生异常a,b,c全等于0" << endl; } } cout << "end" << endl; system("pause"); return 0; }