C语言的数据类型
数据类型包括:基本类型,构造类型,指针类型,空类型。
1.基本类型:整型,字符型,实型,枚举类型。
(1)整型:基本整型(int),无符号基本整型(unsigned int),短整型(short或short int),无符号短整型(unsigned short或unsigned short int).
长整型(long 或long int),无符号长整型(unsigned long 或unsigned long int)。
在Visual C++ 6.0版本中,整型(int)和长整型(long int)具有完全相同的长度和存储格式,所以它们是等同的。
但在早期的C++版本中,由于当时的机器字长为16位,所以整型和长整型的长度是不同的,前者为2个字节,后者为4个字节。
整数有3中书写形式分别为:
十进制形式:十进制整常数没有前缀,其数码为0-9,例如:373,-33,65535,十进制写法中除非要写的整数本身就是0,否则第一个数字字符不能为0
在十六位字长的机器上,基本整型的长度也为16位,十进制无符号整常数的范围为0~65535,五位数,有符号数为-32768~+32767.
八进制形式:八进制整常数必须以0开头,即以0作为八进制数的前缀。数码值为:0-7.八进制数通常是无符号数。
例如,0031,0356355L,其中0031相当于十进制的25
在十六位字长的机器上,基本整型的长度也为16位.八进制无符号数的表示范围为0~0177777
十六进制形式:十六进制整常数的前缀为0X,或者0x,其数码取值为0-9,A_F或a-f,例如:0x41,0xFF,0X324DL。
在十六位字长的机器上,基本整型的长度也为16位,十六进制无符号数的表示范围为0X0~oXFFFF或0x0~0xFFFF。
如果使用的数超过了上述范围,那就必须使用长整型数来表示,长整型数是用后缀"L"或"l"来表示。
长整型数158L和基本整常数158在数值上并无区别,在VC++6.0编译环境下,长整型和基本整型C编译系统都将它们分配4个字节的存储空间,
只有短整型才分配2个字节的存储空间。
(2)字符型:char (char a ='a'),一个字符通常占用一个字节,
转义字符:
\n 回车换行 ASCII代码中的10
\t 横向跳到下一制表位置 ASCII代码中的9
\b 退格 ASCII代码中的9
\r 回车 ASCII代码中的13
\f 走纸换页 ASCII代码中的12
\\ 反斜线符"\" ASCII代码中的92
\' 单引号符 ASCII代码中的39
\'' 双引号符 ASCII代码中的34
\a 鸣铃 ASCII代码中的7
\ddd 1~3位八进制数所代表的字符
\xhh 1~2位十六进制数所代表的字符。
(3)实型:(单精度)float,(双精度)double:
实型数据有两种表现形式:
十进制数形式:由数字序列和小数点组成,例如,34.44,237.66。
指数形式:2.1E5 = 2.1*10的5次幂,0.5E-2 = 0.5*10的-2次幂
类型 字节数 有效数字 数值范围
float 4 7 -3.4*10E-38 ——3.4*10E38
double 8 16 -1.7*10E-308 ——1.7*10E308
long double 16 19 -3.4*10E-4932 ——3.4*10E4932
(4)枚举类型:enum
2.构造类型:数组类型,结构体类型(struct ),共用体类型(union)
3.指针类型:*,指针是一种特殊的数据类型,其值用来表示某个变量在内存存储器中的地址。
4.空类型:void,一般用于对函数的类型说明。
标识符,常量与变量
(1)标识符:标识符只能由字母,数字和下划线组成,且第一个字符必须为字母或下划线,不能使用系统关键字。
(2)关键字: 指系统预定义的保留标识符,又称之为保留字,ANSI C定义的关键字共32个如下:
auto double int struct break else long switch case enum
register typedef char extern return union const float
short unsigned continue for signed void default goto
sizeof volatile do if while static
(3)常量:5,0,-5为整型常量,1.3,-1.2 为实型常量;
'a','b'为字符型常量; "abc"为字符串常量。
PI表示3.14,被称为符号常量。
实型常量:3.143434,-3.14,1.8E5。
字符常量:例如字符常量'0~9'的ASCII编码值是48~57。
字符串常量:C 语言中没有专门的字符串类型的变量,大有字符串常量。例如:"abc"。
字符串常量与字符常量的区别:1.字符串常量在内存中存储时有串尾标记'\0',所以字符常量占一个字节的内存空间。
而字符串常量占的内存字节数等于字符串中字符所占的字节数加1。例如:字符串"a',它在内存中实际存放长度是2个字节,不是1个字节。
其中字符'\0'所对应的ASCII值为0,即"空"字符。
(4)变量:变量是一个命名的存储单元,存放能被程序修改的数据值,其类型显示说明。先定义后才能使用。变量具有地址和值两种属性,常量
只有值而无地址属性。变量的初始化不是在编译阶段完成的,而是在程序运行时执行到本函数赋以初值的。C语言中整型和字符类型的数据可以相互
转化,在0~255之间的整形数据可以转换为字符。所以字符数据可以给整型变量赋值,一部分整型数据也可以给字符型变量赋值。
例子:大小写字母的转换
#include <stdio.h>
void main() {
char c1,c2;
c1='a';c2='b';
c1=c1-32; c2=c2-32;
printf("%c%c",c1,c2);
}//输出结果为AB,A为65,B为66.
运算符与表达式
1.算术运算符 + - * / %
%(取模运算符)求余运算符 ,如 7%3,其值为1.
/(除法运算符) 参与运算量均为整型时候结果也为整型(会舍去小数),如果运算量中有一个是实型(浮点型)则
结果也为浮点型,如 7/3,其值为2.
2.关系运算符 > >= < <= == !=
3.逻辑运算符 ! && ||
4.位运算符 << >> ~ | ^ &
5.赋值运算符 =
6.条件运算符 ?:
7.逗号运算符 ,
8.指针运算符 * &
9.求字节数运算符 sizeof
10.类型转换运算符 (类型)
11.分量运算符 . ->
12. 小标运算符 []
13.其他 如函数调用运算符()
14.自增自减运算符:
int n,i;i =1;
前置自加:
n = ++i;//相当于先计算i=i+1,然后再计算n =i,结果n=2,i=2.
后置自加:
n = i++;//相当于先计算n=i,然后再计算i= i+1,结果n=1,i=2.
自减也同样原理。
15.复合运算符
在赋值运算符"="之前加上其他运算符构成的复合的赋值运算符
形式为:变量 双目运算符 = 表达式; 等同于 变量 = 变量 运算符 表达式;
a+=10; 等价于 a =a+10;
a*=b+10; 等价于 a = a*(b+10);
a% =10; 等价于 a = a%10;
赋值表达式也可以包含复合的赋值运算符,例如:
赋值表达式按照自右向左的顺序结合。
int a =6;
a +=a-=a*a;
1.先计算表达式 a-=a*a的值,相当于a=a-a*a=6-6*6=-30;
2.再计算a+=-30的值,相当于a=a+(-30)=-30-30=-60;
16.逗号表达式
优先级,逗号表达式是所有运算符中级别最低的。结合性为自左向右的。
(a=2+3,a*5),a=10
1.先计算a=2+3 得到a的值为5,表达式的值为5;
2.再计算a*5=25,逗号表达式(a=2+3,a+5)的值为表达式a*5的值为25;
3.最后计算a+10,则整个逗号表达式(a=2+3,a*5),a+10的值为15。
17.逻辑运算符
&& 逻辑与
|| 逻辑或
! 逻辑非
18.条件运算符(三目运算符)与条件表达式
表达式 1 ? 表达式 2:表达式3
意思是:如果表达式1为非0(即条件成立),执行表达式2;否则,执行表达式3.
19.位运算符与位运算表达式
特点是对二进制位的运算。
&(位与),位与的运算规则是:0&0=0, 0&1=0, 1&0=0, 1&1=1。
|(位或),位或的运算规则是:0|0=0, 0|1=1, 1|0=1, 1|1=1。
^(位异或), 位异或的运算规则是:0^0=0, 0^1=1, 1^0=1, 1^1=0。
~(取反),取反的运算规则是: ~0=1, ~1=0。
<< (左移)左移n位,相当于该数字乘以2的n次幂,低位补n个0。
>>(右移)右移n位,相当于该数除以2的n次幂。对于正数和无符号数,高位补n个0;对于负数,高位补n个1。
20.数据类型转换
不同类型数据自动转换规则:
1.单精度浮点型数据(float)在运算时自动转换成双精度浮点型数据(double)。
2.字符型数据(char)和短整型数据(short)在运算时自动转化成整型数据(int)。
3.整型数据(int)和无符号型数据(unsigned)混合运算时,将整型数据转换成无符号型数据。
4.整型数据(int)或无符号型数据(unsigned)和长整型数据(long)混合运算时,都转换成长整型数据。
5.整型数据(int),无符号型数据(unsigned),长整型数据(long)和浮点型数据混合运算时,都转换成浮点型数据。
强制类型转换:
(强制的类型名)(表达式)
(int)a; /*表示将变量a的类型强制转换为整型*/
(float)(a+b); /*表示将表达式a+b结果的类型强制转换为浮点型*/
(float)a+b; /*表示将变量a的类型强制转换成float型后,再进行运算 */
一个简单的C语言程序
#include <stdio.h>//输入输出块函数
#include <math.h>//数学计算函数
void main(){
/*
1求平方根
*/
float x,y,s;
scanf("%f,%f",&x,&y);//%f 浮点型,%d 十进制整数, %c 单个字符,%s字符串格式,\n换行,
//&x 表示x 在内存中的地址,& 取地址符号。
s=sqrt(x*x+y*y);//求平方根函数 sqrt();
printf("s=% f\n",s);
/*
2求和
*/
int a,b,c;
printf("Input the first number:");
scanf("%d",&a);
printf("Input the second number:");
scanf("%d",&b);
c = sum(a,b);
printf("sum=%d\n",c);
#include <stdio.h>
int sum(int x,int y){
int z;
z=x+y;
return(z);
}
/*
3大小写转换
*/
char c1,c2;
c1 = 'a';c2 = 'b';
c1=c1-32; c2 = c2-32;
printf("%c%c\n",c1,c2);//结果 AB
/*
4 测试数据类型
*/
printf(" char:%d字节\n",sizeof(char));//char:1字节
printf(" unsigned char:%d字节\n",sizeof(unsigned char));//unsigned char:1字节
printf(" short:%d字节\n",sizeof(short));//short:2字节
printf(" unsigned short:%d字节\n",sizeof(unsigned short));//unsigned short:2字节
printf(" int:%d字节\n",sizeof(int));//int:4字节
printf(" unsigned int:%d字节\n",sizeof(unsigned int));//unsigned int:4字节
printf(" long:%d字节\n",sizeof(long));//long:4字节
printf(" unsigned long:%d字节\n",sizeof(unsigned long));//unsigned long:4字节
printf(" float:%d字节\n",sizeof(float));//float:4字节
printf(" double:%d字节\n",sizeof(double));//double:8字节
}
/*
5.类型自动转换
#include <stdio.h>
void main (){
char ch = 'A'; short sn =10;
float x = 10.17 ,y = 20.4;
int n =10; unsigned long m =20L;
printf(" *****运行结果 ****\n");
printf(" int<——char +short:\n"); //int<——char +short:
printf(" ch:%d字节\n",sizeof(ch)); //ch:1 字节
printf(" sn:%d字节\n",sizeof(sn)); //sn: 2字节
printf(" ch+sn:%d字节\n",sizeof(ch+sn)); //ch+sn:4字节
printf(" double<——float +float:\n"); //double<——float +float:
printf(" x:%d字节\n",sizeof(x)); //x:4 字节
printf(" y:%d字节\n",sizeof(y)); //y: 4字节
printf(" x+y:%d字节\n",sizeof(x+y)); //x+y:4字节
printf(" unsigned long<——int* unsigned long:\n"); //unsigned long<——int* unsigned long:
printf(" n:%d字节\n",sizeof(n)); //n:4 字节
printf(" m:%d字节\n",sizeof(m)); //m: 4字节
printf(" n*m:%d字节\n",sizeof(n*m)); //n*m:4字节
}
//在VC++ 6.0环境下,所有的float 类型的数据在运算时都自动转化为double型数据。例子中,在调试时系统会提示警告把double类型数据转化成立float型数据。
*/
/*
6.分析程序运行结果一
#include <stdio.h>
void main(){
int x,y;
x=50;
y= (x=x-5,x/5);
printf("y=%d",y);
}//运行结果 y=9;分析:逗号运算取区最后一个表达式值,因为x的初始值为50,减去5后变为45,45除以5得9赋值给y;
*/
/*
7.分析程序运行结果二
#include <stdio.h>
void main (){
int m,n,k;
m=15; n=20;
k =(--m)+(--n);
printf("m=%d,n=%d,k=%d\n",m,n,k);//m=14,n=19,k=33;
m =15,n=20;
k =(m--)+(n--);
printf("m=%d,n=%d,k=%d\n",m,n,k);//m=14,n=19,k=35;
}
*/