【发布时间】:2011-12-07 19:10:27
【问题描述】:
我想重构我的一些旧 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;
}
当我用s += 1 替换s++ 时,我得到了相同的结果,但我想知道这是否适用于所有类型。我还对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++;
}
如果我将行 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),因为它们是等效的。
【问题讨论】:
-
为什么?
a += 1不是对a++的改进。这是如何重构的? -
@CanSpice 因为在很多情况下,将
x添加到指针实际上会添加x*sizeof(*ptr)。 -
@Toomai,实际上在所有情况下。
-
@meagar 我在广义上使用术语重构,它还包括代码格式清理、变量名澄清和更改目录结构等。我相信
a += 1是对a++的改进,因为它有一种棘手的味道。我认为它只是跨越了简洁和简洁之间的界限。
标签: c pointers post-increment