初始化语句

在C++17中,类似于 for 语句,在 if 和 switch 语句的判断条件之前也能加上初始化语句,语法形式如下:

if (初始化语句; 条件) 语句 else 语句
switch (初始化语句; 条件) 语句

这里的初始化语句是可选的,它可以是初始化表达式,也可以是变量声明。

// if (初始化语句; 条件) 语句 else 语句
// 相当于:
{
初始化语句;
if (条件) 语句 else 语句
}
// switch (初始化语句; 条件) 语句
// 相当于:
{
初始化语句;
switch (条件) 语句
}

示例

#include <iostream>
#include <set>
using namespace std; int main()
{
set<string> myset;
if (auto [iter, success] = myset.insert("Hello"); success)
cout << *iter << endl; // Hello
}

示例代码在 if 语句中使用结构化绑定声明了两个变量 iter 以及 success,然后把 success 作为条件进行判断。

变量声明

这是一个相对简单的新特性,需要注意的是如果 if 和 switch 语句中的初始化语句是一个变量声明,那么所声明的变量的作用域仅限于该语句以及其附属语句的范围。

#include <iostream>
using namespace std; int f() {return 1;}
int g() {return 2;}
int main()
{
if (int a = f(); a != 1) {
// 代码块A
cout << a << endl;
} else if (int b = g(); b != 2) {
// 代码块B
a += b;
cout << a << endl;
} else {
// 代码块C
a -= b;
cout << a << endl;
} switch(int c = f(); c) {
case 1:
case 2:
cout << c << endl;
break;
default:
cout << c + 1 << endl;
break;
}
} // -1
// 1

变量 a 的作用域为它所声明的 if 语句及其附属的 else 语句,包括后者所附属的 if 语句,所以它的作用域涵盖代码块 A, B, 以及C。

变量 b 的作用域为它所声明的 if 语句及其附属的 else 语句,所以它的作用域涵盖代码块 B 和 C。

变量 c 的作用域为它所声明的 switch 语句。

C++17尝鲜:在 if 和 switch 语句中进行初始化的更多相关文章

  1. C++17尝鲜:编译期 if 语句

    Constexpr If(编译期 if 语句) 以 if constexpr 打头的 if 语句被称为 Constexpr If. Constexpr If 是C++17所引入的新的语法特性.它为C+ ...

  2. C++17尝鲜

    https://cloud.tencent.com/developer/article/1351910 [译]C++17,optional, any, 和 variant 的更多细节 用户261520 ...

  3. switch语句中的选择因子

    switch语句能否用作用在byte上,能否作用在long上,能否作用在String上? switch选择语句的格式为: switch(intergral-selector){ case  integ ...

  4. 在 php 7.3 中 switch 语句中使用 continue

    在 php 7.3 中 switch 语句中使用 continue 在 php 7.3 的 switch 中使用 continue 会出现警告.1 2 3 while ($foo) { switch ...

  5. C++17尝鲜:结构化绑定声明(Structured Binding Declaration)

    结构化绑定声明 结构化绑定声明,是指在一次声明中同时引入多个变量,同时绑定初始化表达式的各个子对象的语法形式. 结构化绑定声明使用auto来声明多个变量,所有变量都必须用中括号括起来. cv-auto ...

  6. 1.3.1 switch 语句中的 String

    switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Ja ...

  7. 关于switch语句中使用String类型的实现原理

    在Java 7 以后,switch语句可以用作String类型上. 从本质来讲,switch对字符串的支持,其实也是int类型值的匹配.它的实现原理如下: 通过对case后面的String对象调用ha ...

  8. C++中switch 语句中的变量声明和

    switch 内部的变量定义: ; switch(i) { : string str; //error ; //error int val2; //right ; //right : val2 = ; ...

  9. C++17尝鲜:变长 using 声明

    using 声明 先来看 using 声明在类中的应用: 代码1 #include <iostream> using namespace std; struct A { void f(in ...

随机推荐

  1. MYSQL的空间查询(转帖)

    SELECT x(location),y(location) FROM frddata.points; 本文将向各位介绍如何使用MySql5.x中的空间数据库,并展示一下它高效的性能(前提是正确使用) ...

  2. 关于 appium get_attribute --获取对应属性值 API说明

    1.获取 content-desc 的方法为 get_attribute("name") ,而且还不能保证返回的一定是 content-desc (content-desc 为空时 ...

  3. Nginx的ip_hash指令

    ip_hash 语法:ip_hash 默认值:none 使用环境:upstream 当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服 ...

  4. 捷通华声TTS在Aster+中的安装过程

    1)挂载TTS光碟 2)安装如下5个rpm软件包 [asterisk@TTS78:/mnt]$ls *.rpmjTTS-5.0.1.0-3.i386.rpm             VocLib_Xi ...

  5. python 简单的单例模式日志模块

    # -*- coding: utf-8 -*-import logging def singleton(cls): instance = {} def _singleton(*args, **kw): ...

  6. 解析Excel数据

    解析Excel数据常用的方式就是使用POI和JXL工具了,这两种工具使用起来有些类似,这里记录一下使用方式提供个参考 POI使用 File file = new File(filePath); Fil ...

  7. 【转】SQL模糊查询

    在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,% :表示任 ...

  8. 小朋友学Python(3)

    运算符 一.基本运算符 Python运算符多数与C/C++/Java类似,但有少数不一样. “/”表示求商,“//”求商的整数部分.11 / 2 = 5.500000, 11 // 2 = 5 “** ...

  9. java在注解中绑定方法参数的解决方案

    我们有这样子的需求,需要记录用户操作某个方法的信息并记录到日志里面,例如,用户在保存和更新任务的时候,我们需要记录下用户的ip,具体是保存还是更新,调用的是哪个方法,保存和更新的任务名称以及操作是否成 ...

  10. C# 日志记录工具类--LogHelper.cs测试

    C# 日志记录工具类:(适用于不想使用log4j等第三方的Log工具的时候,希望自己写个简单类实现)LogHelper.cs内容如下: using System; using System.Diagn ...