C语言 |
您所在的位置:网站首页 › 数据常量要求 › C语言 |
常量 常量(Constant)是程序中最基本的元素,有字符(Character)常量、 整数(Integer)常量、浮点数(Floating Point)常量和枚举常量。 下面看一个例子: printf("character: %c\n integer: %d\n floating point: %f\n", '}', 34, 3.14);
常量在程序加载内存的常量区,即.data段 字符常量要用单引号括起来,注意单引号只能括一个字符而不能像双引号那样括一串字符, 字符常量也可以是一个转义序列, 例如'\n',这时虽然单引号括了两个字符,但实际上只表示一个字符。
字符串字面值中使用转义序列有一点区别,如果在字符常量中要表示双 引号"和问号?,既可以使用转义序列\"和\?,也可以直接用字符"和?, 而要表示'和\则必须使用转义序列。[2] 计算机中整数和小数的内部表示方式不同,因而在 C 语言中是两种不同 的类型(Type),例如上例的 34 和 3.14,小数在计算机术语中称为浮 点数。这个语句的输出结果和 Hello world 不太一样,字符串 "character: %c\n integer: %d\n floating point: %f\n"并不是按原样打印输 出的,而是输出成这样: character: } integer: 34 floating point: 3.14 变量 变量(Variable)是编程语言最重要的概念之一,变量是计算机存储器 中的一块命名的空间,可以在里面存储一个值(Value),存储的值是可以随时变的,比如这次存个字符'a'下次存个字符'b',正因为变量的值 可以随时变所以才叫变量。 常量有不同的类型,因此变量也有不同的类型,变量的类型也决定了它 所占的存储空间的大小。例如以下四个语句定义了四个变量 fred、bob、 jimmy 和 tom,它们的类型分别是字符型、整型、浮点型: char fred; int bob; float jimmy; double tom; 声明和定义 C 语言中的声明(Declaration)有变量声明、函数声明和类型声明三种。 如果一个变量或函数的声明要求编译器为它分配存储空间,那么也可以 称为定义(Definition),因此定义是声明的一种。在接下来几章的示例 代码中变量声明都是要分配存储空间的,因而都是定义,在下一章我们 会看到函数的定义和声明也是这样区分的,分配存储空间的函数声明可 以称为函数定义。声明一个类型是不分配存储空间的。 “类型定义”和“类型声明”表示相同的含义。声明和语句类似,也是 以;号结尾的,但是在语法上声明和语句是有区别的,语句只能出现在{} 括号中,而声明既可以出现在{}中也可以出现在所有{}之外。 浮点型有三种,float 是单精度浮点型,double 是双精度浮点型,long double 是精度更高的浮点型。给变量起名不能太随意,上面四个变量的名字就不够好,我们猜不出这些变量是用来存什么的。而像下面这样起 名就很好: char firstletter; char lastletter; int hour, minute; 我们可以猜得到这些变量是用来存什么的,前两个变量的取值范围应该 是'A'~'Z'或'a'~'z',变量 hour 的取值范围应该是 0~23,变量 minute 的 取值范围应该是 0~59,所以应该给变量起有意义的名字。从这个例子 中我们也看到两个相同类型的变量(hour 和 minute)可以一起声明。 给变量起名有一定的限制,C 语言规定必须以字母或下划线_ (Underscore)开头,后面可以跟若干个字母、数字、下划线,但不能 有其它字符。例如这些是合法的变量名:Abc、__abc__、_123。但这 些是不合法的变量名:3abc、ab$。其实这个规则不仅适用于变量名, 也适用于所有可以由程序员起名的语法元素,例如以后要讲的函数名、 宏定义、结构体成员名等,在 C 语言中这些统称为标识符(Identifier)。 另外要注意,表示类型的 char、int、float、double 等虽然符合上述规 则,但也不能用作标识符。在 C 语言中有些单词有特殊意义,不允许用 作标识符,这些单词称为关键字(Keyword)或保留字(Reserved Word)。 还有一点要注意,一般来说应避免使用以下划线开头的标识符,以下划 线开头的标识符只要不和 C 语言关键字冲突的都是合法的,但是往往被 编译器用作一些功能扩展,C 标准库也定义了很多以下划线开头的标识符,所以除非你对编译器和 C 标准库特别清楚,一般应避免使用这种标 识符,以免造成命名冲突。 赋值 定义了变量之后,我们要把值存到它们所表示的存储空间里,可以用赋 值(Assignment)语句实现: char firstletter; int hour, minute; firstletter = 'a'; /* give firstletter the value 'a' */ hour = 11; /* assign the value 11 to hour */ minute = 59; /* set minute to 59 */ 注意变量一定要先声明后使用,编译器必须先看到变量声明,才知道 firstletter、hour 和 minute 是变量名,各自代表一块存储空间。另外, 变量声明中的类型表明这个变量代表多大的一块存储空间,这样编译器 才知道如何读写这块存储空间。还要注意,这里的等号不表示数学里的 相等关系,和 1+1=2 的等号是不同的,这里的等号表示赋值。在数学 上不会有 i=i+1 这种等式成立,而在 C 语言中表示把变量 i 的存储空间 中的值取出来,再加上 1,得到的结果再存回 i 的存储空间中。再比如, 在数学上 a=7 和 7=a 是一样的,而在 C 语言中后者是不合法的。总结 一下:定义一个变量,就是分配一块存储空间并给它命名;给一个变量 赋值,就是把一个值保存到这块存储空间中。变量的定义和赋值也可以 一步完成,这称为变量的初始化(Initialization),例如要达到上面代码 的效果也可以这样写: char firstletter = 'a';int hour = 11, minute = 59; 在初始化语句中,等号右边的值叫做 Initializer,例如上面的'a'、11 和 59。注意,初始化是一种特殊的声明,而不是一种赋值语句。就目前来 看,先定义一个变量再给它赋值和定义这个变量的同时给它初始化所达 到的效果是一样的,C 语言的很多语法规则既适用于赋值也适用于初始 化,但在以后的学习中你也会了解到它们之间的不同,请在学习过程中 注意总结赋值和初始化的相同和不同之处。 例如: int hour, minute; hour = "Hello."; minute = "59"; /* WRONG ! */ /* WRONG !! */ 注意第 3 个语句,把"59"赋给 minute 看起来像是对的,但是类型不对, 字符串不能赋给整型变量。 既然可以为变量的存储空间赋值,就应该可以把值取出来用,现在我们 取出这些变量的值用 printf 打印: printf("Current time is %d:%d", hour, minute); 变量名用在等号左边表示赋值,而用在 printf 中表示把它的存储空间中 的值取出来替换在那里。 表达式 表达式与语句的区别左结合与右结合 常量和变量都可以参与加减乘除运算,例如 1+1、hour-1、hour * 60 + minute、minute/60 等。这里的+ - * /称为运算符(Operator),而参与 运算的常量和变量称为操作数(Operand),上面四个由运算符和操作 数所组成的算式称为表达式(Expression)。 和数学上规定的一样,hour * 60 + minute 这个表达式应该先算乘再算 加,也就是说运算符是有优先级(Precedence)的,*和/是同一优先级, +和-是同一优先级,*和/的优先级高于+和-。对于同一优先级的运算从 左到右计算,如果不希望按默认的优先级计算则要加()括号 (Parenthesis)。例如(3+4)*5/6 应先算 3+4,再算*5,再算/6。 前面讲过打印语句和赋值语句,现在我们定义:在任意表达式后面加个; 号也是一种语句,称为表达式语句。例如: hour * 60 + minute; 这是个合法的语句,但这个语句在程序中起不到任何作用,把 hour 的 值和 minute 的值取出来加乘,得到的计算结果却没有保存,白算了一 通。再比如: int total_minute; total_minute = hour * 60 + minute; 这个语句就很有意义,把计算结果保存在另一个变量 total_minute 里。 事实上等号也是一种运算符,称为赋值运算符,赋值语句就是一种表达式语句,等号的优先级比+和*都低,所以先算出等号右边的结果然后才 做赋值操作,整个表达式 total_minute = hour * 60 + minute 加个;号构 成一个语句。 任何表达式都有值和类型两个基本属性。hour * 60 + minute 的值是由 三个 int 型的操作数计算出来的,所以这个表达式的类型也是 int 型。同 理,表达式 total_minute = hour * 60 + minute 的类型也是 int,它的值 是多少呢?C 语言规定等号运算符的计算结果就是等号左边被赋予的 那个值,所以这个表达式的值和 hour * 60 + minute 的值相同,也和 total_minute 的值相同。 等号运算符还有一个和+ - * /不同的特性,如果一个表达式中出现多个 等号,不是从左到右计算而是从右到左计算,例如: int total_minute, total; total = total_minute = hour * 60 + minute; 计算顺序是先算 hour * 60 + minute 得到一个结果,然后算右边的等号, 就是把 hour * 60 + minute 的结果赋给变量 total_minute,这个结果同 时也是整个表达式 total_minute = hour * 60 + minute 的值,再算左边 的等号,即把这个值再赋给变量 total。同样优先级的运算符是从左到右 计算还是从右到左计算称为运算符的结合性(Associativity)。+ - * / 是左结合的,等号是右结合的。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |