2017-01-12 51 views
1

PROG 1:C程序设计 - 逗号中的操作员而循环

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

PROG 2:

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

PROG 1的输出为1,而PROG 2是9.

有人可以解释这里发生了什么。这两个代码如何不同?

回答

2

逗号运算符依次评估它的两个参数,抛出结果,除了最后一个。最后评估的表达式确定整个表达式的结果。

i<=8,i++ - 这里表达式的值是i++的值,它是i在递增之前的值。它是0,所以循环立即终止。

i++,i<=8 - 这里的表达式的值是0,只有当i被递增到9

就个人的i<=8值:我认为第二形式,而有点类似for循环对于代码读者来说,比实际的for循环更不清楚。

0

表达式分隔符运算符,强制从左到右评估,也是测序点

程序1:考虑i <= 8, i++。评估并丢弃i <= 8然后评估i++。整个表达式具有未增值的值i。由于i最初为0,因此while循环在第一次迭代时终止。输出将是i该单独增加的值,即1。

PROG 2:i++被评估并弃去的结果,那么i <= 8与自,值的评价i测序点。所以while循环运行,直到i <= 8不再是true与递增值i。输出将为9.

0
while (condition) 
    statement 

语句重复执行。评估每个执行(迭代)条件之前。如果它是假的,while循环结束并继续执行。

在这种情况下,声明为空。语句可以是以分号(;)结尾的单行代码或用大括号({,})括起来的块代码代码

因此,我们会持续评估条件,直到它产生错误。为了理解发生了什么,我们需要检查逗号运算符的工作方式。 (注意,虽然逗号作为一个字符可以用在C中的地方 - 我可以想到函数声明,定义和调用 - 在这种情况下,逗号字符是条件的一部分,因此它作为一个操作符。)

expression1 , expression2 

逗号运算符使表达式1先被评估,然后被表达式2,然后返回表达式2的值。我们将评估两个操作数(i ++,i < = 8),并在右操作数解析为真时继续操作。

虽然通常我们使用条件来控制循环的执行,但在这种情况下,条件可能会有其他影响。在我们的情况下,变量i受到每个条件评估的影响。它增加了一个。

我们的例子只有条件操作数的顺序不同,因此操作数结果真的控制了循环的执行。

我们先来看第二个例子。在这种情况下,我们有条件“我++,我< = 8”。这意味着每次评估我们首先增加i,然后检查它是否小于或等于8.因此,在第一次评估条件时,我们将i从0增加到1并得出结论:1 < = 8,所以循环继续。这样构建的循环只能在我变成9时破坏,即。在第9次迭代。

现在至于第一个例子,条件是“i < = 8,++ i”。由于比较没有副作用,因此我们可以按任意顺序执行任意数量的比较,如果这是我们所做的唯一事情,那就是说,如果我们没有按照比较结果的方式或顺序执行任何其他操作,那些比较将毫无用处。与我们的情况一样,我们评估i < = 8,其结果为真或假,但我们没有使用该值,只是继续评估正确的操作数。所以我们的情况实际上等于“i ++”。

这是后增量的一元运算符。它返回我的价值,然后只增加一个。 (所有的保证是这个顺序,当我得到提高时,实际上是一个复杂的问题,并不总是在标准问题上决定的,除非我错了)。所以会发生什么是我们首先检查我是否是真的,然后,无论如何,我们增加一个,然后打破循环或继续。

在C中没有真或假的值,没有布尔类型。如果整数具有非零值,则认为它们为真。

因此,第一次评估“i ++”时,我们得到0,这是错误的。这意味着循环被打破,甚至没有一次迭代。然而,“i ++”的评估使它增加了一个,所以当我们完成while循环时,我已经是1.