C语言非常道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 认识递增运算符

我们知道,表达式n = n + 1是赋值表达式,可以用复合赋值表达式n += 1来完成相同的操作。

如果仅仅是将变量n的存储值在原来的基础上加1,则表达式n = n + 1还有更简单的写法,那就是使用“++”运算符。注意,这两个“+”必须连写,不能分开。

该运算符只有一个操作数,这个操作数可以在左(前)边,也可以在右(后)边,也就是分为前缀形式和后缀形式。如果使用前缀形式,则语句

              n += 1;

可以改写成这样:

              ++ n;

相反地,如果使用后缀形式,可以改写成这样:

              n ++;

这里实际上是两个运算符,前缀形式的++称为前缀递增运算符,后缀形式的++称为后缀递增运算符。注意,不管是前缀递增运算符,还是后缀递增运算符,它们的操作数都必须是左值,且不执行左值转换,++ 5和6 ++都是非法的。

表达式++ n和n ++都是具有副作用的表达式,它们的副作用一样,都是导致变量n的存储值被修改为加1之后的值。因此,不管是采用哪一种写法,如果变量n原先的值是1,则不管执行这两条语句中的哪一个,执行之后,变量n的值都会变成2。

这样看来,表达式++ n和n ++似乎没有什么区别。然而,C语言的发明者显然不会如此无聊。

在前缀形式中,表达式的值(前缀递增运算符的结果)是操作数加1之后的值。这就是说,如果变量n原来的值是1,则表达式++ n的值是2;在后缀形式中,表达式的值(后缀递增运算符的结果)是操作数加1之前的原值。这就是说,如果变量n原来的值是1,则表达式n ++的值是1。

需要再次强调的是,和赋值运算符的左操作数一样,前缀递增和后缀递增运算符的操作数不执行左值转换。

练习3.2

你可曾想过怎样才能验证前缀递增和后缀递增运算符的结果是不同的?通过上机翻译并调试以下程序就可以做到(前缀递增和后缀递增运算符的优先级都高于赋值运算符)。

              int main(void)
              {
                  int x = 0, y, z;

                  y = ++ x;
                  z = x ++;
              }

请编辑和保存上述程序,用-g参数翻译为可执行文件,然后调试该程序。在第一条语句那里设置断点,然后运行到断点处,单步执行,观察变量x、y和z的值如何变化。