我想重构我的一些旧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 != ' '; 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 = %dn", 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程序员都应该很容易理解的,因此很难理解为什么要进行这种更改。
以上就是c/c++开发分享对于指针,++与+ = 1相同吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545669.html