为什么 C++ 不喜欢这种字符串语法?

LIT*_*LIT 0 c++ string resize assign

name_abbreviation = name_last.resize(2);
Run Code Online (Sandbox Code Playgroud)

这里我要先赋值

name_abbreviation = name_last;
Run Code Online (Sandbox Code Playgroud)

然后

name_abbreviation.resize(2);
Run Code Online (Sandbox Code Playgroud)

想请教您能否解释一下为什么其他方式不起作用?

Sla*_*ica 5

因为由于运算符优先,这段代码:

name_abbreviation = name_last.resize(2);
Run Code Online (Sandbox Code Playgroud)

等于:

name_abbreviation = (name_last.resize(2));
Run Code Online (Sandbox Code Playgroud)

并且在逻辑上等于:

auto tmp = name_last.resize(2);
name_abbreviation = tmp;
Run Code Online (Sandbox Code Playgroud)

这是不可编译的,因为std::string::resize()什么都不返回,即使它会编译它也不会做你想要的。

你想做的事情可以通过以下方式实现:

(name_abbreviation = name_last).resize(2);
Run Code Online (Sandbox Code Playgroud)

但这不是很可读的代码。我个人更喜欢 2 个单独的陈述。

请注意,可以通过更简单的代码实现相同的结果:

name_abbreviation = name_last.substr( 0, 2 );
Run Code Online (Sandbox Code Playgroud)

这在某些实现上也可以更有效。

  • @LIT这是微优化,很少引人注目 - 但如果你处理大量的大字符串,那就太好了。如果您不确定至少有 2 个字符,您可以执行 `name_abbreviation = std::string(name_last.begin(), name_last.begin() + std::min(name_last.size(), static_cast<size_t> (2)));`。请注意,结果最多为 2 个字符,但如果原始内容较短,则结果也会更短。如果在构造时执行此操作,速度会更快: `std::string name_abbreviation(name_last.begin(), name_last.begin() + std::min(name_last.size(), static_cast<size_t>(2) ));` (2认同)