我想问一下这段短代码:
int i = 0;
有1个操作数还是2个? i
是一个操作数,但是0
也是吗?根据{{3}},不应设置0(否则我可能会误解)。如果0不是操作数,它是常量还是其他?
如果重要的话,代码在C99中。
答案 0 :(得分:7)
在int i = 0;
中,=
不是运算符。它只是变量Initializaton语法的一部分。另一方面,在int i; i = 0;
中它将是一个运算符。
由于=
不是运算符,因此没有操作数。相反,0
是初始化器。
答案 1 :(得分:2)
由于您已将问题标记为“ C”,因此查看问题的一种方法是阅读C标准。正如this answer所指出的那样,初始化(例如int i = 0
)本身并不是表达式,并且通过严格阅读标准,此处的=
不是运算符根据这些术语在标准中的用法。
目前尚不清楚i
和0
是否为操作数。一方面,C标准似乎没有将初始化的部分称为操作数。另一方面,它没有详尽定义“操作数”一词。例如,可以将第6.3节解释为将表达式的几乎所有非运算符部分称为“操作数”,因此至少0
可以视为一个。
(还要注意,如果代码是int i; i = 0;
,则后者i
和0
肯定都是赋值运算符=
的操作数。目前尚不清楚问题的目的是否在于区分赋值和初始化。)
除C标准外,您还参考Wikipedia,尤其是:
在计算中,操作数是计算机指令的一部分,它指定要操作或操作的数据,同时表示数据本身。
如果我们考虑“计算机指令”的上下文,那么C代码可能会天真地转换为mov [ebp-4], 0
之类的汇编代码,其中两个操作数显然是[ebp-4]
(变量在其中的位置称为i
的存储)和0
,这将使i
和0
的操作数都与此定义相同。但是,实际上,编译器可能会将代码优化为其他形式,例如仅将i
存储在寄存器中,在这种情况下将其清零可能会变成xor eax, eax
,其中{{1} }不再作为显式操作数存在(而是操作的结果)。或者,整个0
可能会被优化掉,并被不可避免地要分配的一些不同的值代替。或者,整个变量可能最终被删除,例如,如果将其用作循环计数器并且展开了循环。
因此,最后,或者是一个哲学问题(“如果它被优化掉,零是否作为操作数存在”),或者只是决定术语的期望用法(也许取决于在讨论中)。
答案 2 :(得分:1)
i
是一个操作数,但是0
也是吗?根据维基百科,0不应该 (或者我可能误会了。)
该问题链接到Wikipedia页面,该页面在数学上下文中描述了术语“操作数”。这可能会导致您对=
右侧的0是否是操作数感到困惑,因为在如文章中所示的数学等式语句中,考虑到绝非常规=
个运算符。它不表示计算,因此不对其涉及的表达式进行运算。 即,它们不能用作操作数。
您已将问题放在C上下文中,但是在C中,=
可以用作赋值运算符。这是一个“善意”操作符,它表示一个(简单的)操作,该操作从两个操作数产生一个结果,并且对左侧操作数也有副作用。在赋值语句中,例如
i = 0;
,那么i
和0
都是操作数。
关于...
如果0不是操作数,它是常量还是其他?
... 0
本身是 在C中是一个常量,但这与它是否在任何给定上下文中用作操作数无关。成为操作数是一种可以使用的表达式,其中包括0
。稍后再讨论。
现在还不清楚这是否是意图,但是问题中实际显示的代码与上面的赋值语句非常重要。正如其他答案一样,
int i = 0;
是声明,而不是声明。在这种情况下,i
是要声明的标识符,0
被用作其 initializer ,就像数学方程式中的=
不是操作符,在C声明中引入初始化程序的=
也不是操作符。这里不执行任何操作,因为与此=
没有值计算相关联,这与将相同符号用作赋值运算符不同。在该特定代码行中没有运算符,也没有执行任何操作,也没有操作数。