07 2013 档案
摘要:其实这个问题可以从三个角度去分析:语言规范,编译器实现,CPU支持。首先从语言规范上来讲;前置++和后置++是不等价的,前置++在规范中明确指出 和+=组合操作符是等价的,但和E = E+1;这样的赋值操作不等价,因为后者对操作数E需要进行两次求值,而+=组合操作符只进行一次求值。后置++表示操作数作为结果值被获取之后操作数的 原值再进行更新。 聪明的编译器可以根据应用场景进行优化(标准不规定相关优化的手段,由编译器自决),但不能过度依赖这种优化,因为编译器还是不如人聪明,而且复杂的表达式也不一定可以优化掉。从 CPU的角度上来讲CPU支持什么样的指令集是绝对决定了相应操作符计算效率。在嵌入式
阅读全文
摘要:在写代码常常都会写char * p ="hello";这样的代码,虽然不是错误,但却不建议这样用。应该加const修饰。这句话背后的内涵是什么?下面就刨根问底一下:)这个行为在不同的c和c++的编译器上有会不同的行为,应该说char *a = "hello world";这种写法不能算错误的写法,所以c编译器不报错也不警告。早期的K&C认 为这是完全合法的,但从K&C第二版标准开始就明确指出“修改string literal的结果是未定义的,字符串并不总是可修改的,可能会放在只读内存区域“。从C89开始,这个问题有了更明确的规定。char
阅读全文
摘要:在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); ...
阅读全文
摘要:C和C++有太多的历史包袱而其它语言并没有这些,从另一个角度下来讲C和C++其实就是现代语言的活字典,也是现代软件设计的基础,当然有更古老的语言,但像C和C++影响力这么大的却无其它语言可以出其左右。C++和其它语言最大的不同在于它不属于任何人,任何公司,而Java,C#,Python,Ruby等都是由某个公司或个人控制的,在相对封闭的体系之下设计的语言很容易可以做到易用性,但灵活性和设计思想的广泛度上与C++这样的语言不可同日而语。且不说其它语言从C/C++中借鉴的大量的特性,单就语言本身能够体现的设计思想广泛性上来讲只能说其它语言只作到了”溺水三千 只取一瓢”,像C++可以支持设计风格就有
阅读全文