首页 文章 精选 留言 我的

精选列表

搜索[思考控制],共10005篇文章
优秀的个人博客,低调大师

C++ 枚举类型的思考

C++ 中的枚举类型继承于 C 语言。就像其他从 C 语言继承过来的很多特性一样,C++ 枚举也有缺点,这其中最显著的莫过于作用域问题——在枚举类型中定义的常量,属于定义枚举的作用域,而不属于这个枚举类型。例如下面的示例: enum FileAccess { Read = 0x1, Write = 0x2, }; FileAccess access = ::Read; // 正确 FileAccess access = FileAccess::Read; // 错误 C++枚举的这个特点对于习惯面向对象和作用域概念的人来说是不可接受的。首先,FileAccess::Read 显然更加符合程序员的直觉,因为上面的枚举定义理应等价于如下的定义(实际上,.NET 中的枚举类型便是如此实现的): class FileAccess { static const int Read = 0x1; static const int Write = 0x2; }; 其次,这导致我们无法在同一个作用域中定义两个同样名称的枚举值。也就是说,以下的代码是编译错误: enum FileAccess { Read = 0x1, Write = 0x2, }; enum FileShare { Read = 0x1, // 重定义 Write = 0x2, // 重定义 }; 如果这一点没有让你恼怒过的话,你可能还没写过多少 C++ 代码 :-)。实际上,在最新的 C++0x 标准草案中有关于枚举作用域问题的提案,但最终的解决方案会是怎样的就无法未卜先知了,毕竟对于象 C++ 这样使用广泛的语言来说,任何特性的增删和修改都必须十分小心谨慎。 当然,我们可以使用一些迂回的方法来解决这个问题(C++ 总是能给我们很多惊喜和意外)。例如,我们可以把枚举值放在一个结构里,并使用运算符重载来逼近枚举的特性: struct FileAccess { enum __Enum { Read = 0x1, Write = 0x2 }; __Enum _value; // 枚举值 FileAccess(int value = 0) : _value((__Enum)value) {} FileAccess& operator=(int value) { this->_value = (__Enum)value; return *this; } operator int() const { return this->_value; } }; 我们现在可以按照希望的方式使用这个枚举类型: FileAccess access = FileAccess::Read; 并且,因为我们提供了到 int 类型的转换运算符,因此在需要 int 的地方都可以使用它,例如 switch 语句: switch (access) { case FileAccess::Read: break; case FileAccess::Write: break; } 当然我们不愿意每次都手工编写这样的结构。通过使用宏,我们可以很容易做到这一点: #define DECLARE_ENUM(E) \ struct E \ { \ public: \ E(int value = 0) : _value((__Enum)value) { \ } \ E& operator=(int value) { \ this->_value = (__Enum)value; \ return *this; \ } \ operator int() const { \ return this->_value; \ } \ \ enum __Enum { #define END_ENUM() \ }; \ \ private: \ __Enum _value; \ }; 我们现在可以按如下的方式定义前面的枚举,并且不比直接写 enum 复杂多少。 DECLARE_ENUM(FileAccess) Read = 0x1, Write = 0x2, END_ENUM() DECLARE_ENUM(FileShare) Read = 0x1, Write = 0x2, END_ENUM() ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/03/19/2405456.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

云计算热的深思考

自2015年下半年开始,全球云计算市场所爆发出的强劲增长势头令人惊艳。微软、亚马逊、谷歌等科技巨头的最新财报显示,云计算业务已成为稳定的增长点。微软方面,云服务已经超越了Windows业务成为其主要营收来源;亚马逊方面,云服务是其最赚钱的业务,第三季度营业收入8.61亿美元,同比增长超50%,利润率稳定在26%;谷歌方面,非广告营收的增长主要来自于云业务的贡献。国内企业中,阿里巴巴的最新财报显示,阿里云的业绩非常耀眼,营收达到14.93亿元,同比增长130%,连续第六个季度增幅领跑全球。 来自工信部的数据显示,2015年中国云计算产业规模约为1500亿元,年增长率超过30%,是全球增速最快的市场之一。在《国务院关于促进云计算创新发展培育信息产业新业态的意见》《云计算综合标准化体系建设指南》等政策利好刺激下,我国云计算产业进入了应用迅速普及阶段,在促进互联网和实体经济深度融合发展,以信息流带动技术流、资金流、人才流、物资流,调整产业结构、转变经济发展方式等方面,发挥了积极的作用。 近年来各地云计算中心蓬勃发展,据不完全统计,全国共有20多个省区市提出了要打造云计算产业园区。但一个值得警惕的倾向是:重设施、轻应用,不少云计算产业基地缺乏实质性的应用服务,只能靠出租硬盘空间为主业,甚至打起了价格战。发展云计算产业,不应仅仅停留于硬件建设层面;如果没有针对各个行业用户推出的精准化服务,空有设备而没有真正的应用落地,将导致产业虚火上升。 发展云计算产业,首先要因地制宜。拿呼和浩特来说,其自然条件就非常适宜。年平均气温8摄氏度,一年有6个月时间能够使用自然源进行数据中心设备冷却,有利于降低运营成本。同时电力资源丰富且保障充足,电价可享受每千瓦时0.26元的优惠,形成了极具竞争力的综合成本优势。 其次,要积极探索开展行业应用,推动云计算与大数据的深度融合。推动云计算为代表的新一代信息技术和现代制造业的深度融合,积极培育形成新业态、新模式。呼和浩特云计算产业园区已吸引了三大电信运营商、阿里巴巴、腾讯、百度、浪潮等一批知名云计算企业入驻,在智慧城市、电子商务、信息惠民、畜牧大宗商品、乳业、电力、电商物流等领域开展了大数据深度应用的实践探索。 再者,要加快突破核心技术,构建高水平云计算服务平台。“云计算+大数据+人工智能”三位一体的定位已经非常清晰,机器学习、深度学习等人工智能算法的云端化成为行业发展的必然趋势。如果说云计算的1.0主打分布式的计算资源,那么2.0就是出租人工智能驱动的计算资源,数据、算法、计算资源缺一不可。 尽管云计算产业在我国发展很快,但从产业规模看,我国占全球云计算市场的份额仍不到5%;从服务能力看,我国云计算企业规模普遍较小,提供的服务种类有限,一些关键行业尚没有成熟的云计算解决方案。10月8日,国家批复在内蒙古推进国家大数据综合试验区,内蒙古发展云计算大数据产业可谓正逢其时。只要先行者创新各种新技术、新应用、新模式,在现代制造业特别是工业云、智能制造、工业互联网和工业大数据等方面重点投入,发挥政府引导作用,相信会给云计算大数据产业健康有序发展提供更好的范本。 本文作者:佚名 来源:51CTO

优秀的个人博客,低调大师

groovy–流程控制

在本篇文章中,我们将介绍逻辑分支,循环,以及如何从if-else以及try-catch代码块中返回值。 if – else Groovy 支持Java传统的if-else语法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def x = false def y = false if ( !x ) { x = true } assert x == true if ( x ) { x = false } else { y = true } assert x == y Groovy 也支持Java传统的if-else if -else 语法: 1 if( ... ) { 2 ... 3 }elseif(...) { 4 ... 5 }else{ 6 ... 7 } 三元操作符 Groovy 也支持Java传统的三元操作符: 1 defy =5 2 defx = (y >1) ?"worked":"failed" 3 assertx =="worked" switch Groovy也支持switch语句,不过和java的switch语句还是有很大的区别的: 1 defx =1.23 2 defresult ="" 3 4 switch( x ) { 5 case"foo": 6 result ="found foo" 7 // lets fall through 8 9 case"bar": 10 result +="bar" 11 12 case[4,5,6,'inList']: 13 result ="list" 14 break 15 16 case12..30: 17 result ="range" 18 break 19 20 caseInteger: 21 result ="integer" 22 break 23 24 caseNumber: 25 result ="number" 26 break 27 28 default: 29 result ="default" 30 } 31 32 assertresult =="number" 从上面的例子可以看出switch ( x )中的x可以使用任何类型的值,而且下面的匹配值也可以使用任何的类型。 循环 Groovy也支持Java传统的while循环语法: 1 defx =0 2 defy =5 3 4 while( y-- >0) { 5 x++ 6 } 7 8 assertx ==5 for循环 在Groovy中,for循环更加的简单,而且如果你愿意的话,你也可以在Groovy中使用标准的C/Java的for循环语法。 1 for (inti =0; i <5; i++) { 2 } 3 4 // iterate over a range 5 defx =0 6 for ( iin0..9) { 7 x += i 8 } 9 assertx ==45 10 11 // iterate over a list 12 x =0 13 for ( iin[0,1,2,3,4] ) { 14 x += i 15 } 16 assertx ==10 17 18 // iterate over an array 19 array = (0..4).toArray() 20 x =0 21 for ( iinarray ) { 22 x += i 23 } 24 assertx ==10 25 26 // iterate over a map 27 defmap = ['abc':1,'def':2,'xyz':3] 28 x =0 29 for ( einmap ) { 30 x += e.value 31 } 32 assertx ==6 33 34 // iterate over values in a map 35 x =0 36 for ( vinmap.values() ) { 37 x += v 38 } 39 assertx ==6 40 41 // iterate over the characters in a string 42 deftext ="abc" 43 deflist = [] 44 for (cintext) { 45 list.add(c) 46 } 47 assertlist == ["a","b","c"] 闭包(closures) 有时候你也可以使用闭包的each()和eachWithIndex()方法来替换一些for循环代码。 1 defstringList = ["java","perl","python","ruby","c#","cobol", 2 "groovy","jython","smalltalk","prolog","m","yacc"]; 3 4 defstringMap = ["Su":"Sunday","Mo":"Monday","Tu":"Tuesday", 5 "We":"Wednesday","Th":"Thursday","Fr":"Friday", 6 "Sa":"Saturday"]; 7 8 stringList.each() {print" ${it}"};println""; 9 // java perl python ruby c# cobol groovy jython smalltalk prolog m yacc 10 11 stringMap.each() { key, value ->println"${key} == ${value}"}; 12 // Su == Sunday 13 // We == Wednesday 14 // Mo == Monday 15 // Sa == Saturday 16 // Th == Thursday 17 // Tu == Tuesday 18 // Fr == Friday 19 20 stringList.eachWithIndex() { obj, i ->println" ${i}: ${obj}"}; 21 // 0: java 22 // 1: perl 23 // 2: python 24 // 3: ruby 25 // 4: c# 26 // 5: cobol 27 // 6: groovy 28 // 7: jython 29 // 8: smalltalk 30 // 9: prolog 31 // 10: m 32 // 11: yacc 33 34 stringMap.eachWithIndex() { obj, i ->println" ${i}: ${obj}"}; 35 // 0: Su=Sunday 36 // 1: We=Wednesday 37 // 2: Mo=Monday 38 // 3: Sa=Saturday 39 // 4: Th=Thursday 40 // 5: Tu=Tuesday 41 // 6: Fr=Friday 从if-else和try-catch代码块中返回值 从 Groovy 1.6开始,在方法或者闭包中的最后一行表达式,可以从if/else和try/catch/finally代码块中返回值,而且并不需要明确的使用return关键字返回值,只需要他们是代码块的最后一个表达式就行。 下面的例子就说明了这个情况,在下面的代码块中虽然没有显示的调用return关键字,但是仍然会返回1: 1 defmethod() { 2 if(true)1else0 3 } 4 5 assertmethod() ==1 对于 try/catch/finally blocks代码块来说,如果try代码块中没有抛出异常的话,那么try代码块的最后一行的表达式将会被返回,如果try的代码块抛出异常并且被catch住的时候,那么catch代码块中的最后一个表达式的值将会被返回。 但是请注意:finally代码块不会返回值的。 1 defmethod(bool) { 2 try{ 3 if(bool)thrownewException("foo") 4 1 5 }catch(e) { 6 2 7 }finally{ 8 3 9 } 10 } 11 12 assertmethod(false) ==1 13 assertmethod(true) ==2 ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/p/3349046.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册