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

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

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

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

 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 += 1替换所有x++并期望相同的行为。 但是,您可以安全地将++x替换为(x += 1) ,因为它们是等效的。

a += 1相当于++a (C99§6.5.3.1/ 2)。 在像int b = a++;这样的行中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"]这样的事情因为这个) 。

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

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

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