对于指针,++与+ = 1相同吗?

时间:2011-12-07 19:10:28

标签: c pointers post-increment

我想重构我的一些旧的C代码,我很好奇我是否可以用ptr++替换所有ptr += 1,其中ptr是一些指针,而不改变任何行为。以下是K& R Section 5.3的一个例子:

/* strlen: return length of string s*/
int strlen(char *s)
{
    int n;
    for (n = 0; *s != '\0'; s++)
        n++;
    return n;
}

当我用s++替换s += 1时,我会得到相同的结果,但我想知道所有类型是否都是这种情况。我还对int s进行了测试:

int size = 10;
int *int_array = (int*)calloc(size, sizeof(int));
for (int i = 0; i < size; i++)
    int_array[i] = i;

for (int i = 0; i < size; i++) {
    printf("*int_array = %d\n", i, *int_array);
    int_array++;
}

如果我将行int_array++;替换为int_array += 1;,我会得到相同的结果。

在考虑了这个之后,我意识到如果在表达式中使用该值可能会出现问题。是否更安全我只是将增量移动到另一条线上:

int a = 5;
int b = a++;

会变成:

int a = 5;
int b = a;
a += 1;

结论

我认为可能是一个问题,增加不同类型的指针,不是问题。请参阅@ bdonlan的回复原因。

这并不意味着您可以用x++替换所有x += 1并期望相同的行为。但是,您可以安全地将++x替换为(x += 1),因为它们是等效的。

3 个答案:

答案 0 :(得分:12)

a += 1相当于++a(C99§6.5.3.1/ 2)。在像int b = a++;这样的行中,这意味着 等同于a++; a++会返回a值,而a += 1会返回新值。

请注意,如果您不使用a++的结果(即,您的语句只包含a++;),那么它们实际上是相同的。

另外,请注意_all指针算法以指向类型的大小(§6.5.6/ 8)的增量完成。这意味着:

ptr = ptr + x;

相当于:

ptr = (ptr_type *)( (char *)ptr + x * sizeof(*ptr) );

无论您使用++++=还是[]p[x]完全等同于*(p + x),都是一样的;你甚至可以做4["Hello"]这样的事情。)

答案 1 :(得分:1)

++--是根据内置类型的算术定义的。除了postfix返回旧值之外,行为将是相同的。

答案 2 :(得分:1)

这是一个很好的问题。答案是肯定的,您可以这样做 - 无论您如何操作,增加指针都会向指针添加sizeof(the type that the pointer points to)。正如其他答案所表明的那样,你需要注意,当增量发生时你不依赖,即a ++和++ a有不同的效果,但最终会得到相同的值。

问题是:为什么您想要将所有代码从a++更改为a+=1?任何C程序员都应该容易理解使用带有指针的后增量运算符,因此很难理解为什么要进行这种更改。