当前位置:网站首页>5 运算符、表达式和语句
5 运算符、表达式和语句
2022-07-28 08:26:00 【你回到了你的家】
3.3 递增运算符:++
递增运算符(increment operator)执行简单的任务,将其运算对象递增1。该运算符以两种方式出现。第1种方式,++出现在其作用的变量前面,这是前缀模式;第2种方式,++出现在其作用的变量后面,这是后缀模式。两种模式的区别在于递增行为发生的时间不同。我们先解释它们的相似之处,再分析它们不同之处。程序清单5.10中的程序示例演示了递增运算符是如何工作的。
程序5.10
/* add_one.c -- incrementing: prefix and postfix */
#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 = 1
super = 2, ultra = 2
super = 3, ultra = 3
super = 4, ultra = 4
super = 5, ultra = 5
利用递增运算符的优势,我们可以写出这样的程序:
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 (见图5.4)。
其次,这样做有什么好处?它使得程序更加简洁。更重要的是,它把控制循环的两个过程集中在–个地方。该循环的主要过程是判断是否继续循环(本例中,要检查鞋子的尺码是否小于18.5),次要过程是改变待测试的元素(本例中是递增鞋子的尺码)。
如果忘记改变鞋子的尺码,shoe的值会一直小于 18.5,循环不会停止。计算机将陷入无限循环(infinite loop)中,生成无数相同的行。最后,只能强行关闭这个程序。把循环测试和更新循环放在一处, 就不会忘记更新循环。
但是,把两个操作合并在-一个表达式中,降低了代码的可读性,让代码难以理解。而且,还容易产生计数错误。
递增运算符的另一个优点是,通常它生成的机器语言代码效率更高,因为它和实际的机器语言指令很相似。尽管如此,随着商家推出的C编译器越来越智能,这一优势可能会消失。-一个智能的编译器可以把x =x+1当作++x对待。
最后,递增运算符还有一个在某些场合特别有用的特性。我们通过程序清单5.11来说明。
程序5.11
/* post_pre.c -- postfix vs prefix */
#include <stdio.h>
int main(void){
int a = 1, b = 1;
int a_post, pre_b;
a_post = a++; // value of a++ during assignment phase
pre_b = ++b; // value of ++b during assignment phase
printf("a a_post b pre_b \n");
printf("%1d %5d %5d %5d\n", a, a_post, b, pre_b);
return 0;
}
编译后程序的输出应该是:
a a_post b pre_b
2 1 2 2
a和b都递增了1,但是,a_ post是a递增之前的值,而b_ pre是b递增之后的值。这就是++的前缀形式和后缀形式的区别(见图5.5)。


边栏推荐
- Design for failure常见的12种设计思想
- SQL injection - pre Foundation
- Shell programming specifications and variables
- Competition: diabetes genetic risk detection challenge (iFLYTEK)
- Setting of parameter configuration tool for wireless vibrating wire collector
- Alibaba internal interview materials
- MDM数据质量应用说明
- Go panic and recover
- Learn to draw with nature communications -- complex violin drawing
- shell 实现harbor v1/v2的备份/恢复/迁移等功能
猜你喜欢

51单片机存储篇:EEPROM(I2C)

一年涨薪三次背后的秘密

Principle of line of sight tracking and explanation of the paper

Go synergy

CSV文件存储

Do you know the five minute rule and the ten byte rule?

NDK series (6): let's talk about the way and time to register JNI functions

478-82(56、128、718、129)

Flink window & time principle

Chapter 2-14 sum integer segments
随机推荐
Chapter 2-14 sum integer segments
10、学习MySQL LIKE 子句
12 common design ideas of design for failure
Line generation (matrix)
Eight ways to solve EMC and EMI conducted interference
'global event bus' &' message subscription and Publishing '
KEGG通路的从属/注释信息如何获取
Among China's top ten national snacks, it is actually the first
Network interface network crystal head RJ45, Poe interface definition line sequence
Train your own classification [Bao Jiaobao, the data are ready]
Mysql5.7.38 start keepalived in the container
3D全景展示新模式,成为破局的关键
侯捷STL标准库和泛型编程
Distributed system architecture theory and components
Competition: diabetes genetic risk detection challenge (iFLYTEK)
(IROS 2022) 基于事件相机的单目视觉惯性里程计 / Event-based Monocular Visual Inertial Odometry
golang 协程的实现原理
[advanced drawing of single cell] 07. Display of KEGG enrichment results
Data fabric, next air outlet?
ES6 变量的解构赋值