如何使“i+=x”作为“i++”工作?

Posted

技术标签:

【中文标题】如何使“i+=x”作为“i++”工作?【英文标题】:how to make "i+=x" works as "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:与序列点无关。相反,您不能在右值的内置类型上使用增量。 【参考方案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;

【讨论】:

以上是关于如何使“i+=x”作为“i++”工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使set :: find()适用于自定义类对象?

如何使我的电脑作为主机服务器工作?

如何使 HashMap 以数组为键工作?

如何使环境变量作为python sdk中的环境变量到达Dataflow工作人员

Git:如何使外部存储库和嵌入式存储库作为通用/独立存储库工作?

如何使用命名范围作为验证参考