"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
)本身并不是一个表达式,严格阅读标准,这里的=
不是运算符根据标准中这些术语的用法。
然而,i
和 0
是否是操作数并不清楚。一方面,C 标准似乎没有将初始化部分称为操作数。另一方面,它没有详尽地定义术语 "operand"。例如,可以将第 6.3 节解释为将表达式的几乎所有非运算符部分称为 "operand",因此至少 0
符合条件
(另请注意,如果代码为 int i; i = 0;
,则后者 i
和 0
肯定都是赋值运算符 =
的操作数。它目前还不清楚问题的意图是否是为了区分赋值和初始化。)
除了 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
,根据此定义,这将使 i
和 0
操作数。然而,实际上代码可能会被编译器优化为不同的形式,例如只将 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;
,则i
和0
都是操作数
关于...
If 0 isn't operand, is it a constant or something?
... 0
独立 是 C 中的常量,但这与它是否在任何给定上下文中用作操作数无关.作为操作数是表达式(包括简单的 0
)可以 使用 的一种方式。稍后会详细介绍。
现在还不清楚这是否是故意的,但问题中实际呈现的代码与上面的赋值语句有非常重要的不同。正如其他答案也观察到的那样,
int i = 0;
是声明,不是声明。在这种情况下,i
是声明的标识符,0
用作其 初始化程序 ,就像数学中的 =
equation 不是运算符,在 C 声明中引入初始值设定项的 =
也不是运算符。此处不执行任何操作,因为没有值计算与此 =
关联,这与使用相同符号作为赋值运算符时相反。没有运算符,也没有正在执行的操作,在这个特定的代码行中也没有操作数。
请问这个短码是不是:
int i = 0;
有 1 个操作数还是 2 个? i
是一个操作数,但 0
也是吗?根据wikipedia,0不应该(或者我理解有误)。如果 0 不是操作数,它是常数还是什么?
如果重要,代码在C99中。
在int i = 0;
中,=
不是运算符。它只是变量初始化语法的一部分。另一方面,在 int i; i = 0;
中它将是一个运算符。
由于=
这里不是运算符,所以没有操作数。相反,0
是 初始化程序 .
由于您已将问题标记为 "C",查看它的一种方法是阅读 C 标准。正如int i = 0
)本身并不是一个表达式,严格阅读标准,这里的=
不是运算符根据标准中这些术语的用法。
然而,i
和 0
是否是操作数并不清楚。一方面,C 标准似乎没有将初始化部分称为操作数。另一方面,它没有详尽地定义术语 "operand"。例如,可以将第 6.3 节解释为将表达式的几乎所有非运算符部分称为 "operand",因此至少 0
符合条件
(另请注意,如果代码为 int i; i = 0;
,则后者 i
和 0
肯定都是赋值运算符 =
的操作数。它目前还不清楚问题的意图是否是为了区分赋值和初始化。)
除了 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
,根据此定义,这将使 i
和 0
操作数。然而,实际上代码可能会被编译器优化为不同的形式,例如只将 i
存储在寄存器中,在这种情况下,将其归零可能会变成 xor eax, eax
,其中 0
不再作为显式操作数存在(而是操作的结果)。或者,整个 0
可能会被优化掉,并被不可避免地分配的一些不同的值所取代。或者,整个变量最终可能会被删除,例如,如果它被用作循环计数器并且循环被展开。
所以,最后,这要么是一个哲学问题 ("does the zero exist as an operand if it gets optimized away"),要么只是决定术语的预期用法的问题(可能取决于讨论的上下文)。
The
i
is an operand, but is0
too? According to wikipedia, 0 shouldn't (or maybe I misunderstand).
该问题链接到维基百科页面,该页面在数学上下文中描述了术语 "operand"。这可能会导致您对 =
右侧的 0 是否为操作数感到困惑,因为在文章中出现的等式数学陈述中,这绝不是传统的考虑方式=
一个操作员。它不表示计算,因此不对其相关的表达式进行操作。 即它们不作为操作数。
您已将问题置于 C 上下文中,但是,在 C 中,=
可用作赋值运算符。这是一个 真正的 运算符,因为它表达了一个(简单的)操作,该操作从两个操作数产生一个结果,并且对左侧操作数也有副作用。在赋值语句中,例如
i = 0;
,则i
和0
都是操作数
关于...
If 0 isn't operand, is it a constant or something?
... 0
独立 是 C 中的常量,但这与它是否在任何给定上下文中用作操作数无关.作为操作数是表达式(包括简单的 0
)可以 使用 的一种方式。稍后会详细介绍。
现在还不清楚这是否是故意的,但问题中实际呈现的代码与上面的赋值语句有非常重要的不同。正如其他答案也观察到的那样,
int i = 0;
是声明,不是声明。在这种情况下,i
是声明的标识符,0
用作其 初始化程序 ,就像数学中的 =
equation 不是运算符,在 C 声明中引入初始值设定项的 =
也不是运算符。此处不执行任何操作,因为没有值计算与此 =
关联,这与使用相同符号作为赋值运算符时相反。没有运算符,也没有正在执行的操作,在这个特定的代码行中也没有操作数。