为什么 i + + ; i —— ; 紧随其后?

我查看了1997年发布的 Nmap的源代码,注意到这段代码对我来说有点奇怪:

int i=0, j=0,start,end;
char *expr = strdup(origexpr);
ports = safe_malloc(65536 * sizeof(short));
i++;                                         /* <<<<<< */
i--;                                         /* <<<<<< */
for(;j < exlen; j++)
if (expr[j] != ' ') expr[i++] = expr[j];
expr[i] = '\0';

为什么 i++;i--;紧随其后?i0,然后 i++i变成 1。然后,i--i变成 0

链接到原始源代码。 搜索:

i++;
i--;

有人能解释一下这是干什么用的吗?

11351 次浏览

这是一个错误。这些行一起导致 i没有改变,所以它们不应该在那里。

引入 nmap 的链接文章发表于1997年9月1日。如果您在 https://svn.nmap.org/nmap查看 SVN 存储库中的 nmap,那么在1998年2月10日签入的最初版本没有这些代码行:

int i=0, j=0,start,end;
char *expr = strdup(origexpr);
char *mem = expr;


ports = safe_malloc(65536 * sizeof(short));
for(;j < exlen; j++)
if (expr[j] != ' ') expr[i++] = expr[j];
expr[i] = '\0';

因此,这是作者在发布初始 nmap 源代码和初始签入 SVN 之间发现并修复的问题。

没用的,完全没用。

如果我要推测的话,它可能是在开发过程中使用的一些调试代码的遗留部分。

我猜测,i++i--之一是在一个变更中引入的,而另一个是在另一个变更中引入的。

但是,我没有办法找到介绍的要点,因为在最初的源代码发行版和第一个 SVN 修订版之间没有修订历史。

对于非优化编译器,或者识别硬件副作用的编译器,i + + ; i ——序列将导致 i 从内存中读取,然后重写,而不管通过 For 循环和嵌套 if 的路径如何。

在并行处理中,有时会采用编译器技巧来确保代码序列使用自己的变量本地副本而不是全局副本。

由于该示例是一个代码片段,因此无法确定所使用的编译器、预期的操作系统/硬件,也无法确定这是否在一个可以作为独立线程执行的代码序列/函数中。

在较简单的系统中,我已经临时强制对变量进行更改,以便在调试环境中执行陷阱特性。如果是这种情况,作者可能在开发完成时忘记删除代码。

我建议您只检查更新后的代码。如果紧接着使用(i = 2 + 1)(i-1) ,那就没有意义了。I 的值保持不变。您可以使用任何 c 或 c + + 编译器尝试使用它。甚至在任何其他语言中都是一样的。在编译器中运行代码。