【问题标题】:postfix and prefix in printf and for function (C) [duplicate]printf和函数(C)中的后缀和前缀[重复]
【发布时间】:2015-03-25 18:42:55
【问题描述】:

对不起,我还是 C 的菜鸟。 我想知道为什么 post 和 prefix 在“printf”中具有不同的效果,但在“for”或其他循环中具有相同的效果?

示例:

#include <stdio.h>
main()
{
    int number = 0;
    printf("%d.\n", ++number); //It prints 1
    return 0;
}


...............
    printf("%d.\n", number++); //it prints 0
...............

但在“为”中

#include<stdio.h>
main()
{
    int number;
    for (number = 0; number < 5; ++number);
    {
        printf("%d\n", number); //it prints 0,1,2,3,4
    }
    return 0;
}
.............
    for (number = 0; number < 5, number++);
    {
       printf("%d\n", number); //it prints 0,1,2,3,4
    }
.........................

【问题讨论】:

  • 如果不使用表达式的值,也没关系。你看到丢弃一个值然后给变量加 1 和给变量加 1 和丢弃值之间的区别吗?
  • 是的,我可以看到差异。

标签: c prefix mathematical-expressions


【解决方案1】:

for中,第三个表达式的结果被丢弃,所以不管是number还是number+1。只有改变number变量的值的副作用仍然存在,并且对于后自增和预自增都是一样的。

但是当你将它作为函数参数传递时,表达式的值很重要,这是不同的。请注意,for 不是函数,顺便说一句!

【讨论】:

    【解决方案2】:

    来自http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 的 6.5.2.4 后缀递增和递减运算符:

    后缀 ++ 运算符的结果是操作数的值。得到结果后,操作数的值递增。

    但是,从 6.5.3.1 开始,前缀递增和递减运算符:

    前缀 ++ 运算符的操作数的值递增。结果是操作数自增后的新值。

    C 标准有两个运算符是有原因的。从标准中可以看出,++x 返回(x+1) 并设置x = (x+1),而x++ 返回x 并设置x = (x+1)

    正如另一个答案所解释的,for 循环不是函数调用,并且根本不将表达式的值用于第三个表达式,所以没关系(但请注意,对于第二个表达式表达式的值很重要!)。

    【讨论】:

      猜你喜欢
      • 2017-12-02
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多