代码之家  ›  专栏  ›  技术社区  ›  justinhj

在C/C++中,为什么do while(表达式);需要半结肠吗?

  •  34
  • justinhj  · 技术社区  · 17 年前

    我猜这只是让解析变得更容易,但我不明白确切的原因。

    那么,这有什么意义呢。..

    do
    {
      some stuff
    }
    while(test);
    
    more stuff
    

    这比。..

    do
    {
      some stuff
    }
    while(test)
    
    more stuff
    
    8 回复  |  直到 17 年前
        1
  •  57
  •   Joe White    17 年前

        2
  •  31
  •   Community Mohan Dere    6 年前

    状况 )

    ; 表达 ) 声明

    声明 表达

    请注意,仅 do-while ; 最后。所以,问题是为什么 ; .

    让我们仔细看看:两者 for 定期 while 以a结尾 声明 但是 以控制结束 表达 () ) 声明结束。换句话说,终止 ;

    然而,在实践中,这意味着,例如,以下代码

    do
    {
      /* whatever */
    } while (i + 2) * j > 0;
    

    有效的

    do
    {
      /* whatever */
    } while (i + 2)
    
    *j > 0;
    

    循环 ; .

        3
  •  24
  •   Don    17 年前

    如果不需要分号,请考虑不同的行为:

    int x = 10;
    int y = 10;
    
    do 
      while(x > 0)
        x--;
    while(x = y--);
    
        4
  •  9
  •   JaredPar    17 年前

    虽然我不知道答案,但一致性似乎是最好的论据。C/C++中的每个语句组都以以下方式终止

    1. 分号
    2. 支架

    为什么要创建一个两者都不做的构造?

        5
  •  7
  •   Tony Delroy    15 年前

    考虑一致性。..

    if (expr) statement;
    do statement; while (expr);
    for (expr; expr; expr) statement;
    while (expr) statement;
    

    …所有这些流控制构造都以分号结尾。

    但是,与此相反,我们可以注意到,在块语句形式中,只有 do while

    if (expr) { ... }
    do { ... } while (expr);
    for (expr; expr; expr) { }
    while (expr) { }
    

    语句分隔符的一致性

    我们至少可以说,每条语句都必须用 ; } ,在视觉上帮助我们区分陈述。

    如果不需要分号,请考虑:

    do statement1; while (expr1) statement2; do ; while (expr2) statement3; while (expr3) statement4;
    

    很难直观地将其分解为不同的语句:

    do statement1; while (expr1)
    statement2;
    do ; while (expr2)
    statement3;
    while (expr3) statement4;
    

    ; while 条件告诉你向后寻找 do :

    do statement1; while (expr1); statement2; do ; while (expr2); statement3; while (expr3) statement4;
    

    • 宏替换可以将许多语句放在一行中,我们偶尔需要在排除故障或进行QA时直观地验证预处理器输出。

    #define F(X) do { fn(X); } while (false)
    

    if (expr)
        F(x);
    else
        x = 10;
    

    if (expr)
        do ( fn(x); } while (false);
    else
        x = 10;
    

    如果分号 不是 部分 当循环 if 声明将被解释为:

    if (expr)
        do-while-statement
    ; // empty statement
    else
        x = 10;
    

    如果 ,它被认为是完整的,这就留下了 else 声明不匹配。

        6
  •  3
  •   Nosredna    17 年前

    I、 坦率地说,讨厌重复使用while for do循环。我认为重复直到不会那么令人困惑。但事实就是如此。

        7
  •  1
  •   lothar    17 年前

    在C/C++中,空格对结构没有贡献(例如在python中)。在C/C++语句中 必须

    do
    {
      some stuff; more stuff; even more stuff;
    }
    while(test);
    
        8
  •  1
  •   Flexo - Save the data dump sunny moon    15 年前

    我的答案是,当我们没有在终止符中包含分号时,编译器可能会感到困惑 do.....while();

    1. 什么时候结束?
    2. 如果while可以在do循环之后立即进行单独的循环。

    这就是为什么我们在末尾添加分号 do......while

    推荐文章