Когда вы используете оператор & в языке C?

Я просматривал этот пример из своих заметок, и он не включает оператор & и &i перед i при печати по циклу.

#include <stdio.h>
 
int main() {
  int i;
 
  for (i = 1; i < 11; ++i)
  {
    printf("%d ", i);
  }
  return 0;
}

Когда уместно использовать оператор & и почему он не используется здесь. Вам нужно использовать это только при использовании scanf или его нужно использовать и в printf?

Вы используете его везде, где вам нужен указатель. Например, если вы прочитаете руководство scanf, оно скажет вам, что нужны указатели. Предлагаем вам ознакомиться с любой хорошей книгой или учебником по C, так как это лучший способ изучить основы этого языка (Stack Overflow не заменяет чтение существующих ссылок).

kaylum 11.05.2022 01:51

Помните, что два оператора пишутся & (и один пишется &&). Существует бинарный оператор & для выполнения побитовой логики над двумя целочисленными операндами. Существует унарный & для получения адреса переменной. И бинарный оператор && предназначен для логического И двух выражений, но второе оценивается только в том случае, если первое оценивается как истинное (не ноль).

Jonathan Leffler 11.05.2022 02:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как правило, вы используете только имя объекта, например i, когда вам нужно его значение. В printf("%d ", i) мы хотим, чтобы printf напечатало значение i, поэтому мы просто передаем i.

В scanf("%d", …) мы не хотим говорить scanf, каково значение i. Мы хотим scanf измениться i. Для этого мы должны предоставить scanf некоторую ссылку на i. Для этого мы даем scanf адрес i, с scanf("%d", &i).

Итак, при передаче аргумента подпрограмме вы будете использовать &, если хотите передать адрес объекта этой подпрограмме. Если вы хотите передать значение, вы не будете использовать &.

Технически всякий раз, когда мы пишем i в выражении, это обозначает объект i, а не его значение. Однако во многих случаях объект автоматически преобразуется в свое значение. Итак, в printf("%d", i*3); объект i автоматически конвертируется в его значение, а затем значение умножается на 3. Это автоматическая часть языка, и работает она хорошо, поэтому об этом редко приходится думать.

Это автоматическое преобразование объекта в его значение называется преобразование lvalue. Есть некоторые исключения. В этих случаях мы хотим использовать объект i, а не его значение:

  • В задании, например i = 3;, мы хотим, чтобы задание изменилось i.
  • В sizeof i нам нужен размер объекта i, а не его значение или размер его значения.
  • В &i нам нужен адрес i, а не адрес его значения.
  • В ++i, i++, --i и i-- мы хотим изменить объект i.

Во всех этих случаях автоматическое преобразование объекта в его значение не происходит. Это часть дизайна языка C.

Есть еще два исключения:

  • С оператором доступа к элементу структуры или объединения . левый операнд не преобразуется в его значение. Итак, если s является структурой, то в s.is остается обозначением структуры, а выражение s.i тогда обозначает элемент i этой структуры. (Чтобы продолжить вычисление выражения, в котором он появляется, этот член затем преобразуется в его значение, если только он также не появляется в одном из этих исключений.)
  • Если объект является массивом, он не преобразуется в свое значение. (По отдельным правилам для массивов он часто преобразуется в указатель на его первый элемент.)

Молодец. Ответы на подобные вопросы столь же важны (а может быть, и более), чем на мельчайшие детали правила строгий псевдоним.

David C. Rankin 11.05.2022 02:21

Другие вопросы по теме