关键词:
【中文标题】从任何角度来看 ++i 和 i+=1 有啥区别【英文标题】:what is difference between ++i and i+=1 from any point of view从任何角度来看 ++i 和 i+=1 有什么区别 【发布时间】:2013-08-27 13:07:31 【问题描述】:这是来自 kn king 的 c 编程的一个问题:一种现代方法。看不懂他给出的解决方案:-
The expression ++i is equivalent to (i += 1). The value of both expressions is i after
the increment has been performed.
我怎么理解这个?
【问题讨论】:
哪一部分你不明白? 假设如果i = 10
,那么在i += 1
之后,i
变成11
。
你错了++i
≠i++
,我举个例子。
@skp:你在问题的任何地方看到“i++”吗?
【参考方案1】:
解决方案的意思是说没有没有区别,++i
与(i += 1)
具有相同的含义,无论i
碰巧是什么,也无论表达式的上下文如何。 i += 1
周围的括号确保即使上下文包含进一步的算术,等价也成立,例如 ++i * 3
等效于 (i += 1) * 3
,但不等于 i += 1 * 3
(等效于 i += 3
)。
这不适用于i++
,它具有相同的副作用(递增i
),但周围表达式中的值不同——i
在递增之前的值。
【讨论】:
但是i++ + 1
总是等价于++i
和i+=1
。 :-)
运算符签名相同。他们都返回,例如整数&。
@user2672165:C 中没有 int&
这样的东西。
C 中确实没有引用类型,但该表达式将返回一个 int
类型的 L 值,其存储由变量 i
命名。
@Novelocrat No. ++i
和 i++
不是 C 中的左值。您可能会再次想到 C++。 C 标准不擅长明确定义左值,所以我不会提供参考,但请询问任何 C 编译器。【参考方案2】:
++i
是前置自增运算符。它在设置和返回值之前递增i
(显然是i + 1
)。
现在,i++
是后自增运算符。在评估它出现的整个指令后,它会增加 i
。
例子:
int i = 0;
std::cout << ++i << std::endl; /* you get 1 here */
std::cout << i++ << std::endl; /* you still get 1 here */
std::cout << i << std::endl; /* you get 2 here */
【讨论】:
问题被标记为C
,而不是C++
。
而且问题不涉及后增量。
更重要的是,这个答案中的“之前”和“之后”这两个词并不能反映 C 中前后增量的实际情况(也可能不在 C++ 中)。 i++
计算为i
的最后一个值,并在最后一个和下一个序列点之间的任何时间递增i
,并且不允许程序尝试观察何时。【参考方案3】:
i = 10
printf("%d", i++);
将打印 10,其中为
printf("%d", ++i);
将打印 11
X = i++
可以这样认为
X = i
i = i + 1
X = ++i
在哪里
i = i + 1
X = i
所以,
printf ("%d", ++i);
与
相同printf ("%d", i += 1);
但不是
printf ("%d", i++);
尽管在这三个语句中的任何一个之后i
的值都是相同的。
【讨论】:
【参考方案4】:我认为它们完全一样。有一件事可能很有趣。 ++i 等于 (i+=1) 但不等于 i+=1;不同之处在于支架。因为 i += 1 可能取决于上下文并且会有不同的解释。
【讨论】:
【参考方案5】:在没有赋值的正常操作中:
++i 和 i++
增加1中的变量。在伪汇编中,两个代码都是:
inc i
但是如果你给值赋值,++ 的顺序是相关的:
x = i++
生产:
mov x, i
inc i
x = ++i
生产:
inc i
mov x, i
在以下情况下: i += 1
它会产生:
add i,1
但由于编译器会优化代码,它也会在这种情况下生成:
inc i
【讨论】:
【参考方案6】:到目前为止尚未提出的一个区别是代码的可读性。大部分循环使用递增一,常见的做法是在移动到下一个元素/索引递增 1 时使用 i++/++i。
通常 i+= 仅在增量不是 1 时用于这些情况。将其用于正常增量不会有危险,但会导致理解上的轻微障碍并使代码看起来不寻常。
【讨论】:
【参考方案7】:两者的区别是: ++ 是一元运算符,而 + 是二元运算符....
如果我们考虑执行时间: i++ is more faster than i=i+1.
执行同一组代码的机器周期数不同,这就是循环总是首选 ++ 运算符的原因。
Refer to this thread for more info
【讨论】:
从底层的角度来看,Windows 中的命名管道和远程过程调用 (RPC) 有啥区别?
】从底层的角度来看,Windows中的命名管道和远程过程调用(RPC)有啥区别?【英文标题】:Fromalow-levelperspective,whatisthedifferencebetweennamedpipesandremoteprocedurecalls(RPC)inWindows?从底层的角度来看,Windows中的命名管道和远程过程调用(RPC)有... 查看详情
i++ 和 ++i 有啥区别?
...30@、double等)。有谁知道吗?【问题讨论】:除非它没有任何区别,否则你永远不应该使用任何一个,因为它只会导致人们问你 查看详情
i++ 和 ++i 有啥区别?
...30@、double等)。有谁知道吗?【问题讨论】:除非它没有任何区别,否则你永远不应该使用任何一个,因为它只会导致人们问你 查看详情
PHP中的++$i和$i++有啥区别?
】PHP中的++$i和$i++有啥区别?【英文标题】:What\'sthedifferencebetween++$iand$i++inPHP?PHP中的++$i和$i++有什么区别?【发布时间】:2010-12-1721:08:04【问题描述】:PHP中++$i和$i++有什么区别?【问题讨论】:【参考方案1】:++$i是前置增量... 查看详情
C中的i++和++i有啥区别? [复制]
】C中的i++和++i有啥区别?[复制]【英文标题】:What\'sexactlydifferencebetweeni++and++iinC?[duplicate]C中的i++和++i有什么区别?[复制]【发布时间】:2011-08-0621:01:06【问题描述】:可能重复:(C)Whatisthedifferencebetween++iandi++inta[3][4]=1,2,3,4,5,6,7,8,... 查看详情
+= 和 =+ 有啥区别?
】+=和=+有啥区别?【英文标题】:Whatisthedifferencebetween+=and=+?+=和=+有什么区别?【发布时间】:2011-02-2517:03:45【问题描述】:+=和=+有什么区别?具体来说,在java中,但在一般情况下也是如此。【问题讨论】:【参考方案1】:i+=... 查看详情
tan-1和tan(a)-1有啥区别
...高中数学是不涉及双曲函数的)它们的定义跟角度是没有任何关系的,完全是另一种函数运算,只是在性质上跟6个三角函数有相似点,故被冠以此名;5——还有arsinh、arcosh、artanh等6个反双曲函数,分别称为反双曲正弦、反双曲... 查看详情
c#中的i--和--i有啥区别[重复]
】c#中的i--和--i有啥区别[重复]【英文标题】:What\'sthedifferencebetweeni--and--iinc#[duplicate]c#中的i--和--i有什么区别[重复]【发布时间】:2014-12-2515:41:14【问题描述】:“i--”与c#中的“--i”有何不同?这是一样的吗?它似乎等同于同... 查看详情
这两者有啥区别……?
...?【发布时间】:2011-04-0610:30:12【问题描述】:从安全的角度来看,有哪些主要点会有助于使用.master文件与.aspx文件的结果?【问题讨论】:【参考方案1】:主页面和内容页面在您的浏览器中构成1个呈现页面。母版页用于在整... 查看详情
df.iloc[[i]] 和 df.iloc[i] 有啥区别 [重复]
】df.iloc[[i]]和df.iloc[i]有啥区别[重复]【英文标题】:Whatisthedifferencebetweendf.iloc[[i]]anddf.iloc[i][duplicate]df.iloc[[i]]和df.iloc[i]有什么区别[重复]【发布时间】:2021-03-3000:19:11【问题描述】:df.iloc[[i]]和df.iloc[i]有什么区别?我知道df.iloc[[... 查看详情
装饰器和指令在角度上有啥区别?
...述】:我对Angular中的指令和装饰器感到很困惑。我认为任何以@为前缀的东西都是装饰器,现在当我读到指令时,它说,组件是指令。这是怎么回事?对此事的任何澄清都会有所帮助。【问题讨论】:@ 查看详情
装饰器和指令在角度上有啥区别?
...述】:我对Angular中的指令和装饰器感到很困惑。我认为任何以@为前缀的东西都是装饰器,现在当我读到指令时,它说,组件是指令。这是怎么回事?对此事的任何澄清都会有所帮助。【问题讨论】:@ 查看详情
目录和文件夹有啥区别?
...多数人交替使用术语“文件夹”和“目录”。从程序员的角度来看,有区别吗?如果有,那是什么?它取决于操作系统,还是有广泛的普遍共识?这个contributionunderEnglishUITerminology:Direc 查看详情
`sudo -i -u user` 和 `sudo su - user` 有啥区别? [关闭]
】`sudo-i-uuser`和`sudosu-user`有啥区别?[关闭]【英文标题】:What\'sthedifferencebetween`sudo-i-uuser`and`sudosu-user`?[closed]`sudo-i-uuser`和`sudosu-user`有什么区别?[关闭]【发布时间】:2015-10-2004:34:20【问题描述】:两个命令:sudo-i-uusernamesudosu-use... 查看详情
javajavai++与++i的字节码原理比较绕的一个考题
...我自己在刚学编程时是比较困惑的,下面我们从字节码的角度来看++i与i++到底是如何实现的。首先来看一段i++的陷阱题,如代码清单2-5所示。publicvoidfoo()inti=0;for(intj 查看详情
角度测试中的 tick() 和 flush() 有啥区别?
】角度测试中的tick()和flush()有啥区别?【英文标题】:Whatisthedifferencebetweentick()andflush()inangulartesting?角度测试中的tick()和flush()有什么区别?【发布时间】:2019-10-2305:24:43【问题描述】:在Angular文档中,我看到了这两个函数,tick... 查看详情
Grails:扩展和嵌入域类有啥区别?
...类和嵌入对象之间的功能差异感到有些困惑。从数据库的角度来看,它们都做同样的事情。嵌 查看详情
这个 C++ 代码和这个 Python 代码有啥区别?
】这个C++代码和这个Python代码有啥区别?【英文标题】:WhatisthedifferencebetweenthisC++codeandthisPythoncode?这个C++代码和这个Python代码有什么区别?【发布时间】:2014-09-2821:08:11【问题描述】:回答感谢@TheDark发现溢出。新的C++解决方案... 查看详情