C++数据类型之一:常量和变量

 
C++数据类型之一:常量和变量
一、文字常量:
常量之所以称为“文字常量”,其中“文字”是指我们只能以它的值的形式指代它,“常量”是指它的值是不可变的。同时注意一点:文字常量是不可寻址的(即我们的程序中不可能出现获取所谓常量20的存储地址&20这样的表达式),虽然常量也是存储在内存的某个地方,但是我们没有办法访问常量的地址的。
常量是有类型的:
1、 字符型char:一个字节表示,通常表示单个字符或小整数,字符型常量用一对单引号‘ ’夹着一个字符表示。
(1)可打印字符常量表示:
‘a’    ‘2’ ‘,’    ‘ ’
字符常量在内存中的存储格式依赖于ASCП码表的。
(2)不可打印字符常量,通过斜杠“/”表示:
‘/n’   换行符     ‘//’ 反斜杠 ‘/t’   水平制表符 ‘/0’ 空(NULL)字符
2、 整型int:一个机器字长度的整数值。
短整型short:半个机器字长度的整数值。
长整型long:一个或两个机器字长度的整数值。
在32位机器中,int和long通常相同。
(1)上面提到的char字符型,也可看作长度为一个字节的字符型整数。
通过下面这个小例子,可以看到char型数据,不同初始化方法,内存格式也是不同的。
char a=’1’;
cout<<a+1<<endl; //输出结果为50,参照ASC表,字符常量’1’在内存中是十进制数49
char b=1;
       cout<<b+1<<endl;//输出结果为2
       实际上,字符常量还可以初始化int、long等类型数据,例如:
       int c=’1’;
       cout<<c+1<<endl;//输出结果也是50
       而:
       char a=’1’;
       cout<<a<<endl;//输出结果为1
       int a=’1’;
       cout<<a<<endl;//输出结果为49
       这些区别需要引起我们的注意。
(2)整数常量可以使用十进制、八进制、十六进制表示,例如
       20(十进制)024(八进制)0x24(十六进制,也可写做0X24,“x”大小写无所谓)
(3)整型常量可以有符号,也可以无符号,例如:
       一个8位有符号char:-128~127
       一个8位无符号char:0~255
说明:缺省的整型常量是int型的,我们可以使用”L”或”l”后缀强制把整型常量表示成long型,另外也可加后缀”U”或”u”指定成无符号数,例如:
128U、1024UL、1L、8Lu
3、 浮点型float:一个字长度的单精度浮点数
双精度double:两个字长度的双精度浮点数
长双精度long double:3个或4个字长度的扩展精度浮点数
(1)       浮点常量可以写成科学计数法或普通十进制数
(2)       浮点常量缺省为double型,可以加后缀“F”“f”“L”“l”修饰为单精度浮点数或扩展精度浮点数,但是只能修饰十进制表示的浮点数。还有跟整型常量不一样的地方是,浮点数部分正负,也就是说不能使用“U”“u”后缀。
例如:3.14159F 0.1f  12.345L        0.0    3e1  1.0E-3  1.0L
4、布尔常量boolean:true或false
5、字符串常量:比较特殊的一种类型,它不是内置或基本的数据类型,实际上就是字符常量数组,它由字符串文字本身以及编译器加上的表示结束的空(NULL)字符组成
字符串常量“Ab”在内存中的实际格式是’A’’b’’/0’
如果程序中”two””Some”紧邻,C++编译器会把它们连在一起,并在最后加上一个空字符,即输出为”twosome”
字符串常量还可换行表示,只需在换行的地方加上“/,例如:
“abc/
de/
fgh”
实际上就是表示”abcdefgh”
 
测试题:
1、 说明下列文字常量的区别:
(a)’a’ L‘a’ “a” L”a”
        文字常量’a’表示单一字符,类型为char,L’a’也表示单一字符’a’,只不过它的类型是wchar_t,因为前导词L表示宽字符。
        文字常量”a”表示字符串,包含单一字符’a’和空字符’/0’,L”a”也表示字符串,常量宽字符所表示的数组。
(b)10,10U,10L,10uL,012,0xA
        均表示十进制数10,区别是表示进制不同以及具体类型不同
(c)3.14 3.14f 3.14L
        均表示浮点数3.14,区别是具体类型不同。
2、 下列语句哪些是非法的:
(a)    "Who goes with F/144rgus?/014"
合法,/144代表一个d字符,/014代表一个奇怪的字符
(b)    3.14e1L
不能用L修饰科学计数法表示的浮点数
(c)    "two" L"some"
合法,但结果没有意义
(d)    1024f
合法
(e)    3.14UL
不合法,不能用U修饰浮点数
(f) "multiple line
comment"
        不合法,换行要用/
二、变量
1、简介
变量为我们提供了一个有名字的内存区域,可以通过程序对其读写和处理。C++中的每个符号变量都与一个特定的数据类型相关联,这个类型决定了相关内存的大小,布局,能够存储在该内存区的值以及可以应用在其上的操作集,我们可以把变量说成对象。
 
变量和常量的异同点:
1、 相同点:
均有存储区,并有相关的类型。
2、 不同点:
常量不能寻址,变量可以寻址
       对于每一个变量都有两个值和它关联:
       (1)数据值:存储在某个内存地址中,用做右值。
       (2)地址值:存储数据值的那块内存地址,用做左值。
例如:ch = ch – ‘0’;
右侧的ch是数据值被读取,而左侧的ch是指地址值被读取。
0 = 1; //错误,常量不能用做左值
salary+salary*0.1 = newsalary;//错误,算术表达式不能用做左值。
 
变量的定义会引起内存分配,一个变量定义对应一个内存区域,所以不能重复定义同一个变量,但是由于程序需要,可以重复声明,比如:
extern String stringName;
这样的声明最好放在头文件中。
 
例如:
// file module0.C
// 定义fileName 对象
string fileName;
// ... 为fileName 赋一个值
// file module1.C
// 需要使用 fileName 对象
// 喔: 编译失败:
// 在module1.C 中fileName 未定义
ifstream input_file( fileName );
 
// file module1.C
// 需经使用fileName 对象
// 声明fileName, 也即, 让程序知道它,
// 但又不引入第二个定义
extern string fileName;
ifstream input_file( fileName );
 
2、变量的定义:
由类型标志符后面跟一个名字构成,以分号结束:
double salary;
double wage;
int month;
int day;
int year;
unsigned long distance;
也可以写成:
double salary,wage;
int month,day,year;
unsigned long distance;
 
关于初始化:全局域内的变量定义时,用户若不初始化,系统会自动初始化为0,而如果是局部域内定义的或由new动态分配的,系统会初始化为随机数。
C++支持两种初始化:
(1)       显式
int iVal = 1024;
String project = “Fantasia”;
(2)隐式
       int iVal(1024);
       String project(“Fantasia”);
另外,逗号分隔的标志符列表也能为每个对象提供显式的初始值,如:
doubld salary=9999.99,wage=salary+0.01;
还有,每种内置的数据类型都支持一种特殊的构造函数语法,可将对象初始化为0,例:
int iVal=int();//0
doubld dVal=double();//0.0
Vector<int> iVec(10);//10个0
 
测试题:
1、下列定义哪些是非法的请改正之
(a) int car = 1024, auto = 2048;
(b) int ival = ival;//没有什么实际意义
(c) int ival( int() );
(d) double salary = wage = 9999.99;//wage使用前未曾先定义,在这条语句前加上一条语句double wage=9999.99就没问题了
(e) cin >> int input_value;//使用cin时,不能同时定义
2、说明下列 student 和 name 两个实例的区别
(a) extern string name;
string name( "exercise 3.5a" );
(b) extern vector<string> students;
vector<string> students;
第一行是name的声明,告诉编译器name代表的类型为String,未进行内存分配
第二行是name的定义,告诉编译器name代表的类型为String,并进行内存分配。
3、下列名字哪些是非法的请改正之
(a)    int double = 3.14159; //无效 使用了保留字
(b)    (b) vector< int > _;
(c)    string namespace;  //无效,使用了保留字
(d)    (d) string catch-22;//内含一个无效的-
(e)     char 1_or_2 = '1';//名称不能以数字开头
(f) float Float = 3.14f;
4、下面的全局对象定义和局部对象定义有什么区别(如果你认为有区别的话)
string global_class;
int global_int;
int main() {
int local_int;
string local_class;
// ...
}
两个String对象都是被其缺省的构造函数初始化,另外全局变量global_int被初始化为0,而局部变量local_int不会初始化,是任意值。但是使用VC.NET调试时,输出没有初始化局部变量会编译失败,提示使用没有初始化的变量。但输出没有初始化的全局变量就没有问题,因为系统帮助初始化为0了。
 
 
Sibelius(以前称为 Sibelius | First—了解更多)采用直观的基于任务的界面,可引导您完成整个乐谱创建流程,因此您可以快速进入界面来立即开始作曲。可以从屏幕乐谱、键盘、指板窗口或者您的 MIDI 或计算机键盘输入音符。Sibelius 将负责处理所有音符布局、方向休止符细节。音乐制谱软件 - Avid Sibelius Ultimate 2018 中文多语特别版音乐制谱软件 – Avid Sibelius Ultimate 2018 中文多语特别版增强您的乐曲支持多达 16 个乐器分谱(五线谱),您可以创作丰富的多层乐曲。但是,它不只是音符。通过在 MIDI 设备上弹奏弦或键入后缀元素可以增弦符号吉他弦图。将吉他谱转成乐谱,然后再转回。并轻松添歌词、标题、文字图形来完善乐谱。快速创作精美的乐谱更多时间可以花在作曲(而非修改)上。在您作曲时,磁性布局 (Magnetic Layout) 能自动为乐谱中每个音符分配适当的间隙并避免出现拥挤,从而制作出美观的乐谱,可将作曲的时间缩短一半。而且无论什么时候您更改总谱,动态分谱 (Dynamic Parts) 都能自动创建并更新单独的乐器分谱。将音乐转换为乐谱Sibelius 随附有两个伴奏应用,允许您将录制、演奏、打印手写的音乐转换为乐谱。利用 AudioScore Lite,对着麦克风演唱或单音乐器演奏,就可以输入音符。利用 PhotoScore & NotateMe Lite,可将打印的、PDF JPEG 活页乐谱转换为可编辑的乐谱,即便是手写的乐谱也能做到。清晰地听到您音乐的每一个细节利用附带的 10 GB 高品质采样乐器音色库,您可以回放乐曲,以聆听使用全套乐器演奏时的音色。Espressivo 功能增添了更人性化的感觉,因此您的乐谱听起来会与预期一样。您也可以使用 VST AU 虚拟乐器及音效。获得灵感遇到作曲障碍?不必发愁。查看乐谱入门 (Score Starter) 灵感中心 (Ideas Hub) 来快速启迪您的创造力。使用 40 个特定流派的乐谱入门模板开始作曲。然后在灵感中心 (Ideas Hub) 找到更多灵感,那里提供了 300 种音色库想法任您选择,可以快您的创作流程。您甚至可以捕捉自己的灵感,留待将来使用。分享您的作品使用 Sibelius | Cloud Sharing 轻松在线分享多达 20 个乐谱,以及邀请他人查看弹奏您的音乐。想要分享更多乐谱?通过 Avid 云高级计划扩展您的存储空间。您也可以通过 MusicXML 协作,打印乐谱,以及将您的音乐导出为 MIDI 或 PDF 文件。通过 iPad 排练演奏已经拥有 iPad?导出您的乐谱用于 Avid Scorch,它是一个 iOS 应用,可将您的 iPad 转变为交互式乐谱架乐谱库,供排练演奏。iPad 上有了 Avid Scorch 之后,通过对乐谱移调、更改乐器,甚至与吉他谱之间相互转换,能够查看乐谱并按照您的乐器进行改编。根据需要获取更新帮助Sibelius 可通过低成本的按月或按年订阅来获取,也可以购买永久授权来获取软件的永久使用权。在您的有效订阅期或可续订的“1 年期软件更新 + 支持计划”(购买永久授权时附带)内,上述两种形式都可获取所有最新的 Sibelius 版本标准支持。深入了解 Sibelius | Ultimate需要更多先进的制谱布局功能?Sibelius | Ultimate 非常适合专业作曲家、编曲家、抄谱员、制版师教育工作者,提供了更多的制谱工具、乐器声音、无限的五线谱、排印工具,以及定制乐谱的每一个元素的功能。六月更完美地处理装饰音节省重要的乐谱准备时间,并在同一员工的多种语音之间使装饰音完美保持一致,且无需手动修复间距冲突。由于对 Sibelius 处理装饰音的方式进行了改进,您现在可以将任意值的装饰音添到任意语音中的任意节奏,实现完美一致,从而使您可以更快创建更美观的乐谱。四月同时进行多个文本更改需要在乐谱的多个分谱中添或更新表达式文本?选择多个分谱或音符,并一次性向所有乐器添或编辑表达式文本。您可以按照相同的方法添或编辑技巧文本其他文本类型。更快对乐谱制版对于制版师来说,现在可以花更少的时间来修复音符间距,花更多的时间来完善出色乐谱。由于对自动调整多种语音中重叠音符的间距的方式进行了改进,现在作曲时,Sibelius 可生成更易于辨识更准确的音符,因此您可以更快地创作更精美的乐谱。直接在乐谱上添注释利用“批注”功能,可以直接在乐谱上绘图,以及向他人传达编辑、说明反馈,从而简化协作审核流程。所有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值