Объясните логику вывода на языке Си
#include; main( ) { int x = 4, y, z ; y = --x ; z = x-- ; printf ( "\n%d %d %d", x, y, z ) ; return 0; }
OUTPUT 2 3 3
Что я уже пробовал:
Логика вывода на языке Си ?
#include; main( ) { int x = 4, y, z ; y = --x ; z = x-- ; printf ( "\n%d %d %d", x, y, z ) ; return 0; }
OUTPUT 2 3 3
Ваш код означает::
#include; main( ) { int x = 4, y, z ; --x ; y = x ; z = x ; x-- ; printf ( "\n%d %d %d", x, y, z ) ; return 0; }
5ed!
Я объясню вам ваш конкретный случай, но не забудьте изучить его непосредственно, пока вы действительно не поймете его. Не понимать этого-значит настраивать себя на проблемы в C, C++, C# и других языках.
Когда у вас есть операция предварительного декремента, она говорит компилятору сделать вычитание, прежде чем он использует это значение.
Когда у вас есть операция пост-декремента, она говорит компилятору использовать значение, а затем декрементировать его.
Когда Вы наконец достигнете printf(), все декременты будут выполнены.
Если вы перепишете это, печатая их значение после каждой операции (не забудьте инициализировать y &z !), вы увидите, как это влияет на X.
Что-нибудь неожиданное? Проанализируйте его с точки зрения того, когда происходит операция, пока вы ее не увидите.
Если вы используете эти операторы в макросе, имейте в виду, что если он появляется несколько раз, то будет выполняться несколько раз. Есть подобные ловушки, о которых вы должны узнать.