1. cin原来也可以以空格间隔输入(输入包括string)
2.键盘上Ctrl+Z,可以表示文件结束符
3.文件重定向addItem <infile> outfile
4.char分为:char(具体表现为后面两种之一,
取决于编译器)、signed char、unsigned char
5.赋值给
无符号类型
,
超过范围即为值对
范围求模的余数
;赋值给
有符号类型
,
超过范围
未定义(undefined)
6.初始化与赋值是不同的概念,初始化的含义是创建变量的时候赋予一个初始值,赋值则把当前值擦除,用新值替代
7.定义于
任何函数体之外
的
变量被
初始化为0,建议初始化内置类型变量
,防止未初始化造成的错误
8.extern double pi = 3.1415926为定义,而非声明,任何在函数体 内部试图初始化extern关键字的变量 ,将引发错误
9.用户自定义标示符
不能采用双下划线或下划线加大写字母;
函数体外部 不能
下划线开头
2.3复合类型(引用,指针等)
引用为对象起了另一名字,定义引用时,会跟初始值 绑定(bind)在一起,因此无法另引用指向另一个引用,所以引用必须初始化。引用即别名,非对象。
除2种情况,引用类型需与绑定对象严格匹配
指针指向的对象类型必须与赋值类型相同
void *指针,可以存放任意对象地址,但没法访问内存中的对象,因为不知道其类型
阅读一条比较复杂的指针或引用,可以从右到左阅读该变量的定义 (很有帮助的一条tip)
2.4const限定符
const的变量不是一个常量表达式,可以在声明,和定义都添加extern关键字,extern const int buffer = func() ---定义 ; extern const int buffer---声明;
const引用可以绑定到一个非常量对象上
const int * r3 = &i;
int * const r4 = &i;
r3 = &j;
r4 = &j;这段表明了const int * 与 int * const 的区别,一个是表明指针指向变量的之不可变,一个表明,int类型指针里的内容(地址)不可变,也即只能指向同一个地址
底层const不能忽略,顶层const不受影响,赋值的时候
个人感悟:无论是const int * p = &i,const int &q = i,其实都只是对改指针或引用的声明,表明不能通过修改 *p的值,或q的值来达到修改i的值,i的值能否被修改取决于i属于什么类型,如果为非常量值,则它可以被其他的变量修改。
constexpr类型定义,通过一个常量表达式,或constexpr函数(容易在编译期间得出结果)
2.5处理类型
typedef char * pstring
const pstring cstr = 0 与const char * cstr=0,完全不一样,因为pstring已经成为了一种类型,参考const int a,表明此指针是不可变的
auto类型:需要初始化,赋值的时候类型会自动忽略顶层const(跟一般状况一样 )
decltype类型指示符,返回操作数数据类型
解引用,原来得到的是引用!!!所以,int * p = &i ,
decltype(*p)得到的类型类型其实为int &
解引用操作符是:*。对于其定义书上并没有给出明确的定义,不过其意思是对其得到操作数(必须为指针类型)所指变量的引用。如有如下代码:
int ival;
int *ip=&ival;
int &iref=*ip;//*ip就是ival的引用。
其等价于:
int &iref=ival;
使用decltype时,如果变了带有括号,则代表返回对其引用的类型,例如decltype( ( i ) ),返回的是int &类型,定义对象的时候必须初始化
int *p1 = nullptr; 等价于int *p2 = 0 ; 等价于int *p3 = NULL; (难道0地址即表示空指针。。。)