常量变量和表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。



现在我们把常量、变量、表达式和语句统一起来: 常量、变量、运算符可以一起组成表达式 最简单的表达式由单个常量或变量组成 任何表达式都有一个值 表达式可以加个; 号构成表达式语句。
ቤተ መጻሕፍቲ ባይዱ
1.
2.
3.
4.

以前我们在程序中的很多地方使用常量或变量, 其实这些地方也可以使用表达式。例如,我们可 以这样写:



有时候不同类型的数据很容易弄混,例如 “5”、„5‟ 、5 如果你注意了界定符就会很清楚,第一个是字符 串,第二个是字符,第三个是整数。 你很快就会知道为什么一定要严格区分它们之间 的差别,这个后面再讨论。


总结前面介绍的转义序列的规律,想想在printf 的格式化字符串中怎么表示一个% 字符? 写个小程序试验一下。

例如我们写三条打印语句: 结果。。。
你懂的。。。


试 试 吧
printf("character: %c\ninteger: %d\nfloating point: %f\n", '}', 34, 3.14);

常量(Constant)是程序中最基本的元素,有字符 常量、数字常量和枚举常量。





还有一点要注意,一般来说应避免使用以下划线 开头的标识符。 以下划线开头的标识符只要不和C 语言关键字冲 突的都是合法的,但是往往被编译器用作一些功 能扩展,C 语言库的实现也定义了很多以下划线 开头的名字,很容易造成名字冲突,所以除非你 对编译器和C 语言库特别清楚,一般应避免使用 这种标识符。
常量、变量、表达式
#include <stdio.h> /* * comment1 * main: generate some simple output */ int main(void) { printf(/* comment2 */"Hello, world.\n"); /* comment3 */ return 0; }


注释不能嵌套(Nest)使用,就是说一个注释的 文字中不能再出现/*和*/ 有的C 代码中有类似“// comment”的注释,这 种注释不能跨行,也不能穿插在一行代码中间。 这是从C++借鉴的语法,在C99中被标准化。

大致分为三个阶段:
Old Style汤普森和里奇发明C语言时。 C89,最早的C 语言规范,于1989年提出,1990 年先由ANSI推出ANSI版本,后来被接纳为ISO 国际标准。故也称为C90。 C99 标准是ISO在1999年推出的,加入了许多新 的特性。不过支持不是很广泛
total_minute = hour * 60 + minute; printf("%d:%d is %d minutes after 00:00\n", hour, minute, total_minute);

也可以写得更简洁:
printf("%d:%d is %d minutes after 00:00\n", hour, minute, hour * 60 + minute);


1.
必须以字母或下划线_ (Underscore)开头, 后面可以跟若干个字母、数字、下划线,但不 能有其它字符。
例如这些是合法的变量名:
Abc 、__abc__、_123
2.
3.
但这些是不合法的变量名:
3abc、ab$。

另外int、char、double等等,虽然符合上述规 则,但也不能用作标识符。

赋值时如果类型不匹配,编译器会报警或报错 (这是一种语义错误)。
int hour, minute; hour = "Hello."; minute = "59"; /* WRONG ! */ /* WRONG !! */

这两个赋值语句错在哪里?

既然可以为变量的存储空间赋值,就应该可以把 值取出来用,现在我们取出这些变量的值用 printf打印:
hour * 60 + minute;

但是这个语句在程序中起不到任何作用。 算出的结果没有保存,算了半天,白算了!

事实上赋值语句就是一种表达式语句,因为等号 也是一种运算符,例如:
int total_minute; total_minute = hour * 60 + minute;

这个语句就很有意义,把计算结果保存在另一个 变量total_minute里,=的优先级比+ -*/ 都要低, 所以先算出等号右边的结果然后才做赋值操作。

这个语句的执行顺序是:先求表达式的值,然后 printf把表达式的值打印出来。


printf可以打印表达式,表达式不仅可以是单个 的常量变量也可以是一个算式,上面第二条语句 的写法就是这两条规则的组合(Composition) C 语言规定了一组语法规则,只要符合它的规则, 就可以写出任意复杂的组合,比如以下一条语句:

printf(“%c”, „%‟);

变量(Variable )

是编程语言中最重要的概念之一,变量是计算机存储 器中的一块命名的空间,可以在里面存储一个值 (Value),存储的值是可以随时变的,比如这次存 个字符'a' 下次存个字符'b' ,正因为变量的值可以随时 变所以才叫变量。

常量有不同的类型,因此变量也有不同的类型, 变量的类型也决定了它所占的存储空间的大小。

像"Hello, world.\n"这种由双引号引起来的一串字 符称为字符串字面值,或者简称字符串。 打印出来的结果也没有\n这两个字符,这是为什么 呢?C 语言规定了一些转义序列,这里的\n并不表 示它的字面意思,也就是说并不表示\和n这两个字 符本身,而是合起来表示一个换行符。
printf("Hello, world.\n"); printf("Goodbye, "); printf("cruel world!\n");

比如下面左边的4个语句,我们定义4个变量,名 称是fred, bob, jimmy, tom 不过给变量取名字不能太随意,比如上面的名字 就取的不够好,因为你猜不到这几个变量是用来 做什么的。 名字要突出变量的作用,比如右边的就要好很多
char fred; int bob; float jimmy; double tom; char firstletter; char lastLetter; int hour, minute;
int hour, minute; hour = 19; minute = 30; printf("Current time is %d:%d", hour, minute);

也就是说,变量名除了用在等号左边表示赋值之 外,用在别的地方都表示把它的值取出来替换在 那里。

在计算机中不同类型的变量所占的存储空间大小 是不同的,变量的最小存储单位是字节(Byte)。 在C 语言中char型变量的存储空间是一个字节, 其它类型的变量占多少个字节在不同平台上有不 同的规定,以后再详细讨论。


注意,变量一定要先定义再使用,编译器必须先 看到你的定义语句,才知道firstletter 、hour和 minute 是变量名,代表一块存储空间,下面使 用时才知道去哪里找这个变量的存储空间。 注意,这里的=号跟数学里的=号不一样。


变量的定义和赋值也可以一步完成,这称为变量的 初始化(Initialization)。 例如要达到刚才代码的效果也可以这样写:
因为C 语言用这些单词做特殊用途,如果你起个 变量名也叫这个就会让编译器无法区分,所以C 语言规定了一些单词不允许用作标识符,这些单 词称为关键字(Keyword )或保留字 (Reserved Word )。 通常用于编程的文本编辑器都会高亮显示这些关 键字,所以只要小心一点通常不会当作标识符误 用。

任何一个表达式都能求出一个值来,表达式
hour * 60 + minute

能算出一个值来,那个整个赋值表达式
total_minute = hour * 60 + minute;

的值是什么呢?

C 语言规定等号运算符的计算结果就是等号左边 被赋予的那个值。

等号还有一个和+-*/ 不同的特性,如果一个表 达式中出现多个等号,不是从左到右计算而是从 右到左计算,例如:


字符常量要用单引号括起来,例如上面的'}' ,注意 单引号只能括一个字符而不能像双引号那样 括一串字符,字符常量也可以是一个转义序列,例 如„\n„。 计算机中整数和小数的内部表示方式不同,因而在 C 语言中是两种不同的类型,小数在计算机术语中 称为浮点数(Floating Point)
printf("character: %c\ninteger: %d\nfloating point: %f\n", '}', 34, 3.14);
char firstletter = 'a'; int hour = 11, minute = 59;


注意,初始化是一种特殊的变量定义语句,而不是 一种赋值语句。 事实上C 语言的很多语法规则既适用于赋值,也适 用于初始化。不过到后面你就知道区别在哪里了。 你不妨在学习过程中注意总结赋值和初始化的相同 之处和不同之处。


常量和变量都可以参与加减乘除运算,例如1+1 、 hour-1 、hour * 60 + minute 、minute/60等。 这里的+-*/称为运算符(Operator ),而参与 运算的变量和常量称为操作数(Operand ), 面四个由运算符和操作数所组成的算式称为表达 式(Expression )。


和数学上规定相同
hour * 60 + minute

这个表达式应该先算乘再算加,也就是说运算符 是有优先级(Precedence)的。 我们先介绍+-*/四种运算和(),因为它们比较简 单。 与数学上的规定完全相同,先乘除后加减,有括 号先算括号里的。



我们前面讲了打印语句、变量定义语句、赋值语 句,在任意一个表达式后面加个; 号也成为一个 表达式语句,例如:
auto break case char const continue default do double else enum extern float for goto if inline int long register restrict return short signed sizeof static struct switch typedef union unsigned void volatile while _Bool
_Complex _Imaginary

定义了变量之后,我们要把值存到它们的存储空 间里,可以用赋值(Assignment)语句实现:
char firstletter; int hour, minute; firstletter = 'a'; hour = 11; minute = 59; /* give firstletter the value 'a' */ /* assign the value 11 to hour */ /* set minute to 59 */
1.
2.
3.
#include <stdio.h> /* * comment1 * main: generate some simple output */ int main(void) { printf(/* comment2 */"Hello, world.\n"); /* comment3 */ return 0; }

这个结果跟

Hello,world

不同,它并没有按照字面输出。
"character: %c\ninteger: %d\nfloating point: %f\n“ 称为格式化字符串(Format String),它规定了后面几个 数据以何种格式插入到这个字符串中。 % 号后面加个字母c、d 、f 在printf 中分别解释成字符 型、整型和浮点型的转换说明,分别用后面的三个常量来 替换它们,也就是说它们只是在格式化字符串中占个位置, 并不出现在最终的打印结果中,这种用法通常叫做占位符。
int total_minute, total; total = total_minute = hour * 60 + minute;

过程是怎么样的?? 同样优先级的运算符是从左到右计算还是从右到 左计算,这称为运算符的结合性(Associativity), +-*/ 是左结合的,等号是右结合的。
相关文档
最新文档