第二章常量、变量、类型转换
<?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表示按照e和f中较短的一种输出;
%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
表示输出单个字符,大写c的ASCII码值为67所以输出C;
%d
表示按照十进制输出,字符m的ASCII码值为109;
第二行
因为%c按照字符输出所以‘a’,‘b’就输出a,b
‘\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)
赋初值:在定义或说明变量时,将一个数值送给变量的。
float占4个字节,double占8个字节。
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;
这表示对a的6个元素分别赋值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]={{6,0,0},{7,8,0},{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)自动转换是根据规则自动进行转换的。
char和short转换成int
float转换成double
int->unsigned->long->double
2)强制转换
格式如下:
({类型说明符})(表达式)
(double)(a+5)
转载于:https://blog.51cto.com/2948229/1157871