2011-12-05 2 views
4

В соответствии с таблицей приоритетов операторов на языке C/C++ (см. Википедию) оператор приращения (++) имеет приоритет относительно оператора присваивания (=).Почему компилятор C++ не дает приоритет (оператор приращения при назначении) в этой простой программе?

Может кто-нибудь объяснить, почему компилятор сначала присваивает значение (1 в счете [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 

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

+2

Обратите внимание, что «++ i» является операцией * pre-increment *, а «i ++» - это операция * post-increment *. – dmckee

+0

Рассмотрите возможность поиска ответов, которые вы нашли полезными. И если один из ответов действительно очистил вас, вы должны принять его, нажав на эту маленькую зеленую галочку. – greatwolf

ответ

4

Другим способом вы можете посмотреть на это:

bill[(++i)] = 1; 

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

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

Отличный ответ, ваше объяснение помогло мне понять, как компилятор интерпретирует операторы приоритета в исходном коде.Теперь я вижу, что этот язык (C/C++) очень силен и может путать начинающих, как я. –

7

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

+0

Спасибо, человек, это мне очень помогло. Я новичок в этом. –

+1

Это не отвечает на его вопрос: «Может кто-нибудь объяснить мне, почему .....» – david

+0

Вы правы, я все еще сомневаюсь: почему компилятор не делает то, что я ожидаю от него? Но ваш ответ помог решить проблему в моей программе, используя префикс вместо суффикса для увеличения. –

1

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

«++ i» означает «прирастить переменную и использовать в качестве результата добавленное значение».

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^