笔试常见函数题(读懂这些函数后,笔试强了很多)

1:

判断有无符号

void foo(void)

{

unsigned int a = 6;

int b = -20;

(a+b > 6) ? puts("> 6") : puts("<= 6");

}

答案和解释:

  输出 > 6,原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。-20成了一个非常大的正数。

补充:

判断有无符号的宏函数:
#define issignal(x) ((x>=0 && ~x>=0) ? 1:0) //为1是无符号 为0有符号

2:

nt func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
} 

答案和解释:

  假定x = 9999。 答案:8
思路:将x转化为2进制,看含有的1的个数。

3:

#include<stdio.h>
void myprint(x){
    int i=0;
    for(i=31;i>=0;i--){
        printf("%d",(x>>i)&1);
        }
    }
void main(){
    myprint(5);
    }

作用:将一个数用二进制输出

4:

!注意宏定义机械替代
若有宏定义:#define MOD(x,y) x%y

则执行以下语句后的输出结果是

int a=13,b=94;

printf(″%d\n″,MOD(b,a+4));

A.5

B.7

C.9

D.11

参考答案:B

但是:
#define N 3

#define Y(n) ((N+1)*n)//区别#define Y(n) ( (N+1)*(n))!

则表达式2*(N+Y(5+1))的值是

A.42

B.48

C.54

D.出错

参考答案:B
Y(5+1) 传递过去的应该是6,而不是简单的把5+1给替换掉

5:

main() {
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1)); }

答案和解释:

分析:*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5 。&a+1不是首地址+1,系统会认为加一个a数组的偏移,
是偏移了一个数组的大小(本例是5个int) int *ptr=(int *)(&a+1); 则ptr实际是&(a[5]),也就是a+5 原因如下:
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同
a是长度为5的int数组指针,所以要加 5*sizeof(int) 所以ptr实际是a[5] //a[5]下一个数组对象的地址==元素首地址
但是prt与(&a+1)类型是不一样的(这点很重要)
所以prt-1只会减去sizeof(int*)。 a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(
数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的首地址,即a[5].

6:

char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout < < ( str1 == str2 ) < < endl;
cout < < ( str3 == str4 ) < < endl;
cout < < ( str5 == str6 ) < < endl;
cout < < ( str7 == str8 ) < < endl;

答案和解释:

结果是:0 0 1 1  
str1,str2,str3,str4是数组变量,它们有各自的内存空间,指向不同的内存,str1相当于是一个有独立内存空间的指针变量;
而str5,str6,str7,str8是指针,它们指向相同的常量区域。

7:

int  main()  {
    char a;
    char *str=&a;
    char str1[10];
    strcpy(str,"hello");  (错)
    strcpy(str1,"hello");(对)
    printf(str);
    return 0;
}   

答案和解释:

没有为str分配内存空间,将会发生异常,问题出在将一个字符串复制进一个字
符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内存读写而导致程序
崩溃。

8:

使用初始化列表和赋值方法进行成员数据的初始化

class A{
int a,b;
public:
A(int x):b(x),a(b){}
};
初始化列表是按成员被定义的顺序执行的,也就是虽然你在列表里后写的a,但是因为a先定义的,
所以还是会先执行a的初始化。也就是你的a是用未初始化的b的值初始化的。
class CExample {
public:
 int a; float b;
 CExample(): a(0),b(8.8) {}//构造函数初始化列表 
 CExample() { a=0; b=8.8; }
};
构造函数内部赋值 CExample() { a=0; b=8.8; } }; 上面的例子中两个C++构造函数的结果是
一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化
列表的构造函数是对类的成员(所以当成员数据是const这个方法就不可行了,必须要用初始化列表)!,
并没有进行显式的初始化。

9:

unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问p1+5=  ;              p2+5=  ;  

答案:801005; 810014。不要忘记了这个是16进制的数字,p2要加20变为16进制就是14

10:

指针和*以及++之间常见的运算顺序问题汇总

int i=1;
printf("%d  %d  ",i++,i++);//2 1
printf("%d",i);// 3

int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;     //先算*ptr=*ptr+123; 再 ptr++;所以arr[0]= 129; *p++=*(p++)?
printf("%d,%d",*ptr,*(++ptr));    //按从右到左的顺序

int a[3];  
a[0]=0;  
a[1]=1; 
a[2]=2;   
int *p, *q;   
p=a;   
q=&a[2];  
则a[q-p]=?  
答:a[q-p]=a[2]=2;这题是要告诉我们指针的运算特点???

11:

typedef union
{  long i;
int k[5];
char c;
} DATE;
struct data  {
int cat;
DATE cow;
double dog;
} too;
DATE max;
则语句 printf("%d",sizeof(too)+sizeof(max));的执行结果是:52

12:

静态变量在全局静态区,下次访问会保留上次的赋值

int sum(int a)  {     
auto int c=0;     
static int b=3;   
c+=1;   
b+=2;   
return(a+b+c);  
}   
void main()  {     
int I;   int a=2;   
for(I=0;I <5;I++)   {     
printf("%d,", sum(a));   
}  } 

答案:8,10,12,14,16

时间: 2024-10-12 04:52:04

笔试常见函数题(读懂这些函数后,笔试强了很多)的相关文章

笔试算法题(07):还原后序遍历数组 &amp; 半翻转英文句段

出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历): 分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树): 解题: 1 bool PostOrderCheck(int *array, int i, int j) { 2 /** 3 * 如快速排序一样,解决小子文件 4 * */ 5 if(j-i+1 ==

5分钟读懂正则表达式

本文仅作针对不熟悉正则表达式的朋友,可以通过本文快速的"读"懂代码中令人不快的正则表达式,至于进一步熟练的写出正则表达式,请参考文章底部链接或阅读专业书籍. 如果你总感觉看书看不懂,建议阅读<如何阅读一本书> --题外话. 1. 正则表达式一般使用 / 和 / 包裹起来的.2. 字面量字符(直接量字符) /a/    匹配字符a /a1/  匹配a1中任一个 /\./   匹配除 \n 之外的任一字符 方括号 /[0-9]/        匹配从字符0到字符9的任意一个字符

笔试算法题

转自:http://www.cnblogs.com/xwdreamer/archive/2011/12/13/2296910.html 1.把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向.   10  / \  6  14 / \ / \4  8 12 16 转换成双向链表4=6=8=10=12=14=16.  首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode{  i

用一个例子读懂 RequireJS

用一个例子读懂 RequireJS 例子来自官方,我稍微改造了一下,如下: // project.html <!DOCTYPE html> <html>     <head>         <title>requirejs</title>         <!-- data-main attribute tells require.js to load              scripts/main.js after require.

读懂Redis并配置主从集群及高可用部署

一.背景 运维工作尤其是linux运维,其实最考验你的能力,因为需要学习的东西实在太多, 你既要懂网络:思科华为设备的配置: 要懂性能调优:包括lamp或者lnmp的性能调优,也包括linux操作系统调优: 要懂数据库mysql或者nosql(例如mongodb): 要懂编程语言:Shell是最基本的,还要学习perl,python,甚至ruby和C++等(因为一些软件是这些语言编写的),还得熟练掌握awk,sed,grep以及正则表达式: 要懂一些调试排错的命令工具的使用,比如htop,dst

笔试算法题(53):四种基本排序方法的性能特征(Selection,Insertion,Bubble,Shell)

四种基本算法概述: 基本排序:选择,插入,冒泡,希尔.上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件.前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成正比: 前三种算法在平均,最坏情况下都是N2,而且都不需要额外的内存:所以尽管他们的运行时间只相差常数倍,但运行方式不同: 对于已经就序的序列而言,插入排序和冒泡排序的运行时间都是O(N),但是选择排序的时间仍旧是O(N^2): 因为Insertion和Bubble都是相邻项间的比较交换,所以不会出

笔试算法题(23):数值整数次方 &amp; 最大对称子串

出题:数值的整数次方(不考虑溢出),实现函数double Power(double base, int exponent): 分析: 解法1:最简单的方法是使用直接的乘法运算,但是注意处理几种特殊情况:exponent为负数,base为0: 解法2:将exponent分解成2的不同次方相加的表达式,通过重复平方来最大程度的减少乘法运算的次数. 当然,也可以递归实现,当n为偶数时,a^n=a^(n/2) * a^(n/2):当n为奇数时,a^n=a^((n-1)/2) * a^((n-1)/2)

笔试算法题(38):并查集(Union-Find Sets)

出题:并查集(Union-Find Sets) 分析: 一种树型数据结构,用于处理不相交集合(Disjoint Sets)的合并以及查询:一开始让所有元素独立成树,也就是只有根节点的树:然后根据需要将关联的元素(树)进行合并:合并的方式仅仅是将一棵树最原始的节点的父亲索引指向另一棵树: 优化:加入一个rank数组存储节点深度的下界(从当前节点到其最远子节点的距离),从而可以启发式的对树进行合并,从而减少树的深度,防止树的退化:使 得包含较少节点的树根指向包含较多节点的树根,具体指代为树的高度:另

嵌入式系统 Boot Loader 技术内幕----仅此一篇读懂bootloader

嵌入式系统 Boot Loader 技术内幕----仅此一篇读懂bootloader 本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念.软件设计的主要任务以及结构框架等内容. 1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分. 2. Li