• 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,和强制转换操作符等。

    图片来自百度百科。





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

  • 相关阅读:
    2.3 Nginx服务的启停控制
    2.1 Nginx服务器安装
    三、函数 (SUM、MIN、MAX、COUNT、AVG)
    二、检索语句 SELECT、ORDER BY、WHERE
    一、数据库、SQL简介
    一、单元测试框架的基本使用介绍
    2.4 Nginx服务器基础配置指令
    第十七章 程序管理与SELinux初探--进程、进程管理(ps、top)
    第十五章 例行性工作(crontab)--循环执行的例行性工作调度 crontab(定时任务)
    java多线程04----------final和static
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4808222.html
Copyright © 2020-2023  润新知