了解 C++ 程序 [ Bjarne Stroustrup 的书 ]

Understanding a C++ program [ Bjarne Stroustrup's book ]

一个小问题需要您宝贵的帮助! 我正在阅读 Bjarne Stroustrup 的书,我发现了这个例子:

int main()
{
   string previous = " ";
   string current;

   while (cin >> current) {                                    
      if(previous == current)
        cout << "repeated word: " << current << '\n';
      previous = current;
   }                                                            
   return 0;
}

我的问题是:string previous = " "; 是做什么的?

它将 previous 初始化为字符 space (就像你按下 space) 一样。但我认为在 C++ 中它不会读取它,关于编译器跳过 whitespace。为什么要初始化它呢?

我试过这样写:string previous; 程序仍然可以正常工作...所以?有什么区别?请赐教 x)

string previous = " ";

将 space 分配给字符串变量 'previous'。

它可能仍然 'work',但如果您在第一次尝试时直接按回车键,应该会出现 'repeated word' 消息。

您可能对 C++ 中忽略白色的含义感到困惑space。在 C++ 中

std::string the_string = something;

的待遇相同
std::string      the_string=something          ;

No 当你有一个 string literal 时,文字中的白色 space 不会被忽略,因为它是字符串字符的一部分。所以

std::string foo = " ";

创建一个包含 space 的字符串,其中

std::string foo = "    ";

创建一个包含 4 space 的字符串。

你说得对,使用 std::cin 读取输入时永远不会出现空格。因此,previous 字符串被初始化为一个值,该值永远(即在读取第一个单词时)可能与读入 current 字符串的单词匹配。

在这种情况下,previous 也可以初始化为一个空字符串,因为 istream::operator>> 会跳过所有空格,并且您永远不会像从 std::cin 那样读取一个空字符串。但是,还有其他使用 std::cin 的方法(例如与 getline() 一起使用),这可能会导致读取空字符串。

The book explains this example in every detail

他可以写:)

string previous;

这个想法是,如果默认设置为跳过空格,operator >> 不能输入空字符串。

因此,任何与空字符串或包含空格的字符串的比较 current 都会产生 false