为什么有 i++;一世 - ;就在彼此之后?
Why have i++; i--; right after each other?
我正在查看 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] = '[=10=]';
为什么 i++;
和 i--;
紧接着? i
为0
,则i++
将i
变为1
。之后,i--
将i
变为0
。
Link to original source code. 搜索:
i++;
i--;
谁能解释一下这是干什么用的?
这是一个错误。这些行一起导致 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] = '[=10=]';
所以这是作者在发布初始 nmap 源代码和初始签入 SVN 之间发现并修复的问题。
没用。它什么都不做。
如果我推测它可能是开发过程中使用的一些调试代码的残余。
我猜 i++
或 i--
中的一个是在一个更改中引入的,另一个是在另一个更改中引入的。
不过,我无法找到介绍点,因为在初始源代码发布和第一次 SVN 修订之间没有修订历史。
对于非优化编译器,或者识别硬件副作用的编译器,i++; i-- 序列会导致 i 从内存中读取,然后重写,而不管通过 for 循环和嵌套 if.
的路径如何
在并行处理中,有时会采用编译器 hack 来确保代码序列使用其自己的变量本地副本而不是全局副本。
由于该示例是一个代码片段,因此无法确定所使用的编译器、预期的操作 system/hardware,也无法确定这是否在可以作为独立程序执行的代码 sequence/function 中线程。
在更简单的系统中,我临时强制更改变量以在调试环境中使用陷阱功能。如果是这样,作者可能在开发完成时忘记删除代码了。
我建议您只检查更新后的代码。如果您在 (i-1) 之后立即使用 (i = 2+1),那将毫无意义。 i 的值保持不变。您可以使用任何 c 或 c++ 编译器进行尝试。甚至在任何其他语言中都是一样的。 运行 编译器中的代码。
我正在查看 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] = '[=10=]';
为什么 i++;
和 i--;
紧接着? i
为0
,则i++
将i
变为1
。之后,i--
将i
变为0
。
Link to original source code. 搜索:
i++;
i--;
谁能解释一下这是干什么用的?
这是一个错误。这些行一起导致 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] = '[=10=]';
所以这是作者在发布初始 nmap 源代码和初始签入 SVN 之间发现并修复的问题。
没用。它什么都不做。
如果我推测它可能是开发过程中使用的一些调试代码的残余。
我猜 i++
或 i--
中的一个是在一个更改中引入的,另一个是在另一个更改中引入的。
不过,我无法找到介绍点,因为在初始源代码发布和第一次 SVN 修订之间没有修订历史。
对于非优化编译器,或者识别硬件副作用的编译器,i++; i-- 序列会导致 i 从内存中读取,然后重写,而不管通过 for 循环和嵌套 if.
的路径如何在并行处理中,有时会采用编译器 hack 来确保代码序列使用其自己的变量本地副本而不是全局副本。
由于该示例是一个代码片段,因此无法确定所使用的编译器、预期的操作 system/hardware,也无法确定这是否在可以作为独立程序执行的代码 sequence/function 中线程。
在更简单的系统中,我临时强制更改变量以在调试环境中使用陷阱功能。如果是这样,作者可能在开发完成时忘记删除代码了。
我建议您只检查更新后的代码。如果您在 (i-1) 之后立即使用 (i = 2+1),那将毫无意义。 i 的值保持不变。您可以使用任何 c 或 c++ 编译器进行尝试。甚至在任何其他语言中都是一样的。 运行 编译器中的代码。