强大而灵活的数据
- 变量:数据在程序运行过程中可能变化或被赋值;常量:数据可以在程序使用之前预先设定并在整个运行过程中没有变化。
- 定义变量的常用格式:数据类型 变量名;
- 定义多个类型相同的变量格式:数据类型 变量名, 变量名, 变量名…;
C数据透视图
printf() 的属性,格式说明符的数目和要显示的值的数目一定要相同;每个要显示的值都必须对应自己的格式说明符,并且显示值的类型要同说明符相匹配。printf() 说明符决定数据的显示方式而不决定数据的存储方式。
/*print1.c 说明 print() 的一些属性*/
#include <stdio.h>
int main(void)
{
int ten = 10;
int two = 2;
printf("Doing it right: ");
printf("%d minus %d is %d\n", ten, 2, ten-two );
printf("Doing it wrong: ");
//忘掉了两个参数
printf("%d minus %d is %d\n", ten );
return 0;
}
- char 类型声明与其它类型变量的声明方式相同,此类型用于存储字母和标点符号之类的字符,实际上 char 是整数类型。
/*charcode.c 显示一个字符的编码值*/
#include <stdio.h>
int main(void)
{
char ch, beep;
beep = '\a';
/*
如果编译器不识别警报字符(\a),则可以使用ASCII码替代
beep = '\007';
*/
printf("Please enter a character.\n");
scanf("%c", &ch); /*获取用户输入*/
printf("The code for %c is %d.\n", ch, ch );
printf("%c", beep);
return 0;
}
何为可移植类型?
通过对已有类型进行一些别名的扩展,以达到确切的描述相关信息。在使用这些可移植类型(它们不是关键字& int 不一样的哦)时,需要引用头文件 inttypes.h ,inttypes.h 头文件定义了一些可用在 scanf() 和 printf() 中读写这些类型整数的宏。
此类型使用 typedef 进行定义:
typedef int int32_t;
使用 #define 指令定义格式说明符:
#define PRId32 “d” //输出说明符。
#define SCNd32 “d” //输入说明符。1.确切长度类型,有符号类型使用 intN_t 格式、无符号类型使用 uintN_t 格式;格式宏使用 【d】 或 【i】 表示有符号类型,无符号类型使用 【o、x、X】说明符代替“%u”。
2.最小长度类型,可以保证一种类型的大小至少为某个确定的位。
3.最快最小长度类型,对于特定系统,有些整数表示可能比其它表示更快,inttypes.h定义了表示至少某个位数的最快类型。
4.最大长度类型,有时需要使用可用的最大整数类型,系统也可能提供比 longlong 或 unsigned longlong 更长的整数类型。
5.可以保存指针值的整数,inttypes.h 头文件通过包含 stdint.h 头文件定义了以下两种整数类型,可以精确地保存指针值。
/*altnames.c 可移植的整数类型名*/
#include <stdio.h>
#include <inttypes.h> //支持可移植类型
int main(void)
{
int16_t me16; //me16是一个16位有符号变量
me16 = 4593;
printf("First, assume int16_t is short:\n");
printf("me16 = %hd\n", me16);
printf("Next, let's not make any assumptions.\n");
printf("Instead, use a \"macro\" from inttypes.h:");
printf("me16 = %" PRId16 , me16);
/*参数 PRId16被它在 inttypes.h 中的定义“hd” 所替代*/
return 0;
}
- 浮点型
C语言中包括浮点数:float 、 double 、long double。
浮点型变量的声明及初始方法同整型变量相同,在C中浮点型默认为double,可以通过【f && F】后缀把浮点常量当作 float 类型,也可以通过【l && L】后缀把浮点常量当中 long double 类型。使用 printf() 打印输出时可用说明符【%f 、%e、%a】。
/*showf_pt.c 以三种方式显示浮点值*/
#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 );
/*使用%e打印指数记数法的数字*/
printf("%f can be written %e\n", abet, abet );
printf("%f can be written %e\n", dip, dip );
printf("%a %a %a\n", aboat, abet, dip );
/*使用%a打印十六进制格式浮点数*/
return 0;
}
- sizeof 是求指定数据类型在内存中的大小,单位 “Byte”。
/*typesize.c 输出类型的大小*/
#include <stdio.h>
int main(void)
{
/*c99 为类型提供一个 %zd 说明符*/
printf("type int has a size of %u bytes.\n",
sizeof(int) );
printf("type char has a size of %u bytes.\n",
sizeof(char) );
printf("type long has a size of %u bytes.\n",
sizeof(long) );
printf("type double has a size of %u bytes.\n",
sizeof(double) );
printf("type _Complex has a size of %zd bytes.\n",
sizeof(_Complex) );
/*使用 c99 提供的 %zd 说明符*/
printf("type unsigned int has a size of %lu bytes.\n",
sizeof(unsigned int) );
/*
/sublime_text 编译器允许使用 %lu 代替 %u,因为C允许
由具体的实现来选择 sizeof 返回的结果值实际使用哪种
无符号整数类型。
*/
return 0;
}
上图的编译结果第5行“type _Complex has a size of zd bytes.”,说明本机是不支持c99标准的,至于复数(_Complex)在相应环境中占多少自然字,你可以自己去测试哦!
- printf() 刷新输出的可能性:
1.缓冲区满的时候
2.遇到换行符的时候
3.需要输入的时候