什么是"int*p = + s;" 做?

msc*_*msc 63 c++ arrays pointers unary-operator

我在这里看到了一种奇怪的程序.

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

上面的程序在GCCClang编译器上进行了测试,并在两个编译器上都运行良好.

我很想知道,int* p=+s;做了什么?

数组是否已s衰减为指针类型?

son*_*yao 63

内置operator+可以将指针类型作为其操作数,因此将数组传递s给它会导致数组到指针的转换,然后int*返回指针.这意味着你可以+s单独使用来获取指针.(对于这种情况,它是多余的;没有operator+它也会衰减到指针,然后分配给p.)

(强调我的)

内置的一元加运算符返回其操作数的值.它不是no-op的唯一情况是当操作数具有整数类型或未整合的枚举类型时,它由整数提升改变,例如,它将char转换为int或者如果操作数受到左值到右值的影响,数组到指针或函数到指针的转换.

  • @ machine_1抱歉,我不知道.我不熟悉C,他们是不同的语言.:) (5认同)
  • @ machine_1不是真的.在C中,一元+运算符将`char`转换为`int`就像在C++中一样,但是将它放在数组,指针或函数之前在C中无效. (4认同)

Khu*_*dov 25

测试一下:

#include <stdio.h>
int main(){
    char s[] = { 'h', 'e', 'l', 'l', 'o' , ' ', 'w', 'o', 'r', 'l', 'd', '!'} ;
    printf("sizeof(s) : %zu,  sizeof(+s) : %zu\n", sizeof(s), sizeof(+s) ) ;
}
Run Code Online (Sandbox Code Playgroud)

在我的电脑(Ubuntu x86-64)上打印:

sizeof(s): 12,  sizeof(+s) : 8
Run Code Online (Sandbox Code Playgroud)

哪里

12 = number of elements s times size of char, or size of whole array
 8 = size of pointer
Run Code Online (Sandbox Code Playgroud)

  • `"Hello hell!"`最后会有一个隐含的''\ 0'` (13认同)
  • `char s [] ="Hello worl";`[sic!]会更具可读性. (6认同)

tas*_*oor 11

这是一个一元加号,在这里没有实际效果.例如:

#include <iostream>

int main() {
    int a[] = {1};

    std::cout << a << " " << +a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这将打印两个a和相同的地址+a.数组像往常一样衰减到指针.

请注意,如果它是一元减号,-a那么GCC会显示错误:

error: wrong type argument to unary minus
Run Code Online (Sandbox Code Playgroud)

编辑:虽然它具有OP的代码没有任何影响,a而且+a是不完全一样的.有关详细信息,请参阅Khurshid Normuradov和songyuanyao的答案.


msc*_*msc 10

数组是否已s衰减为指针类型?

是.

怎么int* p=+s;办?

一元+运算符强制数组衰减为指针.

C++标准,5.3.1一元运算符(P7):

一元+运算符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值.对整数或枚举操作数执行整体提升.结果的类型是提升的操作数的类型.

一元+形式(+s)强制将操作数计算为数字或指针.

有关更多信息,请参阅此堆栈溢出答案.