一点点思考和借鉴

一、 隐晦的字符串的const转换。

char *p = "test";
w_char *pw = L"test";

把一个const的字符串类型转成non-const的。包括指针和数组。

二、 隐晦的类型声明。

func() {} //函数的隐晦返回类型是int
static num; //变量的隐晦类型是int
这种feature在C89中还可以使用,但在C99和C++中都被去除了。(gcc 3.4版本对于这种声明会给出编译错误,而VC++6.0会认为这是合法的程序)

三、 布尔变量的累加操作。
bool isConn = false;
isConn++; //这个操作会把isConn变为true
就目前而言,几乎所有的编译器都认可这种操作,但这种用法也是不被建议的,终有一天会被取消。

四、 更改父类成员的存取权限。

class B
{
protected:
int i;
};

class D : public B
{
public:
B::i; //这种方式可能大家很少看到。
};

对于这种语法,子类重新暴露了父类的私有成员。这会带来很大的安全性问题。目前而言,这个feature对于所有的编译器来说应该都是可以编译通过的(连个Warning都没有)。但这个feature也是要被废除的。

五、 文件中域的static声明

static int i;
static void func()

据说,这种旧的在C中的为了实现其作用域在本文件中的feature在未来的C++中也要被取消。


文章到这里应该结束了,在结束之前,让我再给大家共享一个有趣的关于const的例子(在网上看到的)

const int a = 1;
int *p = const_cast<int*>(&a);
*p = 2;

cout << “value a=”<< a << endl;
cout << “value *p=” <<*p << endl;
cout << “address a=” <<&a << endl;
cout << “address p=” <<p << endl;
这段代码输出的结果如下:

value a=1
value *p=2
address a=0xbff1d48c
address p=0xbff1d48c

地址都是一样的,可值为什么不一样呢?呵呵。这个问题看起来有点“学术味”过浓,不过是个好例子,可以让你知道C++的一些用法和一些原理。有以下几个方面大家可以考虑一下:
1)const int a = 1是不是和宏有点像,会不会被编译器优化了?

2)去修改一个const的值,本来应该是不对的。这可能会是向旧的C兼容。是否会让编译器产生未知行为?



给新人程序员的八点建议
走过弯路,有过迷茫,回首九年陈皓感慨万千。“今天,我对许多刚上路的朋友都会说,人生的规则很重要,从上大学时就要好好规划。”他结合自身经历,对许多刚踏入程序员行列的新人程序员,他给出了以下八点建议:
1. 在大学的时候尽量多地进入公司参与实际工作,一方面积累工作经验,另一方面,提前认识工作和自己,以便毕业时更准确地把握自己的方向。
2. 从毕业开始到毕业后至少5年内,踏踏实实地专研技术,这是一个积累过程,千万不要把心思放在钱和职位上。钱和职位只是能力的附属品,不要让其喧宾夺主。
3. 从毕业后3年到7年的时间,注意学习工作当中的方法以及相关的管理和流程,不但要知其然,还要知其所以然。
4. 30岁以前,踏踏实实地学习。学技术,学做人,学做事。30岁以后再谈自己的发展。
5. 毕业后的前5年主要是量的积累,要不停地积累知识和方法。毕业后的5到10年主要是质变,应该着重于思维和想法的更新。后五年应该有很强的包容能力和接受新东西的能力,千万不要太过固执和坚持自己的想法。
6. 换工作要“承前启后”,前面的工作会成为后面工作的一个基础,而后面的工作又会成为前面工作的一个很自然的延续。
7. 不要只把心思放在技术上,技术是hard skill,只要下工夫就一定会掌握。更要注意与人沟通等为人处事的soft skill上。hard skill像一个大树的根,而soft skill则像一个大树的枝叶。树根是你的根基,能让你站得很稳,而枝叶能让你向天空伸展,获得发展。
8. 对于程序员来说,应该始终记住,技术不是主要的,主要的是通过技术能够解决什么样的问题。一定经常想要解决什么的问题,要满足什么样的需求,而不是要用什么样的技术。

你可能感兴趣的:(c,优化,工作,gcc,Class,编译器)