C语言中的自增和自减运算符



C语言 - 自增和自减运算符

自增运算符 (++) 将变量的值增加 1,而自减运算符 (--) 将变量的值减少 1。

自增和自减运算符经常用于构建 C 语言中的计数循环(使用for循环)。它们也应用于数组遍历和指针运算

++ 和 -- 运算符是一元运算符,可以用作变量的前缀或后缀。

自增和自减运算符示例

下面的示例包含多个语句,演示了自增和自减运算符的不同用法:

#include <stdio.h>

int main() {
  int a = 5, b = 5, c = 5, d = 5;
  
  a++; // postfix increment
  ++b; // prefix increment
  c--; // postfix decrement
  --d; // prefix decrement

  printf("a = %d\n", a);
  printf("b = %d\n", b);
  printf("c = %d\n", c);
  printf("d = %d\n", d);

  return 0;
}

输出

运行此代码时,将产生以下输出:

a = 6
b = 6
c = 4
d = 4

示例说明

换句话说,“a++”与“++a”的效果相同,这两个表达式都会将变量“a”的值增加 1。类似地,“a--”与“--a”的效果相同。

表达式“a++;”可以视为语句“a = a + 1;”的等效形式。这里,右侧的表达式将 1 加到“a”,并将结果赋值回 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\n", 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\n", 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\n", 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\n", 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\n", a, b);
   
   a++;
   printf("postfix increment a: %c\n", a);
   
   ++b;
   printf("prefix increment b: %c\n", b);

   printf("x: %d y: %d\n", x, y);
   
   x--;
   printf("postfix decrement x : %d\n", x);
   
   --y;
   printf("prefix decrement y : %d\n", 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\n", x,y);
   printf("postfix increment x: %d\n", x++);
   printf("prefix increment y: %d\n", ++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 \n", x);

   z = x++;
   printf("x: %d z: %d\n", 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\n", x,y);

   z = ++y;
   printf("y: %d z: %d\n", 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\n", x,y,z);

   return 0;
}

输出

运行代码并检查其输出:

x: 6 y:6 z: 11

在这个例子中,第一个要执行的操作是“y++”(“y”变为 6)。其次,“+”运算符将“x”(值为 5)和“y”相加,结果 11 赋值给“z”,然后“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\n", x);
   }
   
   return 0;
}

输出

运行此代码时,将产生以下输出:

x: 1
x: 2
x: 3
x: 4
x: 5
广告