前面介绍了基本的整型变量和基本的输入输出函数,现在将进一步介绍其它基本变量类型和更多的基本函数。
常量
Q:可以直接输出常量吗?
A:当然可以。
#include "iostream.h"
int main()
{
cout<<10<<endl;
return 0;
}
Q:包含的头文件#include "iostream.h" 我看和以前不一样了,它们有什么区别?
A:你观察地很仔细。在头文件的文件夹里,和iostream文件在一个文件夹里,iostream.h文件是以前使用的头文件,现在一般都用iostream文件和using namespace std在一起,这更标准点,这些以后也会继续介绍。
Q:C中不是可以有十六进制吗?那么也就是可以直接输出十六进制数了?
A:是的。
#include "iostream.h"
int main()
{
cout<<0x10<<endl;
return 0;
}
Q:它为什么不是打印 0x10 呢?是按默认按十进制打印的吗?
A:是的。毕竟10进制当然是我们最熟悉的了,最常使用的了。
Q:那么如果要打印十六进制的形式,怎么办?
A:
C中可以用:
printf("%x",0x10);
C++中可以用:
cout<<hex<<0x10<<endl;
这里的hex就是一种格式说明。
【hex】
hex是十六进制hexadecimal的简写,表示在后面输出的数用16进制表示。
Q:关于const修饰符,有什么例子可以说吗?
A:首先介绍下这个修饰符,它是C++中出现的修饰符,C语言中并没有;如果一个变量被它修饰,那么就代表它的值不能再被改变。举例如下:
#include "iostream.h"
int main()
{
const int ten=10;
cout<<ten<<endl;
return 0;
}
Q:那么C语言中表示常量用什么?
A:一般用宏定义#define来声明。
【#define声明常量】
C语言中用#define语句来声明变量,其实说到底,这也并不算是声明了,因为这仅仅是一种替换,把前面的标识符用后面的内容来替换。
如下:
#define ten 10
这里就表示程序代码中所有出现了形如ten标识符的地方全部用10来替换。
具体在预处理处深入研究。
Q:const就代表着这个变量为常量了?
A:是的。你可以尝试去修改它的值,看看会发生什么。
Q:好。
#include "iostream.h"
int main()
{
const int ten=10;
cout<<ten<<endl;
ten+=1;
return 0;
}
出现如下编译错误:
果然常量是不可以修改的!
A:是啊。const修饰的一个好处就是表明它是常量,二就是当程序员的代码有要修改它的值的时候编译器也会提示错误。
Q:那么这里的ten是常量,那它就不是变量了?
A:呵呵。其实,它还是个变量,只不过它的变化幅度始终为0,导致它的值看起来不变。
常量是特殊的变量,正如数学里所说的,直线是特殊的曲线。
Q:如果把const看做修饰符,那么它的位置是由什么决定的?是只要放在变量类型前就可以了吗?
A:怎么会想到这个问题?
Q:英语中常有各种形容词修饰名词时的顺序问题,所以就联想到这里了。
A:哦。想得好。其实,这个问题,就像您说的那样,放在变量类型的前面就可以了;但是呢,这个又没有硬性规定是这样,正如下面,把const和int的位置互换一下得到:
#include "iostream.h"
int main()
{
int const ten=10;
cout<<ten<<endl;
}
编译无错,执行如下:
这么看来,编译器还是不笨的,先看到了类型为int,接着发现有const修饰,表达的就是常整型;和先发现const修饰,再看到了类型为int没什么区别。
还有如下代码:
#include "iostream.h"
void Message(const int i)
{
i++;
cout<<i<<endl;
}
int main()
{
Message(3);
return 0;
}
出现的编译错误信息:
Message函数的参数是一个const类型的,但是在函数体内却有像自增这样修改它的值得情况,编译器首先就不会放过,程序代码的健壮性就是这样提高的。
Q:不还有个修饰符是volatile吗?它是什么用?
A:volatile的英文意为可变地、不稳定地;被它修饰的变量会向编译器提醒:它是随时可能变的,在程序中每次需要读或写此变量的值时,都从此变量的内存地址处读或写。
Q:为什么是限定为从内存地址处读或写呢?每个变量不都保存在内存中吗?
A:其实这要说到编译器的优化功能了:编译器可能把一些变量放到寄存器中,因为CPU读取寄存器中的值比从内存中读取数据的速度快多了,但是呢,有些场合下有些变量很容易被别的程序或特别事件改变,而如果一个程序一直从寄存器中读取,那么肯定会造成读取出错,而volatile的作用就在这。
整型、字符型
Q:C语言中整型数据除了可以用十进制表示、十六进制表示,还可以用别的进制表示吗?
A:当然,还可以用八进制。下面将举例说明这三种进制格式的数。
#include "stdio.h"
int main()
{
int i=12;
printf("%d/n",i);
printf("%o/n",i);
printf("%x/n",i);
return 0;
}
%d格式大家很熟悉了,它表示用十进制形式;
%o表示是八进制格式;
%x表示是十六进制格式;
Q:那么如何直接把八进制的数据赋值给整型变量呢?
A:如下:
#include <iostream>
using namespace std;
int main()
{
int a=013;
cout<<a<<endl;
return 0;
}
013就是八进制的形式,毕竟要与最熟悉的十进制相区别,八进制的整数以数字0开始。
当然,如果只写一个数字0,那就优先被当作十进制的int类型来处理。
Q:那十六进制呢?
A:十六进制是以0x开头的,例如:
int i=0x12;
那么i的值就是18.
Q:那么C语言中的变量没有显式的二进制格式吗?
A:为什么你认为要有二进制格式呢?
Q:因为计算机采用的是二进制的,用二进制格式表示的数不是能更好地反应计算机处理的数据吗?
A:其实这个我也不太明白,汇编里可以有二进制格式,包括八进制、十进制、十六进制都有。也许C语言毕竟要让程序员与计算机里错综的0和1远离点,毕竟看0和1没有看十进制快,没有看十六进制更简洁点。我想是这个原因,况且十六进制可以较方便地转化成二进制形式。
Q:那么从2、8、16进制,那么为什么没有4进制?
A:这个问题,我不太明白。不过网上有关于日本一大学和松下电器公司研究的关于4进制的集成电路,据他们称,这种集成电路的芯片面积和功耗都减少了一半。好像还没有正式报道。
Q:除了int类型,还有哪些和int相近的数据类型?
A:还有如short、char、long等类型的数据,它们都是int的子集。
Q:那分别介绍下它们吧。
A:short类型是short int的缩写,这种类型的数据一般占据2个字节;取值范围为
-32768~32767.
char类型为字符类型,用它可以描述所有的大小写字母以及其它常用字符,一般为1个字节;
long类型是long int的缩写,这种类型占用的字节数一般为4个字节。
short、int、long这三种类型所占用的空间大小有如下关系:
short≤int≤long.
意思就是short类型占用空间是不大于int类型占用的空间,int类型占用的空间不大于long类型占用的空间。
在16位机器上,short类型占据16位,int类型占据16位,long一般占用32位;
而在32位机器上,short类型占据16位,int类型占据32位,long一般占用32位.
【如何得到一种数据类型占用内存空间的大小】
使用运算符sizeof,它的语法是:sizeof(类型名或变量名).
比如:sizeof(int)或sizeof(a). (这里假设a是前面已经声明的变量名)
【sizeof是函数名吗】
有人可能会认为sizeof是一个函数名,其实并非如此。
它仅仅是个运算符,可是有人会问了,运算符为什么后面用括号呢?
用括号的不是函数的“专利”吗?
C++语言中含有这样两个运算符,一个是new,一个是delete.
Q:也就是说,short sh=1;和short int sh=1;这两种声明是等同的?
long ln=1;和long int ln=1;这两种声明也是等同的?
A:是的。