如何使“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+=2
与 i++
相同的行为。所以我的问题没有答案。所以我需要一个替代解决方案。这个答案给了我灵感,让我通过 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++”工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何使环境变量作为python sdk中的环境变量到达Dataflow工作人员