C++ primer 注意的知识点(第1,2章)
来源:互联网 发布:任务管理系统 php 编辑:程序博客网 时间:2024/05/21 19:21
1) main函数是唯一被操作系统(显示)调用的函数,在大多数系统中,main函数的返回值是一个状态指示器。返回值零表示main函数成功执行完毕,任何非零的返回值都有操作系统的含义,通常非零值表明有错误出现。
2) C++中每个表达式会产生一个结果,当操作数是输出操作数时,结果是左操作数的值,也就是说输出操作返回的值是输出流本身,所以才会出现连着输出的语句。
3) 错误的注释比没有注释更糟,因为它会误导后来者。
4) 操作系统使用不同的值作为文件结束符。Windows 系统下我们通过键入 control—z——同时键入“ctrl”键和“z”键,来输入文件结束符。Unix 系统中,包括 Mac OS—X 机器,通常用 control—d。
(注:本人在试验程序的时候,对于在Windows下的VC6.0开发环境下试验的结果是当敲完control—z后,必须练敲两次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 类型作为计算类型使用时容易出问题。
另外网上搜集的资料:
char是C/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 ival(1024); //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 函数这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。
- C++ primer 注意的知识点(第1,2章)
- C++ primer 注意的知识点(第7章)
- C++ primer 注意的知识点(第3-6章)
- C++primer第4版第1章知识点整理
- C++ Primer 第(1-3)章一句话知识点总结
- C++ Primer 第2章 知识点回顾
- C++Primer第5版读书笔记(第2章)
- C++primer知识点(一)
- C++primer知识点(二)
- C++primer知识点(三)
- C++primer知识点(四)
- C++ Primer 第(4-5)章一句话知识点总结
- C++ Primer 第3章 知识点回顾
- C++ Primer 第4章 知识点回顾
- C++ Primer 第5章 知识点回顾
- C++ Primer 第6章 知识点回顾
- C++ Primer 第7章 知识点回顾
- C++ Primer 第8章 知识点回顾
- 子衿的事(21)
- 子衿的事(22)
- 读马克思《共产党宣言》
- 给网页中某些元素赋动作(给input标签赋onclick方法getElementsByTagName)
- shell字符串比较、判断是否为数字
- C++ primer 注意的知识点(第1,2章)
- Shell十三问
- Android 捕获返回键彻底关闭应用程序
- shell字符串操作
- 用Setup Factory 7.0 制作安装程序 基础篇
- 关闭组件的方法
- 用 Setup Factory 7.0 制作安装程序 进阶篇
- 用 Setup Factory 7.0 制作安装程序 问答篇
- Android 从JNI中传入UTF8 的字符到Java