путаница при вычитании и убывании сразу - PullRequest
0 голосов
/ 29 октября 2019

Я застрял в вопросе декремента, код выглядит следующим образом:

#include <stdio.h>
int main()
{
int x = 4, y = 3, z;
z = x-- - y;
printf("%d %d %d\n",x,y,z);

return 0;
}

в соответствии с тем, что я знаю, выходной результат должен быть 4 3 0, пояснение для значения z по мне так:следующим образом: сначала это пост-декремент, поэтому сначала мы уменьшим значение y с x, то есть 4-3, равное 1, и, по моему мнению, мы снова уменьшим 1 с 1 (или мы не исправим меня, еслиЯ тут не прав) и на выходе будет 0.

Ответы [ 2 ]

4 голосов
/ 29 октября 2019

Выражение x-- соответствует значению current , равному x, равному 4. Значение y затем вычитается из этого значения, в результате чего получается значение 1, равное z. x затем уменьшается как побочный эффект постдекремента.

Таким образом, результат будет 3 3 1.

3 голосов
/ 29 октября 2019

Из стандарта C (6.5.2.4 Операторы постфиксного увеличения и уменьшения)

2 Результатом оператора postfix ++ является значение операнда. В качестве побочного эффекта значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа) . См. Обсуждение аддитивных операторов и составного присваивания для получения информации об ограничениях, типах и преобразованиях и влиянии операций на указатели. Вычисление значения результата выполняется до побочного эффекта обновления сохраненного значения операнда . Что касается вызова функции с неопределенной последовательностью, операция postfix ++ представляет собой единственную оценку. Postfix ++ на объекте с атомарным типом является операцией чтения-изменения-записи с семантикой порядка памяти memory_order_seq_cst.98)

3 Оператор postfix - аналогичен оператору postfix ++, за исключением того, что значениеоперанда уменьшается (т. е. из него вычитается значение 1 соответствующего типа).

Таким образом, в этом выражении

z = x-- - y;

используется значениепеременная x перед уменьшением, равным 4. Итак, 4 - 3 дает 1.

Но сам объект x был уменьшен, и после этого утверждения его значение становится равным 3.

Такв результате вы получите следующий вывод

3 3 1

Кстати, вы можете переписать это утверждение

z = x-- - y;

like:)

z = x --- y;
...