Mik*_*ols 6 c pointers post-increment
我想重构我的一些旧的C代码,我很好奇,如果我可以取代所有ptr++与ptr += 1其中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;
}
Run Code Online (Sandbox Code Playgroud)
当我替换s++使用时s += 1,我得到相同的结果,但我想知道是否所有类型的情况.我也做了ints 测试:
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++;
}
Run Code Online (Sandbox Code Playgroud)
如果我更换线int_array++;用int_array += 1;,我得到了相同的结果.
在考虑了这个之后,我意识到如果在表达式中使用该值可能会出现问题.是否更安全我只是将增量移动到另一条线上,如下所示:
int a = 5;
int b = a++;
Run Code Online (Sandbox Code Playgroud)
会成为:
int a = 5;
int b = a;
a += 1;
Run Code Online (Sandbox Code Playgroud)
结论
我认为可能是一个问题,增加不同类型的指针,不是问题.请参阅@ bdonlan的回复原因.
这并不意味着你可以取代所有x++与x += 1和预期相同的行为.你可以,但是,替代++x与(x += 1)安全,因为它们是等价的.
bdo*_*lan 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;
Run Code Online (Sandbox Code Playgroud)
相当于:
ptr = (ptr_type *)( (char *)ptr + x * sizeof(*ptr) );
Run Code Online (Sandbox Code Playgroud)
这是相同的,你是否使用+,++,+=,或[](p[x]完全等同于*(p + x),你甚至可以做这样的事情4["Hello"],因为这一点).