Я просматривал этот пример из своих заметок, и он не включает оператор & и &i перед i при печати по циклу.
#include <stdio.h>
int main() {
int i;
for (i = 1; i < 11; ++i)
{
printf("%d ", i);
}
return 0;
}
Когда уместно использовать оператор & и почему он не используется здесь. Вам нужно использовать это только при использовании scanf или его нужно использовать и в printf?
Помните, что два оператора пишутся & (и один пишется &&). Существует бинарный оператор & для выполнения побитовой логики над двумя целочисленными операндами. Существует унарный & для получения адреса переменной. И бинарный оператор && предназначен для логического И двух выражений, но второе оценивается только в том случае, если первое оценивается как истинное (не ноль).





Как правило, вы используете только имя объекта, например 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 этой структуры. (Чтобы продолжить вычисление выражения, в котором он появляется, этот член затем преобразуется в его значение, если только он также не появляется в одном из этих исключений.)Молодец. Ответы на подобные вопросы столь же важны (а может быть, и более), чем на мельчайшие детали правила строгий псевдоним.
Вы используете его везде, где вам нужен указатель. Например, если вы прочитаете руководство
scanf, оно скажет вам, что нужны указатели. Предлагаем вам ознакомиться с любой хорошей книгой или учебником по C, так как это лучший способ изучить основы этого языка (Stack Overflow не заменяет чтение существующих ссылок).