Как работает цикл while, когда операторы присваивания и постфикса используются в его состоянии - PullRequest
1 голос
/ 18 июня 2019

Я нашел этот код в книге по указателям, и в книге для следующего кода объясняется, что. Сначала значение по адресу, сохраненному в ss, заменяет значение по адресу, в котором оно хранится tt. После назначения выполняется тест, чтобы определить, следует ли продолжать цикл while или нет. Поскольку *tt дает 'l', что является истинным значением. Далее увеличивается ss и tt.

Мои вопросы:

  1. Почему цикл while сначала присваивает значение, а затем проверяет наличие true или false?
  2. Почему проверяется значение в tt, я имею в виду, почему именно tt?
  3. Почему ss и tt увеличиваются после проверки условия; почему не только после присвоения значения?
int main()
{ 
    char s[]="lumps, bumps, swollen veins, new pains";
    char t[40];
    char *ss,*tt;
    tt=t;
    ss=s;
    while (*tt++ = *ss++ );
    printf("%s ",t);
}

выход:

lumps, bumps, swollen veins, new pains

Ответы [ 2 ]

1 голос
/ 18 июня 2019
  1. , почему цикл while сначала присваивает значение, а затем проверяет значение true или false 2.

Копирует char, а затем проверяетесли скопированный символ был нулевым терминатором.Если это так, тогда он оценивается как 0 (или false), и цикл останавливается.

почему проверяется значение в tt, я имею в виду, почему именно tt.

На самом деле проверяется результат =, который равен присвоенному значению.Так что если *ss равно '\0', то = возвращает '\0' и цикл останавливается, потому что '\0' равен 0 или false.

почему сси tt - приращение после проверки условия, почему бы не сразу после присвоения значения

Это приращение постфикса, поэтому присвоение (=) выполняется со старыми значениями, а не с увеличенными значениями.

0 голосов
/ 18 июня 2019

Выражение, подобное этому

*ss++

, можно эквивалентно переписать, например,

*( ss++ )

То есть оператор приращения постфикса ++ имеет более высокий приоритет, чем унарный оператор *.

В соответствии со стандартом C (6.5.2.4 Операторы увеличения и уменьшения Postfix, стр. # 2)

2 Результатом оператора postfix ++ является значениеоперанд.Как побочный эффект, значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа).... Расчет значения результата выполняется до появления побочного эффекта обновления сохраненного значения операнда ....

Так что, если, например, указатель ss указывает на первый символстроки s, то значение выражения ss++ является этим адресом, и только после возврата адреса указатель увеличивается на единицу.

Тогда возвращаемый указатель, который является значением выражения ss++, равенразыменовывается и значение выражения *( ss++ ) является первым символом строки, хранящейся в массиве s.

Аналогично значение выражения *( tt++ ) является объектом, на который указывает указатель tt до его увеличения.

Таким образом, первый символ массива t назначается с первым символом массива s.

Далее в соответствии со стандартом C (6.5.16Операторы присваивания, стр. # 3)

3 Оператор присваивания сохраняет значение в объекте, обозначенном левым операндом.Выражение присваивания имеет значение левого операнда после присваивания (111), но не является lvalue ....

Таким образом, на первом шаге цикла значением оператора присваивания являетсясимвол 'l'.

И наконец (6.8.5 Операторы итерации, стр. # 4)

4 Оператор итерации приводит к многократному выполнению оператора, называемого телом циклапока контрольное выражение не сравнится равным 0 ...

Поскольку результат выражения присваивания (символ 'l') не равен 0, цикл продолжается.Он будет выполняться до тех пор, пока выражение *( ss++ ) не возвратит завершающий нулевой символ '\0' массива s, который назначен массиву t с использованием выражения присваивания *tt++ = *ss++.

Как в этомЕсли результатом выражения присваивания является символ '\0' (который повышается до 0 типа int), то цикл прекращает свои итерации.

В результате массив t содержитстрока хранится в массиве s.

...