Что делает "int* p=+s;"?
Я видел странный тип программы здесь.
int main()
{
int s[]={3,6,9,12,18};
int* p=+s;
}
выше программа протестирована на GCC и лязгом компиляторы и отлично работают на обоих компиляторах.
мне любопытно узнать, что делает int* p=+s;
сделать?
- это массив s
распался на тип указателя?
5 ответов:
встроенный
operator+
может принимать тип указателя в качестве своего операнда, поэтому передача массиваs
к этому приводит преобразование массива в указатель а потом указательint*
возвращается. Это означает, что вы можете использовать+s
индивидуально, чтобы получить указатель. (В данном случае это лишнее; безoperator+
Он также распадается на указатель, а затем присваиваетсяp
.)(выделено мной)
возвращается встроенный унарный оператор plus значение его операнда. Единственная ситуация, когда она не является no-op, - это когда операнд имеет интегральный тип или тип перечисления без области видимости, который изменяется интегральным продвижением, например, он преобразует char в int или если операнд подчиняется lvalue-rvalue,array-to-pointer, или преобразование функции в указатель.
это унарный плюс символ, который не имеет никакого практического эффекта здесь. Например:
#include <iostream> int main() { int a[] = {1}; std::cout << a << " " << +a << std::endl; }
печатает один и тот же адрес для обоих
a
и+a
. Массив распадается на указатель, как обычно.обратите внимание, что, если бы это был унарный минус
-a
вместо этого GCC покажет ошибку:error: wrong type argument to unary minus
Edit: хотя это не имеет никакого эффекта в коде OP,
a
и+a
не совсем то же самое. Пожалуйста, обратитесь к ответам Хуршида Нормурадова и songyuanyao для деталей.
- это массив
s
распадается на тип указателя?да.
что значит
int* p=+s;
сделать?унарный
+
оператор заставляет массив распадаться на указатель.стандарт C++, 5.3.1 унарные операторы (P7):
операнд унарного оператора + должен иметь арифметику, не ограниченную областью видимости перечисление или указатель типа и в результате значение аргумент. Интегральное продвижение выполняется по интегралу или перечислению операнды. Тип результата - это тип повышенного операнда.
унарный
+
форма(+s)
заставляет операнд вычисляться как число или указатель.для получения дополнительной информации, пожалуйста, смотрите по этой переполнение стека ответ.