Почему компилятор C ++ не дает приоритета (оператор приращения при присваивании) в этой простой программе? - PullRequest
4 голосов
/ 05 декабря 2011

Согласно таблице приоритетов операторов в языке C / C ++ (см. Википедия), оператор приращения (++) имеет приоритет по отношению к оператору присваивания (=).

Может кто-нибудь объяснить, почему компилятор сначала присваивает значение (1 в bill [x]), а затем увеличивает значение индекса (i ++) в этой простой программе. Я думаю, что должно быть наоборот (сначала увеличить, а затем назначить):

#include <iostream>
using namespace std;

int bill[] = {16, 17, 18, 19, 20};

int main ()
{
  int i = 3;

  bill[(i++)] = 1; // I think it should be bill[4] = 1;

  cout << bill[0] << endl;
  cout << bill[1] << endl;
  cout << bill[2] << endl;
  cout << bill[3] << endl;
  cout << bill[4] << endl;

  cout << "Index value:" << i << endl;

  return 0;
}

Вывод:

16
17
18
1
20
Index value:4

Я что-то не так делаю?

Ответы [ 4 ]

7 голосов
/ 05 декабря 2011

i увеличивается, но не раньше, чем будет использоваться в качестве средства доступа к массиву.Чтобы получить то, что вы ищете, попробуйте вместо этого `++ i '.(Префикс вместо постфикса.)

4 голосов
/ 05 декабря 2011

С другой стороны, вы можете посмотреть на это:

bill[(++i)] = 1;

Вы можете прочитать это как, сначала увеличьте 'i', затем сделайте утверждение.

bill[(i++)] = 1;

Вы можете прочитать это как, сначала сделайте оператор, затем увеличьте 'i'.

Если вам интересно, как это возможно, можно реализовать внутреннее постинкрементное отображение, чтобы получить поведение, которое вы видите:

int post_increment(int &i)
{
  int t = i;
  i = i + 1;
  return t;
}

bill[post_increment(i)] = 1;    // access bill[3] even though i == 4

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

int pre_increment(int &i)
{
  i = i + 1;
  return i;
}

bill[pre_increment(i)] = 1;    // access bill[4] where i == 4
1 голос
/ 05 декабря 2011

Шаг равен , который выполняется первым.Однако i++ увеличивает i и возвращает копию старого значения.Как уже упоминалось, чтобы получить желаемое поведение, используйте ++i, который увеличивает i и возвращает ссылку на i.

1 голос
/ 05 декабря 2011

«i ++» означает «использовать в качестве результата выражения значение переменной до приращения, но приращивать переменную».

«++ i» означает «приращивать переменную и использовать увеличенныйзначение как результат ".

...