再次向所有专家致意,我再次偶然发现了几个问题。
故事:
我读了一本书,提到一个序列点;
是一个点,它应该在它前进到下一个语句之前评估它之前的所有副作用。为了使我的问题的上下文干净,我会写一个简单的代码。
守则:
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){
相似。这是一个约定还是有任何特殊原因这样做?
感谢您花时间阅读我的问题,非常感谢您的帮助。
答案 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?