我看到了一种奇怪的程序here。
int main()
{
int s[]={3,6,9,12,18};
int* p=+s;
}
以上程序在 GCC 和 Clang 编译器上进行测试,并在两个编译器上正常运行。
我很想知道,int* p=+s;
做了什么?
数组s
是否已衰减为指针类型?
答案 0 :(得分:62)
内置operator+
可以将指针类型作为其操作数,因此将数组s
传递给它会导致array-to-pointer conversion,然后返回指针int*
。这意味着您可以单独使用+s
来获取指针。 (对于这种情况,它是多余的;没有operator+
它也会衰减到指针,然后分配给p
。)
(强调我的)
内置的一元加运算符返回其操作数的值。它不是no-op的唯一情况是当操作数具有整数类型或未整合的枚举类型时,它由整数提升改变,例如,它将char转换为int或者如果操作数受到左值到右值的影响, 数组到指针,或函数到指针的转换。
答案 1 :(得分:24)
测试一下:
#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) ) ;
}
在我的电脑(Ubuntu x86-64)上打印:
sizeof(s): 12, sizeof(+s) : 8
,其中
12 = number of elements s times size of char, or size of whole array
8 = size of pointer
答案 2 :(得分:11)
这是一个一元加号,在这里没有实际效果。例如:
#include <iostream>
int main() {
int a[] = {1};
std::cout << a << " " << +a << std::endl;
}
这会为a
和+a
打印相同的地址。数组像往常一样衰减到指针。
请注意,如果它是一元减去-a
而不是GCC会显示错误:
error: wrong type argument to unary minus
编辑:虽然它对OP的代码没有影响,但a
和+a
并不完全相同。有关详细信息,请参阅Khurshid Normuradov和songyuanyao的答案。
答案 3 :(得分:10)
数组
Missing return in a function expected to return 'Int'
是否已衰减为指针类型?
是强>
s
做了什么?
一元int* p=+s;
运算符强制数组衰减为指针。
C ++标准版,5.3.1一元运算符(P7):
一元+运算符的操作数应具有算术,无范围 枚举,或指针类型,结果是的值 论点。整体推广是针对整体或枚举进行的 操作数。结果的类型是提升的操作数的类型。
一元+
形式+
强制将操作数计算为数字或指针。
有关详细信息,请参阅此stack overflow answer。
答案 4 :(得分:0)
这里的一元 + 只是让* 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指向数组 起始地址。