【问题标题】:Can I declare variables of different types in the initialization of a for loop? [duplicate]我可以在 for 循环的初始化中声明不同类型的变量吗? [复制]
【发布时间】:2012-01-28 12:06:54
【问题描述】:

为什么这段C++代码在VS2010下编译不出来:

for ( int a = 0, short b = 0; a < 10; ++a, ++b ) {}

虽然这个是:

short b = 0;
for ( int a = 0; a < 10; ++a, ++b ) {}

是否禁止在 for 循环初始化器中声明两个不同类型的变量?如果是这样,您如何解决它?

【问题讨论】:

  • 看起来像你说的。使用相同类型的作品:for ( int a = 0, b = 0; a &lt; 10; ++a, ++b ) {} 嗯。以前从未注意到这一点。
  • 是的,这是来自 C 语言的“双循环”机制。不过,相当罕见。不太可读。

标签: c++ for-loop scope initializer variable-declaration


【解决方案1】:

是的,这是禁止的。就像您不能在一个声明语句中声明不同类型的变量一样(edit:以@MrLister 提到的声明符修饰符为模)。你可以声明结构

for (struct { int a = 0; short b = 0; } d; d.a < 10; ++d.a, ++d.b ) {}

C++03 代码:

for (struct { int a; short b; } d = { 0, 0 }; d.a < 10; ++d.a, ++d.b ) {}

当然当都是0时,你可以完全省略初始化器,写成= { }

【讨论】:

  • 我讨厌你分享了这个事实。我敢打赌,我们将在明年回答有关此用法的愚蠢变化。在现实中,我们再也不想看到它了。
  • @Loki:这并不是for struct hack 第一次出现在 SO 上。
  • 不适用于 MSVC12。 2 个变量声明的解决方法:for (auto i = std::make_pair(myVec1Iter.begin(), myVec2Iter.begin()); ... ; ...) {...}
【解决方案2】:

for 循环无关。如果您在任何循环之外编写int a = 0, short b = 0;,这也不会编译。
所以答案是:总是禁止在一条语句中声明两个不同类型的变量。

编辑:哦,对于迂腐的人,我确实意识到您可以在同一语句中声明基类型和指针类型,例如 int 和 int 指针,所以它们将是不同的类型,是的。
嗯,这让我想。在 32 位环境中,指针将是 4 个字节,就像 int 一样,因此您可以使用 short a = 0, *b = 0;然后将 b 转换为 int。嗯……

【讨论】:

    【解决方案3】:

    禁止语句以逗号结尾,就像您在int a = 0, short ... 中所做的那样

    如果你想使用这种表示法,那么两个变量 muss 的类型都相同 int i = 0, s = 0;

    【讨论】:

      【解决方案4】:

      你只能在 for 语句中声明一种类型。所以第二个代码是可用的。

      【讨论】:

        【解决方案5】:

        您不能将变量声明到forwhile 条件中(补偿步骤)。

        for ( a = 0, short b = 0; a < 10; ++a, ++b ) {}
        

        这都不行。

        【讨论】:

          猜你喜欢
          • 2019-05-02
          • 1970-01-01
          • 2012-12-10
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-02
          相关资源
          最近更新 更多