C 语言中的 i++ 与++i

Jinku Hu 2023年1月30日 2021年1月22日
  1. C 语言中++ii++ 记号的主要区别
  2. 在 C 语言中循环语句使用 ++i 符号作为普遍接受的风格
C 语言中的 i++ 与++i

本文将讲解 C 语言中前缀增量与后缀增量运算符,也就是 i++++i 的几种使用方法。

C 语言中++ii++ 记号的主要区别

这两个符号的基本部分是增量一元运算符++,它将操作数(例如 i)增加 1。增量运算符可以作为前缀++i 出现在操作数之前,也可以作为后缀运算符-i++ 出现在操作数之后。

当在一个表达式中使用++ 运算符递增的变量值时,会出现稍微不寻常的行为。在这种情况下,前缀和后缀递增的行为是不同的。也就是说,前缀操作符在其值被使用之前递增操作数,而后缀操作符在值被使用之后递增操作数。

因此,使用 i++ 表达式作为参数的 printf 函数将在 i 的值被递增 1 之前打印出来。另一方面,使用前缀递增操作符 ++iprintf 函数将打印递增的值,在第一次迭代时为 1,如下例代码所示。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i = 0, j = 0;

    while( (i < 5) && (j < 5) ) {
        /*
        postfix increment, i++
        the value of i is read and then incremented
        */
        printf("i: %d\t", i++);
        /*
        prefix increment, ++j
        the value of j is incremented and then read
        */
        printf("j: %d\n", ++j);
    }

    printf("At the end they have both equal values:\ni: %d\tj: %d\n\n", i, j);

    exit(EXIT_SUCCESS);
}

输出:

i: 0	j: 1
i: 1	j: 2
i: 2	j: 3
i: 3	j: 4
i: 4	j: 5
At the end they have both equal values:
i: 5	j: 5

在 C 语言中循环语句使用 ++i 符号作为普遍接受的风格

后缀和前缀运算符在 for 循环语句中使用时具有相同的功能行为。在下面的示例代码中执行两个 for 迭代时,它们打印 k 的值是相同的。

请注意,有几种说法认为在 for 循环中使用前缀增量比后缀有更好的性能效率,但在大多数应用中,有效的时间差异将可以忽略不计。我们可以养成使用前缀操作符作为首选方法的习惯,作为一种普遍接受的风格。

但如果你已经在使用后缀表示法,那么考虑到使用现代编译器的相应优化标志会自动消除低效的循环迭代。

#include <stdio.h>
#include <stdlib.h>

int main() {

    for (int k = 0; k < 5; ++k) {
        printf("%d ", k);
    }
    printf("\n");
    for (int k = 0; k < 5; k++) {
        printf("%d ", k);
    }
    printf("\n\n");

    exit(EXIT_SUCCESS);
}

输出:

0 1 2 3 4
0 1 2 3 4
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C Operator