zoukankan      html  css  js  c++  java
  • C++常量(C++数值常量、字符串常量、符号常量)

    数值常量

    数值常量就是通常所说的常数。在C++中,数值常量是区分类型的,从字面形式即可识别其类型。

    整型常量(整数)的类型
    在上一节中已知道:整型数据可分为int, short int,long int以及unsigned int, unsigned short, unsigned long等类别。整型常量也分为以上类别。为什么将数值常量区分为不同的类别呢?因为在进行赋值或函数的参数虚实结合时要求数据类型匹配。

    那么,一个整型常量怎样从字面上区分为以上的类别呢?

    1. 一个整数,如果其值在-32768~+32767范围内,认为它是short int型,它可以赋值给short int型、int型和long int型变量。
    2. 一个整数,如果其值超过了上述范围,而在-2147483648~+2147483647范围内,则认为它是long int型,可以将它赋值给一个int或long int型变量。
    3. 如果某一计算机系统的C++版本(例如Visual C++)确定int与long int型数据在内存中占据的长度相同,则它们能够表示的数值的范围相同。因此,一个int型的常量也同时是一个long int型常量,可以赋给int型或long int型变量。
    4. 常量无unsigned型。但一个非负值的整数可以赋值给unsigned整型变量,只要它的范围不超过变量的取值范围即可。


    一个整型常量可以用3种不同的方式表示:

    1. 十进制整数。如1357, -432, 0等。在一个整型常量后面加一个字母l或L,则认为是long int型常量。例如123L, 421L, 0L等,这往往用于函数调用中。如果函数的形参为long int,则要求实参也为long int型,此时用123作实参不行,而要用123L作实参。
    2. 八进制整数。在常数的开头加一个数字0,就表示这是以八进制数形式表示的常数。如020表示这是八进制数20,即(20)8,它相当于十进制数16。
    3. 十六进制整数。在常数的开头加一个数字0和一个英文字母X(或x),就表示这是以十六进制数形式表示的常数。如0X20表示这是十六进制数20,即(20)16,它相当于十进制数32。

    浮点数的表示方法

    一个浮点数可以用两种不同的方式表示:
    1) 十进制小数形式。如21.456, -7.98等。它一般由整数部分和小数部分组成,可以省略其中之一(如78.或.06, .0),但不能二者皆省略。C++编译系统把用这种形式表示的浮点数一律按双精度常量处理,在内存中占8个字节。如果在实数的数字之后加字母F或f,表示此数为单精度浮点数,如1234F, -43f,占4个字节。如果加字母L或l,表示此数为长双精度数(long double),在GCC中占12个字节,在Visual C++ 6.0中占8个字节。

    2) 指数形式(即浮点形式)。一个浮点数可以写成指数形式,如3.14159可以表示为0.314159×101, 3.14159×100, 31.4159×10-1, 314.159×10-2等形式。在程序中应表示为:0.314159e1, 3.14159e0, 31.4159e-1, 314.159e-2,用字母e表示其后的数是以10为底的幂,如e12表示1012。其一般形式为:
        数符  数字部分  指数部分

    上面各数据中的0.314159, 3.14159, 31.4159, 314.159 等就是其中的数字部分。可以看到:由于指数部分的存在,使得同一个浮点数可以用不同的指数形式来表示,数字部分中小数点的位置是浮动的。例如:
        a=0.314159e1;
        a=3.14159e0;
        a=31.4159e-1;
        a=314.159e-2;
    以上4个赋值语句中,用了不同形式的浮点数,但其作用是相同的。

    在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以指数形式(即浮点形式)存储的。例如不论在程序中写成314.159或314.159e0, 31.4159e1, 3.14159e2, 0.314159e3等形式,在内存中都是以规范化的指数形式存放,如图2.3所示。


    图 2.3
     


    数字部分必须小于1,同时,小数点后面第一个数字必须是一个非0数字,例如不能是0.0314159。因此314.159和314.159e0, 31.4159e1, 3.14159e2, 0.314159e3在内存中表示成0.314159×103。存储单元分为两部分,一部分用来存放数字部分,一部分用来存放指数部分。为便于理解,在图2.3中是用十进制表示的,实际上在存储单元中是用二进制数来表示小数部分,用2的幂次来表示指数部分的。

    对于以指数形式表示的数值常量,也都作为双精度常量处理。

    字符常量

    1) 普通的字符常量
    用单撇号括起来的一个字符就是字符型常量。如'a', '#', '%', 'D'都是合法的字符常量,在内存中占一个字节。注意:

    • 字符常量只能包括一个字符,如'AB' 是不合法的。
    • 字符常量区分大小写字母,如'A'和'a'是两个不同的字符常量。
    • 撇号(')是定界符,而不属于字符常量的一部分。如cout<<'a';输出的是一个字母"a",而不是3个字符"'a' "。


    2) 转义字符常量
    除了以上形式的字符常量外,C++还允许用一种特殊形式的字符常量,就是以 ""开头的字符序列。例如,' '代表一个"换行"符。"cout<<' '; " 将输出一个换行,其作用与"cout<<endl; " 相同。这种"控制字符",在屏幕上是不能显示的。在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。

    3) 字符数据在内存中的存储形式及其使用方法
    将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII代码放到存储单元中。如果字符变量c1的值为'a',c2的值为'b',则在变量中存放的是'a'的ASCII码97,'b' 的ASCII码98,如图2.4(a)所示,实际上在内存中是以二进制形式存放的,如图2.4(b)所示。

     

    图 2.4


    既然字符数据是以ASCII码存储的,它的存储形式就与整数的存储形式类似。这样,在C++中字符型数据和整型数据之间就可以通用。一个字符数据可以赋给一个整型变量,反之,一个整型数据也可以赋给一个字符变量。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。

    【例2.1】将字符赋给整型变量。

    #include <iostream>
    using namespace std;
    int main( )
    {
      int  i, j;  //i和j是整型变量
      i='A'; //将一个字符常量赋给整型变量i
      j='B'; //将一个字符常量赋给整型变量j
      cout<<i<<' '<<j<<'
    ';  //输出整型变量i和j的值,'
    ' 是换行符
      return 0;
    }

    执行时输出
       65 66
    i和j被指定为整型变量。但在第5和第6行中,将字符'A'和'B'分别赋给i和j,它的作用相当于以下两个赋值语句:
       i=65;j=66;
    因为'A'和'B'的ASCII码为65和66。在程序的第5和第6行是把65和66直接存放到i和j的内存单元中。因此输出65和66。

    可以看到:在一定条件下,字符型数据和整型数据是可以通用的。但是应注意字符数据只占一个字节,它只能存放0~255范围内的整数。

    【例2.2】字符数据与整数进行算术运算。下面程序的作用是将小写字母转换为大写字母。

    #include <iostream>
    using namespace std;
    int main( )
    {
      char c1,c2;
      c1='a';
      c2='b';
      c1=c1-32;
      c2=c2-32;
      cout<<c1<<' '<<c2<<endl;
      return 0;
    }

    运行结果为
       A B
    'a'的ASCII码为97,而'A'的ASCII码为65,'b'为98,'B'为66。从ASCII代码表中可以看到每一个小写字母比它相应的大写字母的ASCII代码大32。C++符数据与数值直接进行算术运算,'a'-32得到整数65,'b'-32得到整数66。将65和66存放在c1,c2中,由于c1,c2是字符变量,因此用cout输出c1,c2时,得到字符A和B(A的ASCII码为65,B的ASCII码为66)。

    字符串常量

    用双撇号括起来的部分就是字符串常量,如"abc","Hello!","a+b","Li ping"都是字符串常量。字符串常量"abc"在内存中占4个字节(而不是3个字节),见图2.5。

     

    图 2.5


    编译系统会在字符串最后自动加一个''作为字符串结束标志。但''并不是字符串的一部分,它只作为字符串的结束标志。如
       cout<<"abc"<<endl;
    输出3个字符abc,而不包括''。

    注意: "a"和'a'代表不同的含义,"a"是字符串常量,'a' 是字符常量。前者占两个字节,后者占1个字节。请分析下面的程序片段:
        char c;  //定义一个字符变量
        c='a';  //正确
        c="a";  //错误,c只能容纳一个字符

    请思考:字符串常量"abc "包含几个字符?不是5个而是4个字符,其中" "是一个转义字符。但它在内存中占5个字节(包括一个""字符) 。编译系统遇到""时就会把它认作转义字符的标志,把它和其后的字符一起作为一个转义字符。

    如果""后面的字符不能与""组成一个合法的转义字符(如"c"),则在编译时显示出错信息。如果希望将""字符也作为字符串中的一个字符,则应写为"abc\n",此时字符包括5个字符,即a,b,c,,n。如果有以下输出语句:
        cout<<"abc\ "<<endl;
    则会输出:
        abc  (然后换行)
    同理执行
        cout<<"I say "Thank you!" ";
    的输出是:
        I say "Thank you!"

    如果在一个字符串中最后一个字符为"",则表示它是续行符,下一行的字符是该字符串的一部分,且在两行字符串间无空格。如
        cout<<"We must study C  //本行最后的""后面的空格和换行均不起作用
       ++ hard!";  //本行的字符紧连在上一行最后的""前面字符之后
    则输出:
        We must study C++ hard!

    符号常量

    为了编程和阅读的方便,在C++程序设计中,常用一个符号名代表一个常量,称为符号常量,即以标识符形式出现的常量。

    【例2.3】符号常量的使用。

    #include <iostream>
    using namespace std;
    #define PRICE 30  //注意这不是语句,末尾不要加分号
    int main ( )
    {
      int num,total;
      num=10;
      total=num * PRICE;
      cout<<"total="<<total<<endl;
      return 0;
    }

    程序中用预处理命令#define指定PRICE在本程序单位中代表常量30,此后凡在本程序单位中出现的PRICE都代表30,可以和常量一样进行运算,程序运行结果为
        total=300
    请注意符号常量虽然有名字,但它不是变量。它的值在其作用域(在本例中为主函数)内是不能改变的,也不能被赋值。如用赋值语句"PRICE=40;"给PRICE赋值是错误的。 使用符号常量的好处是:含义清楚,在需要改变一个常量时能做到"一改全改"。 如:
        #define PRICE 35

    如果一件事情你觉得难的完不成,你可以把它分为若干步,并不断寻找合适的方法。最后你发现你会是个超人。不要给自己找麻烦,但遇到麻烦绝不怕,更不要退缩。 电工查找电路不通点的最快方法是:分段诊断排除,快速定位。你有什么启示吗? 求知若饥,虚心若愚。 当你对一个事情掌控不足的时候,你需要做的就是“梳理”,并制定相应的规章制度,并使资源各司其职。
  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/wvqusrtg/p/4610681.html
Copyright © 2011-2022 走看看