Как работает этот код? - PullRequest
3 голосов
/ 26 ноября 2010

Я смотрю на C ++ для чайников и нашел этот код

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int nextStudentId = 1000; // first legal Student ID
class StudentId
{
public:
StudentId()
{
    value = nextStudentId++;
    cout << "Take next student id " << value << endl;
}

// int constructor allows user to assign id
StudentId(int id)
{
    value = id;
    cout << "Assign student id " << value << endl;
}
protected:
int value;
};

class Student
{
public:
Student(const char* pName)
{
     cout << "constructing Student " << pName << endl;
     name = pName;
     semesterHours = 0;
     gpa = 0.0;
 }

protected:
string    name;
int       semesterHours;
float     gpa;
StudentId id;
};

int main(int argcs, char* pArgs[])
{
// create a couple of students
Student s1("Chester");
Student s2("Trude");

// wait until user is ready before terminating program
// to allow the user to see the program results
system("PAUSE");
return 0;
}

это вывод

Возьмите ID следующего студента 1000

Построение Студенческого Честера

Возьмите ID следующего студента 1001

Построение Студенческого Труда

Нажмите любую клавишу для продолжения. , .

У меня очень тяжелое время, чтобы понять, почему первый идентификатор студента равен 1000, если значение добавляет его к одному, а затем распечатывает

имеет ли это смысл

прямо в конструкторе для studentId. Две строки кода берут nextStudentId и добавляют к нему одну, после чего она распечатывается

не будет ли вывод примерно таким:

Возьмите ID следующего студента 1001

Построение Студенческого Честера

Возьмите ID следующего студента 1002

построение Студенческого Труда

Нажмите любую клавишу для продолжения. , .

надеюсь, вы понимаете, что я пытаюсь сказать

спасибо

Люк

Ответы [ 5 ]

9 голосов
/ 26 ноября 2010

++ - это оператор post -increment: он first читает значение (и присваивает его переменной), и только затем увеличивает его .

Сравните это с оператором pre -increment:

value = ++nextStudentId;

Такое поведение будет ожидаемым.

Посмотрите на этот вопрос для получения дополнительной информации: Инкремент в C ++ - Когда использовать x ++ или ++ x?

5 голосов
/ 26 ноября 2010
value = nextStudentId++;

Используется так называемый оператор постинкремента. Выполнение nextStudentId++ сначала использует текущее значение nextStudentId для value, а , а затем увеличивает его. Таким образом, в первый раз, value будет 1000, а nextStudentId сразу станет 1001 и т. Д.

Если вы вместо этого сделаете:

value = ++nextStudentId;

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

4 голосов
/ 26 ноября 2010

В C и C ++ операторы увеличения (и уменьшения) выполняются в двух формах

  1. префикс - ++ Object
  2. суффикс - Объект ++

Префиксная форма увеличивается, а затем возвращает значение, однако суффиксная форма берет снимок значения, увеличивает объект и затем возвращает снятый ранее снимок.

T& T::operator ++(); // This is for prefix
T& T::operator ++(int); // This is for suffix

Обратите внимание, что у второго оператора есть фиктивный параметр int, чтобы обеспечить разные подписи для этих операторов.

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

1 голос
/ 26 ноября 2010

Знаете ли вы, как работают операторы "x ++" и "++ x"?

"x ++" сначала возвращает значение x, а затем увеличивает x

, например:

int x = 1;
std::cout << x++ << std::endl; // "1" printed, now x is 2
std::cout << x << std::endl; // "2" printed

"++ x" сначала увеличивает x, а затем возвращает увеличенное значение

int y = 1;
std::cout << ++y << std::endl; // "2" printed, y is 2
std::cout << y << std::endl; // "2"
1 голос
/ 26 ноября 2010

Попробуйте это

value = ++nextStudentId;
...