#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a=1;
printf("%d\t%d\t%d\n",a,++a,a++);
return 0;
}
Почему вывод кода 3 3 1
. кто-нибудь объяснит мне, как происходит такой вывод?
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a=1;
printf("%d\t%d\t%d\n",a,++a,a++);
return 0;
}
Почему вывод кода 3 3 1
. кто-нибудь объяснит мне, как происходит такой вывод?
Похоже, ваш компилятор читает параметры справа налево
printf("%d\t%d\t%d\n",a,++a,a++); // a = 1
a++ возвращает a и увеличивает его на 1
printf("%d\t%d\t%d\n",a,++a, 1); // a = 2
++a увеличивает a на 1 и возвращает результат
printf("%d\t%d\t%d\n",a, 3, 1); // a = 3
а это просто
printf("%d\t%d\t%d\n", 3, 3, 1); // a = 3
Но, насколько мне известно, это своего рода UB, потому что стандарт С++ не определяет, в каком порядке считываются параметры, поэтому я бы не стал делать ставку на то, что он будет одинаковым для разных компиляторов.
Изменить: с С++ 17 это больше не UB, а не указано. Вы все равно должны избегать этого
Это неопределенное поведение в соответствии с порядком оценки. ссылка (см. главу Неопределенное поведение)
Результат:
3 3 1
потому что он оценивается следующим образом:
a++
используйте a(1) и a становится 2
++a
a становится 3 и используйте a(3)
используйте a(3)
Важно знать, что a++
является постинкрементным, а ++a
— преинкрементным. Постинкремент означает: использовать значение и увеличивать его после. Предварительное приращение означает: увеличить значение и использовать увеличенное значение.
cstdio
мне кажется заголовком C++. - person StoryTeller - Unslander Monica   schedule 17.06.2019