【问题标题】:for loop's init-statement with two types of variablefor 循环的初始化语句有两种类型的变量
【发布时间】:2011-11-12 06:37:24
【问题描述】:

我想在 for 的 init 语句中声明两种类型的变量。像下面的代码。我知道“for (string word, int numb, ; cin>>word>>numb; )” 不起作用。只是想让你知道我想要做什么。我的目标是声明两种具有相同生命周期的变量并将它们放在一起。其他编码方式也很有帮助。提前致谢。

#include <iostream>
#include <vector>
#include <string>
#include <utility>
using namespace std;
int main ()
{
    cout<<"enter a word and a number"<<endl;
    for (string word, int numb, ; cin>>word>>numb; )
    {
        //do some work      
    }
return 0;
}

好的,我认为这是我能得到的最接近的人建议。

#include <iostream>
#include <vector>
#include <string>
#include <utility>
using namespace std;
int main ()
{
    vector<pair<string,int> > pvec;
    cout<<"enter a word and a number"<<endl;
    {
        int numb=0; 
        for (string word; cin>>word>>numb; )
            pvec.push_back(make_pair(word,numb));
    }
    cout<<pvec[3].second<<endl;
return 0;
} 

【问题讨论】:

  • 什么不起作用?是编译失败吗?是否正在编译但给出不正确的结果?
  • for (string word, int numb, ; cin>>word>>numb; ) 这个语句。因为“字符串”也想将 int 声明为变量。
  • 在以后的帖子中,请发布完整,最小的示例程序。虽然您的程序很小,但它并不完整。为什么让我们所有人重新输入三个缺失的标题行,而不是自己发布?有关完整的最小示例程序的更多信息,请参阅sscce.org
  • @Rob:总的来说,我同意。在这种情况下,很明显(至少对我来说)上面的代码在语法上是无效的,并且 OP 想知道这样的事情是否可能。
  • 谢谢,@OliCharlesworth。即使在这种情况下,我也很想看到确切的错误消息——这需要的不仅仅是我的简单复制、粘贴和编译。

标签: c++


【解决方案1】:

关于你能得到的最近的是:

int main ()
{
    cout<<"enter a word and a number"<<endl;
    {
        string word;
        for (int numb; cin>>word>>numb; )
        {
            //do some work      
        }
    }
    return 0;
}

这组额外的大括号限制了word 的范围,类似于循环限制numb 的范围。显然,您可以撤销声明;使用起来可能更好(更对称):

int main ()
{
    cout<<"enter a word and a number"<<endl;
    {
        string word;
        int numb;
        while (cin>>word>>numb)
        {
            //do some work      
        }
    }
    return 0;
}

由于没有增量或初始化操作,代码实际上是一个带有几个声明变量的while循环;这达到了相同的结果并且有效。

【讨论】:

  • 太棒了。我认为这是最接近的。它看起来不干净,虽然有点笨重。 (不是想成为@ss)。只是说
【解决方案2】:

这是不可能的。在for循环的初始化语句中可以声明两个基本类型相同的变量,但不能声明两个基本类型不同的变量。您必须在 for 循环之外声明一个。

【讨论】:

  • 其实他可以声明一个包含这两个变量的结构体
  • 他可以,但真的有理由为两个彼此无关的项目创建一个结构吗?这里的正确答案是不要使用 for 循环,而不是鼓励有问题的编程实践作为语法的变通方法。
  • 那是声明一种类型的一个变量。此外,我发现这种想法令人反感。如果我在代码审查中看到一个在 for 循环初始化块中定义的结构,我会读到做这件事的人是暴动。
  • 这是不正确的。 for (int a, *b, &amp;c;... 有 3 种不同的类型。
  • struct 的一个相当经典的用法(即将多个变量组合在一起)如果有的话。就我个人而言,我可能不会这样做,但我也不会抱怨。
【解决方案3】:

我相当肯定不可能在 for 语句中声明 2 种不同类型的 2 个变量,但我也看不到这样做比这样的好处:

int main ()
{
    cout<<"enter a word and a number"<<endl;
    while( cin.good() )
    {
        string word;
        int num;

        cin >> word >> num;
        //do some work      
    }
    return 0;
}

一般来说,我更喜欢在需要计算或至少迭代的地方使用 for 循环。其他情况应该使用while或者do循环。

【讨论】:

  • 您的支票放错地方了——或者您必须有另一张。您当前的代码不会检查读取操作是否成功(使用流操作作为条件是一个习语)。
  • 我会说,它让这个想法得以传达。特别是当 OP 询问声明语法而不是流使用时。
  • 是的,这个有效。但它看起来不像 for 循环那么干净。这需要很多空间。
  • “占用空间”是衡量代码可读性的一个非常糟糕的衡量标准,与效率有关。
【解决方案4】:

您尝试这样做的方式不是最干净的方式。我会这样做:

string word;
int num;
while(true)
{
    cin >> word >> num;
    if (!cin.good()) break;
    // do some work
}

wordnum 在同一范围内(相同的“生命周期”)

请注意,您需要将while(true) 替换为一些合适的条件。


如果您希望 word 和 num 在循环范围内,请执行以下操作:

while(true)
{
    string word;
    int num;
    cin >> word >> num;
    if (!cin.good()) break;
    // do some work
}

{
    string word;
    int num;
    while(true)
    {
        cin >> word >> num;
        if (!cin.good()) break;
        // do some work
    }
}

但我不知道为什么需要这样做。

【讨论】:

  • 是的,这行得通,但是while循环结束后word和num仍然存在
  • 如果 OP 的语法是有效的,它可能会更干净;它会将变量的范围限制在循环中。
  • 然后把它们放到循环的范围内。请参阅我的编辑。无论如何它的堆栈分配。
  • 现在这很愚蠢,在循环条件之外重构一个好的测试(即流操作的成功),而根本测试流的状态。
  • @OliCharlesworth 是的,我想让它更干净,更容易移动。
【解决方案5】:

以下内容未经测试,但应该可以:

int main()
{
  std::cout << "enter a word and a number" << endl;
  for (struct { std::string word, int number } vars;
       std::cin >> vars.word >> vars.number;
      )
  {
    //do some work      
  }
  return 0;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多