随笔 - 56, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

第二章 变量和基本类型

第二章
①、

int ival=ival;

虽然语法上没有错误,但这个初始化没有意义,ival仍是未初始化的。

整型的赋值
当我们试着把一个超出其取值范围的值赋给一个指定类型的对象时,结果会怎样呢?答案取决于这种类型是signed还是unsigned的。
对于unsigned类型来说,编译器必须调整越界值使其满足要求。编译器会将该值对unsigned类型的可能取值数目求模,然后取所得值。比如8位的unsigned
char ,其取值范围从0到255(包括255)。如果赋给超出这个范围的值,那么编译器将会取该值对256求模后的值。例如,如果试图将336存储到8位的
unsigned char 中,则实际赋值为80,因为80是336对256求模后的值。

#include<iostream>
using namespace std;
int main()
{
    unsigned 
char ch=336;
    cout
<<(int)ch<<endl;
    
return 0;
}

C++中,把负值赋给unsigned对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值。所以把-1赋给8位的unsigned char,那么结果为255 。

#include<iostream>
using namespace std;
int main()
{
    unsigned 
char ch=-1;
    cout
<<(int)ch<<endl;
    
return 0;
}


②、

double salary=wage=9999.9;

非法:同一定义语句中不同变量的初始化应分别进行。

初始化:
定义时指定了初始值的对象被称为是已初始化的。初始化指创建变量并给它赋初值,而赋值则是擦除对象的当前值并用新值代替。

通过一个计数器和一个字符初始化string对象。这样创建的对象包含重复多次的指定字符,重复次数由计数器指定:
  std::string all_nines(10,'9');      //all_nines="9999999999"
本例中,初始化all_nines的唯一方法是直接初始化。有多个初始化式时不能使用复制初始化。

③、
const对象默认为文件的局部变量
在全局作用域里定义非const变量时,它在整个程序中都可以访问。我们可以把一个非const变量定义在一个文件中,假设已经做了合适的声明,就可
在另外的文件中使用这个变量:

//file_1.cc
int counter;  //definition
//file_2.cc
extern int counter;    //uses counter from file_1
++counter;           //increments counter defined in file_1

与其他变量不同,除非特别声明,在全局作用域声明的const变量时定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。
通过自定const变量为extern,就可以再整个程序中访问const对象:

//file_1.cc
//defines and initializes a const that is accessible to other files
extern const int bufSize=fcn();
//file_2.cc
extern const int bufSize; //uses bufSize from file_1
//uses bufSize defined in file_1
for(int index=0;index!=bufSize;++index)
//


非const变量默认为extern。要使const变量能够在其他的文件中访问,必须显式地指定它为extern。
const对象必须要初始化,且其值不能被修改。

④、

const int ival=1024;
const int &refval=ival;        //ok!
int &ref2=ival;                //error,noconst reference to a const object;

⑤、
const引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量。

int i=42;
const int &r=42;
const int &r2=r+i;

非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或绑定到右值。

int &rval=1.01;        //错误,因为rval1是一个非const引用,非const引用不能绑定到右值,而1.01是一个右值。

⑥、

enum Points {point2d=2,point2w,point3d=3,point3w};

枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行的:

Points pt3d=point3d
Points pt2w
=3;        //error:pt2w initialized with int
pt2w=polygon;         //error:polygon is not a Points enumerator
pt2w=pt3d;            //ok:both are objects of Points enum type

注意把3赋给Points对象是非法的,即使3与一个Points枚举成员相关联。

⑦、
概念:
constant expression(常量表达式):
值可以在编译时计算出来的整型表达式。

posted on 2009-08-11 23:08 八路 阅读(214) 评论(0)  编辑 收藏 引用 所属分类: C++primer 笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理