if-else的语法糖

初试#

#include <iostream>
#include <string>

static int s_Level = 12;
static int s_Speed = 2;

int main()
{

	if (s_Level > 5)
		s_Speed = 10;
	else
	{
		s_Speed = 5;
	}

	s_Speed = s_Level > 5 ? 10 : 5;
	//嵌套
	// 
	//s_Level > 5 && s_Level < 100 这个会先被连接在一起判断
	s_Speed = s_Level > 5 && s_Level < 100 ? s_Level > 10 ? 15 : 10 : 5;

	//如果>5的情况下,如果还>10,则15,如果不大于10则10;否则(不
	//>5),则5
	s_Speed = s_Level > 5 ? s_Level > 10 ? 15 : 10 : 5;


	//方式1:这里没有多构造空对象其实和编译器有关,后面会说到
	std::string rank = s_Level > 10 ? "Master" : "Beginer";

	//方式2:这种声明方式,还会比上面额外多构造一个空字符串对象
	std::string otherRank;
	if (s_Level > 10)
		otherRank = "Master";
	else
		otherRank = "Beginer";

	std::cout << s_Speed << std::endl; //15

	std::cin.get();
}

解释一下方式2#

编译器并不会先创建一个临时的 std::string 之后再拷贝给 rank。它的执行逻辑如下:

  • 确定目标:编译器知道它正在为一个名为 rank 的新变量分配空间。
  • 求值:计算三元运算符的结果。结果是一个字符串字面量(const char*)。
  • 就地构造:编译器直接调用 std::string(const char*) 构造函数,将 rank 的内存空间作为操作目标。