zoukankan      html  css  js  c++  java
  • 牛B的程序员都不知道的几个问题

    [转]原创

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

    大部分转载 小部分自写
  • 相关阅读:
    Intellij IDEA Java web 项目搭建
    Spring的AOP原理
    为何有DAO与Service层?为何先搞Dao接口在搞DaoImpl实现?直接用不行吗?
    DAO层,Service层,Controller层、View层协同工作机制
    浅谈service、DAO层引入(转)
    java书籍推荐转
    Java点滴-List<Integer> list; 中尖括号的意思
    Composer更新慢的终极解决方案-转
    laravel门面DB返回数组配置
    laravel构建联合查询
  • 原文地址:https://www.cnblogs.com/8586/p/1801612.html
Copyright © 2011-2022 走看看