c - 为什么交换变量名会改变 C 程序的输出?

标签 c arrays post-increment pre-increment

我尝试了这个数组示例并对其元素进行了增量/预增量

#include<stdio.h>

int main()
{
    int j[5] = {5, 1, 15, 20, 25};
    int k , l, m, n;

    n = ++j[1];
    k = ++j[1];
    l = j[1]++;
    m = j[k++];

    printf("\n%d, %d, %d, %d", n, k, l, m );

    return 0;
}

这里的输出是:

2, 4, 3, 20

如果我改变 n 和 k 的顺序 即代替

n = ++j[1];
k = ++j[1];

我写

k = ++j[1];
n = ++j[1];

输出变成:

3, 3, 3, 15

我在 windows10 的 mingw 编译器和 Kali Linux 的 GCC 上试过这个... 同样的问题。

这就像取不同的变量名会改变程序的输出。 可能是什么原因?

感谢大家帮我解决这个问题。

我没有考虑 k 的最后一个帖子增量。

结果会和我改变的一样

m=j[k++]

m = j[n++]

最佳答案

他们为什么不呢? knm 的值取决于它们在代码中的位置。

例如,

 m = j[k++];

这将受到 k当前值的影响。

要添加一些关于前置和后置增量运算符,引用 C11

  • 章节 §6.5.3.1,预增量

    The value of the operand of the prefix ++ operator is incremented. The result is the new value of the operand after incrementation. [...]

  • §6.5.2.4 章,后增量

    The result of the postfix ++ operator is the value of the operand. As a side effect, the value of the operand object is incremented (that is, the value 1 of the appropriate type is added to it). [....]

我添加了一些打印语句,以检查每个语句后值如何受到影响。您还可以打印整个数组以更直观地看到变化。

int j[5] = {5, 1, 15, 20, 25};
int k , l, m, n;

printf("j[1] = %d\n", j[1]);

k = ++j[1];
printf("j[1] = %d, k = %d\n", j[1], k);
n = ++j[1];
printf("j[1] = %d, n = %d\n", j[1], n);
l = j[1]++;
printf("j[1] = %d, l = %d\n", j[1], l);
m = j[k++];
printf("m= %d, k = %d\n", m, k);

printf("\n%d, %d, %d, %d", n, k, l, m );

输出是:

j[1] = 1
j[1] = 2, k = 2
j[1] = 3, n = 3
j[1] = 4, l = 3
m= 15, k = 3

3, 3, 3, 15

关于c - 为什么交换变量名会改变 C 程序的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55176674/

相关文章:

python - 将数组数组转换为单个数组

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

c - 为什么后增量运算符不起作用,尽管预增量在此代码中有效?

c - 头文件 (.h) 包含 gcc 的问题

php - 在php中的数组中保留从表单发送的多个值

ios - 如何声明枚举从一个对象传递到另一个对象

java - Java 后递增器的行为

c++ - 递归函数参数中前后递减的区别

无法安装 gedit 插件

c - 六边形的表面积