在C语言中,数组的索引预增运算符不按预期工作。

27 浏览
0 Comments

在C语言中,数组的索引预增运算符不按预期工作。

我对C语言还不熟悉,所以写一些简单的代码来熟悉。我刚刚尝试在数组索引上使用前置递增操作符,但得到的结果与我预期的完全不同。

相关的代码如下:

#include

int main()

{

int array[5] = {1,2,3,4,5};

int i = 0;

printf("%d %d",array[i], array[++i]);

return 0;

}

这段代码应该显示array[0]和array[1]的元素,对吗?

但事实并非如此,输出结果是2 2。

我错过了什么吗?

0
0 Comments

问题的原因是在使用数组索引的前缀增量运算符时,没有按预期的方式工作。当使用array[i++]这样的表达式时,会导致未定义行为,因为无法确定array[i]使用的是旧值还是新值。解决方法是将i++移动到独立的语句中,或者改为使用后缀增量运算符i++

下面是一个示例代码,展示了前缀和后缀增量运算符的工作方式:

#include 
int main() {
    int array[5] = {1, 2, 3, 4, 5};
    int i = 1;
    array[i++] = 22;
    array[++i] = 44;
    for (i = 0; i < 5; i++) {
        printf("%d: %d\n", i, array[i]);
    }
    return 0;
}

需要注意的是,在使用增量运算符时,变量只能在同一个语句中使用一次。例如,i++ + i++i + i++f(a[i], a[i++])等表达式都是错误的,因为它们在同一个语句中既修改了i又使用了i,无法确定使用的是旧值还是新值。在C语言中,没有普遍的从左到右的规则来帮助解决这个问题。

总之,要正确使用数组的索引和增量运算符,需要注意避免未定义行为,并确保变量的使用和修改在不同的语句中进行。

0
0 Comments

这个问题的出现是因为在printf函数调用中,无法保证函数参数的求值顺序。也就是说,无法确定array[i]和array[++i]哪个先被求值。在你的情况下,array[++i]被先求值了,所以你最终打印了两次array[1]。

关于这个问题,你是完全正确的。更多细节请参考:Sequence PointsWhy are these constructs using pre and post-increment undefined behavior?

解决这个问题的方法是使用中间变量来保存i的值,以确保数组的索引在打印时不会改变。下面是一个修复这个问题的示例代码:

int i = 0;
int temp = i;
printf("array[%d]: %d\n", temp, array[temp++]);
printf("array[%d]: %d\n", i, array[i]);

这样,无论参数的求值顺序如何,都能正确打印出array[0]和array[1]的值。

0