C++:int x[+30] 是一个有效的声明吗?

5

最近我一直在学习数组。我发现在声明一个数组并初始化其元素时,有以下方式:

int x[+30];
x[+1]=0;

这让我有些困惑。我理解的概念是,当我们编写代码时,如下所示:

x[n]=0;

那么它的意思是:
*(x+n)=0;

x[+1] 的意思是 *(x++1),但这似乎是无效的。请纠正我对这个概念理解上的错误。


1
注意,*(x++1) 是无效的,因为 ++ 是一个增量操作符,表达式解析为 *((x++)1) - Yuriy Orlov
@utkarsh867:明确指定数组容量为正数有什么用处? - rahul.deshmukhpatil
2
请注意,*(x + + 1)是有效的。这里的重要规则是转换在标记级别上进行,而不是在字符级别上进行。 - MSalters
正如我在答案中所解释的那样,多余的 + 只是充当一元 + 运算符。 - Xirema
@xirema:抱歉,我想说的是,在定义时,数组容量始终为正。 - rahul.deshmukhpatil
2个回答

10
x[n] 表示 *((x)+(n)) (注意方括号),x[+1] 表示 *((x)+(+1))。这是有效的。
参考N3337 5.2.1 下标运算符。

表达式 E1[E2] 的含义(按照定义)等价于 *((E1)+(E2))


2
非常好的黑色毛毯。我差点就买了同款。 - erip
非常感谢 @MikeCAT。 - utkarsh867

7
+符号可以充当一元运算符。它通常没有影响,但其结果是在解析数字之前被移除。例如:
int x[+30];

被转换为

int x[operator+(30)];

然后变成

int x[30];

因此,这个表达式
x[+1] = 0;

只需简单地解决即可转化为。
x[1] = 0;

它不会解析为 *(x++1),尤其是因为在c++中这不是有效的语法。


1
我认为一元加号不会被转换为operator+用于int参数,它是一个内置运算符。 - TartanLlama
@TartanLlama 在所有意义上,它都被视为这样。您可以编写像 int n = 8 + +9; 这样的表达式,编译器将接受并将其解析为 8 + 9 - Xirema
1
但这与operator+无关,只有在参数是类或枚举类型时才考虑operator++运算符与operator+不是同一回事。 - TartanLlama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接