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

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

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

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

🤔 А знаете ли вы, что...
C является одним из самых влиятельных языков программирования в истории.


55
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 этой структуры. (Чтобы продолжить вычисление выражения, в котором он появляется, этот член затем преобразуется в его значение, если только он также не появляется в одном из этих исключений.)
  • Если объект является массивом, он не преобразуется в свое значение. (По отдельным правилам для массивов он часто преобразуется в указатель на его первый элемент.)