1.1示例程序
话不多说,附上一个代码
/* platinum.c ——your weight in platinum */
#include <stdio.h>
int main()
{
float weight; /*你的体重*/
float value; /*相等重量的白金价值*/
printf("Are you worth your weight in platinum?\n");
printf("Let's check it out.\n");
printf("Please enter your weight in pounds: ");
/*获取用户的输入*/
scanf("%f",&weight);
/*白金的价格是每盎司$1700*/
/*14.5833用于把英镑常衡盎司转换为金衡盎司*/
value=1700.0*weight*14.5833;
printf("Your weight in platinum is worth $%.2f.\n",value);
printf("You are easily worth that!If platinum pricesdrop,\n");
printf("eat more to maintain your value.\n");
return 0;
}
程序输出:
1.1.1 剖析代码
(1)weight和value使用float类型,float类型可以存储带小数的数字。为了打印float类型的值,printf()函数使用%f来处理浮点值。%.2中.2表示精确到只输出小数点后两位。
(2)scanf()函数用于读取键盘的输入,%f表示读取一个用户从键盘输入的浮点值,&weight告诉scanf()把输入的值赋给weight变量。scanf通过&找到weight的地址。
(3)scanf()和printf()的使用,突出了该程序的交互性,即用户能灵活输入数值,而不是改动程序来改变输出。
1.2变量与常量数据
数据:承载信息的数字和字符。
常量:在程序使用之前就已经预先设定好的数据类型,在整个程序过程中没有变化,称之为常量。
变量:在程序运行期间能改变或赋值的数据类型,称之为变量。
1.3数据:数据类型关键字
不同的数据类型之间有差异。如一些数据类型表示数据,一些数据类型表示字符。C通过识别一些基本的数据类型来区分和使用这些不同的数据类型。
对于常量而言,编译器会根据它的书写方式识别类型(42是整数,42.0是浮点数)。
对于变量来说,就需要在声明时为其指定类型。
关键字上一篇已经介绍,不过多累赘。
插入一点小知识:
关于位、字节和字
位(bit):最小的存储单元,存储0和1。位是计算机内存的基本构建块。
字节(Byte):计算机的存储单元,1字节=8位。
字(word):是设计计算机时给定的自然存储单元。
1.3.1整数
没什么可介绍的。
1.3.2浮点数
例:2.75、3.16E7、2e-8……
注:
计算机把浮点数分成小数部分和指数部分来表示,并且分来存储这两个部分。
从图中可以清晰看到,7.00和7在数值上虽然相同,但是存储方式完全不同。
1.4C语言基本数据类型
1.4.1 int类型
C语言中的整数类型可表示不同的取值范围和正负值。
int类型是有符号整型,即必须是整型。存储一个int要占用一个机器字长。取值范围最小为-32768~32767.系统用一个特殊位的值表示有符号整数的正负号。
1.声明int变量
格式:int + 变量 + ; ,记得“;”
声明变量时,可以声明一个或多个。
例:int erns;、 int hogs,cows,goats;
2.初始化变量
初始化变量就是为变量赋一个初始值,初始化可以在声明中完成。如:int hogs = 21;
注:不要使用如int hogs,int cows=13;这种初始化
声明为变量创建和标记存储空间,并为其指定初始值。
3.int 类型常量
上面出现的13,21等都是整型常量或整型字面量。
4.打印int值
使用printf()函数打印,%d指明打印位置,称作转换说明,转换说明指定printf()用什么格式输出值,格式化字符串中每一个%d都要与一个int匹配,可以说int变量,常量或其他值为int类型的表达式。
5.八进制和十六进制
(1)整数转化
①十进制转二进制:利用短除法,除二取余,倒序输出
②十进制转八进制和十六进制与转二进制相似,除以8或者16即可。
③二进制转十进制:
即:
④二进制转八进制:3位一组,高位不够则补零
⑤二进制转十六进制:4位为一组,高位不够则补零
(2)小数部分转化
①十进制转二进制:乘二取整,顺序输出
②十进制转八进制和十六进制相似,乘8或16取整。
③二进制转十进制:小数部分从小数点后一位指数为-1开始算起,以后依次为-2、-3……
④八进制和十六进制转成十进制:与二进制相似。
注:八进制和十六进制之间的转换需要先将它们转成二进制,再转化。
用0x或0X前缀表示十六进制。
6.显示八进制和十六进制
不同进制之间要使用不同的转换说明。十进制数字使用%d,八进制使用%o,十六进制使用%x。当要显示各进制前缀0、0x,必须分别使用%#o、%#x、%#X。
/*bases.c--以十进制、八进制、十六进制打印十进制数100*/
#include <stdio.h>
int main()
{
int x = 100;
printf("dec = %d; octal = %o; hex = %x\n",x,x,x);
printf("dec = %d; octal = %#o; hex = %#x\n",x,x,x);
return 0;
}
程序输出:
1.4.2其他整数类型
short int:16位、long int(long):32位 、long long int(long long):64位,属于有符号类型。
unsigned int和unsigned只用于非负值,属于无符号类型,可以表示更大的数。
1.打印short、long、longlong、unsigned类型
打印unsigned int类型,使用%u,long,使用%ld,%lx表示以十六进制打印long整型,%lo表示八进制打印long整型。
/*print2.c--更多printf()的特性*/
#include <stdio.h>
int main()
{
unsigned int un=3000000000; /*int为32位和short为16位的系统*/
short end = 200;
long big = 65537;
long long verybig = 12345678908642;
printf("un = %u and not %d\n", un, un);
printf("end = %hd and %d\n", end, end);
printf("big = %ld and not %hd\n", big, big);
printf("verybig = %lld and not %ld\n", verybig, verybig);
return 0;
}
输出程序:
1.4.3使用字符:char类型
char类型用于存储字符(如字符,标点等),但是从计算角度来说,char类型也是整型,因为它实际存储的是整数而不是字符,计算机使用数字编码来处理字符,ASCLL码,char占一个字节。
1.字符常量和初始化
例:char grade = 'A';
在C中,用单引号括起来的单个字符被称为字符常量。
2.非打印字符
使用特殊的符号序列表示一些特殊的字符,叫转义字符。
\a:警报,发出蜂鸣,不会移动屏幕光标。警报字符不得改变活跃位置,活跃位置指的是显示设备中下一个光标出现的位置。
\f:把活跃位置移至下一页的开始处。
\n:把活跃位置移至下一行的开始处。
\r:把活跃位置移至当前行的开始处。
\t:将活跃位置移至下一个水平制表点。
\v:把活跃位置移至下一个垂直制表点。
\\:打印字符 \
\':打印字符 '
\":打印字符 “
注:无论是普通字符还是转义字符,只要双引号引起来就没必要用单引号。双引号中的字符集合叫作字符串。
3.打印字符
%c打印字符。接下来程序演示了打印char的两种方式
/*charcode.c-显示字符的代码编号*/
#include <stdio.h>
int main()
{
char ch;
printf("Please enter a character.\n");
scanf("%c",&ch);
printf("The code for %c is %d.\n",ch,ch);
return 0;
}
程序输出:
printf()函数中的转换说明决定了数据的显示方式,而不是数据存储方式。
1.4.4_Bool类型
用于表示布尔值,即逻辑值true和false。1表示true,0表示false,_Bool类型其实也是一种整数类型。原则上只占用一位存储空间。
1.4.5float、double和long double
1.0e9,浮点数在计算机中的写法,e后面的数字代表10的指数。
C语言规定,float类型必须至少能表示6位有效数字,且取值范围至少是~
.通常,系统存储一个浮点要占用32位,其中8位用于指数的值和符号,剩下24位用于表示非指数部分及其字符。
double类型和float类型最小取值范围相同,但至少必须能表示10位有效数字。double占用64位。
1.浮点型常量
基本形式:有符号的数字 + e/E+有符号的数表示指数。
如:-1.56E+12;2.87e-3
正号可以省略,可以没有小数点或指数部分,但是不能同时省略;可以省略小数部分或整数部分,但不能同时省略。
默认浮点常量是double类型精度,在浮点数后面加上f或F可覆盖默认设置。
2.打印浮点值
%f打印十进制计数法的float和double;%e打印指数计数法的浮点数,打印long double使用%f、%Le或%La。
程序演示:
/*showf_pt.c -- 以两种方式显示float类型的值*/
#include <stdio.h>
int main()
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip=5.32e-5;
printf("%f can be written %e\n",aboat,aboat);
printf("And it's %a in hexadecimal, powers of 2 notation\n",aboat);
printf("%f can be written %e\n",abet,abet);
printf("%Lf can be written %Le\n",dip,dip);
return 0;
}
程序输出:
3.浮点值的上溢和下溢
当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢。
计算过程中损失原来末尾有效值位上的数字,叫作下溢。
1.4.6复数和虚数类型
C语言有3种复数类型:float_Complex、double_Complex和long double_Complex。
C语言有3种虚数类型:float_Imaginary、double_Imaginary和long double_Imaginary
如果包含complex.h头文件,用complex代替_Complex,用imaginary代替_Imaginary。
1.4.7类型大小
如何知道当前系统指定类型大小多少,下列程序解惑:
/*typesize.c--打印类型大小*/
#include <stdio.h>
int main()
{
printf("Type int has a size of %zd bytes.\n",sizeof(int));
printf("Type char has a size of %zd bytes.\n",sizeof(char));
printf("Type long has a size of %zd bytes.\n",sizeof(long));
printf("Type long long has a size of %zd bytes.\n",sizeof(long long));
printf("Type double has a size of %zd bytes.\n",sizeof(double));
printf("Type long double has a size of %zd bytes.\n",sizeof(long double));
return 0;
}
输出结果:
1.5参数和陷阱
传递给函数的信息被称为参数。
例如,printf("Hello,pal."); 函数调用有一个参数:“Hello,pal”。双引号中的字符序列被称为字符串,一个字符串就是一个参数。
与此类似,scanf("%d",&weight),函数调用有两个参数,C语言用逗号分开参数。
1.6转义序列示例
上程序:
/*escape.c --使用转义序列*/
#include <stdio.h>
int main()
{
float salary;
printf("\aEnter your desired monthly salary:"); /* 1 */
printf(" $_______\b\b\b\b\b\b\b"); /* 2 */
scanf("%f",&salary);
printf("\n\t$%.2f a month is $%.2f a year.",salary,salary * 120); /* 3 */
printf("\rGee!\n"); /* 4 */
return 0;
}
输出结果:
1.6.1刷新输出
printf()何时把输出发送到屏幕上?
printf()语句把输出发送到一个叫作缓冲区的中间存储区域,然后缓冲区的内容再不断被发送到屏幕上。C语言明确规定了何时把缓冲区内容发送到屏幕上:当缓冲区满、遇到换行字符或需要输入的时候(从缓冲区把数据发送到屏幕或文件被称作刷新缓冲区)。
注:C语言允许编写混合数据类型的表达式,但是会自动类型转换,以便统一。