初始化语句
背景
c++17在初始化语句这块,有一些调整,还是蛮有意思的。
示例一(旧语法)
我们将input字符转换为小写字符lower,然后使用转换结果检查输入是否为一个字符,如果是,就生成一些输出。
(这里是为了举例,所以不考虑本应该使用可移植的std::isalpha()函数。
1 | auto lower {static_cast<char>(std::tolower(input))}; |
可以看到,lower变量只在if语句中使用,之后的任何代码都不再使用该变量。
示例二(旧语法)
一般来说,将变量的作用域限制到使用它们的区域,被认为是一种良好的编程风格,即使这意味着要像下面这样添加额外的作用域:
1 | { |
这么做的结果是,对于剩余的代码来说,是lower变量从未存在过。
引入一个额外的作用域(和缩进)来将局部变量绑定到if语句,这种模式相当常见。
示例三(c++17新语法)
c++17引入了一种新语法。这种语法的一般形式如下所示:
1 | if(initialization; condition) ... |
为了完整起见,c++17还为switch语句添加了一种类似的语法:
1 | switch(initialization; condition) ... |
此时,重写前面的示例为如下语句:
1 | if(auto lower{static_cast<char>(std::tolower(input))}; lower >= 'a' && lower <= 'z') { |
注意
这些扩展的if和switch语句仍然是新鲜出炉的,还没有被C++开发人员所熟知,而使用陌生的语法可能会影响代码的可读性。
因此,如果在一支团队里工作,则应该先与同事进行确认,然后再决定是否想要在代码中使用这种语法。
另一方法,如果没有引领趋势的人使用新的语法,新的语法又怎么能够被人接受?