C++学习(六)入门篇——确定常量类型

2018-06-17 22:11:22来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

程序声明将整型变量的类型告诉了C++编译器,但编译器如何知道常量类型呢?

除非有理由(如使用特殊后缀,或者值太大无法存储为int),不然都将存储为int类型

后缀是放在数字常量后面的字母

l、L表示long常量

u、U表示unsigned int

ul(UL)或lu(LU)表示unsigned int

ll、LL为long long

ull、Ull、uLL、ULL为unsigned long long

对不带后缀的十进制整数,使用能够存储该数的最小类型来表示:int、long或long long。

对不带后缀的八、十六进制数,采用能存储该数的最小类型来表示:int、unsigned int、long、unsigned long、long long和unsigned long long

因为十六进制常用来表示地址,没有符号,所以unsigned long 比long更合适

char专为存储字符(字母和数字)

很多系统支持的字符不超过128个,则用一个字节可表示所有符号

char比short更小

//chartype.cpp - - the char type
#include<iostream>
int main()
{
    using namespace std;
    char ch;

    cout << "Enter a charcter:" << endl;
    cin >> ch;
    cin.get();
    cout << "Hola!";
    cout << "Thank you for the " << ch << " character." << endl;
    cin.get();
}

输入时,cin将键盘输入的M转化为77,输出时,cout将77转换为所要显示的字符M

//morechar.cpp - - the char type and int type contrasted
#include<iostream>
int main()
{
    using namespace std;
    char ch = 'M';
    int i = ch;
    cout << "The ASCII code for " << ch << " is " << i << endl;

    cout << "Add one to the character code:" << endl;
    ch = ch + 1;
    i = ch;
    cout << "The ASCII code for " << ch << " is " << i << endl;

    cout << "Displaying char ch using cout.put(ch):";
    cout.put(ch);
    cout.put('!');
    cout << endl << "done" << endl;
    cin.get();
}

‘M’表示M的字符编码

char ch;
cin>>ch;

如果输入5按回车,则将5对应的字符编码“53”存储到ch中。

int n;
cin>>n;

如果输入5,则将数值5存储到n中。

 

1.成员函数cout.put()

类定义了如何表示和控制字符,成员函数归类所有,描述了操纵类数据的方法。

如类ostream有一个put()成员函数,用来输出字符,只能通过类的特定对象来使用成员函数。

句点被称为成员运算符,cout.put()表示通过类对象来使用函数put()

因为历史上,C++的Release 2.0以前,cout将字符变量显示为字符,将字符常量显示为数字。(如‘M’、‘N’)

cout<<ch得到M

cout <<'M'得到77

不过现在已经可以正确的处理字符了

 

2.char字面值

一般最简单的方法就是将字符用单引号括起,书写字符

但有些字符不能通过键盘输入到程序中,故采用特殊的方法——转义序列

C++转义序列的编码
字符名称 ASCII符号 C++代码 十进制ASCII码 十六进制ASCII码
换行符 NL(LF) \n 10 0xA
水平制表符 HT \t 9 0x9
垂直制表符 VT

\v

11 0xB
退格 BS \b 8 0x8
回车 CR \r 13 0xD
振铃 BEL \a 7 0x7
反斜杠 \ \\ 92 0x5C
问号 ? \? 63 0x3F
单引号 ' \' 39 0x27
双引号 " \" 34 0x22

将它们作为字符常量时,应用单引号括起,将它们放在字符串中,不要使用单引号

显示数字时,使用endl比\n容易些,但显示字符串时,\n更容易些,如

cout<<x<<endl;

cout<<"Dr.X.\n";

以下三个都是换行符:

cout<<endl;

cout<<'\n';

cout<<"n";

在使用数字转义序列或符号转义序列时应使用符号序列。数字与特定的编码方式相关,符号适用于任何编码方式,可读性也强。

程序清单3.7 bondini.cpp
//
bondini.cpp - - using escape sequences #include<iostream> int main() { using namespace std; cout << "\aOperation \"HyperHype\" is now activated!\n"; cout << "Enter your agent code:________\b\b\b\b\b\b\b\b"; long code; cin >> code; cin.get(); cout << "\aYou entered " << code << "...\n"; cout << "\aCode verified!Proceed with plan Z3!\n"; cin.get(); }

3.通用字符名

如:

int k\u00F6rper;

cout<<"Let them eat g\u00E2teau.\n"

?的ISO 10646码点为00F6,而a的码点为00E2.

上述变量名为k?rper,输出为Let them eat gateau.

通用字符名的用法类似于转义字符,以\u和\U打头,\u后面是8个十六进制位,\U后面是16个十六进制位。

Unicode为大量字符和符号提供标准数值编码,给每个字符指定一个编号——码点,如U-222B。ASCII码是它的子集。

 

4.signed char和unsigned char

与int不同的是,char在默认情况下既不是没符号,也不是有符号,是开发人员最大限度的将这种类型和硬件属性匹配起来。

 

5.wchar_t

程序需要处理的字符集可能无法用一个8位的字节表示

1.如果大型字符集是实现的基本字符集,则可将char定义为一个16位或更长的字节

2.一种实现可以同时支持一个小型基本字符集(char表示)和一个较大的扩展字符集(wchar_t表示)

wchar_t bob=L'P';
wcout<<L"tall"<<endl;

wcin和wcout用来处理wchar_t流,加上前缀L来指示宽字符常量和宽字符串。

新增了char16_t和char32_t

前者是16位,后者32位,都是无符号的

char16_t与/u00F6通用字符名匹配,char32_t与/U0000222B匹配

char16_t ch1=u'q';
char32_t ch2=U'\U0000222B';

 

6.bool类型

将非零值解释为true,将零解释为false

bool is_ready=true;

int ans=true;           //ans=1
int promise=false;    //promise=0

bool start=-100;      //start=true
bool stop=0;            //stop=false

 

7.const限定符

const int Months=12;

常量Months被初始化以后,其值就被固定了,编译器将不允许再修改该常量的值

创建常量的通用格式
const type name=value;
应在声明中对const进行初始化
const int toes;
toes=10;
如果在声明常量时没有提供值,则该常量值将是不确定的,且无法修改。

 

8.浮点数

存储浮点数由两部分构成

一部分表示值,一部分表示对值进行放大和缩小

 如数字34.1245和34124.5,可将第一个数表示为0.341245和100,第二个表示为0.341245和10000

 

浮点数由两种写法

一种就是小数点法,另一种是3.45E6,相当于3.45*10的6次方,如果是负数意味着除以10的乘方

 

浮点类型:

C++对有效位数的要求是:

32≤float≤double≤long double

且double≥48

一般float为32位,double为64位,

long double为80、96或128位

程序清单3.8  floatnum.cpp
//floatnum.cpp - - floating-point types
#include<iostream>
int main()
{
    using namespace std;
    cout.setf(ios_base::fixed, ios_base::floatfield);
    float tub = 10.0 / 3.0;
    double mint = 10.0 / 3.0;
    const float million = 1.0e6;

    cout << "tub = " << tub;
    cout << ", a million tubs = " << million*tub;
    cout << ",\nand ten million tubs = ";
    cout << 10 * million*tub<<endl;

    cout << "mint =" << mint << " and a million mints = ";
    cout << million*mint << endl;
    cin.get();
}

setf()调用迫使输出使用定点表示法,以便更好的了解精度,防止程序把较大的值切换为E表示法,将程序显示到小数点后6位。

通常cout会删除结尾的零,用cout.setf()将覆盖这种行为,由于cout打印6位小数,则tub和mint都是精确的,但乘了一百万以后,就有了误差,说明float有7位有效数字,而double至少13位是有效的

 

默认浮点常量都存储为double类型

1.234f               //f或F后缀为float类型

2.45E20F

2.345324E28    //double

2.2L                  //l或L后缀  long double类型

 

浮点数两个优点是表示整数之间值,表示范围大。缺点是运算慢,精度会降低。

程序清单3.9  fltadd.cpp
//fltadd.cpp - - precision problems with float
#include<iostream>
int main()
{
    using namespace std;
    float a = 2.34E+22f;
    float b = a + 1.0f;

    cout << "a=" << a << endl;
    cout << "b-a=" << b - a << endl;
    cin.get();
}

a=2.34e+022

b-a=0

因为float只能表示数字中前6或7位所以修改第23位的值不会有任何影响

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Qt中使用CEF(Windows下)

下一篇:VS2013 中 CString类型转换为LPCSTR类型