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   : [email protected]
	> 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;
}  

这个用上面的分析,很容易就知道了

第一个先执行最里层括号

(x+x%2)

而%比+优先,所以就是

x%2 ->1

x+1 -> 4

之后外层括号

4==1 -> 0(false)

第一个输出为0

第二个非常容易知道

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也是通=,的优先级来判断

非常容易就可以推断出来其结果

最后总的输出为

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

C/C++基础笔试题1.1.2(运算符十问之解)

时间: 2024-12-21 01:30:34

C/C++基础笔试题1.1.2(运算符十问之解)的相关文章

C/C++基础笔试题1.1.1(运算符十问)

本文似乎都是问题,意在引起思考,回忆,主题是运算符,另外这些问题是没有特别的逻辑上的关系,只是我想到的就问了,虽然是随便问,但是你能不能随便答呢?. 运算符,我们在每一个程序中都会用到,也是最最基础的基本功,本系列C/C++基础笔试题等,是没有纲要,没有规律的一系列博文. 为什么这样子,因为作者是渣阿,他只能学一点说一点,力求通俗阿,傻瓜但不失主线阿. 1.0写的是字节对齐,没看过有兴趣的朋友可以戳这里.1.1写的是与运算符相关的内容,你最"熟悉"的"朋友". 首先

C/C++基础笔试题1.0(字节对齐)

传说中博文标题带有笔试.面试等点击率都会很高呢?我也试试! 众生皆是码农命,我们这种即将战秋招的渣渣,既没有超凡的能力,也没有流弊的项目,怎么破? 唯独苦苦怒刷基础,笔试题,面试题,因为以前常常刷OJ,所以很多面试题的编程题倒是可以解,但是笔试题或者基础题我就不记得了,唯独慢慢回想. 况且,写这种面试题,谁能写得赢JULY神. 今天首先讲得是字节对齐. 注意:我是一个渣,所以我只能按自己的理解来说了(要不然怎么会这么惨呢?).如果你想看大神的解释,请看这里 来看个题目 #include <ios

Android开发面试经——4.常见Java基础笔试题

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44403041 因为Androd使用Java语言来编程的,所以我们做Android开发全面的掌握Java基础是必须的.在面试的过程中,我们发现很多公司发的笔试题有很多知识点都是Java的,搞安卓久了,Java基础的一些知识点也都快忘了,今天就让我们来一起复习一些Java基础,希望能在面试中用到: 1.Overload和Override的区别.Overloaded的方法是

Android开发面试经——2.常见Android基础笔试题

关注finddreams博客: http://blog.csdn.net/finddreams/article/details/44219231 正值跳槽的热季,整理一下Android面试中最常考的笔试题,为下次找工作时做好充分准备,这是Android的基础部分: 1.Android四大组件是什么?作用以及应用场景? Android 的四大组件分别是是Activity,Service,BroadcastReceiver和ContentProvider: Activity: 从字面上理解,Acti

iOS基础笔试题-(2)

12. obj在编译时和运行时分别时什么类型的对象 如下面的代码,obj在编译时和运行时分别时什么类型的对象: 1 2 3 NSString *obj = [[NSData alloc] init]; 参考答案: 在编译时,我们所声明的obj是NSString *类型,因此是NSString类型对象.在运行时,由于指针obj所指向的是NSData类型对象的内存,因此实际上是NSData类型的对象.在编译时,这一行代码会转换成类似这样: 1 2 3 4 NSString *obj = ((id (

基础笔试题

1.在MySQL中,下列关于触发机器的描述正确的是(    ) 正确答案 :AC A    MySQL的触发器只支持行级出发,不支持语句级触发 B    触发器可以调用将数据返回客户端的存储程序 C    在MySQL中,使用new和old引用触发器中发生的记录内容 D    在触发器中可以使用显示或者隐式方式开始或结束事务的语句 2.假如在MySQL中有存储过程proc1(员工编号,月份)用来查询员工的工资,两个参数类型均为字符类型,则下列调用存储过程的方法正确的是(    ) 正确答案 :

iOS开发基础笔试题(3)

前言 以下部分题目来源于网络,笔者在此处收集起来,既是要巩固自我,也希望能够帮助到同样需要的人!参考答案均为笔者所写,其有疑问或者出错之处,请在评论中提出,谢谢!不喜勿喷! 1.即时聊天App不会采用的网络传输方式 1 2 3 4 5 6 A UDP B TCP C HTTP D FTP 参考答案:D FTP:是文件传输协议,是File Transfer Protocol的简称,它的作用是用于控制互联网上文件的双向传输,因此一定不会是即时聊天使用的: UDP:是面向无连接的传输层协议,数据传输是

iOS开发基础笔试题-(1)

前言 以下部分题目来源于网络,笔者在此处收集起来,既是要巩固自我,也希望能够帮助到同样需要的人!参考答案均为笔者所写,其有疑问或者出错之处,请在评论中提出,谢谢!不喜勿喷! 1. #import和#include的区别? 参考答案: #import是Objective-C导入头文件的语法,可保证不会重复导入.#include是C/C++导入头文件的语法,如果是Objective-C与C/C++混编码,对于C/C++类型的文件,还是使用#include来引入,这种写法需要添加防重复导入的语法. 2

Java基础笔试题

一. 选择题(共50题,每题2分,共100分.多选题选不全或选错都不得分.) 1. 以下属于面向对象的特征的是(C,D).(两项) A) 重载 B) 重写 C) 封装 D) 继承 解析:面向对象的三大特性:封装.继承.多态. 2. 以下代码运行输出是(C) public class Person{ private String name="Person"; int age=0; } public class Child extends Person{ public String gra