"int i = 0" 中的操作数

Operands in "int i = 0"

请问这个短码是不是:

int i = 0;

有 1 个操作数还是 2 个? i 是一个操作数,但 0 也是吗?根据wikipedia,0不应该(或者我理解有误)。如果 0 不是操作数,它是常数还是什么? 如果重要,代码在C99中。

int i = 0;中,=不是运算符。它只是变量初始化语法的一部分。另一方面,在 int i; i = 0; 中它将是一个运算符。

由于=这里不是运算符,所以没有操作数。相反,0 初始化程序 .

由于您已将问题标记为 "C",查看它的一种方法是阅读 C 标准。正如所指出的,初始化(如int i = 0)本身并不是一个表达式,严格阅读标准,这里的=不是运算符根据标准中这些术语的用法

然而,i0 是否是操作数并不清楚。一方面,C 标准似乎没有将初始化部分称为操作数。另一方面,它没有详尽地定义术语 "operand"。例如,可以将第 6.3 节解释为将表达式的几乎所有非运算符部分称为 "operand",因此至少 0 符合条件

(另请注意,如果代码为 int i; i = 0;,则后者 i0 肯定都是赋值运算符 = 的操作数。它目前还不清楚问题的意图是否是为了区分赋值和初始化。)

除了 C 标准,您还参考了 Wikipedia,特别是:

In computing, an operand is the part of a computer instruction which specifies what data is to be manipulated or operated on, while at the same time representing the data itself.

如果我们考虑 "computer instruction" 的上下文,C 代码可能会天真地转换为汇编代码,例如 mov [ebp-4], 0,其中两个操作数显然是 [ebp-4](一个位置其中存储了名为 i 的变量)和 0,根据此定义,这将使 i0 操作数。然而,实际上代码可能会被编译器优化为不同的形式,例如只将 i 存储在寄存器中,在这种情况下,将其归零可能会变成 xor eax, eax,其中 0 不再作为显式操作数存在(而是操作的结果)。或者,整个 0 可能会被优化掉,并被不可避免地分配的一些不同的值所取代。或者,整个变量最终可能会被删除,例如,如果它被用作循环计数器并且循环被展开。

所以,最后,这要么是一个哲学问题 ("does the zero exist as an operand if it gets optimized away"),要么只是决定术语的预期用法的问题(可能取决于讨论的上下文)。

The i is an operand, but is 0 too? According to wikipedia, 0 shouldn't (or maybe I misunderstand).

该问题链接到维基百科页面,该页面在数学上下文中描述了术语 "operand"。这可能会导致您对 = 右侧的 0 是否为操作数感到困惑,因为在文章中出现的等式数学陈述中,这绝不是传统的考虑方式= 一个操作员。它不表示计算,因此不对其相关的表达式进行操作。 它们不作为操作数。

您已将问题置于 C 上下文中,但是,在 C 中,= 可用作赋值运算符。这是一个 真正的 运算符,因为它表达了一个(简单的)操作,该操作从两个操作数产生一个结果,并且对左侧操作数也有副作用。在赋值语句中,例如

i = 0;

,则i0都是操作数

关于...

If 0 isn't operand, is it a constant or something?

... 0 独立 C 中的常量,但这与它是否在任何给定上下文中用作操作数无关.作为操作数是表达式(包括简单的 0)可以 使用 的一种方式。稍后会详细介绍。

现在还不清楚这是否是故意的,但问题中实际呈现的代码与上面的赋值语句有非常重要的不同。正如其他答案也观察到的那样,

int i = 0;

声明,不是声明。在这种情况下,i 是声明的标识符,0 用作其 初始化程序 ,就像数学中的 = equation 不是运算符,在 C 声明中引入初始值设定项的 = 也不是运算符。此处不执行任何操作,因为没有值计算与此 = 关联,这与使用相同符号作为赋值运算符时相反。没有运算符,也没有正在执行的操作,在这个特定的代码行中也没有操作数。