C++零基础(二):数据类型及标准流

C++零基础(二):数据类型

写在前面

再次声明,本人有学过一点点的Java知识,所以在C++学习过程中一些重复的东西会跳过。但这不意味着那些重复的东西不重要。如果遇到困难的地方,请自己百度。

还是以一个例子开头吧:

//add.cpp 求两数之和
#include <iostream>     //预处理命令
using namespace std;    //使用命名空间std
int main()  //主函数首部
{   //函数体开始
    int number1, number2, sum;  //定义变量
    cin>>number1>>number2;      //输入语句
    sum=number1+number2;        //赋值语句
    cout<<"number1+number2="<<sum<<endl;    //输出语句
    return 0;       //如程序正常结束,向操作系统返回一个零值
}   //函数体结束

如果在运行时键盘输入:

123 456(回车)

则输出为

a+b=579

理解

这次出现了几个新的标识符:

  • int
  • cin
  • «、>>、+、=

数据类型

首先来看int。int是C++数据类型中的一种。

被处理的信息,描述成计算机可以接受、处理的形式,可以称之为数据。而数据也有不同类型,C++将数据类型分为两大类:基本类型和引用类型。限于篇幅,引用类型暂时略过不计。先来看看基本类型:

基本类型

分为三个类型:

  1. 整型——短整型short、整型int、长整形long
  2. 字符型——char
  3. 浮点型——单精度型float、双精度型double、长双精度型long double

整型,用于表示整数,而short、int、long区别在于支持整数位数不同;
字符型,用于表示非数字的字符;
浮点型,用于表示带小数点的实数,float、double、long double区别在于支持小数点后位数不同。

C++并没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,各C++编译系统根据自己的情况作出安排。下表列出了Visual C++数值型和字符型数据的情况:

C++数值型会字符型数据情况

几点说明:

2) 整型数据的存储方式为按二进制数形式存储,例如十进制整数85的二进制形式为1010101,则在内存中的存储形式如下图所示。

0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1

3) 在整型符号int和字符型符号char的前面,可以加修饰符signed(表示“有符号”)或unsigned(表示“无符号”)。如果指定为signed,则数值以补码形式存放,存储单元中的最高位(bit)用来表示数值的符号。如果指定为unsigned,则数值没有符号,全部二进制位都用来表示数值本身。例如短整型数据占两个字节 ,见下图

图

有符号时,能存储的最大值为215-1,即32767,最小值为-32768。无符号时,能存储的最大值为216-1,即65535,最小值为0。有些数据是没有负值的,可以使用unsigned,它存储正数的范围比用signed时要大一倍。

4) 浮点型(又称实型)数据分为单精度(float)、双精度(double)和长双精度(long double)3种,在Visual C++ 6.0中,对float提供6位有效数字,对double提供15位有效数字,并且float和double的数值范围不同。对float分配4个字节,对double和long double分配8个字节。

5) 表中类型标识符一栏中,方括号[ ]包含的部分可以省写,如short和short int等效,unsigned int和unsigned等效。

同时,C++也将数据分为常量和变量两部分。

常量,一旦被赋值,就不能再被改变
变量,其值可以随时变化

标准输入流

cin为C++编程语言互换流中的标准输入流,需要iostream.h支持,即开始的时候,要有#include (新版本编译器为#include )读为 “see in”

cin代表标准输入设备,使用提取运算符 “»” 从设备键盘取得数据,送到输入流对象cin中,然后送到内存。使用cin可以获得多个从键盘的输入值,其具体使用格式如下:
cin >> 表达式1 >>表达式2…>> 表达式n;

运算符

C++的运算符十分丰富,使得C++的运算十分灵活方便。例如把赋值号(=)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的。C++提供了以下运算符:
算术运算符
+(加) -(减) *(乘) /(除) %(整除求余) ++(自加) –(自减)

关系运算符
>(大于) <(小于) ==(等于) >=(大于或等于) <=(小于或等于) !=(不等于)

逻辑运算符
&&(逻辑与) ||(逻辑或) !(逻辑非)

位运算符
«(按位左移) »(按位右移) &(按位与) |(按位或) ^(按位异或) ~(按位取反)
赋值运算符 (=及其扩展赋值运算符)
条件运算符 (?:)
逗号运算符 (,)
指针运算符 (*)
引用运算符和地址运算符 (&)
求字节数运算符(sizeof)
强制类型转换运算符( (类型) 或类型( ))
成员运算符 (.)
指向成员的运算符 (->)
下标运算符 ([ ])
其他 (如函数调用运算符())

拓展

一堆云里雾里的术语抄完了,照例附上自己的一些思考以及摘抄:

深度拓展

知识从何而来?

数据类型

最初,编程语言不区分数据类型。

一直到Martin Richards于1967年左右设计实现BCPL语言。BCPL是一门"无类型"的编程语言:它仅能操作一种数据类型,即机器字(machine word)。

BCPL

LET FUNC foo(a) =  VALOF
{ b := a + 1
RESULTIS b }

1970年,肯·汤普逊为运行在PDP-7上的首个Unix系统设计了一个精简版的BCPL,这个语言被称为B语言。它也是无类型的。

B语言

printn(n,b) {
    extrn putchar;
    auto a;

    if(a=n/b) /* assignment, not test for equality */
            printn(a, b); /* recursive */
    putchar(n%b + '0');
}

Unix最早运行在PDP-7上,是以汇编语言写成。在PDP-11出现后,丹尼斯·里奇与肯·汤普逊希望将UNIX移植到PDP-11上,无类型的语言愈发显得不再适合这一硬件。PDP-11提供了多种不同规格大小的基本对象:一字节长的字符,两字节长的整型数以及四字节长的浮点数。B语言无法处理这些不同规格大小的对象,也没有提供单独的操作符去操作它们。

后来,C语言出现,尝试通过向B语言中增加数据类型的想法来处理那些不同类型的数据。

换句话说,数据类型最早出现在C语言中。

iostream

70年代早期,迈克·莱斯克在70年代早期于贝尔实验室所编写的一个“可移植的I/O程序库”。

1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯·里奇与肯·汤普逊,以B语言为基础,在贝尔实验室设计、开发出C语言。而C语言也将“I/O程序库”的大部分功能集成到标准库头文件 中。

按照现在的视角来看,C语言的I/O功能相当底层:C语言将所有的文件操作符都抽象成了字节流(如标准输入流和标准输出流)。
不像其他早期的编程语言,C语言没有对于从文件随机位置读取的直接支持:为了从一个文件的中间部分读取内容,程序员需要创建一个文件流,定向到文件的中间部分,然后从文件流中按顺序读取一个又一个字节。

文件输入输出流的模型因Unix操作系统而受到普及,而Unix操作系统本身也和C语言的发展相辅相成。绝大多数现代的操作系统从Unix身上继承了流,C家族中的许多编程语言也仅对C语言的输入输出界面做了少许改动(例如PHP)。C++标准库则从其语法上反映流的概念,即为iostream。

横向拓展

Java vs C++

Java想要实现同样效果,有两种形式:

使用默认创建的数组

//add1.java 求两数之和
public class add {
    public static void main(String args[]) {
        int sum;    //定义变量
        sum = (int)args[0] + (int)args[1];  //强制转换并赋值
        System.out.println("number1+number2=" + sum);   //输出语句
    }
}

默认数组为字符串型数组,必须要进行强制转换声明才可以计算两数之和。否则看到的只是两个字符串连接在一起然后输出。

不使用默认数组

//add2.java 求两数之和
import java.util.Scanner;

public class add1 {
    public static void main(String args[]) {
        int number1, number2, sum;  定义变量
        Scanner sc = new Scanner(System.in);    //实例化Scanner对象
        number1 = sc.nextInt();     //捕获下一个输入整数并赋给number1
        number2 = sc.nextInt();     //捕获下一个输入整数并赋给number2
    }
}

新创建一个输入对象,用于捕获键盘输入的值(或者字符串),然后将其赋给实现定义的变量,然后进行运算。

这里Java第二段代码与上面的C++代码相似之处更多,主要的差别在于输入输出流的实现。

Java如果想要捕获键盘输入的数据,就得事先将位于util包里的Scanner实例化(当然还有其他实现方法,这里略过不计),声明这个对象专门用于捕获键盘输入的数据;

C++事先规定好了,cin专门用于捕获键盘输入。

两者的差别在于,Scanner不仅能够捕获键盘输入的数据,还可以使用正则表达式来解析基本类型和字符串;而cin只能捕获键盘输入的数据。

1969年-1973年还有那些大事发生?

1969年11月21日——美国和日本达成协议,琉球群岛将在1972年归还日本。

1970年1月1日——UNIX时间的开始。

1971年——罗尔斯出版的《正义论》,被哲学界公认为二十世纪最重要的政治哲学著作。

1972年2月28日——中美两国发表《中美联合公报》,尼克松表示:美国承认世界上只有一个中国,台湾是中国的一部分。
1972年5月15日——美国将托管的冲绳列岛连同钓鱼岛(尖阁列岛)主权一并移交给日本

1973年10月6日——中东战争爆发,引发石油危机。 又叫赎罪日战争

纵向拓展

拖延症与输入输出流的关系

又是瞎扯淡时间 ̄□ ̄||

维基百科-拖延症

延宕(英语:Procrastination),俗称“拖延症”,是一种个性行为,即将要做的事或者任务推迟到稍后时间的行为。延宕者通常会对开始或完成任何任务或决定感到焦虑,而将延宕作为应付焦虑的一种机制。

心理学研究者有三个标准来界定延宕:

  • 这种行为会阻碍你达到预期目标,它是没有必要的,仅仅拖延完成事务。
  • 延宕经常为患者带来压力、负罪感、降低效率、恐慌,及其他人对你不能完成任务,不能尽责的不良评价。
  • 会恶性循环,导致进一步的延宕行为。

对个人来说,轻微程度的延宕是正常的,当其开始阻碍你的正常工作,就需要认真对待它了。慢性或长期的延宕行为,暗示着潜在的心理及生理紊乱。

维基百科-标准流

在Unix和类Unix系统中,如同某些编程语言接口一样,标准流是当一个电脑程序运行时,在它和它的环境间(典型为终端),事先连接的输入和输出频道。这三个I/O链接称作“标准输入”、“标准输出”和“标准错误输出”。

两者之间有一些相似之处:

  • 当问题出现时,大多数时候不明白为什么;
  • 如果想要搞清楚背后的运作原理,需要耗费大量的时间;
  • 如果下功夫,还是能搞明白原理。

应用

将代码抄一遍并运行,然后尝试向家人阐述什么叫数据类型,什么叫标准流。

你可能感兴趣的:(C++,数据类型,标准流)