c语言运算符和表达式 (c语言程序设计与计算思维)

现在, 读者已经熟悉了如何表示数据, 接下来我们学习如何处理数据。C 语言为处理数据提供了大量的操作, 可以在程序中进行算术运算、 比较值的大小、 修改变量、 逻辑地组合关系等。 我们先从基本的算术运算(加、减、 乘、 除) 开始。

一、循环

#include <stdio.h>

#define ADJUST 7.31 // 字符常量

int main(void)

{

const double SCALE = 0.333;// const变量

double shoe, foot;

shoe = 9.0;

foot = SCALE * shoe + ADJUST;

printf("Shoe size (men's) foot length\n");

printf("%10.1f %15.2f inches\n", shoe, foot);

return 0;

}

该程序的输出如下:Shoe size (men's) foot length9.0 10.31 inches

该程序演示了用#define 指令创建符号常量和用 const 限定符创建在程序运行过程中不可更改的变量。 程序使用了乘法和加法, 假定用户穿9码的鞋, 以英寸为单位打印用户的脚长。 你可能会说: “这太简单了, 我用笔算比敲程序还要快。 ”说得没错。 写出来的程序只使用一次(本例即只根据一只鞋的尺码计算一次脚长) , 实在是浪费时间和精力。 如果写成交互式程序会更有用, 但是仍无法利用计算机的优势。while循环可以很好的优化上面程序

while (shoe < 18.5) /* while循环开始 */

{ /* 块开始 */

foot = SCALE * shoe + ADJUST;

printf("%10.1f %15.2f inches\n", shoe, foot);

shoe = shoe + 1.0;

} /* 块结束 *下面解释一下while循环的原理。 当程序第1次到达while循环时, 会检查圆括号中的条件是否为真。 该程序中, 条件表达式如下:shoe < 18.5符号<的意思是小于。 变量shoe被初始化为3.0, 显然小于18.5。 因此,该条件为真, 程序进入块中继续执行, 把尺码转换成英寸。 然后打印计算的结果。 下一条语句把 shoe增加1.0, 使shoe的值为4.0:shoe = shoe + 1.0;此时, 程序返回while入口部分检查条件。 为何要返回while的入口部分? 因为上面这条语句的下面是右花括号( }) , 代码使用一对花括号( {}) 来标出while循环的范围。 花括号之间的内容就是要被重复执行的内容。 花括号以及被花括号括起来的部分被称为块( block) 。

二、基本运算符

(1)赋值运算:

在C语言中, =并不意味着“相等”, 而是一个赋值运算符。 下面的赋值表达式语句:v = 2;

(2)加法运算符:

加法运算符(addition operator) 用于加法运算, 使其两侧的值相加。 例如, 语句:printf("%d", 4 + 20);打印的是24, 而不是表达式4 + 20相加的值(运算对象) 可以是变量, 也可以是常量。 因此, 执行下面的语句:income = salary + bribes;

(3)减法运算符:与加法一致

(4)符号运算符(+、-)

例如, 执行下面的语句后, smokey的值为12:rocky = –12;(等同于:rocky=rocky-12;)smokey = –rocky;以这种方式使用的负号被称为一元运算符(unaryoperator) 。 一元运算符只需要一个运算对象 。dozen = +12;

(5)除法运算符

#include <stdio.h>

int main(void)

{

printf("integer division: 5/4 is %d \n", 5 / 4);

printf("integer division: 6/3 is %d \n", 6 / 3);

printf("integer division: 7/4 is %d \n", 7 / 4);

printf("floating division: 7./4. is %1.2f \n", 7. / 4.);

printf("mixed division: 7./4 is %1.2f \n", 7. / 4);

return 0;

}

C使用符号/来表示除法。 /左侧的值是被除数, 右侧的值是除数。 例如, 下面four的值是4.0:four = 12.0/3.0; 运算符优先级问题:

c语言运算符和表达式,c语言程序设计第六章例题解题

运算符优先级

#include <stdio.h>

int main(void)

{

int top, score;

top = score = -(2 + 5) * 6 + (4 + 3 * (2 + 3));

printf("top = %d, score = %d\n", top, score);

return 0;

}

该程序会打印什么值? 先根据代码推测一下, 再运行程序或阅读下面的分析来检查你的答案。首先, 圆括号的优先级最高。 先计算-(2 + 5) * 6中的圆括号部分, 还是先计算(4 + 3 * (2 + 3))中的圆括号部分取决于具体的实现。 圆括号的最高优先级意味着, 在子表达式-(2 + 5) * 6中, 先计算(2 + 5)的值, 得7。 然后, 把一元负号应用在7上, 得-7。 现在, 表达式是:

top = score = -7 * 6 + (4 + 3 * (2 + 3))下一步, 计算2 + 3的值。 表达式变成:top = score = -7 * 6 + (4 + 3 * 5)接下来, 因为圆括号中的*比+优先级高, 所以表达式变成:top = score = -7 * 6 + (4 + 15)然后, 表达式为:top = score = -7 * 6 + 19-7乘以6后, 得到下面的表达式:top = score = -42 + 19然后进行加法运算, 得到:top = score = -23现在, -23被赋值给score, 最终top的值也是-23。 记住, =运算符的结合律是从右往左。 (6)其他运算符(sizeof)

#include <stdio.h>

int main(void)

{

int n = 0;

size_t intsize;

intsize = sizeof (int);

printf("n = %d, n has %zd bytes; all ints have %zdbytes.\n",n, sizeof n, intsize);

return 0;

}C语言规定, sizeof 返回 size_t 类型的值。 这是一个无符号整数类型,但它不是新类型。 前面介绍过, size_t是语言定义的标准类型。 C有一个typedef机制(第14章再详细介绍) , 允许程序员为现有类型创建别名。 例如,typedef double real;这样, real就是double的别名。 现在, 可以声明一个real类型的变量:real deal; // 使用typedef编译器查看real时会发现, 在typedef声明中real已成为double的别名, 于是把deal创建为double 类型的变量。 类似地, C 头文件系统可以使用 typedef把 size_t 作为 unsigned int 或unsigned long的别名。 这样, 在使用size_t类型时, 编译器会根据不同的系统替换标准类型。 (7)求模运算符:%

11 / 5得2, 11 % 5得1也就是求余数,读者知道这么用就ok

(8)自增“++”(自减“--”就不赘述与自增一样)

递增运算符(increment operator) 执行简单的任务, 将其运算对象递增1。 该运算符以两种方式出现。 第1种方式, ++出现在其作用的变量前面,这是前缀模式; 第2种方式, ++出现在其作用的变量后面, 这是后缀模式。两种模式的区别在于递增行为发生的时间不同。 我们先解释它们的相似之处, 再分析它们不同之处。 #include <stdio.h>

int main(void)

{

int ultra = 0, super = 0;

while (super < 5)

{

super++;

++ultra;

printf("super = %d, ultra = %d \n", super, ultra);

}

return 0;

}

运行该程序后, 其输出如下:super = 1, ultra = 1super = 2, ultra = 2super = 3, ultra = 3super = 4, ultra = 4super = 5, ultra = 5该程序两次同时计数到5。 用下面两条语句分别代替程序中的两条递增语句, 程序的输出相同:super = super + 1;ultra = ultra + 1;

这些都是很简单的语句, 为何还要创建两个缩写形式? 原因之一是, 紧凑结构的代码让程序更为简洁, 可读性更高。 这些运算符让程序看起来很美观。 例如,前面关于鞋码的程序可以这么写:

shoe = 3.0;while (shoe < 18.5){

foot = SCALE * size + ADJUST;printf("%10.1f %20.2f inches\n", shoe, foot);++shoe;}

但是, 这样做也没有充分利用递增运算符的优势。 还可以这样缩短这段程序:shoe = 2.0;while (++shoe < 18.5){

foot = SCALE*shoe + ADJUST;printf("%10.1f %20.2f inches\n", shoe, foot);} 如上代码所示, 把变量的递增过程放入while循环的条件中。 这种结构在C语言中很普遍, 我们来仔细分析一下。首先, 这样的while循环是如何工作的? 很简单。 shoe的值递增1, 然后和18.5作比较。 如果递增后的值小于18.5, 则执行花括号内的语句一次。 然后, shoe的值再递增1, 重复刚才的步骤, 直到shoe的值不小于18.5为止。 注意, 我们把shoe的初始值从3.0改为2.0, 因为在对foot第1次求值之前, shoe已经递增了1。

c语言运算符和表达式,c语言程序设计第六章例题解题

执行一次循环

前缀自增自减表达式的结果就是运算对象+1或者-1后的结果,当表达式的结果出来后,前缀自增自减运算符对运算对象本身具有一个额外作用,即:将运算对象本身的值也变为表达式结果的值,也就是运算对象+1或者-1后的值。

后缀自增自减表达式的结果就是运算对象本身的值,但当表达式执行完毕之后,也有一个额外作用,这个额外作用将运算对象变为它本身+1或者-1后的值。