C++ Attentions

1. switch内部的变量定义

C++语言规定,不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。

#include <iostream>

int main()
{
	bool switch_on = false;

	switch (switch_on)
	{
	case true:
		int j;
		j = 110;
		std::cout << j << std::endl;// 运行此句必须有上面j=110的初始化
		break;
	case false:
		j = 120;
		std::cout << j << std::endl;// 运行此句必须有上面j=120的初始化,跟上一个case中有没有执行j=110的初始化没关系
		break;
	default:
		break;
	}
}

下面的写法是错误的,
错误形式一:

#include <iostream>

int main()
{
	bool switch_on = false;

	switch (switch_on)
	{
	case true:
		int j;
		//j = 110;
		std::cout << j << std::endl;
		break;
	case false:
		//j = 120;
		std::cout << j << std::endl;
		break;
	default:
		break;
	}
}

报错会是:
错误 2 error C4700: 使用了未初始化的局部变量“j”
错误形式二:

#include <iostream>
#include <string>
int main()
{
	bool switch_on = false;

	switch (switch_on)
	{
	case true:
		int j = 110;  // 错误,控制流绕过一个显式初始化的变量
		std::cout << j << std::endl;
		std::string file_name; // 错误,控制流绕过一个隐式初始化的变量
		break;
	case false:
		//j = 120;
		//std::cout << j << std::endl;
		break;
	default:
		break;
	}
}

报错会是:

错误	1	error C2360: “j”的初始化操作由“case”标签跳过
错误	2	error C2361: “default”标签跳过“j”的初始化操作
2. 范围for语句

范围for语句的语法形式是:

for (declaration: expression)
    statement

expression表示的必须是一个序列,比如初始值列表、数组、vector、string等类型的对象,这些类型的共同特点是拥有能返回迭代器的beginend成员。
例如:

#include <iostream>
#include <typeinfo>
int main()
{
	auto alist = { 1, 2, 3, 4 };  // 类型是:class std::initializer_list<int>

	std::cout << typeid(alist).name() << std::endl; //输出class std::initializer_list<int>

	for (auto it : alist) // 如果想要修改alist的元素,可使用&it,然后再循环体中对it进行操作即可
	{
		std::cout << it << std::endl;
	}
	system("pause");
}

不能通过范围for循环增加、删除容器的元素,原因如下:

ellipse
图1 容器操作可能使迭代器失效
3. 声明一个返回数组指针的函数
ellipse
图2函数返回数组指针
举例说明: 方法一:
#include <iostream>

int garr[10] = { 0 };

int (*func(int a))[10] {
    for (auto &it : garr) {
        it += a;
    }
    return &garr;
}

int main(){
    int a = 2;
    int (*it)[10] = func(a);
    for (int i = 0; i !=10; ++i ) {
        std::cout << (*it)[i] << "  ";
    }
    std::cout << std::endl;
}

方法二:

#include <iostream>

using arrT = int[10];
arrT garr = { 0 };
arrT* func(int a) {
    for (auto &it : garr) {
        it += a;
    }
return &garr;
}

int main() {
    int a = 2;
    arrT *it = func(a);
    for (int i = 0; i != 10; ++i) {
        std::cout << (*it)[i] << "  ";
    }
    std::cout << std::endl;
}

方法三:使用尾置返回类型

ellipse
图3使用尾置返回类型
#include <iostream>

int garr[10] = {0};

auto func(int i) ->int(*)[10]{
	for (int & it : garr){
		it += i;
	}
	return &garr;
}

int main(){
	int i = 2;
	auto result = func(i);
	for (int j = 0; j != 10; ++j){
		std::cout << (*result)[j] << " ";
	}
	std::cout << std::endl;
}

方法一、方法二、方法三输出的结果都是:2 2 2 2 2 2 2 2 2 2

方法四:使用decltype

ellipse
图4使用decltype
#include <iostream>

int garr_odd[] = {1,3,5};
int garr_even[] = {2,4,6};

decltype(garr_odd) *func(int i){
	return (i % 2 == 0 ? &garr_even : &garr_odd);
}

int main(){
	int i = 3;
	auto result = func(i);
	for (int j = 0; j != 3; ++j){
		std::cout << (*result)[j] << " ";
	}
	std::cout << std::endl;
}

输出结果是:1 3 5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值