资源描述
概念题:
1. 什么是“引用”?声明和使用“引用”要注意哪些问题?
答:引用就是某个目的变量“别名”(alias),对引用操作与对变量直接操作效果完全相似。声明一种引用时候,牢记要对其进行初始化。引用声明完毕后,相称于目的变量名有两个名称,即该目的原名称和引用名,不能再把该引用名作为其她变量名别名。声明一种引用,不是新定义了一种变量,它只表达该引用名是目的变量名一种别名,它自身不是一种数据类型,因而引用自身不占存储单元,系统也不给引用分派存储单元。不能建立数组引用。
2. 将“引用”作为函数参数有哪些特点?
(1)传递引用给函数与传递指针效果是同样。这时,被调函数形参就成为本来主调函数中实参变量或对象一种别名来使用,因此在被调函数中对形参变量操作就是对其相应目的对象(在主调函数中)操作。
(2)使用引用传递函数参数,在内存中并没有产生实参副本,它是直接对实参操作;而使用普通变量传递函数参数,当发生函数调用时,需要给形参分派存储单元,形参变量是实参变量副本;如果传递是对象,还将调用拷贝构造函数。因而,当参数传递数据较大时,用引用比用普通变量传递参数效率和所占空间都好。
(3)使用指针作为函数参数虽然也能达到与使用引用效果,但是,在被调函数中同样要给形参分派存储单元,且需要重复使用"*指针变量名"形式进行运算,这很容易产生错误且程序阅读性较差;另一方面,在主调函数调用点处,必要用变量地址作为实参。而引用更容易使用,更清晰。
3. 在什么时候需要使用“常引用”?
如果既要运用引用提高程序效率,又要保护传递给函数数据不在函数中被变化,就应使用常引用。常引用声明方式:const 类型标记符 &引用名=目的变量名;
例1
int a ;
const int &ra=a;
ra=1;//错误
a=1;//对的
例2
string foo( );
void bar(string & s);
那么下面表达式将是非法:
bar(foo( ));
bar("hello world");
因素在于foo( )和"hello world"串都会产生一种暂时对象,而在C++中,这些暂时对象都是const类型。因而上面表达式就是试图将一种const类型对象转换为非const类型,这是非法。
引用型参数应当在能被定义为const状况下,尽量定义为const 。
4. 将“引用”作为函数返回值类型格式、好处和需要遵守规则?
格式:类型标记符 &函数名(形参列表及类型阐明){ //函数体 }
好处:在内存中不产生被返回值副本;(注意:正是由于这点因素,因此返回一种局部变量引用是不可取。由于随着该局部变量生存期结束,相应引用也会失效,产生runtime error!
注意事项:
(1)不能返回局部变量引用。这条可以参照Effective C++[1]Item 31。重要因素是局部变量会在函数返回后被销毁,因而被返回引用就成为了"无所指"引用,程序会进入未知状态。
(2)不能返回函数内部new分派内存引用。这条可以参照Effective C++[1]Item 31。虽然不存在局部变量被动销毁问题,可对于这种状况(返回函数内部new分派内存引用),又面临其他尴尬局面。例如,被函数返回引用只是作为一种暂时变量浮现,而没有被赋予一种实际变量,那么这个引用所指向空间(由new分派)就无法释放,导致memory leak。
(3)可以返回类成员引用,但最佳是const。这条原则可以参照Effective C++[1]Item 30。重要因素是当对象属性是与某种业务规则(business rule)有关联时候,其赋值经常与某些其他属性或者对象状态关于,因而有必要将赋值操作封装在一种业务规则当中。如果其他对象可以获得该属性非常量引用(或指针),那么对该属性单纯赋值就会破坏业务规则完整性。
(4)流操作符重载返回值声明为“引用”作用:
流操作符<<和>>,这两个操作符经常但愿被持续使用,例如:cout << "hello" << endl; 因而这两个操作符返回值应当是一种依然支持这两个操作符流引用。可选其他方案涉及:返回一种流对象和返回一种流对象指针。但是对于返回一种流对象,程序必要重新(拷贝)构造一种新流对象,也就是说,持续两个<<操作符事实上是针对不同对象!这无法让人接受。对于返回一种流指针则不能持续使用<<操作符。因而,返回一种流对象引用是惟一选取。这个唯一选取很核心,它阐明了引用重要性以及无可代替性,也许这就是C++语言中引入引用这个概念因素吧。赋值操作符=。这个操作符象流操作符同样,是可以持续使用,例如:x = j = 10;或者(x=10)=100;赋值操作符返回值必要是一种左值,以便可以被继续赋值。因而引用成了这个操作符惟一返回值选取。
例3
#i nclude <iostream.h>
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10;//以put(0)函数值作为左值,等价于vals[0]=10;
put(9)=20;//以put(9)函数值作为左值,等价于vals[9]=20;
cout<<vals[0];
cout<<vals[9];
}
int &put(int n)
{
if (n>=0 && n<=9 ) return vals[n];
else { cout<<"subscript error";return error;}
}
(5)在此外某些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]Item23详细讨论了这个问题。重要因素是这四个操作符没有side effect,因而,它们必要构造一种对象作为返回值,可选方案涉及:返回一种对象、返回一种局部变量引用,返回一种new分派对象引用、返回一种静态对象引用。依照前面提到引用作为返回值三个规则,第2、3两个方案都被否决了。静态对象引用又由于((a+b) == (c+d))会永远为true而导致错误。因此可选只剩余返回一种对象了。
5. “引用”与多态关系?
引用是除指针外另一种可以产生多态效果手段。这意味着,一种基类引用可以指向它派生类实例。
例4
Class A;Class B :Class A{...};B b;A& ref = b;
6. “引用”与指针区别是什么?
指针通过某个指针变量指向一种对象后,对它所指向变量间接操作。程序中使用指针,程序可读性差;而引用自身就是目的变量别名,对引用操作就是对目的变量操作。此外,就是上面提到对函数传ref和pointer区别。
7. 什么时候需要“引用”?
流操作符<<和>>、赋值操作符=返回值、拷贝构造函数参数、赋值操作符=参数、其他状况都推荐使用引用。
以上 2-8 参照:
8. 构造与联合有和区别?
1. 构造和联合都是由各种不同数据类型成员构成,但在任何同一时刻,联合中只存储了一种被选中成员(所有成员共用一块地址空间),而构造所有成员都存在(不同成员存储地址不同)。
2. 对于联合不同成员赋值,将会对其他成员重写,本来成员值就不存在了,而对于构造不同成员赋值是互不影响。
13. .h头文献中ifndef/define/endif 作用?
答:防止该头文献被重复引用。
14. #i nclude<file.h> 与 #i nclude "file.h"区别?
答:前者是从Standard Library途径寻找和引用file.h,而后者是从当前工作途径搜寻并引用file.h。
15.在C++ 程序中调用被C 编译器编译后函数,为什么要加extern “C”?
一方面,作为extern是C/C++语言中表白函数和全局变量作用范畴(可见性)核心字,该核心字告诉编译器,其声明函数和变量可以在本模块或其他模块中使用。
普通,在模块头文献中对本模块提供应其他模块引用函数和全局变量以核心字extern声明。例如,如果模块B欲引用该模块A中定义全局变量和函数时只需包括模块A头文献即可。这样,模块B中调用模块A中函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成目的代码中找到此函数
extern "C"是连接声明(linkage declaration),被extern "C"修饰变量和函数是按照C语言方式编译和连接,来看看C++中对类似C函数是如何编译:
作为一种面向对象语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中名字与C语言不同。例如,假设某个函数原型为:
void foo( int x,int y );
该函数被C编译器编译后在符号库中名字为_foo,而C++编译器则会产生像_foo_int_int之类名字(不同编译器也许生成名字不同,但是都采用了相似机制,生成新名字称为“mangled name”)。
_foo_int_int 这样名字包括了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载。例如,在C++中,函数void foo( int x,int y )与void foo( int x,float y )编译生成符号是不相似,后者为_foo_int_float。
同样地,C++中变量除支持局部变量外,还支持类成员变量和全局变量。顾客所编写程序类成员变量也许与全局变量同名,咱们以"."来区别。而本质上,编译器在进行编译时,与函数解决相似,也为类中变量取了一种独一无二名字,这个名字与顾客程序中同名全局变量名字不同。
未加extern "C"声明时连接方式
假设在C++中,模块A头文献如下:
// 模块A头文献 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x,int y );
#endif
在模块B中引用该函数:
// 模块B实现文献 moduleB.cpp
#i nclude "moduleA.h"
foo(2,3);
事实上,在连接阶段,连接器会从模块A生成目的文献moduleA.obj中寻找_foo_int_int这样符号!
加extern "C"声明后编译和连接方式
加extern "C"声明后,模块A头文献变为:
// 模块A头文献 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x,int y );
#endif
在模块B实现文献中依然调用foo( 2,3 ),其成果是:
(1)模块A编译生成foo目的代码时,没有对其名字进行特殊解决,采用了C语言方式;
(2)连接器在为模块B目的代码寻找foo(2,3)调用时,寻找是未经修改符号名_foo。
如果在模块A中函数声明了foo为extern "C"类型,而模块B中包括是extern int foo( int x,int y ) ,则模块B找不到模块A中函数;反之亦然。
因此,可以用一句话概括extern “C”这个声明真实目(任何语言中任何语法特性诞生都不是随意而为,来源于真实世界需求驱动。咱们在思考问题时,不能只停留在这个语言是怎么做,还要问一问它为什么要这样做,动机是什么,这样咱们可以更进一步地理解许多问题):实现C++与C及其他语言混合编程。
明白了C++中extern "C"设立动机,咱们下面来详细分析extern "C"普通使用技巧:
extern "C"惯用法
(1)在C++中引用C语言中函数和变量,在包括C语言头文献(假设为cExample.h)时,需进行下列解决:
extern "C"
{
#i nclude "cExample.h"
}
而在C语言头文献中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文献中包括了extern "C"时会浮现编译语法错误。
C++引用C函数例子工程中包括三个文献源代码如下:
/* c语言头文献:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c语言实现文献:cExample.c */
#i nclude "cExample.h"
int add( int x,int y )
{
return x + y;
}
// c++实现文献,调用add:cppFile.cpp
extern "C"
{
#i nclude "cExample.h"
}
int main(int argc,char* argv[])
{
add(2,3);
return 0;
}
如果C++调用一种C语言编写.DLL时,当涉及.DLL头文献或声明接口函数时,应加extern "C" { }。
(2)在C中引用C++语言中函数和变量时,C++头文献需添加extern "C",但是在C语言中不能直接引用声明了extern "C"该头文献,应当仅将C文献中将C++中定义extern "C"函数声明为extern类型。
C引用C++函数例子工程中包括三个文献源代码如下:
//C++头文献 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x,int y );
#endif
//C++实现文献 cppExample.cpp
#i nclude "cppExample.h"
int add( int x,int y )
{
return x + y;
}
/* C实现文献 cFile.c
/* 这样会编译出错:#i nclude "cExample.h" */
extern int add( int x,int y );
int main( int argc,char* argv[] )
{
add( 2,3 );
return 0;
}
17.面向对象三个基本特性,并简朴论述之?
1. 封装:将客观事物抽象成类,每个类对自身数据和办法实行protection(private,protected,public)
2. 继承:广义继承有三种实现形式:实现继承(指使用基类属性和办法而无需额外编码能力)、可视继承(子窗体使用父窗体外观和实当代码)、接口继承(仅使用属性和办法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用两种方式。
3. 多态:是将父对象设立成为和一种或更多她子对象相等技术,赋值之后,父对象就可以依照当前赋值给它子对象特性以不同方式运作。简朴说,就是一句话:容许将子类类型指针赋值给父类类型指针。
18. 重载(overload)和重写(overried,有书也叫做“覆盖”)区别?
常考题目。从定义上来说:
重载:是指容许存在各种同名函数,而这些函数参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义复类虚函数办法。
从实现原理上来说:
重载:编译器依照函数不同参数表,对同名函数名称做修饰,然后这些同名函数就成了不同函数(至少对于编译器来说是这样)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后函数名称也许是这样:int_func、str_func。对于这两个函数调用,在编译器间就已经拟定了,是静态。也就是说,它们地址在编译期就绑定了(早绑定),因而,重载和多态无关!
重写:和多态真正有关。当子类重新定义了父类虚函数后,父类指针依照赋给它不同子类指针,动态调用属于子类该函数,这样函数调用在编译期间是无法拟定(调用子类虚函数地址无法给出)。因而,这样函数地址是在运营期绑定(晚绑定)。
19. 多态作用?
重要是两个:1. 隐藏实现细节,使得代码可以模块化;扩展代码模块,实当代码重用;2. 接口重用:为了类在继承和派生时候,保证使用家族中任一类实例某一属性时对的调用。
20. Ado与A相似与不同?
除了“可以让应用程序解决存储于DBMS 中数据“这一基本相似点外,两者没有太多共同之处。但是Ado使用OLE DB 接口并基于微软COM 技术,而ADO.NET 拥有自己ADO.NET 接口并且基于微软.NET 体系架构。众所周知.NET 体系不同于COM 体系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,这也就是说ADO.NET 和ADO是两种数据访问方式。ADO.net 提供对XML 支持。
21. New delete 与malloc free 联系与区别?
答案:都是在堆(heap)上进行动态内存操作。用malloc函数需要指定内存分派字节数并且不能初始化对象,new 会自动调用对象构造函数。delete 会调用对象destructor,而free 不会调用对象destructor.
22. #define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?
答案:i 为30。
23. 有哪几种状况只能用intialization list 而不能用assignment?
答案:当类中具有const、reference 成员变量;基类构造函数都需要初始化表。
24. C++是不是类型安全?
答案:不是。两个不同类型指针之间可以强制转换(用reinterpret cast)。C#是类型安全。
25. main 函数执行此前,还会执行什么代码?
答案:全局对象构造函数会在main 函数之前执行。
26. 描述内存分派方式以及它们区别?
1) 从静态存储区域分派。内存在程序编译时候就已经分派好,这块内存在程序整个运营期间都存在。例如全局变量,static 变量。
2) 在栈上创立。在执行函数时,函数内局部变量存储单元都可以在栈上创立,函数执行结束时这些存储单元自动被释放。栈内存分派运算内置于解决器指令集。
3) 从堆上分派,亦称动态内存分派。程序在运营时候用malloc 或new 申请任意多少内存,程序员自己负责在何时用free 或delete 释放内存。动态内存生存期由程序员决定,使用非常灵活,但问题也最多。
27.struct 和 class 区别
答案:struct 成员默认是公有,而类成员默认是私有。struct 和 class 在其她方面是功能相称。
从感情上讲,大多数开发者感到类和构造有很大差别。感觉上构造仅仅象一堆缺少封装和功能开放内存位,而类就象活并且可靠社会成员,它有智能服务,有牢固封装屏障和一种良好定义接口。既然大多数人都这样以为,那么只有在你类有很少办法并且有公有数据(这种事情在良好设计系统中是存在!)时,你也许应当使用 struct 核心字,否则,你应当使用 class 核心字。
28.当一种类A 中没有声明任何成员变量与成员函数,这时sizeof(A)值是多少,如果不是零,请解释一下编译器为什么没有让它为零。(Autodesk)
答案:必定不是零。举个反例,如果是零话,声明一种class A[10]对象数组,而每一种对象占用空间是零,这时就没办法区别A[0],A[1]…了。
30. 比较C++中4种类型转换方式?
static_cast:
const_cast:常量指针被转化成非常量指针,并且依然指向本来对象;常量引用被转换成非常量引用,并且依然指向本来对象;常量对象被转换成非常量对象。
dynamic_cast:
reinterpret_cast:
static_cast可以施加于任何类型,不论该类型与否具备多态性,dynamic_cast只能施加于具备多态性类型,并且转型目类型必要是指针或引用(即<T*或T&>);但dynamic_cast才干实行运营期类型安全检查。
31.分别写出BOOL,int,float,指针类型变量a 与“零”比较语句。
答案:
BOOL :if ( !a ) or if(a)
int :if ( a == 0)
float :const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)
pointer :if ( a != NULL) or if(a == NULL)
32.请说出const与#define 相比,有何长处?
答案:1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替代,没有类型安全检查,并且在字符替代也许会产生意料不到错误。
2) 有些集成化调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。
33.简述数组与指针区别?
数组要么在静态存储区被创立(如全局数组),要么在栈上被创立。指针可以随时指向任意类型内存块。
(1)修改内容上差别
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”;// 注意p 指向常量字符串
p[0] = ‘X’;// 编译器不能发现该错误,运营时错误
(2) 用运算符sizeof 可以计算出数组容量(字节数)。sizeof(p),p 为指针得到是一种指针变量字节数,而不是p 所指内存容量。C++/C 语言没有办法懂得指针所指内存容量,除非在申请内存时记住它。注意当数组作为函数参数进行传递时,该数组自动退化为同类型指针。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl;// 12 字节
cout<< sizeof(p) << endl;// 4 字节
计算数组和指针内存容量
void Func(char a[100])
{
cout<< sizeof(a) << endl;// 4 字节而不是100 字节
}
34.类成员函数重载、覆盖和隐藏区别?
答案:
a.成员函数被重载特性:
(1)相似范畴(在同一种类中);
(2)函数名字相似;
(3)参数不同;
(4)virtual 核心字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特性是:
(1)不同范畴(分别位于派生类与基类);
(2)函数名字相似;
(3)参数相似;
(4)基类函数必要有virtual 核心字。
c.“隐藏”是指派生类函数屏蔽了与其同名基类函数,规则如下:
(1)如果派生类函数与基类函数同名,但是参数不同。此时,无论有无virtual核心字,基类函数将被隐藏(注意别与重载混淆)。
(2)如果派生类函数与基类函数同名,并且参数也相似,但是基类函数没有virtual 核心字。此时,基类函数被隐藏(注意别与覆盖混淆)
35. There are two int variables:a and b,don’t use “if”,“?:”,“switch”or other judgement statements,find out the biggest one of the two numbers.
答案:( ( a + b ) + abs( a - b ) ) / 2
36. 如何打印出当前源文献文献名以及源文献当前行号?
答案:
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文献中定义,而是由编译器定义。
37. main 主函数执行完毕后,与否也许会再执行一段代码,给出阐明?
答案:可以,可以用_onexit 注册一种函数,它会在main 之后执行int fn1(void),fn2(void),
38. 如何判断一段程序是由C 编译程序还是由C++编译程序编译?
答案:
#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
/*****************************************************************************/
程序题(阅读程序):
28.找错:
#include <string.h>
#include <stdio.h>
class Base
{
private:
char * name;
public:
Base(char * className)
{
name = new char[strlen(className)];改成:name = new char[strlen(className)+1];
strcpy(name,className);
加一句:name[strlen(className)] = ‘\0’;
//最佳写法如下:
if(className == NULL)
{
name = new char[1];
name[0] = ‘\0’;
}
else
{
int len = strlen(className);
name = new char[len+1];
strcpy(name,className);
name[len] = ‘\0’;
}
}
~Base()
{
delete name;
}
char * copyName()
{
char newname [256];
strcpy(newname,name);
return newname;//返回局部数组地址是不明智
}
char * getName()
{
return name;
}
//采用值传递方式
static void print(Base base)
{
printf("name:%s\n" ,base.name);
}
};
class Subclass :public Base
{
public:
Subclass(char * className) :Base(className)
{
}
};
int main()
{
Base * pBase = new Subclass("test");
Base::print(*pBase);
printf("name:%s\n",pBase->getName());
printf("new name:%s\n",pBase->copyName());
return 0;
}
15. Typedef 在C语言中频繁用以声明一种已经存在数据类型同义字。也可以用预解决器做类似事。例如,思考一下下面例子:
#define dPS struct s *
typedef struct s * tPS;
以上两种状况意图都是要定义dPS 和 tPS 作为一种指向构造s指针。哪种办法更好呢?(如果有话)为什么?
这是一种非常微妙问题,任何人答对这个问题(合法因素)是应当被恭喜。答案是:typedef更好。思考下面例子:
dPS p1,p2;
tPS p3,p4;
第一种扩展为
struct s * p1,p2;
上面代码定义p1为一种指向构造指,p2为一种实际构造,这也许不是你想要。第二个例子对的地定义了p3 和p4 两个指针。
晦涩语法
16. C语言批准某些令人震惊构造,下面构造是合法吗,如果是它做些什么?
int a = 5,b = 7,c;
c = a+++b;
这个问题将做为这个测验一种高兴结尾。不论你相不相信,上面例子是完全合乎语法。问题是编译器如何解决它?水平不高编译作者事实上会争论这个问题,依照最解决原则,编译器应当能解决尽量所有合法用法。因而,上面代码被解决成:
c = a++ + b;
因而,这段代码持行后a = 6,b = 7,c = 12。
给出下面程序输出:
What will print out?
main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset (p2,0,20);
while(*p2++ = *p1++);
printf(“%sn”,p2);
}
Answer:empty string.
因素:while循环最后使p2指向是空字符,并且背面都是空,只是p2开辟内存前若干位存入了p1内容,但此时p2已经移到这些字符背面了,因而输出是空(memset将p2所有内容出示话为空,没有该函数将输出乱码).
解决方案有三:1)再定义一种char指针使它指向p2初始位置。代码:
Char *p2,*p3;
P2 = new char[20];
Memset(p2,0,20);
P3 = p2;
While(*p2++ = *p1++);
Printf(“%s”,p3);
2)不用while循环,用for循环这样不移动p2指针初始位置:
将while循环换成:for(int I = 0;I < 5;i++) *(p2+i) = *(p1+i);
3)用strcpy代替while循环:stcpy(p2,p1);
What will be printed as the result of the operation below:
main()
{
int x=20,y=35;
x=y++ + x++;// x = (y++)+(x++ )=56;此时x=56,y=36)
y= ++y + ++x;(y = (++y)+(++x)=37+57= 94;此时x=57,y=94
printf(“%d%dn”,x,y);
}
Answer :5794
What will be printed as the result of the operation below:
main()
{
int x=5;
printf(“%d,%d,%dn”,x,x< <2,x>>2);(<<左移,>>右移)
}
Answer:5,20,1
What will be printed as the result of the operation below:
#define swap(a,b) a=a+b;b=a-b;a=a-b;//宏定义注意括号应用(这里显然存在潜在错误)
void main()
{
int x=5,y=10;
swap (x,y);
printf(“%d %dn”,x,y);
swap2(x,y);
printf(“%d %dn”,x,y);
}
//不能起到互换作用
int swap2(int a,int b)
{
int temp;
temp=a;
b=a;
a=temp;
return 0;
}
Answer:10,5
10,5
What will be printed as the result of the operation below:
main()
{
char *ptr = ” Cisco Systems”;
*ptr++;printf(“%sn”,ptr);
ptr++;
printf(“%sn”,ptr);
}
Answer:Cisco Systems
isco systems
What will be printed as the result of the operation below:
main()
{
char s1[]=“Cisco”;
char s2[]= “systems”;
printf(“%s”,s1);
}
Answer:Cisco
What will be printed as the result of the operation below:
main()
{
char *p1;
char *p2;
p1=(char *)malloc(25);
p2=(char *)malloc(25);
strcpy(p1,”Cisco”);
strcpy(p2,“systems”);
strcat(p1,p2);
printf(“%s”,p1);
}
Answer:Ciscosystems
The following variable is available in file1.c,who can access it?:
static int average;
Answer:all the functions in the file1.c can access the variable.
WHat will be the result of the following code?
#define TRUE 0 // some code
while(TRUE)
{
// some code
}
Answer:This will not go into the loop as TRUE is defined as 0.
What will be printed as the result of the operation below:
int x;
int modifyvalue()
{
return(x+=10);//调用全局变量
}
int changevalue(int x)
{
return(x+=1);
}
void main()
{
int x=10;//局部变量覆盖局部变量
x++;//x=11
changevalue(x);//采用值传递不能修改实参x,除非改成x=changevalue(x)或者修改changvalue函数参数为引用
x++;//x=12;
modifyvalue();
printf("First output:%dn",x);//打印输出12
x++;//x=13
changevalue(x);//无用操作
printf("Second output:%dn",x);//输出13
modifyvalue();//对全局变量操作,在此也是无用操作
printf("Third output:%dn",x);//输出13
}
Answer:12 ,13 ,13
What will be printed as the result of the operation below:
main()
{
int x=10,y=15;
x = x++;
y = ++y;
printf(“%d %dn”,x,y);
}
Answer:11,16
12 . 下面代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) puts("> 6") :puts("<= 6");
}
这个问题测试你与否懂得C语言中整数自动转换原则,我发既有些开发者懂得很少这些东西。不论如何,这无符号整型问题答案是输出是“>6”。因素是当表达式中存在有符号类型和无符号类型时所
展开阅读全文