首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中的while和if语句后面加上分号

在C++中的while和if语句后面加上分号
EN

Software Engineering用户
提问于 2013-06-25 20:09:15
回答 3查看 31.6K关注 0票数 4

为什么要在C++中添加:

代码语言:javascript
复制
while (expression);

不管表达式是否为真,while循环都不会运行。

然而,如果你说:

代码语言:javascript
复制
if (expression);

无论表达式是否为真,该语句都会运行。

看来他们俩的行为应该是一样的。

EN

回答 3

Software Engineering用户

发布于 2013-06-26 04:43:45

语法是:

代码语言:javascript
复制
if (<expr>) <statement>

// or

while (<expr>) <statement>

因此,语句(在这两种情况下)只有在表达式计算为true时才会执行。在while的情况下,它将进入一个循环(每次重新评估快递)。

因此,执行什么是<statement>的问题。这可以归结为语句的定义。如果没有大括号{},则下一条语句将由;终止,即使该语句为空。空语句有效;

代码语言:javascript
复制
if (<expr>)    /* Empty Statement */;

while (<expr>) /* Empty Statement */;

在这两种情况下,都没有执行任何操作(在对表达式进行计算之后)。尽管while可能进入无限循环。注意:“{}”是语句块(一种语句类型(包含其他语句的列表)。

注意:

for(;;)while()if()中使用空语句被认为是不好的形式。它通常很难发现,当人们发现它时,他们并不完全确定代码是正确的(并且可能需要花时间去检查代码的正确性)。

我发现最好在每一个之后使用‘{}’来强调重点(并捕获multi=statement宏)。

代码语言:javascript
复制
for(<init>;<test>;<inc>) { /*Deliberately blank */ }
票数 5
EN

Software Engineering用户

发布于 2013-06-25 20:19:40

实际上当你把

代码语言:javascript
复制
while(expr);

如果expr是真的话,那么您就进入了一个永远不会结束的无限循环(因此剩下的代码永远不会执行)。

您可以通过将空语句;替换为no-op来理解它。

代码语言:javascript
复制
void noop(){}

while(expr)noop();

那么语义就有意义了

票数 4
EN

Software Engineering用户

发布于 2013-06-26 09:47:47

正如其他答案所指出的那样,他们两人都跑了。

考虑一下规范字符串级联器while(*s1++ = *s2++);,一旦初始化了s1s2。在本例中,expr*s1++ = *s2++,while循环的主体是空语句;。请记住,在C中,赋值的值是赋值,因此可以将其重写为

代码语言:javascript
复制
while((*s1++ = *s2++) != 0)
{
}

并具有相同的效果(根据编译器执行的优化,性能可能会发生变化)。

您的困惑可能源于这样一个事实:ifwhile后面都是一个语句,或者是一个语句块。当您在条件部分后面放置分号语句终止符时,它们在语义上等价于:

代码语言:javascript
复制
while(expr)
{
}
{
    /* do something */
}

代码语言:javascript
复制
if(expr)
{
}
{
    /* do something */
}

它们都是完全有效的代码(可以是空块,也可以是没有关联的流控制语句的块),但可能不会按您的要求执行。

如果expr是常数,这通常是在(空)循环中没有修改任何组成变量时发生的情况,那么while循环将跳过空语句块(如果expr值为false)或变成执行空语句的无限循环(如果expr值为true)。

您可以通过给expr一个不间断的副作用来检查这一点,例如记录消息或增加一些内部静态或成员状态变量:

代码语言:javascript
复制
while(log_message(), expr);

并观察到log_message()函数被反复调用。

假设您的代码类似于:

代码语言:javascript
复制
int x = 0;
while (x < 1234);
{
    x++;
}
/* do more... */

现在应该很明显,为什么您的程序没有按照您的预期执行,因为上面的内容在语义上相当于:

代码语言:javascript
复制
int x = 0;
while (x < 1234)
{
}
{
    x++;
}
/* do more... */

由于x从未在while循环的语句块中得到修改(因为它是空的),所以表达式x < 1234将不会计算为除true以外的任何东西,因此有一个无限循环。如果表达式为x != 0,则空语句块将被跳过,因为while循环的条件计算为false,您将到达x++并在/* do more... */点处得到x == 1

如果条件与++x < 1234类似,那么x将被简单地递增(++x求值),并执行空语句块,直到条件为真为止,在此之后,while循环结束并继续执行,只需多次遍历您想要执行的内容。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/202734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档