5

以下两个代码块是否完全相同并实现相同的东西?当我运行程序时它显示相同的东西,但我希望能得到一些严格的解释。

for(i=1;i<=10;i++)
{
printf("%d\n",i);
}

for(i=1;i<=10;printf("%d\n",i),i++);

循环需要有效的forC 语句作为参数,不是吗?但是,即使我已经在 StackOverflow 上验证了类似语句x+=4,y=x*2;是安全的,因为这里的逗号充当序列点,但在上面的循环printf("%d\n",i),i++)中作为参数传递的语句是否相同?for

如果是,请费心回答由此产生的小问题:

  • 是否comma充当涉及许多逗号分隔的语句中的序列点

    函数调用如下:

    printf("Enter number\n"),scanf("%d",&number),printf("You entered %d",number);

4

2 回答 2

3

这是完全有效的,两个语句都等于编译器。对于读者来说,第二个几乎是不可读的,所以这是唯一的区别。使用第二种格式几乎没有意义。

序列点由逗号运算符引入。

参考:

6.5.17 逗号运算符

第 2 段:

逗号运算符的左操作数被评估为 void 表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;结果有它的类型和值。114)

于 2013-04-29T12:12:32.873 回答
1

答案在C 标准的6.8.5.3中:

第1774章 声明

    for ( clause-1 ; expression-2 ; expression-3 ) statement

行为如下:

1775 表达式 >expression-2 是在每次执行循环体之前计算的控制表达式。

1776 每次执行循环体后,表达式 expression-3 被评估为 void 表达式。

1777 如果clause-1是一个声明,它声明的任何标识符的范围是声明的其余部分和整个循环,包括其他两个表达式;

1778 它在控制表达式的第一次评估之前的执行顺序到达。

1779 如果clause-1是一个表达式,它在控制表达式的第一次计算之前被计算为一个空表达式。134)

1780 子句 1 和表达式 3 都可以省略。

1781 省略的表达式 2 被非零常数替换。

在 printf 语句的执行和i. 在这种情况下,printf语句 andi不是expression-3条件语句,因此该语句是有效的,但不是最佳实践。

于 2013-04-29T12:15:12.443 回答