笔试/面试题积累

前言

笔试面试涉及的问题,有时候虽然你会,但不经过思考总结,在笔试面试时很容易说不清楚。
下面总结了我在校招过程中遇到的考点,作为积累,也作为补缺补漏的提纲。


数据库

什么是分布式数据库?
分布式数据库是指利用高速计算机网络将物理上(地理位置上)分散的多个数据存储单元连接起来组成一个逻辑上统一的数据库。分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都可能有DBMS的一份完整拷贝副本,或者部分拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库。
优点:以获取更大的存储容量和更高的并发访问量。

数据库的连接池是什么?
因为数据库的连接是非常昂贵的系统资源,程序频繁建立连接将浪费大量系统资源;
连接池连接池是:事先创建好几个数据库连接放着,当需要操作数据库时就从连接池里直接拿连接,并将这个连接标记为“忙”;用完后在放会池中,标记为“空闲”,以此避免频繁创建数据库连接。当连接池里的连接都在“忙”时,若此时还要连接,连接池就会创建新的连接放到池里(当连接数量未达到数据库配置上限时);若连接数达到上限,新申请连接的程序则需等待。连接池的最大最小连接数量由数据库配置文件设定。

事务4大特性ACID:
1. 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3. 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

视图:
视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。视图在操作上和数据表没有什么区别,但两者的差异是在其本质上的。数据表是实际存储记录的地方,然而视图并不是保存任何记录,它存储的实际上是查询语句。
作用:简化常用复杂查询的的操作;不同角度看待数据;安全性,不给用户显示敏感数据

创建视图:

create view view1 as
select id,name
from student
where classname=’软件工程’ and college=’计算机’

使用视图:

select * from view1   (跟表一样的查询方法)

删除视图:

drop view view1

存储过程:
用SQL语言编写的函数,可以定义变量、像编程语言一样完成复杂的逻辑控制。存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,所以提高数据查询的速度。存储过程可以重复使用,跟函数一样。用于较大型的系统,处理数据量较大。

SQL能激活触发器的命令只有:
insert、update、delete。

如何复制表结构和表数据?如何只复制表结构?如何只复制表数据?

1、 复制表结构和数据:

create table tab_new as select * from tab_old

2、复制表结构不复制数据:

create table tab_new as select * from tab_old where 1=2

3、不复制表结构,只复制数据:

insert into tab_new select * from tab_old

或者

select vale1, value2 into tab_new from tab_old

数据库的内连接、外连接:
内连接,是指A、B表保留一一对应上的行,如A有4行,B有6行,那A inner join B 可能只有1行。
外连接是指以AB中保留某张表的所有行,另外张表对应的行进行连接,不对应的为空NULL,分为左外连接left join和右外连接right join和全连接full join。

简单来讲,随便来个例子:
这里写图片描述

内连接就是左表和右表相同的数据:

select * from A inner join B on A.id=B.id

结果:
这里写图片描述

外连接分为:左外连接、右外连接、全外连接
左外连接就是以左表为准去匹配右表,左表有多少条数据,结果就是多少条数据,右表缺少的数据使用null填充

select * from A left join B on A.id=B.id

结果:
这里写图片描述

右外连接就是与左外连接反之,以右表为准去匹配左表,右表有多少条数据,结果就是多少条数据,左表缺少的数据使用null填充

select * from A right join B on A.id=B.id

结果:
这里写图片描述

全外连接相当与是左外连接和右外连接的综合:

select * from A full join B on A.id=B.id

结果:
这里写图片描述

编写SQL语句,编号id从小到大选择前10个、11-20个、100之后的数据。
开头到N条记录 (top N)

Select Top N * From 表

N到结尾记录 (top N desc)

Select Top N * FromOrder by ID Desc

N到M条记录(要有主索引ID) (top M-N desc)

Select Top M-N * FromWhere ID in (Select Top M ID From 表) Order by ID Desc

数据库的分页查询,以每页10条数据为例
方法一:内存查询+数据库查询结合(有自增长的ID)
http://www.cnblogs.com/bluestorm/archive/2012/08/06/2625578.html
1、为每行数据增加一列自增长的ID(该列设置索引),可以通过ID大小来获取指定的数据。
2、首次查询时按大小所有ID倒序:

select queryId from test_table where + 查询条件 +order by queryId desc

将查询结果保存在服务器的一个数组之中,以备翻页查询
3、用户翻页时根据页号和数组查询ID的最大最小值,再使用以下语句读取数据:
查询语句如下:

String sql = "select * from test_table" + 查询条件 + "(queryId <= " + startId + " and queryId >= " + endId + ")";

方法二:数据库SQL语句查询
MySQL数据库分页Limit

Select * from 表名 limit startrow,pagesize

SQL Server 2000数据库分页: Top+ Not in

Select top pagesize * from 表名 
where 列名 not in 
    (select top pagesize*page 列名 from 表名
     order by 列名) 
order by 列名 

解释:

select top 10 * from user3页数据(21-30条)
where id not in 
    (select top 2*10 id from user2页数据2*10=20条
     orderby id)
orderby id

方法三:部分数据库有ROW_NUMBER()类似方法,来实现分页。
方法四:使用存储过程根据页号来查询

SQL查询优化:
SQL中在某字符列如object _name上建立索引后,语句like ‘ABC%’可以高效查询,然而like ‘%ABC’效率低下。此时如何高效地实现后者的查询?
http://sanwen8.cn/p/23b9Ocs.html
解决方法:
使用reverse()函数对字符列进行倒序,并在倒序结果上建立索引,再用like ‘ABC%’语法进行查询(查询内容也要对应修改为倒序)。

create index idx_t1_objectname2 on t1(reverse(object_name));
select object_name from t1 where reverse(object_name) like reverse('%ABC');

C#

C#中 ref 与 out 参数,是否需要初始化:
ref需要,out不需要

string s1=""; string s2=string.Empty; string s3=null; 的区别
(1)string.Empty在语法级别对“”优化,但二者在用法与性能上基本没区别。
(2)s1会在栈内存上保存一个地址(占4字节),指向堆内存中的某个长度为0的空间,这个空间保存的是str1的实际值(空串)。s2同样在栈内存上保存一个地址(占4字节),指向与s1一致的堆内存地址(编译器优化:共享字符串常量)。str3也会在栈上保存一个地址(占4字节),但这个地址没有明确的指向,堆内存上没有分配空间,其内容为0x00000000。
详见:http://blog.csdn.net/henulwj/article/details/7830615

C#中readonly与const的区别?
http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html
相同:const与readonly都是将变量声明为只读,且在变量初始化后就不可改写
异同:
1、 const修饰的常量是静态常量(或编译时常量,compile-time constants),其修饰的常量在编译期间就被解析,即常量值被替换成初始化的值,因此在声明的时候必须初始化。
2、 readonly修饰的常量是动态常量(或运行时常量,runtime constants),其修饰的常量值在程序运行中获得,因此不必在声明时就初始化,可以延迟到构造函数初始化。

C#中virtual与abstract的区别?
virtual与abstract都可以用来指定需要被重写的成员,但virutal可以由具体实现(父类的默认实现),abstract不能有方法体。

DataTable和DataSet的区别?
DataAdapter接受SQL命令读取数据后断开与数据库的连接,通过Fill()来填充DataSet。DataSet可以包含多个DataTable,通过dataSet.Tables[0]来访问每张DataTable。DataTable有对应数据的行和列。

C#中 property 和 attribute的作用是?
对于property和attribute这两个名词都叫“属性”的问题,来源于国内it书籍翻译界的疏忽。其实它们来源于两个不同的领域,attribute属于OOA/OOD的概念,而property属于编程语言中的概念。
Attributes特性,是Microsoft .NET Framework文件的元数据,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为,通过反射读取特性值。
Property属性,是面向对象编程的基本概念,提供了对私有字段(Field)的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。

attribute和property 的区别:
可以说两者没有可比性,只不过我们国家的语言特点才引起的歧异,其实只要记住Attribute是派生于System,Attribute类之下,它的主要作用是描述,比如为了描述某个方法是来自与外部的dll,可以写代码[DllImport(“User32.dll”)],这就是一个Attribute,他是一个描述(或者说声明)

[DllImport("User32.dll")]       //Attribute特性(举例)
public int Number {             //Property属性
    get { return number; } 
    set { number=value;}
} 
private int number;         //Field字段

什么是泛型?有什么好处?
泛型即通过参数化类型来实现在同一份代码上操作多种数据类型,旨在实现定义的泛型类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。
*使用泛型可以把类型当做参数进行传递,减少代码量。

什么是委托?有什么好处?
委托是定义一个函数的类型(参数类型与返回值),之后可将匹配该类型的函数作为该类型
*使用委托可以把函数作为参数进行传递。

什么是委托?事件是不是委托?
委托是一种在对象里保存方法引用的类型,可以把与委托有相同参数列表和返回值类型的方法作为委托类型的实例进行调用(把方法当做参数进行传递)。委托同时也是一种类型安全的函数指针:C语言中的函数指针只不过是一个指向存储单元的指针,我们无法说出这个指针实际指向什么,而委托确定了指向方法的返回值类型和参数列表,因此是类型安全的。

事件是一种受限制的委托,只能施加+=,-=操作符。事件是对委托的修饰,实现了对委托的封装,但二者本质相同。

委托、事件的使用:
delegate定义一种委托类型,然后创建委托实例,该实例支持委托的+=、-=和其他操作;
若在创建委托实例时, 用event修饰,该实例就变成了一个事件,只支持委托的+=、-=操作
例子见:http://www.cnblogs.com/dirichlet/archive/2013/09/15/3247020.html

在多播委托中需要注意两点:
(1)+=和-=操作,其实它们分别调用了Delegate.Combine和Delegate.Remove方法
(2)多播委托的返回值一般为void,如果委托类型为非void类型,那么多播委托将返回最后一个调用的方法的执行结果,实际中不推荐这样应用。

面向对象编程:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒
设计方法一:观察者模式
设计方法二:事件、委托
http://www.cnblogs.com/xinqqing83/archive/2006/10/11/526446.html
http://www.cnblogs.com/Olive116/archive/2012/11/12/2765934.html

C#与JAVA的区别?
https://www.zhihu.com/question/20451584


Java

以下哪个不属于JAVA基础语法:
A命名空间 B包 C接口 D匿名类
答案:A命名空间是C#的内容。

下面可以被继承的类是:C

A.  java.lang.Double        public final class Double
B.  java.lang.Math          public final class Math
C.  java.lang.Thread        public class Thread
D.  java.lang.Class         public final class Class<T>

final关键字修饰类时,表示该类不可被继承。

下面哪个关键字可以对对象加互斥锁?synchronized

transient       被该关键字修饰的字段不会被序列化
synchronized    互斥锁,实现线程同步
serialize       ?
static          申明变量或方法为静态,代码保存在内存数据区,只有一份

Collection的四种主要接口是?

Set<E>,List<E>, Queue<E>, Deque<E>

集合类包括哪些,有什么区别?
HashSet,派生于Set,
TreeSet,派生于Set,
ArrayList,派生于List,用数组实现的List,读快写慢;
LinkedList,派生于List,用链表实现的List,读慢写快。

以下语句正确编译的是:B

A.  short s1=1;s1=s1+1
B.  short s1=1;s1+=1
C.  short s1=1;s1=s1-1
D.  short s1=1;s1=s1*1

解析:
ACD中,整型常量1在Java中默认为int类型(浮点类型默认为double),表达式计算时自动将所有操作数转换为较大表数范围的类型,因此s1+1的结果为int类型,要赋值给s1,需进行强制转换,如s1=(short)(s1+1),因此ACD错误。
关于B:
表达式x = x + ix += i都被称为赋值表达式。x = x + i表达式使用的是简单赋值操作符(=),而x += i使用的是复合赋值操作符。Java规范上说 x += i等价于x =(T)(x + i),其中T是x的数据类型,自动进行了转换。因此 s1+=1等效于s1=(short)(s1+1),所以是正确的。

但是,如果计算结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于byte、short或char类型的变量,这三类变量进行混合计算时首先被转换为int。

Try-catch-finally中,如果try中抛出的异常没有在catch中匹配,那么是否会执行finally和finally之后的语句?程序是否崩溃?
Java中的异常分为Error(错误)和Exception(异常)。Error无法被程序处理,如JVM错误,表现为程序中断退出;而Exception可以使用try-catch语句进行处理,在抛出异常被正确处理的情况下,程序相当于是正常运行。

try{ … } 
catch{ … } 
finally{ … } 
statements after try-catch;

try:try块中异常语句之后的其他语句不再执行;
finally:除非在finally之前执行了程序退出的代码(如catch中使用System.exit(0)),否则finally始终会执行(即使抛出的异常无法被捕获而导致程序出现Error而退出):
catch块:若抛出的异常被catch捕获,try-catch语句块之后的代码会正常执行(异常被正常处理,程序继续运行);若抛出的异常类型未被catch捕获,此时程序出现错误(Error)而中断退出,而try-catch语句块之后的语句不执行,【但finally仍会执行】。

*另外,catch中捕获的异常类型顺序应从上到下递增的顺序,当catch匹配了一个异常类型后,不会再往下匹配其他的异常。因此,若把“大”异常写在上“小”异常之前,编译器会报“小”异常Unreachable错误,编译不通过。

String、StringBuilder、StringBuffer的区别
String是不可变字符序列,每一个字符串常量都会在内存中的数据区data segment占据一个空间,因此使用String对象时会频繁创建内存空间,特别是在字符串连接时,效率低下。
StringBuilder和StringBuffer是可变字符序列,在字符操作方面效率较高;StringBuilder是非线程安全的,所以用完以后可以丢弃;StringBuffer线程安全,主要用在全局变量中。

如果操作少量的数据,用String;
单线程操作大量数据,用StringBuilder(非线程安全), 一般用来完成类似”+”功能;
多线程操作大量数据,用StringBuffer(线程安全), 主要用在全局变量中。

abstract class和interface的区别?
二者在语法上十分相似,甚至可以互相替换,都可以完成对事物的抽象表示,二者的根本区别在于设计层面。
语法层面上:
interface是特殊的abstract class,其所有成员方法都是abstract的,所有成员变量是static final的,而abstract class并不一定如此。Java的单继承决定了一个类只能单继承abstract class,但可以多实现interface。
设计层面上:
abstract class是对本质相同的事物的抽象,强调的是同类事物的属性,如自行车和汽车都是车;
interface是对相同功能的抽象,强调的是事物(同类或不同类)具有的相同方法,如汽车和动物都可以跑;
http://blog.csdn.net/b271737818/article/details/3950245
http://blog.csdn.net/shuilv2000/article/details/6030387

“两个对象值相同 x.equals(y) == true ,但却可有不同的hashCode()”这句话对不对?
从业务逻辑上说,这equals与hashcode表现应该保持一致,特别是在使用对象作为Map容器的key时,互相equals的对象应该具有相同的hashCode(),才能保证key-value的正确查询。

但是可以通过重写这两个方法强制实现不一致(不推荐)。互相equals的两个对象只是逻辑上相同(如具有相同id、name的person对象可以认为是同一个人),但物理上不一定是相同的(两个person对象的内存地址是不一样的),equals相等而hashcode不等可以达到该目的,但Java API不推荐这样的用法。java.lang.Object类的equals方法默认比较对象地址(即==比较),一般情况下需要重写equals方法进行逻辑比较,重写equals时也要重写hashCode确保二者表现一致。
详见:http://bbs.csdn.net/topics/370130291

什么是装箱/拆箱boxing/unboxing,原理是什么
装箱/拆箱:
装箱:将值类型转换为引用类型,如int i = 1; object o = i; //object或某种int的父类/接口
拆箱:将引用类型转换为值类型,如int j = (int) o; //被装箱的对象才能被拆箱

作用:
将值类型包装为引用类型,可使原本存储在栈内存的值类型被存储到堆内存,可被垃圾回收机制处理。对于一些接受参数为object的方法和非泛型容器(一般以object为参数增加扩展性),需要将值类型装箱后使用。

效率:
装箱需要生成新的引用类型对象,降低了效率。因此应该避免使用装箱/拆箱,尽量通过函数重载、泛型达到装箱/拆箱的目的。

详见:http://www.cnblogs.com/huashanlin/archive/2007/05/16/749359.html

文件流操作时,怎么知道读取的文件的编码格式?
文件开头3个字符标记了文本所用的编码格式
http://jingyan.baidu.com/article/6dad507507dd2aa123e36ea4.html

阐释类构造函数的初始化过程:静态成员、静态方法、父类构造函数、子类构成函数等
http://www.cnblogs.com/runnigwolf/p/5570810.html

JavaBean包括:
让用户一开始就使用getSize()而不是size属性,以便有朝一日修改getSize()实现时,不破坏向后兼容性。这种public int getSize() { return size; }的惯用手法,就是Java Bean。Java Bean是一种惯用模式或者约定。


Android

安卓四大组件:Activity、BroadcastReceive、Service、Content Provider
Activity活动 :
一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。
BroadcastReceive广播接收器:
没有UI。可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。
Service 服务:
一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。如音乐播放器的后台播放。
Content Provider内容提供者 :
android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序(如联系人)。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式,

Activity生命周期:

onCreate()
    onStart()
        onResume()
        onPause()
    onStop()
    [onRestart]
onDestroy()   

继承SQLiteOpenHelper实现对数据库的创建、插入、读取:
略,后续补充。

原生android程序如何移植不同型号手机?
略,后续补充。

Web

CSS:margin:{ 8px 3px } 等效于

margin:{ 8px 3px =} (上下,左右) 等效于
margin:{ 8px 3px 8px 3px } (上,右,下,左)。

Web编程中POST和GET的区别。
(1)GET是从服务器上获取数据,post是向服务器传送数据。
(2)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(3)安全性问题。正如在(2)中提到,使用Get的时候,参数会显示在地址栏上,而Post不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用post为好。
(4)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(5)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。


多线程编程

什么是多线程
通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来。一个最直接的方法便是使用多线程。多线程编程的方式在大型开发中必不可少。

.NET多线程编程
Thread.start发起线程,UI的Invoke回调更新UI
http://www.cnblogs.com/GIS_zhou/articles/1839248.html

1、Thread t = new Thread(new ThreadStart(this.DoSomething));
从UI线程定义线程,DoSomething是业务内容,并start()开始线程。
2、线程开销较大,可使用线程池ThreadPool相关方法
3、this.Invoke回调,改变UI。业务线程里面执行完毕,要改变窗体控件的值了,此时,如果直接通过this得到控件的句柄,然后对它进行操作是会抛异常的,.Net WinForm Application里面是不允许这样的操作的。这是,可以调用Control.Invoke方法

什么是线程安全?什么是线程同步?
多线程可能同时访问同一资源,如改写内存中同一个对象,这可能会使得改写的结果与预期不一致,这个现象被称为“非线程安全”或“线程不安全”。“线程安全”是指通过同步的方式,使得某一时刻资源被一个线程锁定,不允许其他线程进行访问,以此避免访问结果不一致的问题。

Java多线程有哪几种实现方法?
http://blog.csdn.net/andymu077/article/details/52312330
JAVA多线程实现方式主要有两种:
1、实现Runnable接口;
2、继承Thread类;
两种方法本质相同,Thread是实现了Runnable接口的一个实例。相较继承Thread方法,实现Runnable接口可以避免由于Java的单继承特性带来的局限。使用方式如下:

class ThreadTest1 extends Thread{  //1通过继承Thread类,重写run()方法实现
    public void run(){
        System.out.println("执行线程1...");
}
class ThreadTest2 implements Runnable{  //2通过实现Runnable接口,重写run()方法实现
    public void run(){
        System.out.println("执行线程2...");
}
public static void main(String[] args) {
    new ThreadTest1().start();  //启动线程1
    new Thread( new ThreadTest2()) .start();  //启动线程2
}

同步有哪几种实现方法?
Java用synchronized关键字锁定对象来实现同步机制,被锁定的对象在任意时刻只能被一个线程访问,其他线程要访问该对象需等待。
方法一:同步代码块,如在需要同步的代码块加上 synchronized(this) {…},执行此代码段时当前对象被锁定。
方法二:同步方法,如public synchronized void add(){…},执行add方法时当前对象(定义该方法的类的实力)被锁定。

Android多线程编程:采用Thread+Handler的方式实现UI更新
使用Thread线程获取数据而不在UI线程中获取数据是为了避免耗时操作堵塞UI线程;
使用Handler更新UI,是因为Android主线程(UI线程)是线程不安全的,也就是说更新UI只能在主线程中更新,子线程(数据线程)中更新UI是危险的,而Handler运行于主线程。Thread线程发出Handler消息,通知更新UI。Handler来根据接收的消息,处理UI更新。

在我的android项目中:
1、定义数据线程:定义数据访问线程如UserThread实现Runnable接口的run()方法,根据参数实现不同的数据访问。
2、发起数据线程:在UI线程中实例化该数据线程,传递给Thread并Start,如new Thread(new UserThread(id)).start();
3、通过Handler更新UI:数据线程获取数据后调用UI的Handler对象的sendMessageDelayed()方法传递Message(包含数据),让Handler对UI进行更新。
4、Handler对象在接收到message后,使用handleMessage(msg)对获得数据进行处理。

android中的Handler是什么?
Handler主要接受子线程发送的数据,并用此数据配合主线程更新UI。
当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发。比如,点击一个Button,Android会分发事件到Button上来响应操作。如果在主线程中进行耗时的操作(如联网读取数据),界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示”强制关闭”。因此需要把这些耗时的操作,放在一个子线程中。
因为子线程涉及到UI更新(如读取数据完毕时更新界面),但Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。Handler的出现解决了这个问题。Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据。Handler接受子线程传过来的(子线程用sedMessage()方法传递)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。


C/C++

char[]p="abc"; char[]q={'a','b','c'};问:sizeof(p)跟sizeof(q)的值以及strlen(p)和strlen(q)的值?

char p[]="abc";相当于char p[4]="abc"; 其中p[0]='a';p[1]='b';p[2]='c';p[3]=0;
char q[]={'a','b','c'};相当于char q[3]={'a','b','c'};

sizeof(p)等于4,sizeof(q)等于3,返回的是数组实际元素个数
strlen(p)由于p中最后一个单元取值是0表示字符串结束,所以会返回字符个数3
strlen(q)由于q数组中没有字符串结束的0,所以返回值取决于数组后面的数据出现0的位置,但应该大于等于3

http://www.cnblogs.com/nightwatcher/archive/2011/03/13/1982575.html
sizeof的作用是告诉我们分配给变量的“建筑面积”而不是“实用面积”。当sizeof的参数为数组名时,得到数组的大小;参数为指针时,得到指针本身的大小(一般为4)

以下说法正确的是?C
A. C语言程序总是从第一个函数开始执行(错)
B. C语言程序要调用的函数必须在main()中定义(错)
C. C语言程序总是从main()函数开始执行(一般对,但是也可以另外指定程序入口)
D. C语言程序中的main()必须放在程序开始部分(错)

32位机器上,C语言的以下基本类型字节长度是:

Intshort intunsigned intlongfloatdoublechar
4244481

http://blog.csdn.net/sun_song520/article/details/51682128

局部变量能否和全局变量重名?   
能,局部会屏蔽全局。要用全局变量,需要使用 “:: ”
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?  
可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

C语言实现函数:字符串str找子串substr出现次数,字母大小写认为相同,且不重复计算,如”aaaaa”中包含”aa”2个
略。


概念题

重载与重写的区别?
重载:函数名相同,参数不同,功能不同;
重写:子类继承父类(或实现接口),覆盖父类函数实现,如toString()。

面向对象的三大特征?
封装、继承、多态

影响局域网的三大关键技术是?
网络拓扑、传输介质和介质访问控制方法。

Internet使用什么协议?该协议的组成结构?
TCP/IP协议,5层:应用层、传输层、网络层、数据链路层、物理层


智力题

(以下题可百度)
扑克花色推理
二对三胞胎推理
和尚敲钟50下
虫子啃书
买卖盈利:7买入8卖出9买入10卖出,赚多少?-7+8-9+10=2
用6ml瓶子和5ml瓶子,倒出3ml的水;
有天平、7g砝码、2g砝码,三次操作将140g盐分为90g和50g

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KwCoding

谢了老板您讷~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值