C 语言中的增量和减量运算符
C - 增量和减量运算符
增量运算符 (++) 将变量的值加 1,而减量运算符 (--) 将变量的值减 1。
在 C 语言中,增量和减量运算符常用于构造计数循环(例如 for 循环)。它们也适用于数组的遍历和指针运算。
++ 和 -- 运算符是一元运算符,可以用作变量的前缀或后缀。
增量和减量运算符示例
以下示例包含多个语句,演示了增量和减量运算符的不同变体用法 -
#include <stdio.h> int main() { int a = 5, b = 5, c = 5, d = 5; a++; // 后缀递增 ++b; // 前缀递增 c--; // 后缀递减 --d; // 前缀递减 printf("a = %d ", a); printf("b = %d ", b); printf("c = %d ", c); printf("d = %d ", d); return 0; }
输出
运行此代码时,将产生以下输出 -
a = 6 b = 6 c = 4 d = 4
示例说明
换句话说,"a++"与"++a"效果相同,因为这两个表达式都将变量"a"的值加 1。同样,"a--"与"--a"效果相同。
表达式"a++;"可以视为语句"a = a + 1;"的等价形式。这里,右边的表达式将"a"加 1,并将结果赋回 1,因此"a"的值加 1。
同样,"b--;"等同于"b = b 1;"。
增量运算符的类型
增量运算符有两种类型:预增量和后增量。
前置(前缀)增量运算符
在表达式中,前置增量运算符会在使用变量值之前,先将变量的值加 1。
语法
++variable_name;
示例
在下面的示例中,我们使用前置增量运算符,其中"x"的值将加 1,然后在表达式中使用增加的值。
#include <stdio.h> int main() { int x = 10; int y = 10 + ++x; printf("x = %d, y = %d ", x, y); return 0; }
运行此代码时,将产生以下输出 -
x = 11, y = 21
后置(后缀)递增运算符
在表达式中,后置递增运算符会在使用变量值后,将变量值加 1。
语法
variable_name++;
示例
在下面的示例中,我们使用后置递增运算符,其中"x"的值将在表达式中使用,然后加 1。
#include <stdio.h> int main() { int x = 10; int y = 10 + x++; printf("x = %d, y = %d ", x, y); return 0; }
运行此代码时,将产生以下输出 -
x = 11, y = 20
自减运算符的类型
自减运算符有两种类型:预自减和后自减。
前置(前缀)自减运算符
在表达式中,前置自减运算符会在使用变量值之前将其值减 1。
语法
--variable_name;
示例
在下面的示例中,我们使用了预减运算符,其中"x"的值将减少 1,然后将减少后的值用于表达式中。
#include <stdio.h> int main() { int x = 10; int y = 10 + --x; printf("x = %d, y = %d ", x, y); return 0; }
运行此代码时,将产生以下输出 -
x = 9, y = 19
后置(后缀)减量运算符
在表达式中,后置减量运算符会在使用变量值后,将其值减 1。
语法
variable_name--;
示例
在下面的示例中,我们使用后置减量运算符,其中"x"的值将在表达式中使用,然后减 1。
#include <stdio.h> int main() { int x = 10; int y = 10 + x--; printf("x = %d, y = %d ", x, y); return 0; }
运行此代码,将产生以下输出 -
x = 9, y = 20
更多增量和减量运算符示例
示例 1
以下示例重点介绍了前缀/后缀增量/减量的用法 -
#include <stdio.h> int main(){ char a = 'a', b = 'M'; int x = 5, y = 23; printf("a: %c b: %c ", a, b); a++; printf("postfix increment a: %c ", a); ++b; printf("prefix increment b: %c ", b); printf("x: %d y: %d ", x, y); x--; printf("postfix decrement x : %d ", x); --y; printf("prefix decrement y : %d ", y); return 0; }
输出
运行此代码时,将产生以下输出 -
a: a b: M postfix increment a: b prefix increment b: N x: 5 y: 23 postfix decrement x: 4 prefix decrement y: 22
以上示例表明,前缀运算符和后缀运算符对操作数变量的值具有相同的效果。但是,当这些"++"或"--"运算符与其他运算符一起出现在表达式中时,它们的行为会有所不同。
示例 2
在以下代码中,"a"和"b"变量的初始值相同,但 printf() 函数 显示的值不同 -
#include <stdio.h> int main(){ int x = 5, y = 5; printf("x: %d y: %d ", x,y); printf("postfix increment x: %d ", x++); printf("prefix increment y: %d ", ++y); return 0; }
输出
运行代码并检查其输出 −
x: 5 y: 5 postfix increment x: 5 prefix increment y: 6
在第一种情况下,printf() 函数会打印"x"的值,然后将其值递增。在第二种情况下,先执行增量运算符,printf() 函数会使用递增后的值进行打印。
增量和减量运算符的优先级
C 语言中有许多运算符。当表达式中使用多个运算符时,它们将按照其优先级顺序执行。增量和减量运算符与其他运算符一起使用时,其行为会有所不同。
当表达式包含增量或减量运算符以及其他运算符时,将首先执行增量和减量运算。后缀递增和递减运算符的优先级高于前缀递增和递减运算符。
另请参阅: C 语言中的运算符优先级
示例 1
请看以下示例 -
#include <stdio.h> int main(){ int x = 5, z; printf("x: %d ", x); z = x++; printf("x: %d z: %d ", x, z); return 0; }
输出
运行代码并检查其输出 −
x: 5 x: 6 z: 5
由于"x++"将"x"的值递增为 6,因此您预期"z"也为 6。然而,结果显示"z"为 5。这是因为赋值运算符的优先级高于后缀递增运算符。因此,在递增"x"之前,先将"x"的现有值赋给"z"。
示例 2
查看下面的另一个示例 -
#include <stdio.h> int main(){ int x = 5, y = 5, z; printf("x: %d y: %d ", x,y); z = ++y; printf("y: %d z: %d ", y ,z); return 0; }
输出
运行此代码时,将产生以下输出 -
y: 5 y: 6 z: 6
结果可能令人困惑,因为"y"和"z"的值现在都是 6。这是因为前缀递增运算符的优先级高于赋值运算符。因此,"y"首先递增,然后将其新值赋给"z"。
运算符的结合性也起着重要作用。对于递增和递减运算符,结合性是从左到右的。因此,如果单个表达式中有多个递增或递减运算符,则最左边的运算符将首先执行,并向右移动。
示例 3
在此示例中,赋值表达式同时包含前缀和后缀运算符。
#include <stdio.h> int main(){ int x = 5, y = 5, z; z = x++ + ++y; printf("x: %d y: %d z: %d ", x,y,z); return 0; }
输出
运行代码并检查其输出 −
x: 6 y:6 z: 11
在本例中,首先要执行的运算是"y++"("y"变为 6)。然后,"+"运算符将"x"(5)和"y"相加,结果赋值给"z",赋值为 11,然后"x++"将"x"加 6。
在循环中使用增量运算符
在 C 语言中,for 循环最常用的语法如下:
for (init_val; final_val; increment) { statement(s); }
示例
循环体对变量的初始值和最终值之间的所有值执行,并在每轮循环后递增。
#include <stdio.h> int main(){ int x; for (x = 1; x <= 5; x++){ printf("x: %d ", x); } return 0; }
输出
运行此代码时,将产生以下输出 -
x: 1 x: 2 x: 3 x: 4 x: 5