6

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

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

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

+4

Для чего это стоит, правильный способ сделать это в данном случае 'INT * PTR = новый Int ((5, 6));'. 'int (5,6)' должно приводить к ошибке, но размещение его в скобках превращает его в 6, а затем использует это. Тем не менее, это уродливо. :) – GManNickG

+0

@GMan: Вы должны поставить это как ответ, чтобы мы могли его перенести. – Zacky112

ответ

13

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

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

Source

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

+0

Так как оператор (,) отбрасывает свой первый операнд, это то же самое, что и новый int (6). Правильно? – Stringer

+3

Да, это правильно. Но у вас может быть другое выражение вместо 5, которое вы бы хотели оценить, и 6 вернулись. Он будет оценивать все выражения, но возвращает последний. –

+1

http://msdn.microsoft.com/en-us/library/zs06xbxh(VS.80).aspx Но по этой ссылке Microsoft говорит: «Где запятая обычно используется как разделитель (например, в реальных аргументах для функций или агрегированные инициализаторы), оператор запятой и его операнды должны быть заключены в круглые скобки ». Не будет ли выражение в int (выражение) считать списком аргументов и, следовательно, не будет ли запятая оцениваться как разделитель? – Bob

1

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

Какой компилятор или код вы его видели?

+0

Visual Studio 2008. Я написал этот код. – Stringer

+0

Он компилируется в MSVC 6.0 и инициализирует местоположение ptr со значением 6. –

1

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

int* ptr = new int(6); 
1

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

результат набора операторов, разделенных оператор запятой является значением последнего утверждения, так что ИНТ инициализируется 6

1

Просто сделать это:

int* ptr = new int(6); 

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

int* ptr = new int(5, 6); 
Смежные вопросы