??xml version="1.0" encoding="utf-8" standalone="yes"?>
{
this.Calendar1.Attributes.Add("style", "display:none;border-width:1px;border-style:solid;border-collapse:collapse;z-index: 100; left: 0px;");
TextBox1.Attributes.Add("onfocus", "javascript:document.getElementById('Calendar1').style.display=''");
}
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
TextBox1.Text = this.Calendar1.SelectedDate.ToShortDateString();
Calendar1.Attributes.Add("onblur", "javascript:document.getElementById('Calendar1').style.display='none'");
}
protected void Button1_Click(object sender, EventArgs e)
{
Console.Write(this.TextBox1.Text);
]]>
思科pȝ亚太区NGN/VoIP首席技?/font>ND康认ؓ(f)Q尽?#8220;软交?#8221;是目前NGN讨论的热点,但是Z对它的概念仍然有些似是而非。他?“‘软交?#8217;q个术语可以说是从Softswitch译而得。Softswitchq一术语借用?jin)传l?a target=_blank>?sh)?/font>领域PSTN|中?#8216;?#8217;交换?#8216;switch’的概念,所不同的是其基于分l网上呼叫控制与媒体传输承蝲相分ȝ含义。国内一开始有人将Softswitch译ؓ(f)‘软交?#8217;。但?#8216;软交?#8217;q个译术语含义不够十分明晰Q单从字面上看很难人理解它I竟是设备系l概念还是体pLc(din)?#8221;
D康指出Q我国电(sh)信业历来名词属性的、设备概念范畴的switch译ؓ(f)“交换?#8221;Q而将动名词属性的switching译ؓ(f)“交换”。X25switch译ؓ(f)X25交换机,ATMswitch译ؓ(f)ATM交换机,L2/L3 switch 译ؓ(f)二层/三层交换机。因此他Qؓ(f)学术研讨的严肃? 应该softswitch更ؓ(f)切地译?#8220;软交换机”。这只是译概念上的问题。不q从某一斚w来说Q对于Y交换概念的模p,也反映了(jin)产业界对于Y交换认识上在某些斚w依旧存在偏差Q存在着q分某一斚w的能力,或者是q分夸大?jin)Y交换功能的情c(din)甚臛_以说在很长的一D|_(d)软交换被Zؓ(f)?#8220;话”?jin),它被认?f)是一U代表着通信行业的未来,g无所不能的技术?
软交?/span>是一U正在发展的概念Q包含许多功能。其核心(j)是一个采用标准化协议和应用编E接口(APIQ的开放体pȝ?/span>。这׃ؓ(f)W三方开发新应用和新业务敞开?jin)大门。Y交换体系l构的其它重要特性还包括应用分离Qde-couplingofapplicationsQ、呼叫控制和承蝲控制?/p>
软交换是一U功能实体,Z一代网lNQN提供h实时性要求的业务的呼叫控制和q接控制功能Q是下一代网l呼叫与控制的核?j)?/p>
单地看,软交换是实现传统E控交换机的“呼叫控制”功能的实?/span>Q但传统?#8220;呼叫控制”功能是和业务l合在一L(fng)Q不同的业务所需要的呼叫控制功能不同Q而Y交换是与业务无关的,q要求Y交换提供的呼叫控制功能是各种业务的基本呼叫控制?/p>
优先U?/p>
q算W?/p>
名称或含?/p>
使用形式 l合方向 说明 1 [] 数组下标 数组名[帔R表达式] 左到?/p>
() 圆括?/p>
Q表辑ּQ?函数?形参? . 成员选择Q对象)(j) 对象.成员?/p>
-> 成员选择Q指针)(j) 对象指针->成员?/p>
2 - 负号q算W?/p>
-表达?/p>
叛_?/p>
单目q算W?/p>
(cd) 强制cd转换 (数据cd)表达?/p>
++ 自增q算W?/p>
++变量?变量?+ 单目q算W?/p>
-- 自减q算W?/p>
--变量?变量?- 单目q算W?/p>
* 取D符 *指针变量 单目q算W?/p>
& 取地址q算W?/p>
&变量?/p>
单目q算W?/p>
! 逻辑非运符 !表达?/p>
单目q算W?/p>
~ 按位取反q算W?/p>
~表达?/p>
单目q算W?/p>
sizeof 长度q算W?/p>
sizeof(表达? 3 / ?/p>
表达?表达?/p>
左到?/p>
双目q算W?/p>
* ?/p>
表达?表达?/p>
双目q算W?/p>
% 余数Q取模)(j) 整型表达?整型表达?/p>
双目q算W?/p>
4 + ?/p>
表达?表达?/p>
左到?/p>
双目q算W?/p>
- ?/p>
表达?表达?/p>
双目q算W?/p>
5 << 左移 变量<<表达?/p>
左到?/p>
双目q算W?/p>
>> 右移 变量>>表达?/p>
双目q算W?/p>
6 > 大于 表达?gt;表达?/p>
左到?/p>
双目q算W?/p>
>= 大于{于 表达?gt;=表达?/p>
双目q算W?/p>
< 于 表达?lt;表达?/p>
双目q算W?/p>
<= 于{于 表达?lt;=表达?/p>
双目q算W?/p>
7 == {于 表达?=表达?/p>
左到?/p>
双目q算W?/p>
!= 不等?/p>
表达?= 表达?/p>
双目q算W?/p>
8 & 按位?/p>
表达?amp;表达?/p>
左到?/p>
双目q算W?/p>
9 ^ 按位异或 表达式^表达?/p>
左到?/p>
双目q算W?/p>
10 | 按位?/p>
表达式|表达?/p>
左到?/p>
双目q算W?/p>
11 && 逻辑?/p>
表达?amp;&表达?/p>
左到?/p>
双目q算W?/p>
12 || 逻辑?/p>
表达式||表达?/p>
左到?/p>
双目q算W?/p>
13 ?: 条gq算W?/p>
表达?? 表达?: 表达? 叛_?/p>
三目q算W?/p>
14 = 赋D符 变量=表达?/p>
叛_?/p>
/= 除后赋?/p>
变量/=表达?/p>
*= 乘后赋?/p>
变量*=表达?/p>
%= 取模后赋?/p>
变量%=表达?/p>
+= 加后赋?/p>
变量+=表达?/p>
-= 减后赋?/p>
变量-=表达?/p>
<<= 左移后赋?/p>
变量<<=表达?/p>
>>= 右移后赋?/p>
变量>>=表达?/p>
&= 按位与后赋?/p>
变量&=表达?/p>
^= 按位异或后赋?/p>
变量^=表达?/p>
|= 按位或后赋?/p>
变量|=表达?/p>
15 , 逗号q算W?/p>
表达?表达?… 左到?/p>
从左向右序q算 说明Q?/p>
同一优先U的q算W,q算ơ序q合方向所军_?/p>
memest原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n); memset:作用是在一D内存块中填充某个给定的|它对较大的结构体或数l进行清零操作的一U最快方法?/span> 常见的三U错?/strong> W一: 搞反?jin)c ?nbsp;n的位|? 一定要C 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20) W二: q度使用memset, 我想q些E序员可能有某种?j)理阴?jing), 他们惧怕未l初始化的内? 所以他们会(x)写出q样的代? char buffer[20]; memset(buffer, 0, sizeof((char)*20)); q里的memset是多余的. 因ؓ(f)q块内存马上p覆盖? 清零没有意义. W三: 其实q个错误严格来讲不能用错memset, 但是它经常在使用memset的场合出?/strong> int some_func(struct something *a){ ?/strong>:Z要用memset|零?memset( &Address, 0, sizeof(Address))Q经常看到这L(fng)用法Q其实不用的话,分配数据的时候,剩余的空间也?x)置零的?/p>
{?1.如果不清I,可能?x)在试当中出现野倹{?nbsp;你做下面的试验看看结?) char buf[5]Q?nbsp; CString str,str1Q?nbsp;//memset(buf,0,sizeof(buf))Q?nbsp;for(int i = 0Qi<5Qi++) { str.Format(“%d “,buf[i])Q?nbsp;str1 +=str Q?nbsp;} TRACE(“%s\r\n“,str1) 2.其实不然Q特别是对于字符指针cd的,剩余的部分通常是不?x)?f)0?/span>Q不妨作一个试验,定义一个字W数l,q输入一串字W,如果不用memset实现清零Q用MessageBox昄出来׃(x)有ؕ码(0表示NULLQ如果有Q就默认字符l束Q不?x)输出后面的qQ?/p>
? 如下demo是可以的Q能把数l中的元素值都讄成字W?Q?br>#include <iostream> 1Q第一个程序ؓ(f)什么可以,而第二个不行Q?br>2Q不惌用forQ或是while循环来初始化int a[5];能做到吗Q(有没有一个像memsetQ)(j)q样的函数初始化Q?br> {? 1.因ؓ(f)W一个程序的数组a是字W型的,字符型占据内存大是1ByteQ而memset函数也是以字节ؓ(f)单位q行赋值的Q所以你输出没有问题。而第二个E序a是整型的Q用memsetq是按字节赋|q样赋值完以后Q每个数l元素的值实际上?x01010101卛_q制?6843009。你看看你输出结果是否这P 2.如果用memset(a,1,20); (2)itoa的实玎ͼ(x) 题目Q? ?要:(x)本文讨论?jin)Oracle和SQL Server的在事务处理上的区别Qƈ分析?jin)其实现机制的差异?/p>
关键词:(x)OracleQSQL ServerQ事务;事务隔离U别QDDL?/p>
事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在q个斚wp?jin)很大精力,不同的事务处理方式?x)D数据库性能和功能上的巨大差异?/p>
事务处理也是数据库管理员?sh)数据库应用E序开发h员必Lȝ解的一个问题,对这个问题的疏忽可能?x)导致应用程序逻辑错误以及(qing)效率低下?/p>
下面我们针对Oracle?qing)SQL Serverq两U当前广泛用的大型数据库品,探讨一下它们在事务处理斚w的一些差异。如没有Ҏ(gu)说明Q本文内定w用的数据库产品版本为Oracle9i?qing)SQL Server 2000Q其中的CZSQL语句Q对于Oracle是在SQL*Plus中执行,而对于SQL Server 2000是在osql中执行?br>一.事务的概?/p>
事务可以看作是由Ҏ(gu)据库的若q操作组成的一个单元,q些操作要么都完成,要么都取消,从而保证数据满一致性的要求。事务的一个典型例子是银行中的转帐操作Q帐户A把一定数量的N转到帐户B上,q个操作包括两个步骤Q一个是从帐户A上把存款减去一定数量,二是在帐户B上把存款加上相同的数量。这两个步骤昄要么都完成,要么都取消,否则银行׃(x)受损失。显?dng)q个转帐操作中的两个步骤构成一个事务?/p>
数据库中的事务还有如下ACID特征?/p>
ACID分别是四个英文单词的首写字母Q这四个英文单词是Atomicity、Consistency、Isolation、DurabilityQ分别翻译ؓ(f)原子性、一致性、隔L、持久性?/p>
原子性:(x)指事务中的操作,或者都完成Q或者都取消?/p>
一致性:(x)指事务中的操作保证数据库中的数据不会(x)出现逻辑上不一致的情况Q一致性一般会(x)隐含的包括在其他属性之中?/p>
隔离性:(x)指当前的事务与其他未完成的事务是隔离的。在不同的隔ȝ别下Q事务的d操作Q可以得到的l果是不同的?/p>
持久性:(x)指对事务发出COMMIT命o(h)后,即ɘq时发生pȝ故障Q事务的效果也被持久化了(jin)。与此相反的是,当在事务执行q程中,pȝ发生故障Q则事务的操作都被回滚,x(chng)据库回到事务开始之前的状态?/p>
Ҏ(gu)据库中的数据修改都是在内存(sh)完成的,q些修改的结果可能已l写到硬盘(sh)可能没有写到盘Q如果在操作q程中,发生断电(sh)或系l错误等故障Q数据库可以保证未结束的事务Ҏ(gu)据库的数据修改结果即使已l写入磁盘,在下ơ数据库启动后也?x)被全部撤销Q而对于结束的事务Q即使其修改的结果还未写入磁盘,在数据库下次启动后会(x)通过事务日志中的记录q行“重做”Q即把丢q数据修改l果重新生成Qƈ写入盘Q从而保证结束事务对数据修改的永久化。这样也保证?jin)事务中的操作要么全部完成,要么全部撤销?/p>
?事务讄?qing)类型的区?/p>
在SQL Server中有三种事务cdQ分别是Q隐式事务、显式事务、自动提交事务,~省动提交?/p>
自动提交Q是指对于用户发出的每条SQL语句QSQL Server都会(x)自动开始一个事务,q且在执行后自动q行提交操作来完成这个事务,也可以说在这U事务模式下Q一个SQL语句是一个事务?/p>
昑ּ事务Q是指在自动提交模式下以Begin Transaction开始一个事务,以Commit或Rollbackl束一个事务,以Commitl束事务是把事务中的修改怹化,即ɘq时发生断电(sh)q样的故障。例如下面是SQL Server中的一个显式事务的例子?/p>
Begin Tran Update emp Set ename=’Smith’ Where empno=7369 Insert Into dept Values(60,’HR’,’GZh’) Commit 隐式事务Q是指在当前?x)话中用Set Implicit_Transactions On命o(h)讄的事务类型,q时MDML语句(Delete、Update、Insert)都会(x)开始一个事务,而事务的l束也是用Commit或Rollback?/p>
在Oracle中没有SQL Server的这些事务类型,~省情况下Q何一个DML语句都会(x)开始一个事务,直到用户发出Commit或Rollback操作Q这个事务才?x)结束,q与SQL Server的隐式事务模式相伹{?/p>
?事务隔离U别 在SQL92标准中,事务隔离U别分ؓ(f)四种Q分别ؓ(f)QRead Uncommitted、Read Committed、Read Repeatable、SerializableQ其中Read Uncommitted与Read Committed句别的Q而Read Repeatable与Serializable是针对事务别的?/p>
在Oracle和SQL Server中设|事务隔ȝ别的语句是相同的Q都使用SQL92标准语法Q即Q?/p>
Set Transaction Isolation Level Read Committed 上面CZ中的Read Committed可以被替换ؓ(f)其他三种隔离U别中的L一U?/p>
1.SQL Server中的隔离U别?qing)实现机?/p>
在SQL Server中提供了(jin)所有这四种隔离U别?/p>
下面我们讨论在SQL Server中,q几U隔ȝ别的含义?qing)其实现方式?/p>
Read UncommittedQ一个会(x)话可以读取其他事务未提交的更新结果,如果q个事务最后以回滚l束Q这时的dl果可能是错误的,所以多数的数据库应用都不会(x)使用q种隔离U别?/p>
Read CommittedQ这是SQL Server的缺省隔ȝ别,讄U隔ȝ别的事务只能d其他事务已经提交的更新结果,否则Q发生等待,但是其他?x)话可以修改q个事务中被d的记录,而不必等待事务结束,昄Q在q种隔离U别下,一个事务中的两个相同的d操作Q其l果可能不同?/p>
Read RepeatableQ在一个事务中Q如果在两次相同条g的读取操作之间没有添加记录的操作Q也没有其他更新操作D在这个查询条件下记录数增多,则两ơ读取结果相同。换句话_(d)是在一个事务中W一ơ读取的记录保证不会(x)在这个事务期间发生改变。SQL Server是通过在整个事务期间给d的记录加锁实现这U隔ȝ别的Q这P在这个事务结束前Q其他会(x)话不能修改事务中d的记录,而只能等待事务结束,但是SQL Server不会(x)ȝ其他?x)话向表中添加记录,也不ȝ其他会(x)话修改其他记录?/p>
SerializableQ在一个事务中Q读取操作的l果是在q个事务开始之前其他事务就已经提交的记录,SQL Server通过在整个事务期间给表加锁实现这U隔ȝ别。在q种隔离U别下,对这个表的所有DML操作都是不允许的Q即要等待事务结束,q样׃证了(jin)在一个事务中的两ơ读取操作的l果肯定是相同的?/p>
2.Oracle中的隔离U别?qing)实现机?/p>
在Oracle中,没有Read Uncommitted?qing)Repeatable Read隔离U别Q这样在Oracle中不允许一个会(x)话读取其他事务未提交的数据修改结果,从而避免了(jin)׃事务回滚发生的读取错误。Oracle中的Read Committed和SerializableU别Q其含义与SQL ServercMQ但是实现方式却大不一栗?/p>
在Oracle中,存在所谓的回滚D?Oracle9i之前版本)或撤销D?Oracle9i版本)QOracle在修Ҏ(gu)据记录时Q会(x)把这些记录被修改之前的结果存入回滚段或撤销D中Q就是因U机ӞOracle对于事务隔离U别的实CSQL Server截然不同。在Oracle中,d操作不会(x)ȝ更新操作Q更新操作也不会(x)ȝd操作Q这样在Oracle中的各种隔离U别下,d操作都不?x)等待更C务结束,更新操作也不?x)因为另一个事务中的读取操作而发生等待,q也是Oracle事务处理的一个优势所在?/p>
Oracle~省的设|是Read Committed隔离U别(也称句别的隔离)Q在q种隔离U别下,如果一个事务正在对某个表进行DML操作Q而这时另外一个会(x)话对q个表的记录q行d操作Q则Oracle?x)去d回滚D|撤销D中存放的更C前的记录Q而不?x)象SQL Server一L(fng)待更C务的l束?/p>
在Serializable隔离U别(也称Z务别的隔离)Q事务中的读取操作只能读取这个事务开始之前已l提交的数据l果。如果在dӞ其他事务正在对记录进行修改,则Oracle׃(x)在回滚段或撤销D中d扑֯应的原来未经更改的记?而且是在d操作所在的事务开始之前存放于回滚D|撤销D늚记录)Q这时读取操作也不会(x)因ؓ(f)相应记录被更新而等待?/p>
?DDL语句对事务的影响 1.Oracle中DDL语句对事务的影响 在Oracle中,执行DDL语句(如Create Table、Create View{?Ӟ?x)在执行之前自动发出一个Commit命o(h)Qƈ在随后发Z个Commit或者Rollback命o(h)Q也是_(d)DDL?x)象如下伪码一h行:(x) Commit; DDL_Statement; If (Error) then Rollback; Else Commit; End if; 我们通过分析下面例子来看Oracle中,DDL语句对事务的影响Q?/p>
Insert into some_table values(‘Before’); Creaate table T(x int); Insert into some_table values(‘After’); Rollback; ׃在Oracle执行Create table语句之前q行?jin)提交,而在Create table执行后也?x)自动发出Commit命o(h)Q所以只有插入After的行被回滚,而插入Before的行不会(x)被回滚,Create table命o(h)的结果也不会(x)被回滚,即Create table语句p|Q所q行的Before插入也会(x)被提交。如果最后发出Commit命o(h)Q因为插入Before?qing)Create table的操作结果已l在之前提交Q所以Commit命o(h)影响的只有插入After的操作?/p>
2.SQL Server中DDL语句对事务的影响 在SQL Server中,DDL语句对事务的影响与其他DML语句相同Q也是_(d)在DML语句发出之前或之后,都不?x)自动发出Commit命o(h)?/p>
在SQL Server 2000中,对于与上面Oracle同样的例子,最后发出Rollback后,数据库会(x)回滚到插入Before之前的状态,x(chng)入Before和After的行都会(x)被回滚,数据表T也不?x)被创徏?/p>
如果最后发出Commit操作Q则?x)把三个操作的结果全部提交?/p>
?用户断开数据库连接对事务的媄(jing)?/p>
另外Q对应于Oracle的管理客L(fng)工具SQL*PlusQ在SQL Server 2000中是osqlQ两U管理工具都是命令行工具Q用方式及(qing)作用也类|但是在SQL*Plus中,用户退?gu)接时Q会(x)自动先发出Commit命o(h)Q然后再退出,而在osql中,如果用户退?gu)接,会(x)自动发出Rollback命o(h)Q这对于SQL Server的自动提交模式没有什么媄(jing)响,但如果处于隐式事务模式,其媄(jing)响是显而易见的。对于两U数据库产品的其他客L(fng)理工具也有cM的不同之处?/p>
]]>
支持双归属网l容?一个或多个MGW同时q接C个MSCServer上,q两个SERVER互ؓ(f)备䆾关系Q正常情况下两个MSCServer可以是负荷分担的Q也可以是完全主备方式提供业务。当其中一个MSCServer故障Ӟ另一个MSCServer能够立即接管故障MSCServer上的话务Q能完成人工或自动倒换。从而极大地提高大容量系l容灄能力。这U双归属|络容灾Ҏ(gu)在中国移动T1局获得应用?br>
]]>
而不?nbsp;memset(a, 20, 0)
strcpy(buffer, "123");
…
…
memset(a, 0, sizeof(a));
…
}
#include <cstring>
using namespace std;
int main()
{
char a[5];
memset(a,'1',5);
for(int i = 0;i < 5;i++)
cout<<a[i]<<" ";
system("pause");
return 0;
}
而,如下E序惛_数组中的元素D|成1Q却是不可行?br>#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int a[5];
memset(a,1,5);//q里Ҏ(gu)memset(a,1,5 *sizeof(int))也是不可以的
for(int i = 0;i < 5;i++)
cout<<a[i]<<" ";
system("pause");
return 0;
}
问题是:(x)
是对a指向的内存的20个字节进行赋|每个都用ASCII?的字W去填充Q{Zq制后,1是00000001,占一个字节。一个INT元素?字节Q合一起就?000000010000000100000001Q就{于16843009Q就完成?jin)对一个INT元素的赋g(jin)?/p>
]]>
]]>
#include<stdio.h>
int atoi(const char *str)
{
int value=0;
bool b_plus=true; //判断W号
switch(*str) //qo(h)W号
{
case '+':
str++;
break;
case '-':
b_plus=false;
str++;
break;
default:
break;
}
while('\0' != *str)
{
value = (value*10)+(*str-'0');
str++;
}
if(!b_plus)
value=-value;
return value;
}
void main()
{
char str[]="-999";
int value=atoi(str);
printf("The result is:%d\n",value);
}
#include<stdio.h>
void itoa(int value, char *str)
{
if (value < 0) //如果是负?则str[0]='-',q把value取反(变成正整?
{
str[0] = '-';
value = 0-value;
}
int i,j;
for(i=1; value > 0; i++,value/=10) //从value[1]开始存放value的数字字W,不过是逆序Q等下再反序q来
str[i] = value%10+'0'; //数字加?的ASCII??0')得到该数字的ASCII?br>
for(j=i-1,i=1; j-i>=1; j--,i++) //数字字W反序存?br>
{
str[i] = str[i]^str[j];
str[j] = str[i]^str[j];
str[i] = str[i]^str[j];
}
if(str[0] != '-') //如果不是负数Q则需要把数字字符下标左移一位,卛_1
{
for(i=0; str[i+1]!='\0'; i++)
str[i] = str[i+1];
str[i] = '\0';
}
}
void main()
{
int value = -1212345;
char str[10] = {'\0'}; //记得把str全填充ؓ(f)'\0'
itoa(value, str);
printf("The result is:%s\n", str);
}
]]>
已知strcpy函数的原型是Q?
char * strcpy(char * strDest,const char * strSrc);
1.不调用库函数Q实现strcpy函数?
2.解释Z么要q回char *?
解说Q?
1.strcpy的实C?
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strsrc="/=NULL")) //[1]
throw "Invalid argument(s)"; //[2]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
错误的做法:(x)
[1]
(A)不检查指针的有效性,说明{题者不注重代码的健壮性?
(B)(g)查指针的有效性时使用((!strDest)||(!strSrc))?!(strDest&&strSrc))Q说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为boolx(chng)cd隐式转换Q这U功能虽然灵z,但更多的是导致出错概率增大和l护成本升高。所以C++专门增加?jin)bool、true、false三个关键字以提供更安全的条g表达式?
(C)(g)查指针的有效性时使用((strDest==0)||(strsrc="/=0"))Q说明答题者不知道使用帔R的好处。直接用字面常量(如本例中?Q会(x)减少E序的可l护性?虽然单,但程序中可能出现很多处对指针的检查,万一出现W误Q编译器不能发现Q生成的E序内含逻辑错误Q很难排除。而用NULL代替0Q如果出现拼写错误,~译器就?x)检查出来?
[2]
(A)return new string("Invalid argument(s)");Q说明答题者根本不知道q回值的用途,q且他对内存泄漏也没有警惕心(j)。从函数中返回函C内分配的内存是十分危险的做法Q他把释攑ֆ存的义务抛给不知情的调用者,l大多数情况下,调用者不?x)释攑ֆ存,q导致内存泄漏?
(B)return 0;Q说明答题者没有掌握异常机制。调用者有可能忘记(g)查返回|调用者还可能无法(g)查返回|见后面的铑ּ表达式)(j)。妄惌q回D负返回正值和异常值的双重功能Q其l果往往是两U功能都失效。应该以抛出异常来代替返回|q样可以减轻调用者的负担、错误不会(x)被忽略、增强程序的可维护性?
[3]
(A)忘记保存原始的strDest|说明{题者逻辑思维不严密?
[4]
(A)循环写成while (*strDest++=*strSrc++);Q同[1](B)?
(B)循环写成while (*strSrc!='\0') *strDest++=*strSrc++;Q说明答题者对边界条g的检查不力。@环体l束后,strDest字符串的末尾没有正确地加?\0'?
2.q回strDest的原始g函数能够支持铑ּ表达式,增加?jin)函数?#8220;附加?#8221;。同样功能的函数Q如果能合理地提高的可用性,自然更加理惟?
铑ּ表达式的形式如:(x)
int iLength=strlen(strcpy(strA,strB));
又如Q?
char * strA=strcpy(new char[10],strB);
q回strSrc的原始值是错误的。其一Q源字符串肯定是已知的,q回它没有意义。其二,不能支持形如W二例的表达式。其三,Z(jin)保护源字W串QŞ参用const限定strSrc所指的内容Q把const char *作ؓ(f)char *q回Q类型不W,~译报错?/div>
]]>