C++ primer 注意的知识点(第1,2章)

来源:互联网 发布:任务管理系统 php 编辑:程序博客网 时间:2024/05/21 19:21

 

1)    main函数是唯一被操作系统(显示)调用的函数,在大多数系统中,main函数的返回值是一个状态指示器。返回值零表示main函数成功执行完毕,任何非零的返回值都有操作系统的含义,通常非零值表明有错误出现。

2)    C++中每个表达式会产生一个结果,当操作数是输出操作数时,结果是左操作数的值,也就是说输出操作返回的值是输出流本身,所以才会出现连着输出的语句。

3)    错误的注释比没有注释更糟,因为它会误导后来者。

4)    操作系统使用不同的值作为文件结束符。Windows 系统下我们通过键入 controlz——同时键入ctrl键和z键,来输入文件结束符。Unix 系统中,包括 Mac OSX 机器,通常用 controld

(注:本人在试验程序的时候,对于在Windows下的VC6.0开发环境下试验的结果是当敲完controlz后,必须练敲两次Enter键才有结果,并且输出会有一个换行,莫名其妙!不知是不是VC的一个漏洞?在Linux下的试验结果符合的很好)

5)    对于 unsigned 类型来说,编译器必须调整越界值使其满足要求。编译器会将该值对 unsigned 类型的可能取值数目求模,然后取所得值。比如 8 位的 unsigned char,其取值范围从 0 255(包括 255)。如果赋给超出这个范围的值,那么编译器将会取该值对 256 求模后的值。例如,如果试图将 336 存储到 8 位的 unsigned char 中,则实际赋值为 80,因为 80 336 256 求模后的值。把负值赋给 unsigned 对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值。所以,如果把 -1 赋给8位的 unsigned char,那么结果是 255,因为 255 -1 256 求模后的值。当将超过取值范围的值赋给 signed 类型时,由编译器决定实际赋的值。在实际操作中,很多的编译器处理 signed 类型的方式和 unsigned 类型类似。也就是说,赋值时是取该值对该类型取值数目求模后的值。然而我们不能保证编译器都会这样处理 signed 类型。

附一段程序:

#include <iostream>

#include <cstdio>

using namespace std;

int main()

{

    unsigned char ch;//可以去掉unsigned测试char

    ch = static_cast<unsigned char>(256);

    printf("%d/n",ch); //printf来输出它的值,字符可能不能显示

    return 0;

}

6)    虽然 char 类型是整型,但是 char 类型通常用来存储字符而不用于计算。事实上,在某些应用中 char 类型被当作 signed 类型,在另外一些应用中则被当作 unsigned 类型,因此把 char 类型作为计算类型使用时容易出问题。

另外网上搜集的资料:

charC/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标准中是unsigned编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。在C/C++中:关于char还有一个特殊的语言就是char *它在C/C++中有专门的语义,既不同于signed char *,也不同于unsigned char *,专门用于指以'/0'为结束的字符串。C语言是弱类型还没什么,如果在C++中(在C语言可以),你可以试一试,用char *p = "abcd";是可以通过编译的但如果用signed char *p = "abcd";还是unsigned char *p = "abcd";都是不能通过编译的。

判断编译器的默认char符号

#include <stdio.h>

int main()

{

   char c = -1;

   if ( c < 200)

   {

      printf("signed/n");

   }

   else

   {

      printf("unsigned/n");

   }

   return 0;

}

7)    C++是一门强静态类型的语言,在编译时会做类型检查。

注释:所谓强类型语言,也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。所谓静态:它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#JAVA等。

8)    初始化分为直接初始化和复制初始化

int ival1024); //direct-initialization

int ival = 1024;  // copy-initialization

对于内置类型来说,这两种初始化没有任何区别,但是对于类类型对象来说就不一样了,此为后话。

9)    const变量默认为extern(外部变量),const对象默认为文件的局部变量,要使const变量能够在其他的文件中访问,必须显式的指明为extern

写成如下形式:

//file_1.cpp

extern const int bufsize = 9;//z注意这句话既是声明也是定义

//file_2.cppe

extern const int bufsize;

………

10)             const 引用可以初始化为不同类型的对象或者初始化为右值。这句话不太好理解,经过csdn网友 zy020118的帮助,解释如下:

 int a = 4;

const double& b= a;

这样写是可以通过的,但是如果去掉const的话显然是不行的,既是

int a = 4;

double& b= a;

因为编译器会把这些代码转换成如以下形式的编码:

int temp = a;          // create temporary int from the double

double &b = temp; 

我们可能会在后面的程序中修改b,我们本意希望a的值也会跟着改变。但是由于编译器加的那句会导致,b只是一个临时变量的引用,因此实际上a的值却不会变,这就导致程序运行的状态和我们希望的不一样。为了避免这种不和谐的情况发生,c++规定,只有const引用可以初始化为不同类型的对象,因为当一个引用申明为const就代表我们不会去改变它的值,那么程序运行将和我们希望的一样。

11)             对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。

 

原创粉丝点击