第二章常量、变量、类型转换 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1 常量

1)  数字常量:(包括整型常量(十//十六进制)、浮点型常量)

整型常量(八进制前缀加0;十六进制前缀加0x;

根据长度整型常量又可分为(长整型(后缀加L)、短整型、无符号型(后缀加u))

下面我们来看一下这个程序:

#include <stdio.h>

int main()

{

printf("%d\t%x\t%o\n",29,29,29);

printf("%d\t%x\t%o\n",025,025,025);

printf("%d\t%x\t%o\n",0x1a,0x1a,0x1a);

printf("%u\t%1d\n",47675u,742611);

getchar();

}

结果为:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

我们来解释一下:\n表示换行;

%d表示按照十进制输出;

\t表示水平制表;

%x表示按照十六进制输出;

%o表示按照八进制输出;

%u表示按照无符号整数输出;

%1d表示按照长整数输出(1用于说明符d,o,x之前表示长整数;用于e,f,g之前表示双精度浮点数)。

 

浮点常量(实型常量)可表示为(十进制小数形式和指数形式

十进制小数合法表示有0.567  567.0  .567  567.

指数表示形式(该表示形式必须包含字母E/e,在之母e前必须有数字,在字母e后得数字必须为整数(正负皆可))。格式如下:

{整数部分}.{小数部分}e{指数部分}(整数部分省略时,但小数点和小数部分必须有。有整数部分时,可以省略小数点和小数部分。)

我们来看这个程序:

#include <stdio.h>

int main()

{

printf("%f\t%e\t%g\n",12e3,12.3,12.3);

printf("%f\t%e\t%g\n",12.3456,12.3456,12.3456);

printf("%f\t%.2f\t%f\n",12.3,12.345,123);

getchar();

}

结果为:

 

我们来解释一下:\n表示换行;

%f表示按照浮点数(小数型)输出;

\t表示水平制表;

%e表示按照浮点数(指数型)输出;

%g表示按照ef中较短的一种输出;

%2f表示按照长整数输出(2用于说明符d,o,x之前表示长整数;用于e,f,g之前表示双精度浮点数)。

 

2)  字符常量(字符常量、字符串常量)

字符常量:由单引号括起来的一个字符组成。(字符常量是具有数值的,即ASCII码值。可参与加减运算。)

我们来看下面一个程序:

#include <stdio.h>

int main()

{

printf("%c,%d\n",67,'m');

printf("%c,%c %c\n" ,'a','\b','b');

printf("%c,%c,%c\n",'a','\r','b');

printf("%c%c",'\a','\007');

getchar();

}

输出结果为:

 

很奇怪啊,应该输出四行啊。怎么只有三行?

我们来解释一下:

第一行  

%c 表示输出单个字符,大写cASCII码值为67所以输出C

%d 表示按照十进制输出,字符mASCII码值为109

第二行

因为%c按照字符输出所以‘a’,‘b’就输出ab

\b’表示退格,在输出退格后屏幕上输出a,接着输出b

第三行

\r’表示回车,在前面输出a,后,执行‘\r’光标移到该行首列,即a处,这时输出控制字符创的第二个逗号,将字符a改为逗号,在输出b

第四行

\a’是机器的鸣铃,‘\007’还是鸣铃。

字符串常量(由“”括起来的字符序列。)

字符实际上是一个整型数,字符串实质上是个地址值

 

 

3)  符号常量(用一个标识符来代表一个常量)

符号常量在使用之前要先定义,格式如下:

#define {符号常量名}(常量)

符号常量名长用大写

举个例子:

#include <stdio.h>

#define PI 3.1415926

#define R 2

int main()

{

double zhouchang,area;

zhouchang=2.0*PI*R;

area=PI*R*R;

printf("zhouchang=%1f,area=%1f\n",zhouchang,area);

getchar();

}

结果如下:

 

2 变量(程序中值发生变化的量)(三要素:名称,类型,值。)

名称:变量必须先定义后使用,定义或说明变量时,要给出该变量的名字(大小写字母都行,应考虑变量的含义和使用目的)。

类型:(编译时系统根据变量类型分配相应的内存单元。)

1)  基本数据类型(整型(整型,长整型,短整型),浮点型(单精度浮点型,双精度浮点型),字符型)如:

 

基本数据类型定义格式如下:

int a,b,c;

2)  构造数据类型(由若干个相同或不同的基本数据类型变量按照不同规律组合成的。)

如数组,结构,联合,枚举。

3)  存储类(自动存储,寄存器存储,外部存储,静态存储)。

 

值:(变量要被赋值,或赋初值才能被使用。)

1)  赋值:将一个数值赋给变量,直到下次再被赋值为止。

2)  赋初值:在定义或说明变量时,将一个数值送给变量的。

float4个字节,double8个字节。

3 数组(数目固定,类型相同的若干变量的有序集合)

1)数组定义格式如下:

{类型说明符}{数组名}{常量表达式1}】【{常量表达式2}】。。。。

数组元素的表示如下:

{数组名}{下标1}】【{下标2}】。。。(数组下标从0开始。

举个例子:

int a[3] 表示a数组中有3个元素:a[0],a[1],a[2]

3)  数组的赋值

赋初值格式如下:

Static int a[5]={5,4,3,2,1}    其中(a[0]=5,a[1]=4,a[2]=3,a[3]=2,a[4]=1)

赋值格式如下:

int a[5],b[1][2];

a[0]=a[1]=a[2]=1;

a[3]=a[4]=0;

b[0][0]=3;

b[0][1]=2;

b[1][0]=9;

b[1][1]=8;

b[1][2]=4;

是不是有点麻烦?

其实还可以采用循环复制的方法:

for(i=0;i<6;i++)

a[i]=i+1;

这表示对a6个元素分别赋值1,2,3,4,5,6

注意!一下赋值方式是错误的

int a[5];

a={1,2,3,4,5};

下面我们来看一个二维数组的赋值(这个比较常用)

#include <stdio.h>

int main()

{

int i,s=0;

static int b[3][3]={{6},{7,8}};

for (i=0;i<3;i++)

b[2][i]=i+1;

for (i=0;i<3;i++)

s+=b[i][i];

printf("%d\n",s);

getchar();

}

输出结果如下:

我们来分析一下:

首先我们把b[3][3]每个元素都列出来:

b[3][3]={{6},{7,8}}其实就是b[3][3]={{60,0},{7,80}{0,0,0}}

b[0][0]=6,b[0][1]=0,b[0][2]=0

b[1][0]=7,b[1][1]=8,b[1][2]=0

b[2][0]=0,b[2][1]=0,b[2][2]=0)

for(i=0;i<3;i++)    #执行三次循环赋值;

b[2][0]=1,b[2][1]=2,b[2][2]=3

 

for(i=0;i<3;i++)

s+=b[i][i];    #b[0][0]+b[1][1]+[2][2]的值赋给s

s=0+6+8+3=17)

 

数组除了有数字数组外,还有字符数组(数组内各元素是char类型的),定义和数字数组定义相同。

格式如下:

static char m[5]={‘a’,’b’,’c’,’d’,’\0’};等价于static char m[]=”abcd”;

我们来看下面两条语句:

Static char x[3]={‘a’,’b’,’\0’};

Static char y[3]={‘a’,’b’,’c’};

数组x中存放的是一个字符串“ab“,而数组y中存放的不是字符串,而是三个字符a,b,c

因为数组y的三个元素中没有结束符’\0’

(如果将一个字符创常量在定义数组时赋初值给该数组,则该数组将存放所赋予的字符串,这时系统将自动给数组加一个’\0’作为结束符。

注意字符串有效数字加1后小于等于字符数组的元素个数。

 

总结一下:

1)  字符串的输入方法可以单个字符输入;

2)  字符串的输出方法可以单个字符输出,使用格式符%c,最终形成字符串形式,也可以使用%s一次输出字符串;

3)  使用格式符%c输出字符时,对应参数是数组元素名,使用格式符%s输出一个字符串时,对应参数是数组名,实际上是一个地址值;

4)  在使用格式符%s输出字符串时,实际上是从给定的地址开始逐一输出其存放的字符直到遇到’\0’为止。

4 类型转换(自动转换,强制转换)

1)自动转换是根据规则自动进行转换的。

charshort转换成int

float转换成double

int->unsigned->long->double

2)强制转换

   格式如下:

{类型说明符})(表达式)

double)(a+5