当前位置: 首页 > 知识库问答 >
问题:

int a[]={1,2,};允许奇怪的逗号。有什么特别的原因吗?

周麒
2023-03-14

也许我不是来自这个星球,但在我看来,下面的应该是一个语法错误:

int a[] = {1,2,}; //extra comma in the end

但事实并非如此。当这段代码在Visual Studio上编译时我感到很惊讶,但是我已经学会了就C++规则而言不信任MSVC编译器,所以我检查了标准,它也是标准允许的。如果你不相信我,你可以看8.5.1的语法规则。

为什么允许这样做?这可能是一个愚蠢无用的问题,但我想让你明白我为什么要问。如果这是一个通用语法规则的子例,我会理解的--他们决定不让通用语法变得更困难,只是在初始值列表的末尾不允许一个多余的逗号。但不是,则显式允许附加逗号。例如,不允许在函数调用参数列表的末尾有多余的逗号(当函数使用...),这是正常的。

那么,再一次,有什么特别的原因明确允许这个多余的逗号吗?

共有2个答案

魏元白
2023-03-14

这样做很有用:

int a[] = {
  1,
  2,
  3, //You can delete this line and it's still valid
};
司徒俊健
2023-03-14

它使生成源代码变得更加容易,也使编写以后可以轻松扩展的代码变得更加容易。考虑添加额外条目所需的条件:

int a[] = {
   1,
   2,
   3
};

...您必须在现有行中添加逗号并添加新行。把它和三个字母后面已经有逗号的情况比较一下,你只需要加一行就可以了。同样,如果您想删除一行,您可以这样做,而不必担心它是否是最后一行,您也可以重新排列行,而不必摆弄逗号。基本上这意味着你对待线条的方式是一致的。

现在考虑生成代码。类似于(伪代码):

output("int a[] = {");
for (int i = 0; i < items.length; i++) {
    output("%s, ", items[i]);
}
output("};");

不需要担心当前写出的项目是第一个还是最后一个。简单多了。

 类似资料:
  • 问题内容: 我对这些语言(Java,C …)感到好奇,它们忽略了模运算的数学定义。 在模块操作中返回负值的意义是什么(根据定义,应该始终返回正数)? 问题答案: 我怀疑其余运算符是否故意设计为具有这些语义,我同意这不是很有用。(您是否曾经编写过一个日历程序,以显示时代之前的工作日为星期日,反星期六,反星期五,…,反星期一?) 相反,负余数是定义整数除法的副作用。 如果定义为,则得到C的运算符。如果

  • 问题内容: 在Java 8中,我可以轻松地编写: 我将获得在类中也可以使用的完整同步语义。但是,我不能在方法声明上使用修饰符: 现在,可以争论说这两个接口的行为方式相同,只是在on 和on上建立了一个 契约 ,这比 契约 要强一点。当然,我们也可能会争辩说,实现不应对具体的实现状态做出任何假设,或者这样的关键字根本无法发挥作用。 题: JSR-335专家组决定不支持接口方法的原因是什么? 问题答案

  • 我在系统的分号后面加了一个分号。出来打印ln: 这对Java编译器来说是合法的,所以我检查了其他语句,它们也都是合法的。所以当我搜索并找到这些链接时: > 为什么Java在语句末尾不显示双分号错误? 当我用两个分号结束一行时,编译器并没有抱怨。为什么? 什么时候在方法结束括号后面加上分号? 为什么使用连续分号的代码会编译? “if”语句末尾的分号 我开始明白一个额外的分号意味着一个额外的空语句。

  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队