C语句的副作用和序列点

时间:2011-04-27 22:58:58

标签: c expression

再次向所有专家致意,我再次偶然发现了几个问题。

故事:

我读了一本书,提到一个序列点;是一个点,它应该在它前进到下一个语句之前评估它之前的所有副作用。为了使我的问题的上下文干净,我会写一个简单的代码。

守则:

while (guess++ < 10)
{
   printf("%d \n" , guests);

我的想法和问题:

1.)从上面的代码中,while语句测试条件guess++ < 10是一个完整的表达式。所以在我的心态中,它不是一个语句,因为它不以{{1结尾}}

2.)由于使用了后缀增量运算符,因此;值在递增之前进行了评估。

3.)书中提到增量操作是在guess变量用于关系操作之后立即执行的,那么只有guess函数才能执行其职责。

4.)我的问题是,由于测试条​​件不以printf()结束,因此它不是声明。但是为什么调用;函数之前实现的递增操作,而不是在printf()函数之后才调用它?

5.)也许这是一个附带问题,书中提到print()是一个结构化的陈述,但为什么我没有看到尾随while附加在;while(testcondition);

6.)这可能听起来像是一个愚蠢的问题,但有时当我读到其他人写的一些源代码时,我会看到其中一些将while循环的开放括号{放在同一行上while(),使其与while(testcondition){相似。这是一个约定还是有任何特殊原因这样做?



感谢您花时间阅读我的问题,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

回答问题1:while循环括号之间的代码实际上是一个完整的表达式。来自wikipedia

  

此类别包括表达式语句(例如赋值a = b;),return语句,if,switch,while或do-while语句的控制表达式,以及for语句中的所有三个表达式。

可以在C faq:

中找到完整表达式的良好描述
  

完整的表达   构成表达式语句的完整表达式,或if,switch,while,for或do / while语句的控制表达式之一,或初始化程序或return语句中的表达式。完整表达式不是更大表达式的一部分。 (参见ANSI Sec.3.6或ISO Sec.6.6。)

重要的是要注意完整表达式与语句或分号标记无关。

所以让我们深入研究一下。修复你的代码snippit我想出了这个:

#include <stdio.h>
int main(void)
{
    unsigned guess = 0;
    while (guess++ < 10)
    {
       printf("%d " , guess);
    }
    return 0;
}

产生此输出:

  

1 2 3 4 5 6 7 8 9 10

这意味着评估将等同于此代码:

while (guess < 10)
{
    guess++;
    printf("%d " , guess);
}

问题5的答案可以在这个stackoverflow问题中找到: In C/C++ why does the do while(expression); need a semi colon?