【问题标题】:Some way to declare variable inside while condition?在while条件中声明变量的某种方式?
【发布时间】:2014-07-12 16:45:08
【问题描述】:

在 C++ 中,您可以这样做:

for (int i = 0 ; i < 10 ; i++) {
    /* ... */
}

然后变量i 只存在于for 语句的主体内。 是否存在使用 while 语句执行此操作的方法? 例如,做这样的事情会很好:

while ( (int c = fgetc(file)) != EOF ) {
   /* ... */
}

显然这不起作用。但是存在一些语法技巧来有效地做到这一点(变量在while条件中使用并且仅在while语句的主体内可见)?

【问题讨论】:

  • 用大括号括起来。
  • 听起来你想要一个匿名块:stackoverflow.com/questions/581097/…
  • @shuttle87,这只是一个块。你不能有一个命名块,所以称它为匿名块是没有意义的。
  • 为什么while (int c = fgetc(handle) != EOF) 不起作用?
  • @BenjaminTrent,运算符优先级。

标签: c++


【解决方案1】:

你可以使用:

{
    int c = fgetc(file); /* c should only be in scope for a limited time */
    while (c != EOF) {
        /* Do your stuff */
        c = fgetc(file);
    }
} /* c goes out of scope */

但是它很混乱,而且作为一个嵌入式 C 程序员,我个人更喜欢在类或函数的开头声明变量。

真正的答案是,如果您担心将变量的范围限制为给定的代码块,那么说明该代码块应该是一个单独的函数/类成员是一个很好的指标,那么您就没有担心局部变量的范围。

【讨论】:

  • 我不同意,尽可能晚地声明一个变量(在最内部的范围内)比旧的 C 习惯要好得多。
  • 我遇到的唯一真正问题是 a) 出现过多同名声明 b) 变量仅在 some 可能导致不可预知的崩溃的代码路径。
  • @SteveBarnes,我很好奇当变量只能在这些路径中使用时,您会想到什么样的崩溃,但是隐藏另一个具有相同名称的变量通常是不好的。在使用唯一名称之前声明权利通常是理想的(imo)。
  • @SteveBarnes,这不是假设b 已经在if 之外声明(我希望不是)?或者这就是编译器错误的意思?我可以看到它对于数百行长的函数非常烦人,尽管该函数无论如何都可以使用重构:)
  • 看起来更干净:{int c; while( (c=fgetc()...
【解决方案2】:
for(int c; (c = fgetc(file)) != EOF;) {
    // do something
}

【讨论】:

  • 不过,他询问了一个 while 循环。
  • @RickyMutschlechner C++ 中的whilefor 之间确实没有太大区别。
  • 这是一个很好的答案,但我相信你的语法不正确。在 fgetc 的结束括号之后你有一个额外的括号也许你的意思是for(int c;(c = fgetc(file)) != EOF;)
【解决方案3】:

您可以使用任何可转换为bool 的类型

while (int* p = get_ptr()) { /* some code */}
// same with if
if (int* p = get_ptr()) { /* some code */}

但您不能使用自定义条件(作为与EOF 的比较)。

【讨论】:

    【解决方案4】:

    这应该有效;看这个例子from a previous question of mine:

    while ((c = getopt(argc, argv, "i:o:")) != -1) { 
     // do stuff 
    }
    

    这会编译并运行(前提是 c 是事先声明的)

    【讨论】:

    • 我喜欢你在第一句话和最后一句话之间增加的信心。
    • @OllieFord 哈哈,我对答案进行了编辑,但忘了更改措辞。我肯定笑着回来阅读它。
    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多