admin管理员组

文章数量:1558696


***********************************************************************************************************

------------------------------------------------------分割线---------------------------------------------------

***********************************************************************************************************

进入今天的学习吧

上次说到了这个程序,研究了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_BIT8定义一个字节的比特数。
SCHAR_MIN-128定义一个有符号字符的最小值。
SCHAR_MAX127定义一个有符号字符的最大值。
UCHAR_MAX255定义一个无符号字符的最大值。
CHAR_MIN0定义类型 char 的最小值,如果 char 表示负值,则它的值等于 SCHAR_MIN,否则等于 0。
CHAR_MAX127定义类型 char 的最大值,如果 char 表示负值,则它的值等于 SCHAR_MAX,否则等于 UCHAR_MAX。
MB_LEN_MAX1定义多字节字符中的最大字节数。
SHRT_MIN-32768定义一个短整型的最小值。
SHRT_MAX+32767定义一个短整型的最大值。
USHRT_MAX65535定义一个无符号短整型的最大值。
INT_MIN-32768定义一个整型的最小值。
INT_MAX+32767定义一个整型的最大值。
UINT_MAX65535定义一个无符号整型的最大值。
LONG_MIN-2147483648定义一个长整型的最小值。
LONG_MAX+2147483647定义一个长整型的最大值。
ULONG_MAX4294967295定义一个无符号长整型的最大值。

摘自http://www.runoob/cprogramming/c-standard-library-limits-h.html


这是float.h中的一些明示常量

描述
FLT_ROUNDS定义浮点加法的舍入模式,它可以是下列任何一个值:
  • -1 - 无法确定

  • 0 - 趋向于零

  • 1 - 去最近的值

  • 2 - 趋向于正无穷

  • 3 - 趋向于负无穷

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

这些宏定义了最小的浮点值。
摘自http://www.runoob/cprogramming/c-standard-library-float-h.html

------------------------------------------------------------------------------------------------------

上面所提到的两个,最近还不怎么需要使用到,可以先关注后收藏,以备不时之需。

对,你没有想错,就是骗关注。

溜了溜了。。。。。。。。。。。

下期预告:printf()和scanf()

本文标签: primerdefine