博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

牛B的程序员都不知道的几个问题

Posted on 2010-08-17 16:44  浪端之渡鸟  阅读(319)  评论(0编辑  收藏  举报

[转]原创

我平时遇到不清楚的问题总喜欢研究研究,问题遇多了脑子里面放不下,怕忘记了就整理如下。这里例子有些偏,做不对也不是你水平问题。部分例子不适合用来笔试和面试,如果笔试招不到人可不要怪我,呵呵。。
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类型。