C++ do-while循环}前放标签为何报expected primary expression错误
C++ do-while循环中标签直接置于闭合大括号前报错的原因
核心原因
C语法明确规定:**标签(label)本身不是独立的语法单元,只能作为语句的前缀存在,标签后面必须紧跟一个合法的C语句**,不允许标签后直接跟块结束标记}。
报错场景分析
对应问题中的报错写法,标签label直接放在do块的闭合}前时:
do{ if(x==2) goto label; printf("%d", x); label: }while(--x);
此时标签label后面没有任何合法语句,直接接块结束标记},不符合语法要求,编译器就会抛出expected primary-expression before ‘}’ token的错误,提示需要在}前提供一个合法的表达式/语句作为标签的修饰对象。
示例中空语句的作用
代码中加在标签后的单独分号;是C++中的空语句,本身就是合法的语句类型,刚好满足标签后必须跟语句的要求,所以编译可以正常通过。
除了空语句之外,也可以用其他无副作用的合法语句替代,比如空块{},只是单独分号的写法最简洁通用。
补充说明
这个语法规则是全局通用的,并非do-while循环独有:任何场景下把标签直接放在块结束标记}前,都会触发相同的编译错误。
内容的提问来源于stack exchange,提问作者Sadeesh Kalhara
相关产品推荐
相关产品推荐

