博文
bool型的用法(2007-07-18 16:40:00)
摘要:布尔型对象可以被赋以文字值true 或false 例如
// 初始化一个string 对象用来存放搜索的结果
string search_word = get_word();
// 把一个bool 变量初始化为false
bool found = false;
string next_word;
while ( cin >> next_word )
if ( next_word == search_word )
found = true;
// ...
// 缩写, 相当于: if ( found == true )
if ( found )
cout << "ok, we found the word\n";
else cout << "nope, the word was not present.\n";
虽然布尔类型的对象也被看作是一种整数类型的对象但是它不能被声明为signed
unsigned short 或long 例如下列代码是非法的
// 错误不能指定bool 为short
short bool found = false;
当表达式需要一个算术值时布尔对象(如found)和布尔文字都被隐式地提升成 int(正
如下面的例子) false 变成0 而true 变成1 例如
bool found = false;
int occurrence_count = 0;
while ( /* 条件省略 */ )
{
found = look_for( /* 内容省略 */ );
// found 的值被提升为0 或者1
occurrence_count += found;
}
正如文字false 和true 能自动转换成整数值0 和1 一样如果有必要算术值和指针值也能隐式地被转换成布尔类型的值0 或空指针被转换成false 所有其他的值都被转换成true
例如
// 返回出现次数
extern int find( const string& );
bool found = false;
if ( found = find......
C++ 中使用 goto 增强 break 和 continue(转)(2007-05-27 21:00:00)
摘要:C++ 的 goto 语句在大多数时间是被打入冷宫的,就因为它容易使代码晦涩难读。同时,break 和 continue 又经常在多重循环中黔驴技穷——不能越层控制循环。
相比之下,Java 就兼顾这两种情况,将 goto 彻底禁用,而标签则限制其只能用于循环之前,以此增加 break 和 continue 的功能,使其能越层控制循环 [参阅:《带标签的 break 和 continue (Java)》]
Java 尚能如此,为何不在 C++ 中用标签和 goto 语句模仿 Java 来增强 break 和 continue 的功能呢?
于是照 Java 代码写了一份 C++ 的试验样例,结果第一次试验失败。代码如下:
int main(int argc, char* argv[])
...{
cout << "[begin>" << endl;
continuei:
for (int i = 0; i < 10; i++) ...{
for (int j = 0; j < 5; j++) ...{
if ((i + j) % 5 == 0) ...{
cout <<&nbs......
堆、栈及静态数据区详解 (转)(2007-03-25 18:10:00)
摘要:
堆、栈及静态数据区详解
五大内存分区
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
明确区分堆与栈
在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。
首先,我们举一个例子:
void f() { int* p=new int[5]; }
这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:
00401028 push  ......