C++数组定义的下限和上限是什么?

4
我的女儿的12年级C ++教科书说:
"数组的符号表示法也可以如下给出:Array name [lower bound L, upper bound U]”。
这令我惊讶。 我知道Pascal有这种表示法,但是C ++吗? 以前从未见过这个。 我在她规定的编译器(古老的Turbo C ++ 4.5)中编写了一个快速程序,该程序不支持它。 Stanley Lippman的书中也没有找到此语法。 互联网搜索也没有找到。 或者可能是我没有正确搜索?
因此,这是有效声明吗?

2
PL/1可以做到这一点,但C++不行。 - stark
4
至少自1998年以来,任何标准中都已经不是这种情况。学习一个20年前的生僻方言是一种巨大的时间和精力浪费;我会把那本教材(和编译器)扔掉,然后去购买这些和最近的GCC或Clang版本。 - Mike Seymour
1
呃,如果她的学校在使用 Turbo C++ 的话,建议换一所学校。 - crashmstr
请注意 "Array name[...]" 中的大写字母 A。我怀疑书中其他地方指定了一个 Array 类。没有书名,我们只能猜测。一些类确实会重载逗号运算符,比如 Boost lambdas,但对于一个数组类(特别是用于教育目的),这似乎不可取。 - Jonny D
2个回答

3

这是不合法的,根据C++标准草案8.3.4数组,声明必须采用以下格式:

D1 [ 常量表达式opt] 属性说明符序列opt

我们可以从第5.19常量表达式中了解到常量表达式的语法:

constant-expression:
   conditional-expression

这个语法不允许我们使用逗号运算符,也不能像这样做:

int a[ 1, 2 ] ;
        ^

正如其他人所暗示的那样,从条件表达式逗号运算符没有路径。但是如果加上括号,我们可以到达逗号运算符,因为条件表达式允许我们到达基本表达式,从而得到(),因此以下内容是有效的:

int a[ (1, 2) ] ;
       ^   ^

请注意,在C++03中,您明确禁止在常量表达式中使用逗号运算符。

虽然可以在访问数组时使用它。这应该足够有趣了。 - Deduplicator

3
不,这不是真的,除非有人重载了逗号运算符,可能还包括[],但这种情况非常不可能。(Boost Spirit做到了这两点,但出于非常不同的原因)。
如果没有任何重载,Array[x,y]在语法上是无效的,因为大小必须是一个常量表达式,而这些表达式不能包含逗号运算符;否则它将成为一个赋值表达式。
烧掉这本书,把Stroustrup放在她的圣诞袜里!

2
不,像 Array[x,y] 这样的语法是无效的,因为大小必须是一个 常量表达式,它不能包含逗号运算符(因为这会使它成为一个 赋值表达式)。 - Mike Seymour
@MikeSeymour:Mike,你说得很好。如果你不介意的话,我已经把它融入到答案中了。 - Bathsheba

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