1. ホーム
  2. c

[解決済み] なぜ、i++; i--;が隣り合っているのですか?

2022-04-24 07:02:45

質問

のソースコードを見ていたら nmap 1997年にリリースされたこのコードには、少し奇妙な部分があることに気づきました。

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--;

これは何のためにあるのか、どなたか説明してください。

解決方法は?

これはバグでした。 これらの行を合わせると i は変更されないので、本来は存在しないはずです。

nmapを紹介したリンク先の記事は、1997年9月1日に公開されたものです。 にあるnmapのSVNレポジトリを見れば、その内容がわかる。 https://svn.nmap.org/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にチェックインするまでの間に作者が発見し、修正したものなのです。