“ int i = 0”中的操作数

时间:2019-01-03 23:07:09

标签: c operands

我想问一下这段短代码:

int i = 0;

有1个操作数还是2个? i是一个操作数,但是0也是吗?根据{{​​3}},不应设置0(否则我可能会误解)。如果0不是操作数,它是常量还是其他? 如果重要的话,代码在C99中。

3 个答案:

答案 0 :(得分:7)

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

由于=不是运算符,因此没有操作数。相反,0初始化器

答案 1 :(得分:2)

由于您已将问题标记为“ C”,因此查看问题的一种方法是阅读C标准。正如this answer所指出的那样,初始化(例如int i = 0)本身并不是表达式,并且通过严格阅读标准,此处的=不是运算符根据这些术语在标准中的用法

目前尚不清楚i0是否为操作数。一方面,C标准似乎没有将初始化的部分称为操作数。另一方面,它没有详尽定义“操作数”一词。例如,可以将第6.3节解释为将表达式的几乎所有非运算符部分称为“操作数”,因此至少0可以视为一个。

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

除C标准外,您还参考Wikipedia,尤其是:

  

在计算中,操作数是计算机指令的一部分,它指定要操作或操作的数据,同时表示数据本身。

如果我们考虑“计算机指令”的上下文,那么C代码可能会天真地转换为mov [ebp-4], 0之类的汇编代码,其中两个操作数显然是[ebp-4](变量在其中的位置称为i的存储)和0,这将使i0的操作数都与此定义相同。但是,实际上,编译器可能会将代码优化为其他形式,例如仅将i存储在寄存器中,在这种情况下将其清零可能会变成xor eax, eax,其中{{1} }不再作为显式操作数存在(而是操作的结果)。或者,整个0可能会被优化掉,并被不可避免地要分配的一些不同的值代替。或者,整个变量可能最终被删除,例如,如果将其用作循环计数器并且展开了循环。

因此,最后,或者是一个哲学问题(“如果它被优化掉,零是否作为操作数存在”),或者只是决定术语的期望用法(也许取决于在讨论中)。

答案 2 :(得分:1)

  

i是一个操作数,但是0也是吗?根据维基百科,0不应该   (或者我可能误会了。)

该问题链接到Wikipedia页面,该页面在数学上下文中描述了术语“操作数”。这可能会导致您对=右侧的0是否是操作数感到困惑,因为在如文章中所示的数学等式语句中,考虑到绝非常规=个运算符。它不表示计算,因此不对其涉及的表达式进行运算。 ,它们不能用作操作数。

您已将问题放在C上下文中,但是在C中,=可以用作赋值运算符。这是一个“善意”操作符,它表示一个(简单的)操作,该操作从两个操作数产生一个结果,并且对左侧操作数也有副作用。在赋值语句中,例如

i = 0;

,那么i0都是操作数。

关于...

  

如果0不是操作数,它是常量还是其他?

... 0本身是 在C中是一个常量,但这与它是否在任何给定上下文中用作操作数无关。成为操作数是一种可以使用的表达式,其中包括0。稍后再讨论。

现在还不清楚这是否是意图,但是问题中实际显示的代码与上面的赋值语句非常重要。正如其他答案一样,

int i = 0;

声明,而不是声明。在这种情况下,i是要声明的标识符,0被用作其 initializer ,就像数学方程式中的=不是操作符,在C声明中引入初始化程序的=也不是操作符。这里不执行任何操作,因为与此=没有值计算相关联,这与将相同符号用作赋值运算符不同。在该特定代码行中没有运算符,也没有执行任何操作,也没有操作数。