4

在我的计算机科学 II 课上,教授认为 ++、--、*= 等是 2 个操作。但是,在组装级别,这并不是真正的两个操作。有人可以解释一下还是只是为了简单起见?

4

9 回答 9

9

我实际上认为它是 3 个操作:读取、递增(或其他)、写入。这是假设它从某种共享内存读取到某种本地存储(例如寄存器或堆栈),在本地存储上操作,然后写回。

它在装配级别有多少操作将取决于您要增加的内容、平台、硬件等。

于 2009-01-14T15:49:13.413 回答
8

因为 ++(例如:b++)是

b = b + 1 

那里有两个操作,加法(b + 1),然后将加法的值分配给原始变量。

于 2009-01-14T15:49:46.003 回答
2

做复杂性分析时为什么要麻烦?这只是 O(1) :-)

编辑:当你投票否决时,请告诉我为什么。由于这个问题被标记为complex,我认为大 O 概念是最重要的,而不是实际的常数。此外,正如其他答案中已经提到的,这有多少操作取决于很多因素:您计算操作的方式、平台、编译器等。

于 2009-01-14T16:00:00.990 回答
1

我来猜几个。

  • 你的教授指的是解释语言吗?
  • ++i 与 i++ 不同,也许他指的是那个?
  • 也许他选择的汇编语言需要中间存储变量?

    add reg_temp, reg_i, 1
    mov reg_i, reg_temp
    
于 2009-01-14T15:55:24.417 回答
0

不是加法加二传手吗?

类似于 i+=1?

于 2009-01-14T15:49:02.323 回答
0

教授可能只是指必须取值,将其加 1,然后将其分配回变量。

于 2009-01-14T15:50:38.857 回答
0

在汇编级别,一切都在寄存器中完成,因此在 A 中有一个变量

ADD AX,1

但是,在编译语言中,所有内容都必须存储,因此 i++ 变为(在伪汇编中)

MOV AX,i
ADD AX, 1
MOV i, AX

这是三个操作...除非我完全忘记了我的基本架构...

于 2009-01-14T15:56:20.827 回答
0

你让我想起了我很久以前听到 的一个有点“陪审团没有出局”的问题。

“前增量比后增量快”

我刚刚做了一个快速的谷歌搜索。

  1. 很多人仍然认为这是真的。
  2. 其他人则认为编译器已经如此优化,无法对比较高级的代码进行基准测试。
  3. 然而,其他人则认为没有区别。
于 2009-01-14T16:09:05.993 回答
0

在我看来它应该超过 2,因为它根据上下文有两种含义,当我看到它时,我总是要提醒自己。

a = b++是相同的a = b; b = b + 1

a = ++b是相同的b = b + 1; a = b

这足以让大多数一年级学生陷入困境。

于 2009-01-14T16:14:45.373 回答