现在的位置: 首页 > 综合 > 正文

C语言问答进阶–3、基本数据类型

2013年09月22日 ⁄ 综合 ⁄ 共 3573字 ⁄ 字号 评论关闭

前面介绍了基本的整型变量和基本的输入输出函数,现在将进一步介绍其它基本变量类型和更多的基本函数。

常量

Q:可以直接输出常量吗?

A:当然可以。

#include "iostream.h"

int main()

{

cout<<10<<endl;

return 0;

 }

Q:包含的头文件#include "iostream.h" 我看和以前不一样了,它们有什么区别?

A:你观察地很仔细。在头文件的文件夹里,和iostream文件在一个文件夹里,iostream.h文件是以前使用的头文件,现在一般都用iostream文件和using namespace std在一起,这更标准点,这些以后也会继续介绍。

QC中不是可以有十六进制吗?那么也就是可以直接输出十六进制数了?

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来替换。

具体在预处理处深入研究。

Qconst就代表着这个变量为常量了?

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:哦。想得好。其实,这个问题,就像您说的那样,放在变量类型的前面就可以了;但是呢,这个又没有硬性规定是这样,正如下面,把constint的位置互换一下得到:

#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吗?它是什么用?

Avolatile的英文意为可变地、不稳定地;被它修饰的变量会向编译器提醒:它是随时可能变的,在程序中每次需要读或写此变量的值时,都从此变量的内存地址处读或写。

Q:为什么是限定为从内存地址处读或写呢?每个变量不都保存在内存中吗?

A:其实这要说到编译器的优化功能了:编译器可能把一些变量放到寄存器中,因为CPU读取寄存器中的值比从内存中读取数据的速度快多了,但是呢,有些场合下有些变量很容易被别的程序或特别事件改变,而如果一个程序一直从寄存器中读取,那么肯定会造成读取出错,而volatile的作用就在这。

整型、字符型

QC语言中整型数据除了可以用十进制表示、十六进制表示,还可以用别的进制表示吗?

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语言毕竟要让程序员与计算机里错综的01远离点,毕竟看01没有看十进制快,没有看十六进制更简洁点。我想是这个原因,况且十六进制可以较方便地转化成二进制形式。

Q:那么从2816进制,那么为什么没有4进制?

A:这个问题,我不太明白。不过网上有关于日本一大学和松下电器公司研究的关于4进制的集成电路,据他们称,这种集成电路的芯片面积和功耗都减少了一半。好像还没有正式报道。

Q:除了int类型,还有哪些和int相近的数据类型?

A:还有如shortcharlong等类型的数据,它们都是int的子集。

Q:那分别介绍下它们吧。

Ashort类型是short int的缩写,这种类型的数据一般占据2个字节;取值范围为

-32768~32767.

char类型为字符类型,用它可以描述所有的大小写字母以及其它常用字符,一般为1个字节;

long类型是long int的缩写,这种类型占用的字节数一般为4个字节。

shortintlong这三种类型所占用的空间大小有如下关系:

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:是的。

抱歉!评论已关闭.