1、用 C 语言写一个函数交换两整数的值,不借助第三个变量
方法一:
a = a + b;
b = a - b;
a = a - b;
不过提出了最大的问题,就是两个正数的溢出问题。
方法二:
a = a - b;
b = a + b;
a = b - a;
还是存在溢出的情况:一正数与一负数。
方法三:
a = a^b;
b = a^b;
a = a^b;
不存在溢出。
2、500张骨牌整齐地拍成一行,按顺序编号为1、2、3、…………499、500。第一次拿走所有奇数位置上的骨牌,第二次再从剩余的骨牌中拿走所有奇数位置上的骨牌,以此类推,请问最后一张骨牌编号是多少?
第一次拿走后剩下的骨牌编号:2n
第二次拿走后剩下的骨牌编号:4n
第三次拿走后剩下的骨牌编号:8n
…………
第m次拿走后剩下的骨牌编号:n*(2的m次方)
因为 n*(2的m次方) <= 500,所以n=1的时候,能取到最大的m,所以依据2的几次方特性可以得知, 2的m次方=256,所以m=8,所以最后一个骨牌编号是256.
3、下面两段代码输出结果是什么?
代码段1:
#include <stdio.h>
int main(void)
{
int a ,x ;
for( a = 0, x = 0; a <= 1 && !x++ ; a++ )
{
a++;
}
printf("%d,%d\n",a,x);
return 0;
}
代码段2:
#include <stdio.h>
int main(void)
{
int a ,x ;
for( a = 0, x = 0; a <= 1 && !x++ ; )
{
a++;
}
printf("%d,%d\n",a,x);
return 0;
}
!x++ 看起来是一个表达式,其实是两个表达式,分别为!x,和x++。
结果是
2,1
1,2
4、有两个表格如下:
a
id | play_id | values |
1 | 17 | 1 |
2 | 18 | 2 |
id | play_id | others |
1 | 19 | 1 |
2 | 20 | 2 |
3 | 21 | 3 |
A,SELECT a.play_id FROM a, b WHERE values=1 AND a.play_id=b.play_id
B,SELECT a.play_id FROM a,b WHERE values=1
答案:
A,17
B,17
17
17
5、JVM来运行这个class文件的原理。
参考答案:
Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的, 类装载器所做的工作实质是把类文件从硬盘读取到内存中,这个过程我们叫做【加载 】。加载完成之后,我们就可以进行一系列的运行前准备工作了,比如: 为类静态变量开辟空间,将常量池存放在方法区内存中并实现常量池地址解析,初始化类静态变量等等。
6、下面C 语言代码输出什么?
#include <stdio.h>
int main(void)
{
int b = 3;
int arr[]={6,7,8,9,10};
int * ptr;
ptr = arr;
*(ptr++) += 123;
printf("%d,%d\n",*ptr,*(++ptr));
return 0;
}
答案:8,8
printf("%d,%d\n",*ptr,*(++ptr));
是从右边开始执行的。
7、用一个表达式,判断一个数X是否是2的N次方,不可以使用循环语句。
答案:2的N次方二进制是:10,100,1000,10000.......如果X减1后与X运算,答案若是0,则X是2的N次方。
8、下面的代码实现了什么功能:
int f(int x, int y)
{
return (x&y)+((x^y)>>1);
}
答案:x&y取得是x和y的相同位,这个结果是x和y相同位的一半,x^y是取x和y不同位,右移相当与除以2,所以这个函数的功能是取两个数的平均数。
9、有两个变量a和b,不使用判断语句找出两个数中值较大的那个。
答案:int max = ((a+b)+abs(a-b))/2;