《c++语言导学》——1.5 类型、变量和算术运算

1.5 类型、变量和算术运算

每个名字和每个表达式都有自己的类型,类型决定了名字和表达式所能执行的操作。例如,下面的声明

把inch的类型指定为int,也就是说,inch是一个整型变量。
声明(declaration)是一条语句,负责为程序引入一个新的名字,并指定该命名实体的
类型:

  • 类型(type)定义了一组可能的值以及一组(对象上的)操作。
  • 对象(object)是存放某类型值的内存空间。
  • 值(value)是一组二进制位,具体的含义由其类型决定。
  • 变量(variable)是一个命名的对象。

C++提供了若干基本类型,例如:

https://yqfile.alicdn.com/3f897c4f419a8fa5d48fb6d61957ac487712d9c4.png" >

每种基本类型都与硬件特性直接相关,其尺寸固定不变,决定了其中所能存储的值的
范围:

https://yqfile.alicdn.com/5e48b1a169b163cf2135995ed73f89168d5c10ef.png
" >

一个char变量的尺寸取决于在给定的机器上存放一个字符所需的空间(通常是一个8位的字节),其他类型的尺寸是char尺寸的整数倍。类型的实际尺寸是依赖于实现的(即在不同机器上可能不同),使用sizeof运算符可以得知该值。例如,sizeof(char)等于1,sizeof(int)通常是4。
算术运算符可用于上述这些类型的组合:

比较运算符也是如此:

除此之外,C++还提供了一些逻辑运算符:

位逻辑运算符是对它的运算对象逐位计算,所得的结果类型与运算对象的类型保持一致。一般逻辑运算符&&和||返回的是true或者false。
在赋值运算和算术运算中,C++编译器会在基本类型之间进行各种有意义的类型转换,以便它们能够自由地组合在一起,进行混合运算:

https://yqfile.alicdn.com/6b2ffaa12d0a2e208c78800985e94215eadc1936.png" >

表达式中使用的类型转换称为常用算术类型转换(usual arithmetic conversion),它的目的是确保表达式以它的运算对象中最高的精度进行求值计算。例如,一个double值和一个int值求和,执行的是双精度浮点数的加法。
注意,=是赋值运算符,而==用于相等性判断。
C++提供了好几种表示初始化的符号,比如上面用到的=。此外还有一种更加通用的形式,这种形式使用的是以花括号括起来的一个初始值列表:

https://yqfile.alicdn.com/7a622e002285c255abf87ff8020c49191415b64e.png" >

符号=是一种比较传统的形式,最早被C语言使用。但是如果拿不准的话,最好在C++中使用更通用的{}列表形式。抛开其他因素不谈,使用初始值列表的形式至少可以确保不会发生某些可能导致信息丢失的类型转换:

不幸的是,像把double转换成int或者把int转换成char这样的窄化类型转换(narrowing conversion)即使会丢失一些信息,但C++编译器不禁止这种转换,反而会隐式地自动执行。隐式窄化类型转换带来的问题是为了与C语言兼容而不得不付出的代价(见14.3节)。
常量(见1.7节)在声明时必须进行初始化,普通变量也只应在极有限的情况下不进行初始化。换句话说,在引入一个新名字时最好已经有了一个合适的值。用户定义的类型(如string、vector、Matrix、Motor_controller和Orc_warrior)可以在定义时进行隐式初始化(见4.2.1节)。
在定义一个变量时,如果变量的类型可以由初始化符号推断得到,则无需显式指定其类型:

可以使用=初始化形式与auto配合,因为在此过程中不存在可能引发错误的类型转换。
当我们没有明显的理由需要显式指定数据类型时,一般使用auto。在这里,“明显的理由”包括:

  • 该定义位于一个较大的作用域中,我们希望代码的读者清楚地知道其类型;
  • 我们希望明确规定某个变量的范围和精度(比如希望使用double而非float)。

使用auto可以帮助我们避免冗余,并且无需再书写长类型名。这一点在泛型编程中尤其重要,因为在泛型编程中程序员很难知道对象的确切类型,类型的名字也可能相当长
(见10.2节)。
除了传统的算术运算符和逻辑运算符之外,C++还提供了其他一些可用于改变变量值的运算符:

这些运算符简洁明了,使用广泛。

时间: 2024-11-10 10:10:37

《c++语言导学》——1.5 类型、变量和算术运算的相关文章

《Java语言导学(原书第6版)》一一3.1 变量

3.1 变量 根据第2章可知,对象的状态存储在字段中: 2.1节已经介绍了字段的概念,但读者仍可能会问:命名字段有什么规则和约定?除了整型,是否还有其他数据类型?字段在声明时是否必须初始化?如果字段没有显式初始化,该字段是否会被赋予一个默认值?本章将会详细解答这些问题.但在此之前,先要明确一些技术差别.Java程序语言同时使用字段和变量.对于新的开发人员而言,这是造成概念混淆的主要原因,因为两者经常看似指代同一个事物.Java程序语言定义了如下变量: 实例变量(非静态字段).就技术而言,对象将个

《Java语言导学(原书第6版)》一3.1 变量

3.1 变量 根据第2章可知,对象的状态存储在字段中: 2.1节已经介绍了字段的概念,但读者仍可能会问:命名字段有什么规则和约定 除了整型,是否还有其他数据类型?字段在声明时是否必须初始化?如果字段没有显式初始化,该字段是否会被赋予一个默认值?本章将会详细解答这些问题.但在此之前,先要明确一些技术差别.Java程序语言同时使用字段和变量.对于新的开发人员而言,这是造成概念混淆的主要原因,因为两者经常看似指代同一个事物.Java程序语言定义了如下变量: 实例变量(非静态字段).就技术而言,对象将个

《c++语言导学》—— 导读

前言 现在的C++仿佛进化成了一种新的语言.与C++98相比,C++11更易于我们清晰.简洁.直观地表达思想.而且编译器可以更好地检查程序中的错误,程序的运行速度也提高了. 就像其他任何一种现代编程语言一样,C++的规模庞大且提供的库异常丰富,值得程序员认真学习以便高效地利用.这本小册子的目的是让有经验的程序员快速了解现代C++语言,因此它几乎介绍了C++的全部核心功能和重要的标准库组件.读者花费几个小时就能读完本书,但是想必所有人都清楚,要想写出漂亮的C++程序绝非一日之功.好在本书的目的并非

《c++语言导学》——第1章 基 础 知 识1.1 引言

第1章 基 础 知 识 引言 程序 Hello,World! 函数 类型.变量和算术运算 作用域和生命周期 常量 指针.数组和引用 检验 建议 1.1 引言 本章简要介绍C++的符号系统.C++的存储和计算模型以及如何把代码组织成程序.这些语言特性支持C语言中绝大多数常见的编程模式,我们称之为面向过程的程序设计(procedural programming).

《c++语言导学》——第2章 用户自定义类型 2.1 引言

第2章 用户自定义类型 引言 结构 类 联合 枚举 建议 2.1 引言 我们把用基本类型(见1.5节).const修饰符(见1.7节)和声明运算符(见1.8节)构造出来的类型称为内置类型(built-in type).C++语言的内置类型及其操作非常丰富,不过相对来说更偏重底层编程.这些内置类型的优点是能够直接有效地展现出传统计算机硬件的特性,但是并不能向程序员提供便于书写高级应用程序的高层特性.为此,C++语言在充分利用内置类型和操作的基础上,提供了一套成熟的抽象机制(abstraction

《Java语言导学(原书第6版)》一导读

前 言 自2010年年初Oracle公司收购Sun公司以来,Java语言迎来激动人心的时代.正如Java Community Process计划的活动所印证的,Java语言将不断发展.本书基于Java SE 8(Java Platform Standard Edition 8)并引用其API. 相比本书第5版(针对的是Java版本7),第6版有一些新特点: Lambda表达式使得功能可作为方法参数使用,代码作为数据使用.Lambda表达式描述单个方法接口(也称为功能接口)的实例会更简洁.4.4.

《Java语言导学(原书第6版)》一3.2 运算符

3.2 运算符 学习了如何声明和初始化变量之后,下面看看如何利用这些变量来做点事情.学习Java程序语言的运算符是个很好的切入点.运算符是一类特殊的符号,它们执行1个.2个或3个运算对象上的特定操作,然后返回结果. 研究Java程序语言的运算符时,先了解这些运算符的优先级可能会有帮助.表3-2根据优先级顺序列出了所有的运算符.越靠近表的顶端,运算符的优先级越高.优先级较高的运算符先计算,相对较低的后计算.同一行的运算符优先级相等.当表达式中出现优先级相等的运算符时,计算规则如下:赋值运算符从右到

《Java语言导学(原书第6版)》一一3.2 运算符

3.2 运算符 学习了如何声明和初始化变量之后,下面看看如何利用这些变量来做点事情.学习Java程序语言的运算符是个很好的切入点.运算符是一类特殊的符号,它们执行1个.2个或3个运算对象上的特定操作,然后返回结果. 研究Java程序语言的运算符时,先了解这些运算符的优先级可能会有帮助.表3-2根据优先级顺序列出了所有的运算符.越靠近表的顶端,运算符的优先级越高.优先级较高的运算符先计算,相对较低的后计算.同一行的运算符优先级相等.当表达式中出现优先级相等的运算符时,计算规则如下:赋值运算符从右到

《c++语言导学》——2.3 类

2.3 类 上面这种将数据与其操作分离的做法有其优势,比如我们可以非常自由地使用它的数据部分.不过对于用户自定义类型来说,为了将其所有属性捏合在一起,形成一个"真正的类型",在其表示形式和操作之间建立紧密的联系还是很有必要的.特别是,我们常常希望自定义的类型易于使用和修改,希望数据具有一致性,并且希望表示形式最好对用户是不可见的.此时,最理想的做法是把类型的接口(所有代码都可使用的部分)与其实现(对外部不可访问的数据具有访问权限)分离开来.在C++中,实现上述目的的语言机制称为类(cl