3

以下のコードは、文字列内の連続する重複文字を 1 回だけ置換するために使用されます。

e.g. "AAAABBBB" -> "AB" 

for ループを終了して値を temp に出力すると、文字列の単語の最後の文字を取得することが期待されます。ただし、文字列の最初の文字を取得します (つまり、temp を初期化した値で)。

string processString(string word) {
  char temp = word[0];
  string result = "";
  int size = word.size();
  for(int i=0, temp=word[0]; i<size; i++) {
    if(word[i] == temp) {
      continue;
    } else {
      result += temp;
      temp = word[i];
    }
  }
  cout << "TEMP : " << temp << endl;
  return result + temp;
}

結果:

WORD: CJXEJACCAJEXJF
TEMP: C
Output of function: CJXEJACAJEXJC

しかし、for ループで再初期化を削除すると、上記のコードは完全に正常に動作します。

string processString(string word) {
  char temp = word[0];
  string result = "";
  int size = word.size();
  for(int i=0; i<size; i++) {
    if(word[i] == temp) {
      continue;
    } else {
      result += temp;
      temp = word[i];
    }
  }
  cout << "TEMP : " << temp << endl;
  return result + temp;
}

結果:

WORD: CJXEJACCAJEXJF
TEMP: F
Output of function: CJXEJACAJEXJF

なぜこれが起こっているのか手がかりはありますか?FOR ループで再初期化すると、なぜそれほど大きな違いが生じるのでしょうか?

4

4 に答える 4

2

他の答えはシャドウイングについて正しいですが、参考までに、関数は次のように簡単に書くことができます。

#include <string>
#include <iterator>
#include <algorithm>

std::string unique(std::string const &source)
{
    std::string result;

    std::unique_copy(src.begin(), src.end(),
                     std::back_inserter(result));
    return result;
}
于 2012-12-12T16:02:43.107 に答える
2

ループでは、for再初期化していませんtemp。outer をシャドウするという名前の新しいint変数を作成しています。temptemp

for(int i=0,temp=word[0];i<size;i++){
            ^^^^ brand new `temp'

一部のコンパイラは、これについて警告するように構成できます。

$ g++ -Wshadow test.cpp
test.cpp: In function 'std::string processString(std::string)':
test.cpp:10:15: warning: declaration of 'temp' shadows a previous local [-Wshadow]
test.cpp:7:8: warning: shadowed declaration is here [-Wshadow]
于 2012-12-12T15:47:51.493 に答える
1
for(int i=0,temp=word[0];i<size;i++)

これは、ステートメントでスコープが設定された2 つの変数 と を宣言しますi。これにより、ステートメントの外側で宣言されたものが隠されます。tempfortempfor

于 2012-12-12T15:47:43.647 に答える
1

という名前の新しい変数は、ループ内でtempとして宣言されます。intfor

for(int i=0,temp=word[0];i<size;i++){

外側のchar temp変数を非表示にします。つまり、char temp変数が 内で使用されることはありませんfor。ループの 2 番目のバージョンでは、初期化を省略して新しい変数をfor宣言していません。temp

于 2012-12-12T15:47:44.677 に答える