【问题标题】:how to make "i+=x" works as "i++"?如何使“i+=x”作为“i++”工作?
【发布时间】:2013-05-14 08:33:07
【问题描述】:

以下代码

int i=0;
while(i<10) {
   printf("%d\n", i++);
}

等价于

int i=0;
while(i<10) {
   printf("%d\n", i); i++;
}

但是下面的代码

int i=0;
while(i<10) {
   printf("%d\n", i+=2);
}

等价于

int i=0;
while(i<10) {
   i+=2; printf("%d\n", i);
}

如何使其等价于

int i=0;
while(i<10) {
   printf("%d\n", i); i+=2;
}

i++

【问题讨论】:

  • 出于好奇,到底为什么你需要这样的东西吗?
  • @C.Lang:你测试过吗?!
  • @TonyTheLion:我认为 OP 想要的恰恰相反。
  • 您回答了自己的问题:使用两个语句(当然,在两个单独的行上)。为什么用简单的方法搜索混淆的解决方案非常有效。
  • @MOHAMED:与序列点无关。相反,您不能在右值的内置类型上使用增量。

标签: c


【解决方案1】:

您也可以编写一个宏来执行此操作。像这样:

#define POSTINC(var, val) ((var) += (val), (var) - (val))

printf("%d\n", POSTINC(i,2));

但最好使用for 或只是增加下一条语句中的值。

【讨论】:

    【解决方案2】:

    很好奇我会因为提出以下明显的建议而受到打击:

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

    【讨论】:

    • 谢谢你的回答,它很简单,给了我灵感
    • @MOHAMED 哇,不幸的是,你所追求的只是一个for 循环,这使得这个问题比我最初想象的要简单得多。
    • @ChristianRau 显然不支持 i+=2i++ 相同的行为。所以我的问题没有答案。所以我需要一个替代解决方案。这个答案给了我灵感,让我通过 for 循环改变我的 while 循环。我很感激
    • @MOHAMED 是的,确实 for 循环是您示例中的最佳解决方案。我只是不知道您根本不知道 for 循环这一事实,并将该示例解释为演示总体一般任务的简化示例。但至少你得到了满意的答案。
    【解决方案3】:

    你可以用这个

    1)

    printf("%d",i++?(i++?i-2:(i-2)):(i++?i-2:0));
    

    ?引入序列点

    没有提到可读性。所以我不介意。

    2)

    printf("%d",(a++,a++,a-2));
    

    ,引入序列点。这里括号内的, 充当逗号运算符,而不是参数分隔符。

    【讨论】:

    • 嗯?这不与i+=2 实现相同(返回增加的值而不是 prior 增加的值),这是 OP 不想要的吗?
    • 差不多,但现在它不适用于初始的0(在这种情况下它只会做i++)。
    • 确实如此,但价格如何? ;)(不是真的,+1 是一种有趣的方法。)
    • @ChristianRau 我的老板看到这个肯定会解雇我的。 :)
    【解决方案4】:

    运算符“++”在 C/C++ 和其他类似 C 的语言中具有两种含义
    1.如果“++”在变量前面
    ++i; 这样我将首先加一,计算的值将是语句的值 例如: int i=0;
    int k;
    k=++i;
    //k=1 i=1

    2.如果“++”在变量后面
    i++; 这样语句的值将是 i 的值并且 i 加一 例如: int i=0;
    int k;
    k=i++;
    //k=0 i=1

    【讨论】:

    • 好吧,那又怎样?是什么让您认为 OP 还没有意识到这一点(如果他没有,他一开始就不会问这个问题)?并没有真正提供实际问题的答案,是吗?
    • 哦,我试图解释“1++”是如何工作的,但实际上我没有给出答案。对此感到抱歉
    【解决方案5】:
    int i=2;
    while(i<10) {
       printf("%d\n", i); i+=2;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2017-03-24
      • 2016-03-22
      • 1970-01-01
      • 2014-05-13
      • 2016-07-05
      相关资源
      最近更新 更多