Что делает "int* p=+s;"?


Я видел странный тип программы здесь.

int main()
{
    int s[]={3,6,9,12,18};
    int* p=+s;
}

выше программа протестирована на GCC и лязгом компиляторы и отлично работают на обоих компиляторах.

мне любопытно узнать, что делает int* p=+s; сделать?

- это массив s распался на тип указателя?

5 60

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) заставляет операнд вычисляться как число или указатель.

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

здесь унарные + просто делает *p, чтобы указать адреса целочисленного массива. Возьмем два массива s1 и s2

int s1[]={1,5,2};
int s2[]={2,5,2};

int *p=+s1;
p=+s2; 
printf("%d",(int)p[0]);

выход: 2

Так что на мой взгляд унарный + просто делает указатель p, чтобы указать массив s начальный адрес.