Я просматривал этот пример из своих заметок, и он не включает оператор & и &i перед i при печати по циклу.
#include <stdio.h>
int main() {
int i;
for (i = 1; i < 11; ++i)
{
printf("%d ", i);
}
return 0;
}
Когда уместно использовать оператор & и почему он не используется здесь. Вам нужно использовать это только при использовании scanf или его нужно использовать и в printf?
🤔 А знаете ли вы, что...
C является одним из самых влиятельных языков программирования в истории.
Как правило, вы используете только имя объекта, например 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.i
s
остается обозначением структуры, а выражение s.i
тогда обозначает элемент i
этой структуры. (Чтобы продолжить вычисление выражения, в котором он появляется, этот член затем преобразуется в его значение, если только он также не появляется в одном из этих исключений.)