Почему значение X не увеличивается при назначении - PullRequest
0 голосов
/ 12 мая 2019

Я новичок в языке C и не совсем уверен, почему в строке 4, когда выполняется постинкремент, значение x не меняется, я имею в виду, что

x = printf("%d",x++);

Значение x было 12, поэтому printf напечатал бы 12, а затем x должно быть присвоено 2, и, пока ++ было там, x позже должно быть изменено с 2+1 и в строке 6 выполняется предварительное увеличение, поэтому вывод не должен быть 124.

Почему х в строке 4 не добавлено?

Пожалуйста, помогите.

#include <stdio.h>

int main(){

int x = 12;

x = printf("%d", x++);

printf("%d", ++x);

return 0;

}

Ответы [ 4 ]

2 голосов
/ 12 мая 2019

Осознайте последовательность . С это [выделено мной] :

Существует точка последовательности после оценки всех аргументов функции и обозначения функции, и до фактического вызова функции .

С это [выделено мной] :

Операторы приращения инициируют побочный эффект добавления значения 1 соответствующего типа к операнду. Операторы декремента инициируют побочный эффект вычитания значения 1 соответствующего типа из операнда. Как и с любыми другими побочными эффектами, эти операции завершаются в или перед следующей точкой последовательности .

Смотрит на это утверждение:

x = printf("%d", x++);

Оператор постинкрементного увеличения значения операнда на 1, но значением выражения является исходное значение операнда до операции приращения .
Таким образом, значение x, переданное printf(), будет его исходным значением, равным 12, и из-за точки последовательности перед вызовом printf() значение x будет увеличено на 1. Возвращаемое значение printf() будет присвоено x, которое перезаписывает последнее значение x, которое является увеличенным значением из-за оператора post ++. Следовательно, после этого утверждения значение x равно 2.

1 голос
/ 12 мая 2019

Значение для x было 12, так что printf напечатал бы 12, а затем x должен был быть присвоен 2, и, хотя ++ был там, x должен быть позже изменен на 2 + 1, и в строке 6 выполняется предварительное увеличение, поэтому output не должен т быть 124.

нет, назначение выполнено после всего, что касается printf("%d", ++x);, ваш код эквивалентен этому:

#include <stdio.h>

int main(){
  int x = 12;

  int y = printf("%d", x++);

  x = y;

  printf("%d", ++x);

  return 0;
}

так x = printf("%d", ++x); делает:

  • printf пишет 12
  • затем x увеличивается до значения 13
  • затем x присваивается результату printf со значением 2

затем вы выполняете printf("%d", ++x);, тогда как x значения 2 ранее, поэтому x увеличивается до того, как будет задано в аргументе, поэтому 3 записывается

и окончательный результат печати - 123

PS. Как сказал @ H.S. в другом замечании: после вычисления всех аргументов функции есть точка последовательности (x ++ является аргументом для printf ()) и операция до / после увеличения / уменьшения завершается в или до следующей точки последовательности.

0 голосов
/ 12 мая 2019

x = printf ("% d", x ++);Это примерно размер этого целого числа.x ++ находится в printf, он печатает значение x и увеличивает его на единицу.Но это не влияет на размер этого целого числа.Затем вы назначаете размер x, а не значение x.Вот почему этот инкремент не работал там.

Я думаю, вы понимаете, о чем я говорю.

0 голосов
/ 12 мая 2019

Это будет работать для вас:

++ x - приращение префикса, а x ++ - приращение постфикса, и вот разница между ними:

Приращение префикса возвращает значение переменной после ее увеличения.

С другой стороны, более распространенный прирост постфикса возвращает значение переменной до ее приращения.

#include <stdio.h>

int main()
{
    int x = 12;

    x = printf("%d", ++x);

    printf("%d", ++x);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...