代码改变世界

C++查缺补漏2,赶紧的

2012-03-28 21:29  Rollen Holt  阅读(525)  评论(1编辑  收藏  举报

先来看一段代码把:

#include <iostream>
#include <typeinfo>
using namespace std;

void foo(void)
{
	unsigned int a = 6;
	int b = -20;
	(a+b > 6) ? puts("> 6") : puts("<= 6");
}

int _tmain(int argc, _TCHAR* argv[])
{	
	
	foo();
	unsigned int c=1;
	int d=-5;
	cout<<typeid(d+c).name()<<endl;
	cout<<d+c<<endl;
	return 0;
}
输出的结果是:image

有没有一点吃惊?

这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ">6"。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。

下面再来看看一段代码:

#include <iostream>
#include <malloc.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{	
	char *ptr=NULL;
	ptr=(char*)malloc(0);
	if(ptr==NULL){
		cout<<"Got a null pointer"<<endl;
		cout<<*ptr<<endl;
	}else{
		cout<<"Got a valid pointer";
	}
	free(ptr);

	return 0;
}
输出的结果为:image

我询问一些技术大牛,她们的回答是:

malloc(0)是未定义的,返回NULL或者不是NULL,都是满足ISO C标准的。有些操作系统会返回一个指针

Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:

#define dPS struct s *
typedef struct s * tPS;

以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?
这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:

dPS p1,p2;
tPS p3,p4;

第一个扩展为

struct s * p1, p2;
.
上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。晦涩的语法

16 . C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?

int a = 5, b = 7, c;
c = a+++b;

这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:

c = a++ + b;

因此, 这段代码持行后a = 6, b = 7, c = 12。

 

7.C++中为什么用模板类。
答:(1)可用来创建动态增长和减小的数据结构
(2)它是类型无关的,因此具有很高的可复用性。
(3)它在编译时而不是运行时检查数据类型,保证了类型安全
(4)它是平台无关的,可移植性
(5)可用于基本数据类型