《C和C++代码精粹》——1.16 语句声明

1.16 语句声明

C和C++代码精粹
在C++中,声明可以出现在语句可以出现的任何地方。这就意味着不必在程序块的开始进行一组声明,而可以在第一次使用对象时定义它。例如,程序清单1.17中数组a在整个函数体中都是可见的,但是n直到声明后才有效,而i直到下一行才有效。注意i在第二次for循环中被再次声明,这说明了在循环中声明的变量的作用域是该循环本身。

程序清单1.17 声明是语句

// declare.cpp
#include <iostream>
using namespace std;  

main()
{
    int a[] = {0,1,2,3,4};  

//打印地址和大小
    cout << "a == " << (void *) a << endl;
    cout << "sizeof a == " << sizeof a << endl;  

//顺序打印
    size_t n = sizeof a / sizeof a[0];
    for (int i = 0; i < n; ++i)
        cout << a[i] << ' ';
    cout << endl;  

//倒序打印
    for (int i = n-1; i >= 0; --i)
        cout << a[i] << ' ';
    cout << endl;
}  

//输出:
a == 0xffec
sizeof(a) == 10
0 1 2 3 4
4 3 2 1 0

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-07-31 23:17:51

《C和C++代码精粹》——1.16 语句声明的相关文章

《C和C++代码精粹》导读

前言 C和C++代码精粹 本书适合于那些C和C++的职业程序员.假如你已熟悉这两种语言的语法和基本结构,这本书能够为你创建有效的.实用的程序提供实践性的指导.每一个代码范例或程序范例均标明行之有效的用法和技术,这些用法和技术对C/C++这两种重要编程语言的性能发挥起着重要的作用. 对于那些希望在工作中加强自身技术和提高效率的人来说,本书可以算是一本经验之谈.尽管目前人们对面向对象模式的推崇到了白热状态(本书也包括这方面的丰富内容),可是我没有理由不对C++的基础-C表示尊崇.我发现太多的程序开发

《C和C++代码精粹》——1.8 标准流

1.8 标准流 C和C++代码精粹C++中有4个预定义的流:cin(标准输入),cout(标准输出),cerr(标准错误),clog(标准错误).除了cerr外其余都是全缓冲流.就像stderr一样,cerr的行为好象是非缓冲的,但事实上它是单元缓冲的,也就是说它在处理完每一个对象而不是每一个字节后会自动清除缓冲.例如,带有单元缓冲的语句: cerr<<"hello":缓冲处理5个字符,然后清除缓冲区.一个非缓冲处理的流会立即发送每个字符到它的最终目的地. 程序清单1.5

《C和C++代码精粹》——2.3 指针运算

2.3 指针运算 C和C++代码精粹当一个指针指向一个数组元素时,可以在指针上加一个整数或减一个整数来使它指向同一数组的元素.在这样的指针上加1是通过它所引用类型的数据的字节数来增加它的值,因此,它就指向下一个数组元素.程序清单2.3中的程序实现了在一个浮点型数组内完成整数的运算.数组看起来像: 在我的系统平台上,浮点型占4个字节.在p上加1实际上等于在它的值上加4.对两个指向数组元素的指针进行相减可以得到在两个地址之间数组元素个数.换句话说,如果p和q是指向相同类型的指针,那么语句q=p+n意

《C和C++代码精粹》——1.14 默认参数

1.14 默认参数 C和C++代码精粹在一个函数声明中的默认参数用于指示该函数从它的原型中取值.在程序清单1.16中有一个具有原型的函数: int minutes(int hrs ,int min=0); 最后一个参数后面的"=0"指示编译器给第二个参数提供值0.当调用minutes函数时,可以省略了该参数.这种机制对定义相应的重载函数来说本质上是一种速记的方法.在这种情况下,前面的语句等价于: int minutes (int hrs,int min); int minutes (i

《C和C++代码精粹》——1.9 格式化

1.9 格式化 C和C++代码精粹在程序清单1.8中ios::skipws是一个格式化标志的例子.格式化标志是位掩码值,该位掩码值可以通过成员函数setf来设置,也可用unsetf复位(见表1.1的完整描述). 程序清单1.9的程序阐述了数字的格式化.标准流成员函数precision用来指定浮点值显示的小数位数.如果没有设置ios::showpoint标志,那么末尾的零不被显示.要用前置加号来打印正数,就用ios::showpos.在上例中想要以16进制形式显示x 和在指数形式中显示大写e,使用

《C和C++代码精粹》——2.11 更高深的内容

2.11 更高深的内容 C和C++代码精粹 我们可以很自然地得出以下结论:一个三维数组是二维数组的集合. int a[2] [3] [4]={{{0,1,2,3},{4,5,6,7},{8,9,0,1}}, {{2,3,4,5},{6,7,8,9},{0,1,2,3}}}; 这个数组的第一个元素是一个"二维数组" a[0](从技术上来说,a[0]是一个由3个含有4个整数的数组的数组),为了使指针与数组名a一致,定义: int (*p) [3] [4] = a; 程序清单2.16是一个应

《C和C++代码精粹》——2.7 指针和一维数组

2.7 指针和一维数组 C和C++代码精粹 在程序清单2.7中,会注意到在传递数组 s 时并没有使用它的地址,这是因为C和C++在大多数表达式中把数组名转换成指向它第一个元素的指针.自1984年以来,我已经向成百上千的学生讲授了C和C++,我注意到了指针和数组,特别是指针和多维数组之间的关系造成很多迷惑. 这样说似乎很奇怪,但是C++确实不支持数组,至少C++不像支持第一类数据类型如整型或者甚至结构体那样支持数组.考虑以下的语句: int i=1,j; int a[4]={0,1,2,3},b[

《C和C++代码精粹》——1.10 操纵器

1.10 操纵器 C和C++代码精粹 当标识符 endl出现在一个输出流中时,一个换行字符就被插入并且流被刷新.标识符endl是操纵器的一个例子,即为了副效应而插入到流的一个对象.在〈iostream〉中被声明的系统预定义的操纵器列于表 1.3中.程序清单1.11里的程序在功能上与程序清单1.10的程序等价,但它是用操纵器来代替显式调用setf函数.操纵器经常可以使代码更为高效. 表1.3 简单的操纵器(〈iostream〉) 程序清单1.11 用操纵器改变数据基数 // base2.cpp:

《C和C++代码精粹》——2.12 指向函数的指针

2.12 指向函数的指针 C和C++代码精粹 一个指针可以指向函数也可以指向存储的对象.下面的语句声明fp是一个指向返回值为整型(int)的函数的指针: int(*fp)( ); *ftp的圆括号是必需的,没有它的语句 int *fp( ); 将fp声明为一个返回指向整型(int)指针的函数.这就是将星号与类型声明紧密相连的方式成为逐渐受人们欢迎的方式的原因之一. int fp(); //方式说明fp()返回一个指向整型的指针(int ) 当然,这种方式建议你通常应该每条语句只声明一个实体,否则