Операнды в "int i = 0" - PullRequest
       10

Операнды в "int i = 0"

0 голосов
/ 04 января 2019

Я хотел бы спросить, если этот короткий код:

int i = 0;

имеет 1 операнд или 2?i - это операнд, но тоже 0?Согласно Википедии , 0 не должно (или, возможно, я неправильно понимаю).Если 0 не операнд, это константа или что-то?Если это важно, код находится в C99.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Поскольку вы пометили вопрос как «C», один из способов взглянуть на него - прочитать стандарт C.Как указывает этот ответ , инициализация (такая как int i = 0) не является выражением сама по себе, и при строгом чтении стандарта = здесь не является оператором в соответствии ск использованию этих терминов в стандарте .

Однако не так ясно, являются ли i и 0 операндами.С одной стороны, стандарт C, похоже, не ссылается на части инициализации как операнды.С другой стороны, он не определяет термин «операнд» исчерпывающе.Например, можно было бы интерпретировать раздел 6.3 как называющий почти любую неоператорную часть выражения «операндом», и поэтому по крайней мере 0 будет квалифицироваться как единица.

(Также обратите внимание, что если кодвместо int i; i = 0;, последний i и 0 определенно были бы обоими операндами оператора присваивания =. Остается неясным, было ли целью вопроса провести различие между присваиванием и инициализацией.)

Помимо стандарта C, вы также ссылаетесь на Википедию , в частности:

В вычислениях операнд является частью компьютерной инструкции, которая определяет, чтоданные должны обрабатываться или обрабатываться, и в то же время представлять сами данные.

Если мы рассмотрим контекст «компьютерной инструкции», код C может быть наивно переведен в код сборкикак mov [ebp-4], 0, где два операнда будут явно [ebp-4] (место, где хранится переменная с именем i) и0, который по этому определению сделал бы операнды i и 0.Тем не менее, в действительности код, вероятно, будет оптимизирован компилятором в другую форму, такую ​​как хранение только i в регистре, и в этом случае обнуление может стать xor eax, eax, где 0 больше не существует какявный операнд (но является результатом операции).Или целое 0 может быть оптимизировано и заменено каким-то другим значением, которое неизбежно будет присвоено.Либо вся переменная может в конечном итоге быть удалена, например, если она используется в качестве счетчика цикла, а цикл развернут.

Итак, в конце концов, это либо философский вопрос ("ноль существует как операнд, если его оптимизируют "), или просто вопрос выбора желаемого использования терминов (возможно, в зависимости от контекста обсуждения).

0 голосов
/ 04 января 2019

i - операнд, но тоже 0?Согласно википедии, 0 не должен (или, возможно, я неправильно понимаю).

Вопрос связан со страницей Википедии, описывающей термин «операнд» в математическом контексте.Это, вероятно, влияет на вашу путаницу относительно того, является ли 0 в правой части = операндом, потому что в математическом утверждении равенства, таком как появляется в статье, ни в коем случае не принято считать = оператор.Он не выражает вычисление, поэтому связанные с ним выражения не используются. Т.е. они не функционируют как операнды.

Однако вы поместили вопрос в контекст C, а в C = можно использовать как оператор присваивания.Это добросовестный оператор в том смысле, что он выражает (простую) операцию, которая производит результат из двух операндов, а также оказывает побочный эффект на левый операнд.Тогда в операторе присваивания, таком как

i = 0;

, оба i и 0 являются операндами.

Относительно ...

Если 0 не операнд, это константа или что-то еще?

... 0 стоящий сам по себе - это константа в C, но это мало что меняетделать с тем, служит ли он как операнд в любом данном контексте.Операнд - это способ, которым выражение, включая просто 0, может быть использовано .Подробнее об этом чуть позже.

Теперь неясно, было ли это намерением, но код, фактически представленный в вопросе, очень важно отличается от приведенного выше оператора присваивания.Как и другие ответы,

int i = 0;

является декларацией , а не утверждением.В этом контексте i является объявленным идентификатором, 0 используется в качестве инициализатора , и так же, как = в математическом уравнении не является оператором, =введение инициализатора в объявлении C также не является оператором.Здесь не выполняется никакая операция, поскольку с этим = не связано вычисление значения, в отличие от того, когда один и тот же символ используется в качестве оператора присваивания.Поскольку в этой конкретной строке кода нет операторов и не выполняется никаких операций, также нет операндов.

0 голосов
/ 04 января 2019

В int i = 0;, = не является оператором.Это просто часть синтаксиса инициализации переменной.С другой стороны, в int i; i = 0; это будет оператор.

Поскольку = здесь не является оператором, здесь нет операндов.Вместо этого 0 является инициализатором .

...