我想重构我的一些旧的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)
,因为它们是等效的。
答案 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程序员都应该容易理解使用带有指针的后增量运算符,因此很难理解为什么要进行这种更改。