对象、类型和值 笔记(一)
为了读取某些东西,我们需要从某个地方读入;我们需要在计算机内存中的某个地方放置读取的东西。这样一个“地方”称为一个对象。
一个对象是一个具有某种类型的存储区域。一个有名字的对象称为一个变量。
对象:用来存储数据的“位置”。
类型用来指定可以放置什么样的信息。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
inline void keep_window_open() { char ch; cin >> ch; }
int main()
{
cout << "Please enter your first name(followed by'enter':\n";
string first_name; //first_name为字符串名的变量
cin >> first_name; //读取字符串到first_name
cout << "Hello," << first_name << "!\n";
}
main中第一行简单地输出一条信息,提示用户输入一个名字,这个信息通常被称为一个提示信息。
接下来几行定义了一个名为first_name的string变量。
读入键盘输入到该变量。
输出一个欢迎词。
string first_name; 这行会划分一个字符串的内存区域,并将它命名为first_name。
cin读做“see-in”,“chapter input”的缩写。
其中>>为操作符,get from。指定输入到哪里。
换行是有必要的,用来引起计算机的注意,直到输入下一个换行,计算机才会收集这些字符,按下回车键之前可以修改、删除。这个换行不会保存在内存中成为字符串的一部分。
cout << “Hello,” << first_name << “!\n”; 注意:我们使用引号来表示字符串字面值,当不使用引号时,输出的是名字所对应的值。
变量
我们需要使用一个名字来访问一个对象。一个命名后的对象被称为一个变量。
变量有特定的类型(int、string…),类型决定我们将什么赋给对象以及可使用的操作。我们赋给变量的数据项被称为值。
一个用来定义变量的语句被称为“定义”。
我们不能把错误类型的值赋给一个变量。编译器会记录每个变量的类型并确保对它的使用与定义它时的类型一致。
int:整数
double:浮点数
char:单个字符,比如 ’ . '。单引号限定的单个字符。
string:字符串,在双引号中的一串字符。
bool:逻辑变量,比如bool tap_on = true
double是双精度浮点的简写,浮点是数学概念上的一个实数在计算机中的近似值。
输入和类型
输入操作>>(“get from”)对类型敏感。读取的值与变量类型需一致。
//读取名字和年龄
int main()
{
cout << "Please enter your name and age\n";
string first_name; //字符串变量
int age; //整型变量
cin >> first_name; //读入一个字符串
cin >> age; //读入一个整数
cout << "Hello,"<<first_name<<"(age"<<age<<")/n";
}
如果你输入LI 22,>>将LI读入first_name,将22读入age,并且生成以下输出:
Hello,LI (age 22)
如果你输入22 LI呢?,这时候的输出将为22 和一个随机数,22会被当成字符串读入first_name,而LI不是一个整数则不会被读取,而我们没有给age赋初值,也没有成功读入一个数存进它,因此就会得到内存中某个部分的“垃圾值”。
现在我们可以初始化age,这样在输入错误时我们可以得到一个可预测的值。
//读取名字和年龄
int main()
{
cout << "Please enter your name and age\n";
string first_name="???"; //字符串变量
//???表示“不知道名字”
int age=-1; //整型变量,-1表示不知道年龄
cin >> first_name>>age; //读入字符串和整数
cout << "Hello,"<<first_name<<"(age"<<age<<")/n";
}
现在输入22 LI,则会得到 Hello,22(age -1)
此外,计算机不将LI 22全部读入first_name是因为按照规定,读取字符串会被空白符所终止,包括空格、换行符和tab字符。空格在默认情况下会被>>忽略,若在读取的数字之前添加任意多空格,>>将会跳过它们并读取这个数字。使用>>的字符串读取缺省情况会被空格终止:它只能读取一个单词。解决办法可以是:
int main()
{
cout << "Please enter your first and second names\n";
string first; //字符串变量
string second;
cin >> first>>second; //读取2个字符串
cout << "Hello,"<<first<<" "<<second<<'\n';
}
运算和运算符
指定什么值可以存储在一个变量中,变量类型决定我们可以对它进行什么运算以及它们意味着什么。
string s2 = name + "Jr."; //+代表追加字符串
int c3 = count - 2 //- 是指整数相减
string s3 = name - "Jr." //错误:对于字符串来说减号是未定义的
=:赋值,==:等于
sqrt(n),n的平方根。
其中int运算符包含余数(模),而double浮点型没有该运算符,int有余数并赋值(%=),而double没有。
string name=first+’ '+second; //字符串连接
字符串+意味着连接。
字符串比较也特别有用
//读入并比较两个名字
int main()
{
cout<<"Please enter two names\n";
string first;
string second;
cin>>first>>second;//读入两个字符串
if (first==second)
cout<<"That's the same name twice.";
if (first<second)
cout<<first<<"is alphabetically before"<<second<<'\n';
if (first>second)
cout<<first<<"is alphabetically after"<<second<<'\n';
}
赋值和初始化
初始化:给一个变量它的初值
赋值:给一个变量一个新的值
两者在逻辑上是不同的,初始化变量为“空”,赋值在放入一个新的值前需要将旧的值清空。当我们想将一个新的值放入,赋值是必须的。
实例:检测重复单词
int main()
{
string previous=' ';//前一个单词,初始化为“不是一个单词”
//这里" "只包含一个空格字符
string current; //当前单词
while (cin>>current) //读入单词流
{
if(previous==current) //检测当前单词是否和前一个相同
cout<<"repeated word:"<<current<<'/n';
previous=current;
}
}
while的意思,当输入操作cin>>current成功的情况下,(cin>>current)后面的语句将反复执行。
注意:对于一个string,>>读取的是用空格分开的单词,可以通过给程序一个终止输入符号(通常是文件结尾)来终止这个循环。
复合赋值运算符
一个变量的递加(+1)在程序中很常用,有一个特定的语法比如:
++counter
表示:counter=counter+1
C++直接支持这些运算:
a+=7 ; //a= a+7
b-=9; // b= b-9
c*=2; //c=c*2
在很多应用领域=和/=被认为是“缩放”