变量和基本类型

还是从最基础的来看吧,简单的大概看一下吧。

char是8位类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。如中文字符,就可用 wchar_t来表示

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。能够使计算机实现跨语言、跨平台的文本转换及处理。

void* 指针

可用于存放任意对象的地址

作用:拿它与其他类型的指针比较、作为函数的输入或输出、赋给另一个void*指针

不能直接操作void*指向的对象

指向指针的引用

引用本身不是一个对象,因此不能定义指向引用的指针,但是指针是对象,存在对指针的引用

r到底是什么?

最简单的方法是从右向左阅读r的定义。离变量最近的符号对变量的类型个有最直接的影响。

所以,在此例中,r是一个引用。r引用的是一个int指针。

const与指针中,用名词顶层const 表示指针本身是个常量,而用底层const表示指针所指的对象是一个常量。

constexpr和常量表达式

常量表达式——值不会改变并且在编译过程中就能得到计算结果的表达式。用常量表达式初始化的const对象也是常量表达式。

constexpr变量

允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

Tips:一般来说,如果你认定变量是一个常量表达式,那就把它声明成constexpr类型。

字面值类型

常量表达式的值需要在编译时就得到计算,因此对声明constexpr时用到的类型必须有所限制。

这些类型称为“字面值类型”。

算数类型、引用和指针 属于字面值类型。

自定义类、IO库、string类型则不属于字面值类型。也就不能定义成constexpr。

PS:一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。

一般来说,定义于所有函数体之外的对象其地址固定不变,允许函数定义一类有效范围超过函数本身的变量,这类变量和定义在函数之外的变量一样也有固定地址。因此,constexpr引用能绑定到这样的变量上,constexpr指针也能指向这样的变量。

constexpr指针中,限定符constexpr仅对指针有效,与指针所指的对象无关。

constexpr把它所定义的对象置为了顶层指针

指针、常量和类型别名

不能简单的将类型别名替换成它本来的样子,以理解该语句的含义:

如  const char *cstr = 0;       //理解错误!!!

用到pstring时,其基本数据类型是阵阵,声明了一个指向char的常量指针

改写后,数据类型变成了char,*成了声明符的一部分,声明了一个指向const char 的指针。

auto声明 让编译器判断数据类型,一般会忽略掉顶层const,同时底层const则会保留下来

设置一个类型为auto的引用时,初始值中的顶层常量仍然保留。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。

PS:要在一条语句中定义多个变量,切记!符号*和&只从属于某个声明符,而非基本数据类型的一部分,因此初始值必须是同一类型。

decltype类型指示符

选择并返回操作数的数据类型

declttype(f()) sum = f()                     //sum的类型就是表达式f()的类型
const int ci = 0, &cj = ci;
decltype(ci) x = 0;
decltype(cj) y = x;        //y的类型是const int&, y 绑定到变量x
decltype(cj) z;              //错误:z是一个引用,必须初始化

decltype和引用

//decltype的结果可以是引用类型
int i = 42, *p = &i, &r = i;
decltype(r + 0) b;           //正确:加法的结果是int,因此b是一个(未初始化的)int
decltype(*p)  c;              //错误:c是int&,必须初始化

解引用指针可以得到指针所指的对象,而且还能给这个对象赋值。因此,decltype(*p)的结果类型就是int&,而非int

使用decltype时,如果变量名加上了一对括号,则得到的类型与不加括号时会有不同。不加括号,得到的结果是该变量的类型,如果给变量加上了一层或多层括号,编译器就会把它当成一个表达式。变量是一种可以作为赋值语句左值得特殊表达式,所以这样的decltype就会得到引用类型:

decltype((i)) d;         //错误:d是int&,必须初始化
decltype(i) e;            //正确:e是一个(未初始化de)int
时间: 2024-07-30 14:32:23

变量和基本类型的相关文章

由浅入深JavaScript——变量和原始类型

JavaScript变量 JavaScript变量标识符标识符 var + 变量名称来定义变量.变量名称以字母,下划线_,美元$符号开头,余下字符可以是字母,数字,下划线,美元符号.eg: var  name = 'hello';     var  a1 = 'hello';    var  _test = 'hello';    var  $test = 'hello';    以上变量名称均为正确.    var  1a = 'hello'; //数字开头错误.    JavaScript允

第2章 变量和基本类型

2015-10-08 20:18:32 注:  之前解除过C++比较少,只学过C语言. ----------------------------------------------------------- 内置类型是编程语言自己定义的一些类型,不需要我们自己定义了. 比如bool.int: 空类型Void  不对应具体的值,仅用于特殊的场合,例如最常见的是,当函数不反悔任何值时使用空类型作为返回值. 使用浮点数时,选用double---因为float的精度不够,且计算的时候,双精度和单精度的代

C++ Primer学习总结 第1-2章 变量和基本类型

第1-2章 变量和基本类型 1.下面这个语句在C++98和C++11中的输出结果不同. C++98结果: (如果想要更高的精度,可以用%.9lf,输出9位有效数字) C++11结果: 结论: printf的%lf在C++11中表示longdouble,所以用中%f就可以输出float和double类型.而printf在C++98中可以用%lf正确输出double. 如果是scanf的话,不论C++98还是C++11中float都用%f读取,double都用%lf读取,因为二者结构不同.   2.

判断一个变量是数组类型的方法

在很多时候,我们都需要对一个变量进行数组类型的判断(借鉴) 学过js就应该知道typeof运算符返回字符串,该字符串代表操作数的类型(即返回数据类型)这是最常用的. 下面多种实现方式: JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Array的对象就不起作用了. alert(typeof null); // "object" alert(ty

PHP内核探索:变量存储与类型

先回答前面一节的那个问题吧. 01 <?php 02 $foo = 10; 03 $bar = 20; 04    05 function change() { 06     global $foo; 07     //echo '函数内部$foo = '.$foo.'<br />'; 08     //如果不把$bar定义为global变量,函数体内是不能访问$bar的 09     $bar = 0; 10     $foo++; 11 } 12    13 change(); 14

在类中成员变量的作用域类型

作用域类型一共有四种 1,@public 在任何地方都能直接通过成员变量名直接访问成员变量.(不推荐使用) 2,@private 只能在当前类的对象方法中直接通过成员变量名访问成员变量,在其他地方需要通过geter和seter方法访问.(@implementation中被声明成员变量的默认类型) 3,@protected 只能在当前类及其子类的对象方法中直接通过成员变量名访问成员变量,在其他地方需要通过geter和seter方法访问.(@interface中被声明成员变量的默认类型) 4,@pa

C++ Primer 学习笔记_5_变量和基本类型(续2)

 变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: [cpp] view plaincopyprint? enum {input, output, append}; const int input = 0; const int output = 1; const int append = 2; enum {input, output, append}; const int input = 0;

C++primer笔记2:变量和基本类型、字符串,向量和数组、表达式、类

第2章:变量和基本类型 char 8位 bool 未定义 short 短整型16 int 整型16 long 长整型32 long long 长整型64 C++11新定义的 float: 1个字 32位 6位有效位 double: 2个字 64位 10位有效位 long double: 10位有效位 带符号和不带符号的 unsigned 不带符号 仅仅表示大于0的 signed 带符号 大于,小于,0 基本字符集 :比特位 可寻址的最小内存块:字节 8比特 存储的基本单位 :字 32或64比特

C++ Primer 笔记(2)第二章 变量与基本类型

第二章 变量与基本类型 1.基本内置类型包括算术类型和空类型,算术类型分为两类:整型(包括字符和布尔类型)和浮点型: 2.布尔类型(bool)的取值是真(true)或者假(false): 3.字面值常量:每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型, 由单引号括起来的一个字符是char型字面值,有双引号括起来的零个或者多个字符则构成字符串字面值: 20  整形字面值 ‘a’ 字符字面值 “Hello World”或者“”都会字符串字面值 ‘A’表示单独字符A,而“A”

Lex与Yacc学习(八)之变量和有类型的标记(扩展计算器)

变量和有类型的标记 下一步扩展计算器来处理具有单个字母名字的变量,因为只有26个字母 (目前只关心小写字母),所以我们能在26个条目的数组(称它为vbltable)中存储变量. 为了使得计算器更加有用,也可以扩展它来处理多个表达式(每行一个)和使用浮点值. 具有变量和实值的计算器词法ch3-03.l %{ #include "ch3-03.tab.h" #include <math.h> extern double vbltable[26]; %} %% ([0-9]+|(