[转]原创
我平时遇到不清楚的问题总喜欢研究研究,问题遇多了脑子里面放不下,怕忘记了就整理如下。这里例子有些偏,做不对也不是你水平问题。部分例子不适合用来笔试和面试,如果笔试招不到人可不要怪我,呵呵。。
http://www.cnweblog.com/fly2700/
1. null 不等于 null 吗?
(偏指数☆☆☆)
//C#代码
class A { }
interface B { }
public Foo()
{
A a = null;
B b = null;
String s = null;
//Console.WriteLine("{0},{1}", (a == b) , (a == s));
}
请问条件(a==b)、 (a==s) 结果分别是多少?
//结果
a==b 结果是True
a==s 编译是错误
2. return 后还执行finally不
(偏指数☆☆)
//C#代码
int Foo(out int n)
{
n = 0;
try
{
n = 1;
throw new Exception("err");
return n;
}
catch
{
n = 2;
return n;
}
finally
{
n = 3;
}
n = 4;
return n;
}
//结果
那n最后等于多少呢,答案是3,return后也会执行finally
猜猜函数返回值是多少呢,,,函数的返回值就不是3了
3. 引用类型的参数前面再加个ref,是不是多余的?
(偏指数☆)
//C#代码
class A { public int data;}
void Foo1(A a)
{
//a = new A();
a.data = 2;
}
void Foo2(ref A a)
{
//a = new A();
a.data = 2;
}
public Test()
{
A a = new A();
A b = new A();
b.data = 1;
a.data = 1;
Foo1(a);
Foo2(ref b);
Console.WriteLine("{0},{1}", a.data, b.data );
Console.ReadKey();
}
//结果
运行Test(),结果是2,2 可以看出,这里不加ref结果相同。
那么是否得出结论,引用类型前面的ref是多余的?其实不然。
我们把a = new A();前面的注释去掉,再运行,发现结果就不一样了。是1,2
4.编译通过吗?
(偏指数☆)
//c++代码
extern int n ;
int main()
{
n = 2;
return 0;
}
//结果
不能编译通过
extern int n; 只是保证在代码的某个地方有一个int n; 并没有定义n; 放在头文件中可防止重复包含定义。
如果把extern int n;改成extern int n=0; 或者改成int n;则可以编译通过;
5.编译通过吗?
(偏指数☆)
//c++代码
int n = 1;
n = 0;
int main()
{
n = 2;
return 0;
}
//结果
不能编译通过。n=0;不能写在main()外面;
6.C++ delete NULL; 这样会执行出错吗?
(偏指数☆☆☆)
//C++代码
int main()
{
int *p = 0;
delete p;
return 0;
}
//结果
不会出错,C++ Primer上面有说法, 这是因为c++语言会处理delete 0; 不会因为编译器不同而不同。
7. 我们知道C#中的垃圾回收机制是:“如果没有任何一个指针指向这个类的实例,那么这个实例会被系统自动回收。”
我的问题是,如果没有任何指针指向这个类的实例,但有指针指向这个类的成员变量,那么这个类的实例会自动回收吗。
(偏指数☆☆)
//C#代码
//Demo和Data都是类,data是Demo的成员变量;
public void TestDispose()
{
Data[] b = new Data[1000];
for (int i = 0; i < 1000; i++)//循环申请资源,迫使系统自动回收。
{
Demo demo = new Demo();
b[i] = demo.data;
}
}
//结果
通过在类的构造方法和析构方法中写日志,可以观察到Demo类的实例会被系统自动回收。而Demo的成员data不会被回收。
8. 问题,C#中二个类相互有指向关系,也就是说A有指针指向B, B有指针指向A, 当A和B不再被使用的时候,他们的实例能被系统回收吗。
(偏指数☆☆)
//C#代码
public void TestDispose()
{
for (int i = 0; i < 1000; i++)
{
Demo d1 = new Demo();
Demo2 d2 = new Demo2();
d1.demo2 = d2;
d2.demo = d1;
}
}
//结果
d1 d2都可以被系统自动回收的。看来C#的垃圾回收机制不像字面上面的那么简单。
9. C#中 int[][,] a; 和 int[,][] a; 分别是什么意思?
(偏指数☆)
//C#代码
int[] a = new int[] { 11, 22 }; //一维数组
int[,] b = { { 11, 12 }, { 21, 22 } };//二维数组
int[][] c = { new int[] { 11, 12 }, new int[] { 21, 22 ,23 } };//一维数组,数组的每个成员又是一个数组。 和二维数组不一样的是:1,这种数组的成员可以是不等长的数组.2,他的lenght是其中数组的个数,而二维数组lenght是所有元素个数
int[][,] e = { b, b };//一维数组,数组的每个成员是一个二维数组,其中二维数组可以不等长
int[,][] f = { { a, a }, { a, a } };//二维数组,数组的每个成员是一个一维数组,其中一维数组可以不等长
10. C++中 unsigned类型相减后类型还是unsigned类型吗?
(偏指数☆)
//C++代码
unsigned char a = 10;
unsigned char b = 20;
unsigned char c = a - b;
printf("%d,%d\n", (a-b), c);
//打印结果:-10,246 。
unsigned类型相减后类型会变成int类型。