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

先来看一段代码把: 

#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;
}

输出的结果是:

有没有一点吃惊?

这个问题测试你是否懂得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;
}

输出的结果为:

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

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)可用于基本数据类型

时间: 2024-08-03 04:05:07

C++查缺补漏2,赶紧的的相关文章

C++查缺补漏,赶紧的

c++中 switch支持的数据类型为实型 (麻烦朋友们给我解释一下什么是实型) 支持的有int long unsigned short enum类型,不支持的是:float double string 回答下面的问题: Void GetMemory(char **p, int num){ *p = (char *)malloc(num); } void Test(void){ char *str = NULL; GetMemory(&str, 100); strcpy(str, "he

ruby查缺补漏

<Programming Ruby中文版>前3部分我并不准备细看,毕竟我接触ruby也有一段时间了,只准备快速地掠过一遍,查缺补漏:重点放在第3部分的核心内容上,至于第四部分的参考手册更多作为工具书了.仅在此记录下一些值的注意的东西. 1.全局变量$_,默认当gets方法返回输入的行时,同时保存在全局变量$_,并且正则表达式如果作为条件语句(if或者while)时默认是跟这个全局变量进行匹配,而print参数为空时也是打印这个全局变量.这是早期ruby向perl语言学习的结果.可以看看这个例子

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

请说出const与#define 相比,有何优点? 答案:1) const 常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查.而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误.       2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试. 在8086 汇编下,逻辑地址和物理地址是怎样转换的?(Intel)答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要访

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

如何判断一段程序是由C 编译程序还是由C++编译程序编译的?  答案:  #ifdef __cplusplus cout<<"c++"; #else cout<<"c"; #endif 如何打印出当前源文件的文件名以及源文件的当前行号?  答案:  cout << __FILE__ ;  cout<<__LINE__ ;  __FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定

知识点查缺补漏贴02:Linux环境fork()函数详解

引言 先来看一段代码吧, #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { pid_t pid = fork(); if(pid < 0){ fprintf(stderr,"error!"); }else if(0 == pid){ fprintf(st

知识点查缺补漏贴03:单机最大进程数,线程数和Socket连接数

前言: 参加Unix/Linux相关高级研发职位时,是否经常会被文档,单机允许最大进程数.线程数和Socket连接数,而你却感到束手无措呢?本文给你一个最为详细的答案. 一.最大进程数 运行Linux ulimit -a指令,我们可以看到:max user processes =1024 运行结构如下图所示: [root@localhost ~]# ulimit unlimited [root@localhost ~]# ulimit -a core file size (blocks, -c)

知识点查缺补漏贴01-进程间通讯之mmap文件共享

引文: 个人名言:"同一条河里淹死两次的人,是傻子,淹死三次及三次以上的人是超人".经历过上次悲催的面试,决定沉下心来,好好的补充一下基础知识点.本文是这一系列第一篇:进程间通讯之mmap. 一.概念:什么是mmap? 通过共享存储实现进程间通讯是一个主要的进程间通讯的方式.它包括磁盘文件的共享和内存的共享,以前总是关注内存的共享,而忽略了磁盘文件的共享,也就是这里要讲的mmap.mmap地址映射是Linux系统提供的一种功能强大的系统调用,最典型的应用是用于显卡内存的映射.同样,对于

查错补漏 在XP SP2系统中疯狂BT_WindowsXP

经常使用BT软件下载的朋友也许会发现一个奇怪的现象:将系统升级到Windows XP SP2后,在以前系统中下载如飞的BT,却经常出现连接不上的情况.即便连接上,下载/上传速度也大不如前. 开始我还以为是BT软件出了问题,可是在我几乎把市面上所有的BT软件都尝试了后,情况仍然没有得到改善.我又把瑞星防火墙卸载了,还是不行.于是干脆把系统又恢复到SP1(我在升级到SP2的时候保留了SP1的GHOST备份),结果BT又"活"过来了.于是我断定问题一定出在SP2上. 一个偶然的机会,我在&q

上帝、天使、精灵

    在天堂,上帝是至高无尚的,是权力与威严的象征:天使是上帝忠实的臣民,尽心尽力为上帝服务:精灵是天使的总管也是上帝的臣子,更是无私的公仆,他们效忠于上帝,管理着天使即又服务于天使,奔波忙碌却不求一丝功利只为搏上帝与天使莞尔!故,人们祈求上帝辟佑,请求天使赐福,却不曾记得精灵!     在人间,上帝并不是唯一的,"顾客就是上帝!",所以人人都能过一把"上帝瘾!"既然众人皆上帝,那么相对而言就众生皆臣子(天使与精灵)了!     在北大高科,客户就是唯一的上帝,一