为什么有 i++;一世 - ; 紧随其后?

DDi*_*ond 166 c nmap

我正在查看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';
Run Code Online (Sandbox Code Playgroud)

为什么你们会i++;然后i--;紧跟其后?i0,则i++轮流i1。在那之后,i--变成i0

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

i++;
i--;
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这是干什么用的?

dbu*_*ush 155

这是一个错误。这些行一起导致i未更改,因此它们不应该存在。

介绍 nmap 的链接文章发表于 1997 年 9 月 1 日。如果您在https://svn.nmap.org/nmap 上查看 nmap 的 SVN 存储库,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';
Run Code Online (Sandbox Code Playgroud)

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

  • 也许值得注意的是,在某些情况下(内存映射 IO),更改变量可能会产生外部影响。 (5认同)
  • 它让读者感到困惑,这完全是无意的。我想说这显然是一个错误。;-) (4认同)
  • 现在,如果“i”不是 int,而是一些具有运算符重载的奇特类,则可能会产生一些副作用(尽管不太可能,而且通常是不良编码实践的标志)。(当然,仅适用于 C++。) (4认同)
  • @sergut 维基百科不同意你的观点,但[这篇博文](https://www.yegor256.com/2015/06/11/wikipedia-bug-definition.html)同意你的观点,而且我也倾向于这样做:-) (2认同)

JL2*_*210 42

这毫无用处。它绝对没有任何作用。

如果我推测它可能是开发过程中使用的一些调试代码的残余。

我猜想其中一个i++i--是在一个更改中引入的,而另一个是在另一个更改中引入的。

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

  • 我认为关于调试代码的猜测是准确的。我见过很多不同类型的调试代码,只是为了在您期望的位置设置断点。 (14认同)

小智 9

对于非优化编译器,或识别硬件副作用的编译器,i++;i-- 序列会导致 i 从内存中读取,然后重新写入,无论通过 for 循环和嵌套 if 的路径如何。

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

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

在更简单的系统中,我临时强制更改变量以在调试环境中使用陷阱功能。如果是这样,作者可能在开发完成时忘记删除代码。

  • 上面的代码显示了“i”声明为局部变量,并且其他线程无法在“i++;”所在的位置访问它。i--` 行是。 (6认同)