1.示例程序
#include<stdio.h>
int main(void)
{
float weight;
float value;
printf("Are you worth your weight in platnum?\n");
printf("Let's check it out.\n");
printf("Please enter you weight in pounds:");
//获取用户输入
scanf_s("%f", &weight);
//假设白金价格是每盎司$1700
value = 1700 * weight * 14.5833;
printf("Your weight in platinum is worth $%.2f.\n", value);
printf("you are easily worth that! if platinum prices drop,\n");
printf("eat more to maintain your value.\n");
return 0;
}
scanf()函数是标准C中提供的标准输入函数,用以用户输入数据scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数输入字符串时,必须提供一个数字以表明最多读取多少位字符。
原因和区别:
scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节char buf[5]={’\0’};scanf("%s", buf);//如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。以上代码如果用scanf_s()则可避免此问题:
char buf[5]={’\0’};scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放’\0’//如果输入1234567890,则buf只会接受前4个字符注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符
%f处理浮点数字。
在%.2f中的 .2 用于精确控制输出,指定输出的浮点数只显示小数点后面 2 位
&weight 高数 scanf_s把输入和输出值赋给名为 weight 的变量。scanf_s函数使用&符号表明找到 weight变量地点。
2.变量与常量数据
3数据:数据类型关键字
1.int表示整型
long, short, 和 unsigned 和C90新增的 signed 用于提供基本整数类型的变式,例如 long long int, unsigned short int
2.char 用于指定字母和其他字符(如,#,$,%和*),另外char也可以表示较小的整数
3.float, double, long double 表示带小数点的数。
4._Bool 类型表示布尔值
5._Complex 和 _Imaginary 分别表示复数和虚数
计算机储存总共可以分为两大基本类型:整数类型和浮点类型
整数
浮点数
3.16E7表示3.16*10的七次方
Ⅰint 类型
声明为变量创建和标记储存空间,并为其指定初始值
程序演示int类型打印:
#include<stdio.h>
int main(void)
{
int ten = 10;
int two = 2;
printf("doing it right:\n");
printf("%d minus %d is %d\n", ten, 2, ten - two);
printf("doing it wrong:\n");
printf("%d minus %d is %d", ten);
return 0;
}
说明:最终打印结果如下
其中第二行由于只有第一个 %d对应了 ten 变量,而第二个第三个 %d 没有提供任意值,所以打印出的是内存中的任意值。
在打印中使用转换说明要注意,转换说明的数量要和待打印值的数量相等;
②十六进制和八进制
0X & 0x 为前缀表示十六进制,
0 为前缀表示八进制
③显示十六进制和八进制
以十进制显示数字使用 %d 以十六进制显示数字使用 %x 以八进制显示数字使用 %o
要显示各进制数的前坠 0, 0x, 0X,必须分别使用 %#0, %#x, %#X。
实例程序:
#include<stdio.h>
int main(void)
{
int x = 100;
printf("dec = %d, octal = %o, hex = %x \n");
printf("dec = %d, octal = %#o, hex = %#x");
return 0;
}
输出为:
④其他整数类型
当正整数到达他所能表示最大值时,会重新从起点开始,对于int i 当超过最大值时会从 -27147483648开始
⑤打印short, long, long long 和 unsigned 类型
打印 unsigned int 类型的值,使用 %u 转换说明,
打印 long 类型的值,使用 %ld 转换说明
打印 short 类型的值,使用h前坠,注意 h, l 前缀都可以和 u 一起使用,用于表示无符号类型;
#include<stdio.h>
int main(void)
{
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;
}
输出为:
第一句说明,无符号数3000000000 和有符号数-1294967296 存放在系统同一位置,但是对于较小的正数,例如96 无符号和有符号类型的存储显示都相同。
C编译器会把 short 类型的值转换成 int 类型的值:
为什么要转换? h 修饰符有什么用?
<问题1>int 类型 被认为是计算机处理整数类型时最高效的类型
<问题2>使用 h 修饰符可以显示较大整数被截断成 short 类型值的情况
例如第三行中将 long 65337 写成二进制后,使用 %hd printf()只会查看后16位,所以显示值为一。
Ⅱ使用字符:char 类型
char 类型常用于储存字符,但是从技术层面上来看,char是整数类型。因为 char 类型实质上储存的是整数而不是字符(ASCⅡ编码)
若在printf()函数中打印ASKⅡ表则需要使用"/x"的形式
char占用位数为 1
②声明 char 类型变量
③字符常量和初始化
例如:
char a = '1';
int 对应32字节,而 char 对应1字节,如果定义一个字符常量 ‘FATE’ ,即把4个独立的8位ASCⅡ嘛储存在一个32位存储单元中,如果将其付给 char 类型 的变量,那么只有最后八位有效,即最终输出为 'E'
#include<stdio.h>
int main(void)
{
char ch;
printf("Please enter a character.\n");
scanf("%c", &ch);//用户输入字符
printf("The code for %c is %d.\n");
return 0;
}
证明了字符显示方式,存储方式依旧是一个二进制数
Ⅲ_Bool类型
C语言中,true 用值1表示, false 用值0表示。
所以_Bool类型实际上也是一种证书类型,但原则上他只占用一位存储空间,对0,1而言一位已经足够
Ⅳ可移植类型:stdint.h 和 inttypes.h
Ⅴ float, double 和 long double
①浮点数的表示时指数计数法(或e计数法),是科学计数法在计算机中的写法。
float 类型必须至少能表示6位有效数字(注意不是精确到小数点后六位,时保存前六位)
且取值范围至少是10的-37次方到10的+37次方。
系统存储一个浮点数要占用32位,其中八位用于表示指数的值和符号,剩下的24位用来表示非指数部分机及其符号。
②double
double意味双精度,double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字。
一般情况下,double占据64位而不是32位。
③long double
满足比double更高精度的需求。(c只保证 long double 的类型 至少与double类型的精度相同)
浮点类型常量:
浮点类型常量基本形式是:有符号的数字(包括小数点)后面紧跟 e 或 E, 最后是一个有符号数表示 10 的指数。下面是是两个有效浮点型常量:
-1.53E + 12
2.87e - 3
注意:正号可以省略,可以没有小数点或指数部分,但是不能同时省略两者。可以省略小数部分,或整数部分,但是不能同时省略两者
不要在浮点类型常量中间加空格,例如:1.56 E + 12
编译器默认浮点数存储位double,应当显示说明,如:2.3f,5.4F,
使用 L 或 l 使得数字成为 long double 类型:54.32l,58.22L(建议使用大写L防止混淆)
打印浮点值
printf() 函数使用 %f 转换说明打印十进制计数法的float和double类型浮点数,
用 %e 打印指数计数法的浮点数,如果支持16进制格式的浮点数,可以使用 a 和 A 代替 e 和 E
打印 long double 类型要使用 %Lf , %Le 或 %La
注意:未那些位在函数原型中显示说明参数类型的函数(如printf())传递参数时,C编译器会把float类型的值自动转化为double类型。
#include<stdio.h>
int main(void)
{
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, power of 2 notation\n", aboat);
printf("%f can be written %e\n", abet, abet);
printf("%Lf can be witten %Le\n", dip, dip);
return 0;
}
浮点值的上溢和下溢
上溢:当计算导致数字过大,超过当前类型所能表达的范围时,就会发生上溢。会给toobig赋一个表示无穷大的特定值。printf显示该值为 inf 或者 infinity.
下溢:得到了结果却损失了元末为有效位上的数字称为下溢,C语言将损失了类型的全精度的浮点值称为低于正常的浮点值。因此将最小的政府点数除以二将会得到一个低于正常的值,如果初一一个非常大的值,会导致所有位都为0.
还有一个特殊浮点值NaN(not a number)
浮点数舍入错误
#include<stdio.h>
int main(void)
{
//给定一个数,加上1再减去原来的数,浮点运算会给出不同答案
/*演示舍入错误*/
float a, b;
b = 2.0e20 + 1.0;
a = b - 2.0e20;
printf("%f\n", a);
return 0;
}
原因是,计算机没有足够的小数位来完成正确的运算。
复数和虚数类型
C语言有3中复数类型:float_Complex, double_Complex, long_Complex 例如:float_Complex 值应该包含两个float,一个表示实数,一个表示虚数。
三种虚数类型:float_Imaginary, double_Imaginary, long double_Imaginary
如果包含了complex.h 头文件,便可使用 complex 代替 _Complex 用imaginary 代替 _Imaginary,还可以用 I 代替 -1 的平方根
其他类型
总结
int:
系统给定的基本整型。C语言规定int类型不小于16位。
short 或 short int:
最大的short类型整数小于或等于最大的 int 类型整数,C语言规定shirt类型至少占16位
long 或 long int:
该类型可表示的整数大于或等于最大的 int 类型整数。C语言规定long类型至少占32位
long long 或 long long int:
该类型课表示的整数大于或等于最大的 long 类型整数。long long 类型至少占 64 位
无符号整型:
无符号整型只能用于表示0和正整数,因此无符号整型可以表示的正整数比有符号整型的大(unsigned 和 signed 都是 C 语言中的数据类型修饰符,它们的主要区别在于它们可以表示的数值范围和表示方式。 unsigned 类型表示非负整数,其取值范围为 0 到 2^n-1(n 为该类型的位数),例如 unsigned char 可以表示 0 到 255 之间的值。unsigned 类型的存储方式是二进制补码。 signed 类型表示有符号整数,其取值范围为 -2^(n-1) 到 2^(n-1)-1,例如 signed char 可以表示 -128 到 127 之间的值。signed 类型的存储方式也是二进制补码。 因此,unsigned 和 signed 数据类型的区别在于它们的表示范围和存储方式。在使用时,需要根据具体的需求选择合适的数据类型。如果数值是非负的,可以使用 unsigned 数据类型,否则需要使用 signed 数据类型。)
在整型类型前加上关键字, unsigned 表明该类型是无符号整型:unsigned int, unsigned long, unsigned short.单独的 unsigned相当于 unsigned int.
字符类型:
char:可以打印出来的符号又是字符。char类型表示一个字符要占用1字节内存(区分JAVA需要2字节)出于历史原因一字节通常是8位,但是如果要表示基本字符集,也可以是16位或者更大。
布尔类型:
布尔值表示true 和 false。C语言用 1 表示true,用 0 表示 false
_Bool——布尔类型关键字,布尔类型是无符号的 int 类型, 所占用的空间值要能存储 0 或 1 即可
实浮点类型:
实浮点类型可表示正浮点数和负浮点数。
float——系统基本的浮点类型,课精确表示至少有6位有效数字。
double——储存浮点数的范围(可能)更大,能表示比float类型更多的有效数字(至少10位,通常会更多)和更大的指数。
long double——储存浮点数的范围(可能)比double大,能表示比1 double 类型更多的有效数字和更大的指数。
复数和虚数浮点数
Ⅵ类型大小:
使用C语言内置运算符 sizeof,以字节为单位给出指定类型的大小。
Ⅶ使用数据类型
把一个类型的数值初始化给不同类型的变量时,编译器会把值转换成与变量匹配的类型,这将导致部分数据丢失,例如:
int cost = 12.99;——这里将会直接截断小数部分,而不会进行四舍五入,(注意区别和JAVA的强制类型转换)
float pi = 3.1415926536;——这里将会损失一些精度,C只保证了float类型前6位的精度。
注意,用%d i按时float 类型的值,其值不会被转换为int类型。在不同平台下,缺少参数,或参数类型不匹配导致的结果不同。
Ⅷ转义字符
\b:退格
\t:制表符
\r:回车
\n:换行
Ⅸ刷新缓冲区
最出,printf()语句将输出发送到一个叫做缓冲区的中间储存区域,然后缓冲区中的内容在不断被发送到屏幕上。
当缓冲区满,遇到换行字符或需要输出的时候(从缓冲区把数据发送到屏幕或文件被称为刷新缓冲区)