摘要: 其实这个问题可以从三个角度去分析:语言规范,编译器实现,CPU支持。首先从语言规范上来讲;前置++和后置++是不等价的,前置++在规范中明确指出 和+=组合操作符是等价的,但和E = E+1;这样的赋值操作不等价,因为后者对操作数E需要进行两次求值,而+=组合操作符只进行一次求值。后置++表示操作数作为结果值被获取之后操作数的 原值再进行更新。 聪明的编译器可以根据应用场景进行优化(标准不规定相关优化的手段,由编译器自决),但不能过度依赖这种优化,因为编译器还是不如人聪明,而且复杂的表达式也不一定可以优化掉。从 CPU的角度上来讲CPU支持什么样的指令集是绝对决定了相应操作符计算效率。在嵌入式 阅读全文
posted @ 2013-07-04 16:09 thinkingfor 阅读(5546) 评论(0) 推荐(1) 编辑
摘要: 在写代码常常都会写char * p ="hello";这样的代码,虽然不是错误,但却不建议这样用。应该加const修饰。这句话背后的内涵是什么?下面就刨根问底一下:)这个行为在不同的c和c++的编译器上有会不同的行为,应该说char *a = "hello world";这种写法不能算错误的写法,所以c编译器不报错也不警告。早期的K&C认 为这是完全合法的,但从K&C第二版标准开始就明确指出“修改string literal的结果是未定义的,字符串并不总是可修改的,可能会放在只读内存区域“。从C89开始,这个问题有了更明确的规定。char 阅读全文
posted @ 2013-07-03 18:39 thinkingfor 阅读(5339) 评论(0) 推荐(0) 编辑
摘要: 在chinaunix论坛上有人问到关于变量存府类型的问题,我觉得可以写个测试代码加深大家对内存使用和布局的理解。下面我把原问题及处理办法贴出来,限供大家参考。原问题:static void testB (char *src){ /* 判断传入的src 是属于 @1/2/3 ??? */ do_somthing ();}static void testA (char *src){ char *a = "hello world"; char b[100] = "hello world"; testB (a); ... 阅读全文
posted @ 2013-07-03 14:58 thinkingfor 阅读(4493) 评论(4) 推荐(1) 编辑
摘要: 其实这个问题可以从三个角度去分析:语言规范,编译器实现,CPU支持。首先从语言规范上来讲;前置++和后置++是不等价的,前置++在规范中明确指出 和+=组合操作符是等价的,但和E = E+1;这样的赋值操作不等价,因为后者对操作数E需要进行两次求值,而+=组合操作符只进行一次求值。后置++表示操作数作为结果值被获取之后操作数的 原值再进行更新。 聪明的编译器可以根据应用场景进行优化(标准不规定相关优化的手段,由编译器自决),但不能过度依赖这种优化,因为编译器还是不如人聪明,而且复杂的表达式也不一定可以优化掉。从 CPU的角度上来讲CPU支持什么样的指令集是绝对决定了相应操作符计算效率。在嵌入式 阅读全文
posted @ 2013-07-04 16:09 thinkingfor 阅读(5546) 评论(0) 推荐(1) 编辑
摘要: 在写代码常常都会写char * p ="hello";这样的代码,虽然不是错误,但却不建议这样用。应该加const修饰。这句话背后的内涵是什么?下面就刨根问底一下:)这个行为在不同的c和c++的编译器上有会不同的行为,应该说char *a = "hello world";这种写法不能算错误的写法,所以c编译器不报错也不警告。早期的K&C认 为这是完全合法的,但从K&C第二版标准开始就明确指出“修改string literal的结果是未定义的,字符串并不总是可修改的,可能会放在只读内存区域“。从C89开始,这个问题有了更明确的规定。char 阅读全文
posted @ 2013-07-03 18:39 thinkingfor 阅读(5339) 评论(0) 推荐(0) 编辑
摘要: 在chinaunix论坛上有人问到关于变量存府类型的问题,我觉得可以写个测试代码加深大家对内存使用和布局的理解。下面我把原问题及处理办法贴出来,限供大家参考。原问题:static void testB (char *src){ /* 判断传入的src 是属于 @1/2/3 ??? */ do_somthing ();}static void testA (char *src){ char *a = "hello world"; char b[100] = "hello world"; testB (a); ... 阅读全文
posted @ 2013-07-03 14:58 thinkingfor 阅读(4493) 评论(4) 推荐(1) 编辑
摘要: C和C++有太多的历史包袱而其它语言并没有这些,从另一个角度下来讲C和C++其实就是现代语言的活字典,也是现代软件设计的基础,当然有更古老的语言,但像C和C++影响力这么大的却无其它语言可以出其左右。C++和其它语言最大的不同在于它不属于任何人,任何公司,而Java,C#,Python,Ruby等都是由某个公司或个人控制的,在相对封闭的体系之下设计的语言很容易可以做到易用性,但灵活性和设计思想的广泛度上与C++这样的语言不可同日而语。且不说其它语言从C/C++中借鉴的大量的特性,单就语言本身能够体现的设计思想广泛性上来讲只能说其它语言只作到了”溺水三千 只取一瓢”,像C++可以支持设计风格就有 阅读全文
posted @ 2013-07-01 00:00 thinkingfor 阅读(1659) 评论(10) 推荐(2) 编辑
摘要: 说明: 对于比较现代的语言来讲字符编码不是个大问题:java就可以使用中文作为变量名称,但对于C/C++来讲却不是这样,由于历史原因,标准和编译器厂商的实现总在不停的变化,相关编码信息到底是如何处理的?对于想知道相关信息的新手来讲是很难从现有的书籍和资料上来找到明确的答案。针对这个问题我就自己的理解并结合相关的标准试图向读者把这个问题讲清楚,由于编译器众多,所以重点就放在对标准的解释以及相关文档的说明上,具体的实验和测试请自行操作。 标识符(Identifer)定义(C99和C++2003中的定义是一致的,C89中没有规定universal-character-name且对标识符长度有规... 阅读全文
posted @ 2013-06-29 21:37 thinkingfor 阅读(4584) 评论(0) 推荐(0) 编辑
摘要: 因为官方QQ for linux 版本只用32位,所以在64位系统上运行需要相应的库支持。Ubuntu 执行以下命令: sudo apt-get install ia32-libs ia32-libs-gtk linux32 lib32asound2CentOS 执行以下命令: sudo yum -y install glibc.i686libX11.i686 gtk2.i686 gtk2-engines.i686 libcanberra-gtk2.i686 PackageKit-gtk-module.i686从官网下载QQ解压后直接运行即可:http://im.qq.com/qq/lin.. 阅读全文
posted @ 2012-08-17 15:58 thinkingfor 阅读(361) 评论(0) 推荐(0) 编辑
摘要: 鉴于chinaunix上的一个关于IT工程师出路的贴子再次引出了"30岁“等问题。就此把自己的一些想法写出来,第一次写水贴。有人要是看着不爽那就尽情的喷吧。以下的内容有部分是我在原贴中的评论就直接引用了。原贴在http://bbs.chinaunix.net/viewthread.php?tid=1815029&page=1&extra=#pid13149922经常在各种讨论中看到说30岁之后的程... 阅读全文
posted @ 2010-11-20 23:00 thinkingfor 阅读(4526) 评论(43) 推荐(16) 编辑
摘要: 以上代码用来检测Flash是否安装,CLSIDFromProgID通过注册表来查询CLSID的值。不知何故有时注表内注册项不完整(在XP,2003中都有出现),查询得知HKEY_CLASSES_ROOT\ShockwaveFlash.ShockwaveFlash健值不存在会导致调用此API为失败并返回REGDB_E_WRITEREGDB。变通的方法可以通过CLSID检测ProgID来检查Flash... 阅读全文
posted @ 2010-11-11 17:49 thinkingfor 阅读(4047) 评论(0) 推荐(0) 编辑
摘要: 从Visual Studio 2005开始编译程序时就会遇到很多warning C4996警告。虽然没有错误但是这个警告估计还是让很多人不爽。MSDN上关于此警告有说"为了支持新的、更安全的函数,否决了某些 CRT 和标准 C++ 库函数,如果出于安全原因使用了否决的 MFC 或 ATL 函数,也可能发生 C4996"。以此为切入点来聊聊微软从Visual Studio 2005开始引入的一项针对... 阅读全文
posted @ 2010-11-11 13:44 thinkingfor 阅读(4015) 评论(0) 推荐(1) 编辑
摘要: 当WebBrowser控件(CDHtmlDialog自动创建了WebBrowser控件)加载的网页中含有错误Javascript代码时默认情况下控件会弹出错误信息提示对话框,相对于用户体验来说这样的提示完全不是开发人员想要的,针对这个问题有两个解决方案,一是完全屏蔽掉错误提示,二是控制错误的提示并且记录错误信息同时也可以控制出现错误后Javascript是否继续执行。1、屏蔽错误信息提示m_pBrowserApp->put_Silent(VARIANT_TRUE);在CDHtmlDialog::OnInitDialog()的代码中首先了创建WebBrowser控件,然后把控件的Brows 阅读全文
posted @ 2010-11-10 13:41 thinkingfor 阅读(11216) 评论(6) 推荐(4) 编辑