***********************************************************************************************************
------------------------------------------------------分割线---------------------------------------------------
***********************************************************************************************************
进入今天的学习吧
上次说到了这个程序,研究了string()函数和sizeof运算符的区别,详见上篇《C Primer Plus的学习_4》。
/*praise2 比较strlen()和sizeof*/
#include <stdio.h>
#include <string.h>
#define PRAISE "You are an extraordinary being."
int main (void)
{
char name [40];
printf("What's your name ?\n");
printf("My name is ");
scanf("%s",name);
printf("Hello,%s,%s\n",name,PRAISE);
printf("Your name of %u letters occupies %u memory cells.\n",strlen(name),sizeof name);
printf("Your name of %u letters ",strlen(PRAISE));
printf("occupies %u memory cells.\n",sizeof PRAISE);
return 0;
}
下面来说说【#define PRAISE "You are an extraordinary being."】这一行 。
当你阅读一个很长的程序时,见到常量名会比见到数字更加亲切,常量名也能表达更多信息。可能有同学要说数字更方便,直接拿来用就行了,还不用定义。
是的,说的没错。
但是当写一个很长的程序时,如果要使用同一个数常量很多次,有时还需要改动这些值,一个一个改岂不是很麻烦?
如果提前定义好了一个常量,改动的时候只要在开头微调就行了呀,是不是很方便?
而且还有一个原因,那就是。。。。。。。。。。。。逼。。。。。。格。。。。。。高。。。。。。
C预处理器
预处理器是如何定义常量的呢?只要在只要在程序顶部添加一行例如:
#define TAXRATE 66666
效果就是程序里所有 TAXRATE 的值都会变成666666
定义的格式如下所示
#define NAME value
关于为什么要大写。。。这是为了提高程序可读性,看到这个全大写的名字就会知道这是个符号常量,不是个变量。
小写当然也是没问题的,但这毕竟是行业约定俗成的东西,还是乖乖遵守为好。
而且还有一个原因,那就是。。。。。。。。。。。。逼。。。。。。格。。。。。。高。。。。。。
【注:符号常量的命名与变量相同,可以用大写小写字母、数字和下划线,首字母不能为数字】
来个例子
/*pizza.c 使用已定义的常量*/
#include <stdio.h>
#define PI 3.14159
int main (void)
{
float area, circum, radius;
printf("What's the rsdius of your pizza?\n");
scanf("%f",&radius);
area = PI * radius * radius;
circum = 2.0 * PI * radius;
printf("Your basic pizza parameters are as follow:\n");
printf("circumference = %1.2f,area = %1.2f\n",circum,area);
return 0;
}
这里的"PI"就是符号常量,定义好了之后想怎么用就怎么用。
同时,#define指令还可以定义字符和字符串常量
#define BEEP '\a'
#define TEE 'T'
#define ESC '\033'
#define OOPS "Now you have done it!"
#define TOES = 20 /*这是错的!*/
这最后一条,在替换的时候得到的是“ = 20 ”而不是“20”。
除了上面所说的那些,C语言中还有 const限定符 和 明示常量
const限定符:
使用于限定一个变量为 只读
const int MONTHS = 12 //MONTHS的址在程序中不可以改变,只能是12
明示常量:
C语言头文件limits.h和float.h提供了与整数类型和浮点类型大小限制相关的详细信息,头文件都定义了一系列现成的明示常量,这些常量是由 ANSI C 提出的,这让程序更具有可移植性。
这是limits.h中的一些明示常量
宏 | 值 | 描述 |
---|---|---|
CHAR_BIT | 8 | 定义一个字节的比特数。 |
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 | 定义一个无符号长整型的最大值。 |
摘自http://www.runoob.com/cprogramming/c-standard-library-limits-h.html
这是float.h中的一些明示常量
宏 | 描述 |
---|---|
FLT_ROUNDS | 定义浮点加法的舍入模式,它可以是下列任何一个值:
|
FLT_RADIX 2 | 这个宏定义了指数表示的基数。基数 2 表示二进制,基数 10 表示十进制,基数 16 表示十六进制。 |
FLT_MANT_DIG DBL_MANT_DIG LDBL_MANT_DIG | 这些宏定义了 FLT_RADIX 基数中的位数。 |
FLT_DIG 6 DBL_DIG 10 LDBL_DIG 10 | 这些宏定义了舍入后不会改变表示的十进制数字的最大值(基数 10)。 |
FLT_MIN_EXP DBL_MIN_EXP LDBL_MIN_EXP | 这些宏定义了基数为 FLT_RADIX 时的指数的最小负整数值。 |
FLT_MIN_10_EXP -37 DBL_MIN_10_EXP -37 LDBL_MIN_10_EXP -37 | 这些宏定义了基数为 10 时的指数的最小负整数值。 |
FLT_MAX_EXP DBL_MAX_EXP LDBL_MAX_EXP | 这些宏定义了基数为 FLT_RADIX 时的指数的最大整数值。 |
FLT_MAX_10_EXP +37 DBL_MAX_10_EXP +37 LDBL_MAX_10_EXP +37 | 这些宏定义了基数为 10 时的指数的最大整数值。 |
FLT_MAX 1E+37 DBL_MAX 1E+37 LDBL_MAX 1E+37 | 这些宏定义最大的有限浮点值。 |
FLT_EPSILON 1E-5 DBL_EPSILON 1E-9 LDBL_EPSILON 1E-9 | 这些宏定义了可表示的最小有效数字。 |
FLT_MIN 1E-37 DBL_MIN 1E-37 LDBL_MIN 1E-37 | 这些宏定义了最小的浮点值。 |
------------------------------------------------------------------------------------------------------
上面所提到的两个,最近还不怎么需要使用到,可以先关注后收藏,以备不时之需。
对,你没有想错,就是骗关注。
溜了溜了。。。。。。。。。。。
下期预告:printf()和scanf()