在while条件中声明变量的某种方法? 在C++中你可以这样做: for (int i = 0 ; i < 10 ; i++) { /* ... */ }

在while条件中声明变量的某种方法? 在C++中你可以这样做: for (int i = 0 ; i < 10 ; i++) { /* ... */ },c++,C++,显然,这是行不通的。但是存在一些语法技巧来有效地做到这一点(在while条件中使用的变量,并且仅在while语句体中可见)?这应该有效;请参见此示例: 这将编译并运行(前提是事先声明了c)您可以使用: { int c = fgetc(file); /* c should only be in scope for a limited time */ while (c != EOF) { /* Do your stuff */ c = fgetc(fi

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

这应该有效;请参见此示例:

这将编译并运行(前提是事先声明了
c

您可以使用:

{
    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程序员,我个人更喜欢在类或函数的开头声明变量


真正的答案是,如果您担心将变量的范围限制在给定的代码块内,那么这是一个很好的指标,即所述代码块应该是单独的函数/类成员,那么您不必担心局部变量的范围。

您可以这样做,任何类型都可以转换为
bool

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

但是您不能使用自定义条件(与
EOF
)进行比较。

用大括号将其括起来。听起来您需要一个匿名块:@shuttle87,它只是一个块。你不能有一个命名块,所以称它为匿名块没有意义。为什么
while(int c=fgetc(handle)!=EOF)
不起作用?@BenjaminTrent,运算符优先。我不同意,尽可能晚地声明一个变量(在最内部的范围内)比旧的C习惯要好得多。我唯一真正的问题是:a)出现太多同名声明,b)变量仅在代码的某些路径上声明,这可能导致不可预知的崩溃。@SteveBarnes,我很好奇,当变量只能在这些路径中使用时,您会想到什么样的崩溃,但是隐藏另一个同名变量通常是不好的。在使用唯一名称之前正确声明通常是理想的(imo)。@SteveBarnes,这不是假设
b
已在
if
之外声明(我希望不是这样)?或者这就是你所说的编译器错误吗?我可以看出,对于一个数百行长的函数来说,这是非常讨厌的,尽管该函数无论如何都可以使用重构:)看起来更干净:
{int c;while((c=fgetc())…
我喜欢你在第一句话和最后一句话之间信心的增强。@OllieFord哈哈,我对答案做了编辑,但忘了更改措辞。我回来阅读时肯定笑了。不过,他问了一个while循环。@RickyMutschlechner
while
for之间真的没有太大区别在C++中,这是一个很好的答案,但是我相信你的语法是错误的。在FGEC的关闭PARN之后你有一个额外的PAREN,也许你的意思是<代码>为(int c;(c= fgcC(file))=eof;)/c>
while ((c = getopt(argc, argv, "i:o:")) != -1) { 
 // do stuff 
}
{
    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 */
while (int* p = get_ptr()) { /* some code */}
// same with if
if (int* p = get_ptr()) { /* some code */}