为何这段含多余分号的C++代码能通过编译检查?
为何这段含多余分号的C++代码能通过编译检查?
嗨,这个问题挺有意思的!咱们先把你的代码格式化清楚,方便分析:
#include <iostream> int main() { std::string msg; msg += std::string("15") + "nm"; +" <= " + std::string("limit"); }
你困惑的点在于第二行那个看起来“多余”的语句对吧?其实它在C++语法里完全合法,编译器没理由报错,咱们拆成两步看:
一元正号运算符的作用
开头的+" <= "里,+是一元正号运算符,它作用在字符串字面量" <= "上——而字符串字面量的本质是const char*类型的指针。对于指针类型来说,一元正号啥也不做,只是原封不动返回指针本身,这是C++标准允许的操作,语法完全合规。合法的表达式语句
接下来+" <= "返回的const char*,和后面的std::string("limit")做+运算:因为C++里std::string重载了operator+,可以把const char*隐式转换成std::string再做拼接,最终会生成一个临时的std::string对象。虽然这个临时对象没有被赋值给任何变量、也没有参与其他操作,最后直接被销毁了,但C++标准允许这种“无副作用的表达式语句”存在——编译器默认不会因为这个报错,不过如果你开启更高等级的警告(比如GCC的
-Wall -Wunused-value,或者MSVC的/W4),编译器就会提醒你这里有个没用的表达式。
简单来说,你不小心加的分号把原本连续的语句拆成了两个独立的合法语句,第二个语句虽然没用,但语法上完全没问题,所以编译器就直接通过啦~
内容来源于stack exchange




