Что делает это динамическое выделение?

Сегодня, я узнал, что можно написать такой код в C++ и скомпилировать его:

int* ptr = new int(5, 6);

Какова цель этого? Я знаю, конечно, динамическое new int(5) вещь, но здесь я потерян. Какие-либо подсказки?

6
задан Stringer 27 February 2010 в 00:04
поделиться

5 ответов

Вы используете запятую оператор, он оценивает только одно значение (крайнее правое).

Оператор запятой (,) используется для разделения двух или более выражений, которые включены, где только одно выражение {{1 }} ожидаемый Тед. Когда набор выражений должен быть вычислен для значения , учитывается только крайнее правое выражение .

Источник

Адрес памяти, на который указывает указатель, инициализируется значением 6 выше.

13
ответ дан 8 December 2019 в 13:45
поделиться

Мой компилятор g++ возвращает ошибку при попытке сделать это.

В каком компиляторе или коде вы это видели?

-121--4166917-

Я считаю, что это ошибка, которая предназначена для выделения какого-то 2D массива. Вы не можете сделать это в C++, однако. Фрагмент фактически компилируется, потому что он использует оператор запятой, который возвращает последнее выражение и игнорирует результаты всех остальных. Это означает, что оператор эквивалентен:

int* ptr = new int(6);
-121--4166918-

5 игнорируется. при этом в куче выделяется int и инициализируется (5,6).

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

1
ответ дан 8 December 2019 в 13:45
поделиться

Мой компилятор, g ++, возвращает ошибку при попытке сделать это.

В каком компиляторе или коде вы это видели?

1
ответ дан 8 December 2019 в 13:45
поделиться

Просто сделайте следующее:

int* ptr = new int(6);

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

int* ptr = new int(5, 6);
1
ответ дан 8 December 2019 в 13:45
поделиться

Я считаю, что это ошибка, связанная с выделением какого-то 2D-массива. Однако вы не можете сделать это в C ++. Фрагмент фактически компилируется, потому что он использует оператор запятой, который возвращает последнее выражение и игнорирует результаты всех остальных. Это означает, что этот оператор эквивалентен следующему:

int* ptr = new int(6);
1
ответ дан 8 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: