从任何角度来看 ++i 和 i+=1 有啥区别

     2023-02-21     208

关键词:

【中文标题】从任何角度来看 ++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 你错了++ii++,我举个例子。 @skp:你在问题的任何地方看到“i++”吗? 【参考方案1】:

解决方案的意思是说没有没有区别,++i(i += 1) 具有相同的含义,无论i 碰巧是什么,也无论表达式的上下文如何。 i += 1 周围的括号确保即使上下文包含进一步的算术,等价也成立,例如 ++i * 3 等效于 (i += 1) * 3,但不等于 i += 1 * 3(等效于 i += 3)。

这不适用于i++,它具有相同的副作用(递增i),但周围表达式中的值不同——i 在递增之前的值。

【讨论】:

但是i++ + 1 总是等价于++ii+=1。 :-) 运算符签名相同。他们都返回,例如整数&。 @user2672165:C 中没有 int& 这样的东西。 C 中确实没有引用类型,但该表达式将返回一个 int 类型的 L 值,其存储由变量 i 命名。 @Novelocrat No. ++ii++ 不是 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++解决方案... 查看详情