zoukankan      html  css  js  c++  java
  • C/C++基础笔试题1.1.2(十问解决方案运营商)

    他写在博客上不负责任,有人踩在上面,原因一点点失去了它。

    其实纯常见问题。特别糟糕,由于鲍文看起来很大的优势就是想更直接看到的东西。

    好了。返回整个标题。

    1.你脑海中的运算符有哪些。按优先级排个序?

     这个问题明显没有标准答案,可是最主要的还是要有吧。

    比方+ ,- ,* ,/ ,%, 前++/--,后++/--,=,<, >, << ,>>,(),&,^,|,~以及逗号","域名符"::",&&,||等等等等。

    其优先级麻,这个可能会略微麻烦一点,可是自己简单试验肯定能够做出来的。

    所谓的优先级顺序能够看博文最后的表。



    2 .malloc/free 和 new/delete的差别?(我没有跑题?。)

     从功能上两者都是申请/释放动态的数组可是,malloc/free是stdlib的函数。须要加头文件stdlib。而new/delete是运算符。

    1、malloc/free是C/C++中的方法(函数),new/delete是C++中的操作符。

    2、malloc/free使用的内存空间为堆区,new/delete是free store区。

    3、free须要推断非空,非空才干释放。可是delete是不须要的

    4、另外在使用new/delete是调用构造函数/析构函数,而malloc/free不过对内存分配,也因此不能满足非内部数据。


    3.让你来写一个重载函数++i,i++,你怎么写? 

     这个是基本功

    /***********************************************************
    	> OS     : Linux 3.11.10-301.fc20.x86_64 Fedora20
    	> Author : yaolong
    	> Mail   : dengyaolong@yeah.net 
    	> Time   : 2014年07月17日 星期四 09时02分44秒
     **********************************************************/
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    using namespace std;
    class A{
    public:
        int x;
        A(int x=0){
            this->x=x;
        }
        A operator ++(int ){ //i++,先返回复制品。再搞原对象
            A tmp=*this ;
            this->x++;
            return tmp;
        }
        A operator ++(){//++i,直接改动对象
            this->x++;
            return *this;
        }
    };
    int main(){
        A a1(3);
        A a2=a1++;
        cout<<a2.x<<endl;; //3
        cout<<a1.x<<endl;  //4
        A a3=++a2;
        cout<<a3.x<<endl; //4
        cout<<a2.x<<endl; //4
    }
    

    4.来看个程序


    #include<iostream>  
    using namespace std;  
      
    int main(){  
        int x=3;  
        cout<<x+x%2==1<<endl;  
         return 0;  
    }  

    这个程序是不能正常执行的。编译错误,依据优先级看来是% , +  。 <<, ==

    所以整个式子解释应该是

    x%2    -> 1

    x+ 1  -> 4

    1<<endl  出错了

    以下假如式子变成这样,

    cout<<(x+x%2==1<<2)<<endl;

    这样整个式子的解释是这种

    由于()优先级最高(在这个式子中),所以先解释()内的

    x%2 -> 1

    x+1 ->4

    1<<2  -> 4

    4 ==4  得到1

    之后到运算符<<

    而<<是从左到右的,故cout<<1  之后再输出转行

    输出的为

    1

    当我们这样写

    int y=x+x%2==1<<2;

    cout<<y<<endl;

    这时候就没有错,为什么?由于=号的优先级非常低,仅仅有逗号比其更低了,就仅仅有一个

     我们不是常常这么做吗?

    int x=3,y;

    5.再来看一个?跟你想的又一样不一样?

    #include<iostream>  
    using namespace std;  
    int main(){  
        int x=3;  
        cout<<((x+x%2)==1)<<endl;  
        cout<<(x+(x%2==1))<<endl;  
      
    return 0;  
    }  
    这个用上面的分析,非常easy就知道了

    第一个先运行最里层括号

    (x+x%2)

    而%比+优先,所以就是

    x%2 ->1

    x+1 -> 4

    之后外层括号

    4==1 -> 0(false)

    第一个输出为0

    第二个很easy知道

    x%2->1

    1==1 -> 1(true)

    x+1 -> 4

    第二个输出4

    6.来个难一点的,感觉一下逗号和括号的恶心?

    #include<iostream>
    using namespace std;
    
    void fun0(int x,int y ,int z){
      cout<<x<<" "<<y<<" "<<z<<endl;
      int a=2,b=3,c=7;
      x=a*b,c;
      y=(a*b+z,z=c);
      cout<<x<<" "<<y<<" "<<z<<endl;
    }
    void fun1(int x,int y,int z){
      cout<<x<<" "<<y<<" "<<z<<endl;
      int a=2,b=3,c=7;
      y=(x=a+b+z),(z=b+c);
      cout<<x<<" "<<y<<" "<<z<<endl;
    }
    void fun2(int x,int y,int z){
      cout<<x<<" "<<y<<" "<<z<<endl;
      int a=2,b=3,c=7;
      y=((x=a+b+z),(z=b+c));
      cout<<x<<" "<<y<<" "<<z<<endl;
    }
    int main(){
        int x,y,z;
        fun0(x,y,z);
        fun1(x,y,z);
        fun2(x,y,z);
    }
    

    这个题目是相对过分的,由于手写根本写不出正确答案,不同编译器输出结果页不一样。

    看fun0(x,y,z)

    由于x,y,z没有初始值,所以每一个函数的第一个输出x,y,z都是编译器默认的。

     int a=2,b=3,c=7;
      x=a*b,c;
      y=(a*b+z,z=c);
    这个,先声明了a=2,b=3,c=7

    x=a*b,c

    由于逗号比=优先级低,前面说过,=号是倒数第二低,逗号是倒数第一。x=6,c没有不论什么改变

    y=(a*b+z,z=c)

    先执行括号的东西

    (a*b+z,z=c)

    ,号是从左到右执行,假设感兴趣的朋友能够试验一下(p=a*b+c,z=c),把p数出来就知道了

    所以先运行表达式

    a*b+z。得到2*3 +z(z是一个乱七八糟的数,我的GCC编译出来的是32767)。

    再运行z=c,而(表达式1,表达式2。表达式……)最后返回的是最后一个表达式

    所以y=z=c,y=7,z=7

    第一个fun0在我这里输出为

    0 0 32767
    6 7 7
    对于fun1,2也是通=,的优先级来推断

    很easy就能够判断出来其结果

    最后总的输出为

    0 0 32767
    32773
    6 7 7
    0 0 32767
    32772 32772 10
    0 0 32767
    32772 10 10
    以下再附带一个fun3,用于測试上述到的逗号的从左到右运行

    void fun3(int x,int y ,int z){
          cout<<x<<" "<<y<<" "<<z<<endl;
          int a=2,b=3,c=7,p;
          x=a*b,c;
          y=(p=a*b+z,z=c);
          cout<<p<<endl;
          cout<<x<<" "<<y<<" "<<z<<endl;
    
    }

    7.我们用%来做余运算,%仅仅能应用于正整数对吗?

    这个问题自己測试就能够拉,是能够对非0的整数进行操作,可是不能对浮点型等操作。

    8.域运算符::我们经常常使用到,请问::能够重载吗?

    不能够的,运算符有一些是不能重载的。比方本题的::和.等等。在文章最后会有提到可否重载。

    9.运算符重载作为非成员函数重载时必须定义为友元函数?

    不是的,当操作的成员为公开的时候不一定要定义友元函数。

    10. 运算符必须是符号吗?(即仅仅能是+,-,*,/,::之类的吗?)

    不是的。文章一開始就提到了。new/delete是运算符。还有sizeof,和强制转换操作符等。

    图片来自百度百科。





    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4808222.html
Copyright © 2011-2022 走看看