博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ if
阅读量:6159 次
发布时间:2019-06-21

本文共 2665 字,大约阅读时间需要 8 分钟。

C语言时代,for语句引入了初始化器,代码如下:

for(int i=0;i<100;++){    printf("i=%d", i );}

这是个很大的进步,i的作用域被限定在for循环内部。

但是if语句就没有类似语法,C++98代码要做很烦人的处理,如下:

#include 
#include
using namespace std;int main(){ string a = "Hello World. C++"; const auto it = a.find("Hello"); if (it != string::npos) cout << it << " Hello\n"; const auto it2 = a.find("World"); if (it2 != string::npos) cout << it2 << " World\n"; const auto it3 = a.find("C++"); if (it3 != string::npos) cout << it3 << " C++\n";}

这种风格的代码见的太多了。程序员心底里最害怕的是,因为拷贝粘贴,应该写it3的地方,被错写成it2或it1。

如果想用一个变量名字,这里是行不通的,因为const变量不能被再次赋值。所以我们想了个好招,代码如下:

int main(){    string a = "Hello World. C++";    {        const auto it = a.find("Hello");        if (it != string::npos)            cout << it << " Hello\n";     }    {        const auto it = a.find("World");        if (it != string::npos)            cout << it << " World\n";    }    {        const auto it = a.find("C++");        if (it != string::npos)            cout << it << " C++\n";    }}

拷贝粘贴能愉快的进行了,不怕it名字漏改了,但是这段代码是多么别扭,凭空出现一堆大括号呢。为此,C++17引入if的初始化:

int main(){    string a = "Hello World. C++";        if (const auto it = a.find("Hello"); it != string::npos)        cout << it << " Hello\n";    if (const auto it = a.find("World"); it != string::npos)        cout << it << " World\n";            if (const auto it = a.find("C++"); it != string::npos)        cout << it << " C++\n";}

注意,初始化器后面是分号;结束。

int main(){    int i = 0;    if ( i=1, i>0 ) {  //ok 逗号表达式        //...    }    if (int i = 1, i>0) {  //error 编译错误,逗号表达式中不能定义变量        //...    }    if (int i = 1; i > 0) {  //ok C++17 if init        //...    }}

应用例子:自动锁

if (std::lock_guard
lk(mx_); v.empty()) { v.push_back(kInitialValue);}

考虑对std::map的insert操作,代码如下:

int main(){    map
myMap = { { 1,"hello" },{ 2, "world" } }; auto pp = make_pair(3, "C++"); std::pair< std::map
::iterator, bool > result = myMap.insert(pp); if (result.second) { cout << "insert ok. current position=" << result.first->first << "\n"; } else { cout << "insert fail!" << "\n"; }}

result.first->first是什么鬼?代码无比繁琐。C++17简化代码如下:

int main(){    map
myMap = { { 1,"hello" },{ 2, "world" } }; auto pp = make_pair(3, "C++"); if ( const auto[iter, inserted] = myMap.insert( pp ); inserted ) cout << "insert ok. current position=" << iter->first << "\n"; else cout << "insert fail! conflict position=" << iter->first << "\n"; }}

inserted对应一个bool变量,iter对应一个迭代器。这样就避免了上述pair套迭代器,迭代器解引用成另一个pair的繁琐思路。

转载于:https://www.cnblogs.com/thomas76/p/8523339.html

你可能感兴趣的文章
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>
Yii2单元测试初探
查看>>
五、字典
查看>>
前端js之JavaScript
查看>>
Log4J日志配置详解
查看>>
实验7 BindService模拟通信
查看>>
scanf
查看>>
Socket编程注意接收缓冲区大小
查看>>
SpringMVC初写(五)拦截器
查看>>
检测oracle数据库坏块的方法
查看>>
SQL server 安装教程
查看>>
Linux下ftp和ssh详解
查看>>
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
查看>>
js时间和时间戳之间如何转换(汇总)
查看>>
js插件---图片懒加载echo.js结合 Amaze UI ScrollSpy 使用
查看>>