相关知识:
一、常量表示
1、数值型常量
C 语言的整型常量有以下几种形式。
十进制:31
十进制长整型(添加后缀L):123456789L
十进制无符号长整型(添加后缀UL):123456789UL
八进制:037 /* 八进制需加前缀 0 */
八进制长整型(添加后缀l):037l /* 八进制需加前缀 0 */
八进制无符号长整型(添加后缀ul):037ul /* 八进制需加前缀 0 */
十六进制:0x1f /* 十六进制需加前缀 0x 或 0X */
十六进制长整型(添加后缀L):0X1FL /* 十六进制需加前缀 0x 或 0X */
十六进制无符号长整型(添加后缀UL):0XFUL /* 十六进制需加前缀 0x 或 0X */
提示:常量表示中的字母不区分大小写。
C 语言的浮点型常量有以下几种形式。(编译器默认小数为double类型)
十进制小数(无后缀即 double 类型):0.23
十进制 float 型浮点数(后缀 f):2.34F
十进制 long double 型浮点数(添加后缀l):.123l 123.L
指数形式小数(无后缀即 double 类型):2e-3
指数 float 型浮点数(后缀 f):2.34e-2f
指数 long double 型浮点数(添加后缀l):2.3e12l
注意:浮点数整数部分为 0 或小数部分为 0 可忽略不写。指数形式e或E前面必须有数字,后面必须是整数且可带正负号。
当我们要把一个十进制小数 x 转化成指数形式输出,可以采用以下代码:
float x = 12345.678 ;
printf("单精度浮点数形式:%.1f\n",x); /* 保留一位小数 */
printf("指数形式:%.1e",x); /* 保留一位小数并输出为指数形式 */
输出结果:
单精度浮点数形式:12345.7
指数形式:1.2e+04
C 语言还定义了一个格式转换符 %g、%G,可以根据数据的大小确认输出时是采用 %e 格式还是 %f 格式,自动选择%f和%e两种格式中较短的格式输出,且不输出无意义的0。 对于指数小于−4或者大于给定精度的数值,按照 %e 的控制输出,否则按照 %f 的控制输出。 注意: %g、%G 给出的精度并不是指小数位数,而是指包含整数位数在内的有效数字的最大位数。
printf("%g\n", 0.00001234); /* 指数小于 -4 */
printf("%g\n", 0.0001234); /* 指数不小于 -4 */
printf("%.2g\n", 123.45); /* 有效数字的最大位数是2 */
printf("%.2g\n", 23.45); /* 有效数字的最大位数是2 */
上面四句输出结果为:
1.234e-05
0.0001234
1.2e+02
23
2、字符常量与字符串常量
字符常量:由单引号括起,实际存储的是字符集中字符对应的 ASCII 编码值。单引号内有且只能有一个字符。
字符串常量:由双引号括起,以 \0
字符作为结束标志。双引号内可以有任意多个字符。
我们来看看下面这两个常量有什么区别?
'a'
"a"
第一个是字符 a ,实际存储的是 ASCII 码 97。
第二个是字符串 a ,实际上储存的是 a
和 \0
即 97, 0 两个数值。
字符串常量就是字符数组,同时字符串以\0
为结束标志,说明 C 语言对字符串长度没有限制。
3、枚举常量
枚举类型是一种由程序员自己定义的数据类型,定义枚举类型时需要以枚举常量的形式一一列出其类型变量的具体取值集合。
枚举类型关键字: enum
。 使用方式如下:
/*使用关键字 enum 定义一个枚举类型 weekday*/
enum weekday{sun,mom,tue,wed,thu,fri,sat}; /* 花括号中是枚举常量 */
C 语言为花括号中的枚举常量设定了默认值,默认初值为0,从左往右依次递增,故上述代码等价于:
enum weekday{sun=0,mom=1,tue=2,wed=3,thu=4,fri=5,sat=6};
也可以自己定义枚举常量的值:
enum season{spring,summer=3,autumn,winter};
上面的代码中只有一个枚举常量被赋值了,其他枚举常量的值遵循默认规则,最左侧的常量值为0,从summer
右侧开始,数值在summer
的取值基础上依次加 1 ,因此上面代码等价于:
enum season{spring=0,summer=3,autumn=4,winter=5};
枚举常量的名称不能相同,比如以下写法是错误的:
enum season{spring=1,spring=3,autumn=4,winter=5}; /* 错误示例 */
但是不同枚举常量可以具有相同的数值,如下代码所示:
enum season{spring=3,summer=3,autumn=4,winter=5};
二、变量声明
1、变量的初始化
C 语言允许变量定义(声明)的同时对变量进行初始化赋值,称为变量初始化,例如:
int a = 1; // 定义变量 a 并进行初始化赋值
当我们对字符数组进行初始化时,可以通过给其赋予的字符串长度决定数组长度,如下代码所示:
char str[] = "student"; // 字符数组长度8 ,即字符串长度加上结束符
当我们没有对变量进行初始化定义时,机器对局部变量和外部变量的处理不相同。机器会在编译的时候将外部变量默认初始化为0,如下代码所示:
/*未给外部变量赋值*/
#include<stdio.h>
int sum; // 定义外部变量
main(){
printf("未赋值的外部变量默认为:%d",sum); // 直接输出未赋值的外部变量
return 0;
}
输出结果为:
未赋值的外部变量默认为:0
但是当我们使用未经显式赋值的局部变量时,有的机器会报错,有的机器会给其赋一个不确定的值。总之,未赋值的局部变量值为无用的值。
2、const 限定符
当我们希望一个变量的值固定不被修改,我们可以使用一个新的限定符 const
,如下代码所示:
const int i = 3.14159;
通过 const 限定符 ,变量 i 的值不可以被修改,相当于把变量 i 当成一个常量使用。
提示:如果试图修改const限定符限定的值,其结果取决于具体的实现。
三、C 标准库 <limits.h> 与 <float.h>
limits.h 头文件决定了各种变量类型的各种属性。定义在该头文件中的符号常量限制了各种变量类型(比如 char、int 和 long)的值。
这些限制指定了变量不能存储任何超出这些对应限制的值,例如一个无符号字符型变量可以存储的最大值是 255。下面给出各种类型的变量范围以及对应的符号常量。
符号常量 | 数值 | 解释 |
---|---|---|
SCHAR_MIN | -128 | 定义一个有符号字符的最小值。 |
SCHAR_MAX | 127 | 定义一个有符号字符的最大值。 |
UCHAR_MAX | 255 | 定义一个无符号字符的最大值。 |
CHAR_MIN | 0 | 定义类型 char 的最小值,如果 char 表示负值,则它的值等于 SCHAR_MIN,否则等于 0。 |
CHAR_MAX | 127 | 定义类型 char 的最大值,如果 char 表示负值,则它的值等于 SCHAR_MAX,否则等于 UCHAR_MAX。 |
MB_LEN_MAX | 1 | 定义多字节字符中的最大字节数。 |
SHRT_MIN | -32768 | 定义一个短整型的最小值。 |
SHRT_MAX | +32767 | 定义一个短整型的最大值。 |
USHRT_MAX | 65535 | 定义一个无符号短整型的最大值。 |
INT_MIN | -32768 | 定义一个整型的最小值。 |
INT_MAX | +32767 | 定义一个整型的最大值。 |
UINT_MAX | 65535 | 定义一个无符号整型的最大值。 |
LONG_MIN | -2147483648 | 定义一个长整型的最小值。 |
LONG_MAX | +2147483647 | 定义一个长整型的最大值。 |
ULONG_MAX | 4294967295 | 定义一个无符号长整型的最大值。 |
float.h 头文件包含了一组与浮点值相关的依赖于平台的常量。 以下是与 double 型浮点数相关的常量。
符号常量 | 数值 | 解释 |
---|---|---|
DBL_DIG | 15 | 小数点后面精确的位数 |
DBL_EPSILON | 2.2e-16 | 小的正数 ,double的0跨度值 |
DBL_MAX | 1.8e+308 | 最大值 |
DBL_MAX_10_EXP | 308 | 最大十进制指数 |
DBL_MIN | 2.2e-308 | 最小值 |
DBL_MIN_10_EXP | -307 | 最小十进制指数 |
以下是与 float 型浮点数相关的常量。
符号常量 | 数值 | 解释 |
---|---|---|
FLT_DIG | 6 | float小数点后面精确的位数 |
FLT_EPSILON | 1.2e-07 | 小的正数 ,float的0跨度值 |
FLT_MAX | 3.4e+38 | 最大值 |
FLT_MAX_10_EXP | 38 | 最大十进制指数 |
FLT_MIN | 1.2e-38 | 最小值 |
FLT_MIN_10_EXP | -37 | 最小十进制指数 |
对于 long double 型浮点数则有以下常量。
符号常量 | 数值 | 解释 |
---|---|---|
LDBL_DIG | 18 | long double小数点后面精确的位数 |
LDBL_EPSILON | 2.2e-16 | 小的正数 ,long double的0跨度值 |
LDBL_MAX | 2e+323 | 最大值 |
LDBL_MAX_10_EXP | 323 | 最大十进制指数 |
LDBL_MIN | 7e-310 | 最小值 |
LDBL_MIN_10_EXP | -309 | 最小十进制指数 |
练习任务:
获取标准头文件中各种数据类型的最大最小值并输出。
要求:
获取标准头文件<limits.h>、<float.h>中涉及到第一关11种数据类型的最大值和最小值并按格式输出,其中浮点型变量用指数形式输出(不保留小数)。
预期输出:
有符号短整型的最小值是x,最大值是y
有符号基本整型的最小值是x,最大值是y
有符号长整型的最小值是x,最大值是x
无符号短整型的最小值是x,最大值是x
无符号基本整型的最小值是x,最大值是x
无符号长整型的最小值是x,最大值是x
单精度浮点型的最小值是x,最大值是x
双精度浮点型的最小值是x,最大值是x
长双精度浮点型的最小值是x,最大值是x
有符号字符型的最小值是x,最大值是x
无符号字符型的最小值是x,最大值是x
说明:上面预期输出中的实际数值使用字母 x ,y 代替。
参考:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
main(void)
{
printf("有符号短整型的最小值是%d,最大值是%d\n有符号基本整型的最小值是%d,最大值是%d\n有符号长整型的最小值是%ld,最大值是%ld\n无符号短整型的最小值是%hu,最大值是%hu\n无符号基本整型的最小值是%u,最大值是%u\n无符号长整型的最小值是%lu,最大值是%lu\n单精度浮点型的最小值是%0.0g,最大值是%0.0g\n双精度浮点型的最小值是%0.0g,最大值是%0.0g\n长双精度浮点型的最小值是%0.0g,最大值是%0.0g\n有符号字符型的最小值是%d,最大值是%d\n无符号字符型的最小值是%hhu,最大值是%hhu",SHRT_MIN,SHRT_MAX,INT_MIN,INT_MAX,LONG_MIN,LONG_MAX,0,USHRT_MAX,0,UINT_MAX,0,ULONG_MAX,1e-38,3e+38,2e-308,DBL_MAX,7e-310,2e-323,SCHAR_MIN,SCHAR_MAX,0,UCHAR_MAX);
return 0;
}