真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javascript枚舉,java枚舉菜鳥(niǎo)教程

為什么,jxssq(n)函數(shù)中的循環(huán),執(zhí)行出來(lái)的結(jié)果怎么都是一樣的。如何能產(chǎn)生不同的數(shù)據(jù)。

#includestdlib.h

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)盂縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

#includestdio.h

#includetime.h

#define N_Ten 30000

#define switcha(a,b) {int temp;temp=b,b=a,a=temp;}

void Insert_Sort(int a[],long n);

void sw(int c,int b);

int main(void)

{

clock_t start,end;

srand(time(NULL));

int a[N_Ten],i;

for(i=0;iN_Ten;i++)

{

a[i]=(rand()%500);

}

printf("產(chǎn)生的號(hào)碼是: ");

// for(i=0;iN_Ten;i++)

// printf("%d ",a[i]);

start=clock();

Insert_Sort(a,N_Ten);

printf("\n");

end=clock();

printf("排序時(shí)間是: %ld毫秒",end-start);

// printf("排序的號(hào)碼是: ");

// for(i=0;iN_Ten;i++)

// printf("%d ",a[i]);

printf("\n");

return 0;

}

void Insert_Sort(int a[],long n)

{

int b=1,c=2,temp0;

int i=1,j,temp;

while(in) //和數(shù)組循環(huán)移位的操作方法類似,先把a(bǔ)[i]的值賦給temp保存,判斷大小后再移位,實(shí)現(xiàn)數(shù)值交換;

{

j=i;

temp=a[i];

while(tempa[j-1])

{

a[j]=a[j-1];

if(j0)

j--;

else

break;

}

a[j]=temp;

i++;

// temp0=b;

// b=c;

// c=temp0;

switcha(c,b); //宏定義的函數(shù);

//printf("\n");

// sw(c,b);

}

}

void sw(int c,int b) //函數(shù);

{

int temp0;

temp0=b;

b=c;

c=temp0;

}我來(lái)幫他解答 輸入內(nèi)容已經(jīng)達(dá)到長(zhǎng)度限制還能輸入 9999 字插入圖片刪除圖片插入地圖刪除地圖插入視頻視頻地圖回答即可得2分經(jīng)驗(yàn)值,回答被選為滿意回答可同步增加經(jīng)驗(yàn)值和財(cái)富值

參考資料:匿名回答提交回答取消

回答 共2條 檢舉 | 2011-6-19 10:21 有錢(qián)買(mǎi)不起房子 | 十一級(jí)

1734毫秒 1750毫秒 1718毫秒.......不是都相等,你可以增加一個(gè)

while(j100) 100次循環(huán),再隨便打開(kāi)其它文件或者開(kāi)幾個(gè)網(wǎng)頁(yè),差距明顯不同,說(shuō)明CPU在不到調(diào)整 贊同0| 評(píng)論 檢舉 | 2011-6-20 03:16 400zclkuu | 五級(jí)

表達(dá)方式與以往數(shù)學(xué)學(xué)習(xí)中不同(如運(yùn)算符等),這就要求不氣餒,不明白的地方多問(wèn)多想,鼓足勇氣進(jìn)行學(xué)習(xí),待學(xué)完后面的章節(jié)知識(shí),前面的問(wèn)題也就迎刃而解了,這一方面我感覺(jué)是我們同學(xué)最欠缺,大多學(xué)不好的就是因?yàn)橐婚_(kāi)始遇到困難就放棄,曾經(jīng)和好多同學(xué)談他的問(wèn)題,回答是聽(tīng)不懂、不想聽(tīng)、放棄這樣三個(gè)過(guò)程,我反問(wèn),這節(jié)課你聽(tīng)過(guò)課嗎?回答又是沒(méi)有,根本就沒(méi)聽(tīng)過(guò)課,怎么說(shuō)自己聽(tīng)不懂呢?相應(yīng)的根本就沒(méi)學(xué)習(xí),又談何學(xué)的好?

學(xué)習(xí)C語(yǔ)言始終要記住“曙光在前頭”和“千金難買(mǎi)回頭看”,“千金難買(mǎi)回頭看”是學(xué)習(xí)知識(shí)的重要方法,就是說(shuō),學(xué)習(xí)后面的知識(shí),不要忘了回頭弄清遺留下的問(wèn)題和加深理解前面的知識(shí),這是我們學(xué)生最不易做到的,然而卻又是最重要的。學(xué)習(xí)C語(yǔ)言就是要經(jīng)過(guò)幾個(gè)反復(fù),才能前后貫穿,積累應(yīng)該掌握的C知識(shí)。

那么,我們?nèi)绾螌W(xué)好《C程序設(shè)計(jì)》呢?

一.學(xué)好C語(yǔ)言的運(yùn)算符和運(yùn)算順序

這是學(xué)好《C程序設(shè)計(jì)》的基礎(chǔ),C語(yǔ)言的運(yùn)算非常靈活,功能十分豐富,運(yùn)算種類遠(yuǎn)多于其它程序設(shè)計(jì)語(yǔ)言。在表達(dá)式方面較其它程序語(yǔ)言更為簡(jiǎn)潔,如自加、自減、逗號(hào)運(yùn)算和三目運(yùn)算使表達(dá)式更為簡(jiǎn)單,但初學(xué)者往往會(huì)覺(jué)的這種表達(dá)式難讀,關(guān)鍵原因就是對(duì)運(yùn)算符和運(yùn)算順序理解不透不全。當(dāng)多種不同運(yùn)算組成一個(gè)運(yùn)算表達(dá)式,即一個(gè)運(yùn)算式中出現(xiàn)多種運(yùn)算符時(shí),運(yùn)算的優(yōu)先順序和結(jié)合規(guī)則顯得十分重要。在學(xué)習(xí)中,只要我們對(duì)此合理進(jìn)行分類,找出它們與我們?cè)跀?shù)學(xué)中所學(xué)到運(yùn)算之間的不同點(diǎn)之后,記住這些運(yùn)算也就不困難了,有些運(yùn)算符在理解后更會(huì)牢記心中,將來(lái)用起來(lái)得心應(yīng)手,而有些可暫時(shí)放棄不記,等用到時(shí)再記不遲。

先要明確運(yùn)算符按優(yōu)先級(jí)不同分類,《C程序設(shè)計(jì)》運(yùn)算符可分為15種優(yōu)先級(jí),從高到低,優(yōu)先級(jí)為1 ~ 15,除第2、13級(jí)和第14級(jí)為從右至左結(jié)合外,其它都是從左至右結(jié)合,它決定同級(jí)運(yùn)算符的運(yùn)算順序.

二.學(xué)好C語(yǔ)言的四種程序結(jié)構(gòu)

(1)順序結(jié)構(gòu)

順序結(jié)構(gòu)的程序設(shè)計(jì)是最簡(jiǎn)單的,只要按照解決問(wèn)題的順序?qū)懗鱿鄳?yīng)的語(yǔ)句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行。

例如;a = 3,b = 5,現(xiàn)交換a,b的值,這個(gè)問(wèn)題就好像交換兩個(gè)杯子水,這當(dāng)然要用到第三個(gè)杯子,假如第三個(gè)杯子是c,那么正確的程序?yàn)椋?c = a; a = b; b = c; 執(zhí)行結(jié)果是a = 5,b = c = 3如果改變其順序,寫(xiě)成:a = b; c = a; b = c; 則執(zhí)行結(jié)果就變成a = b = c = 5,不能達(dá)到預(yù)期的目的,初學(xué)者最容易犯這種錯(cuò)誤。 順序結(jié)構(gòu)可以獨(dú)立使用構(gòu)成一個(gè)簡(jiǎn)單的完整程序,常見(jiàn)的輸入、計(jì)算,輸出三步曲的程序就是順序結(jié)構(gòu),例如計(jì)算圓的面積,其程序的語(yǔ)句順序就是輸入圓的半徑r,計(jì)算s = 3.14159*r*r,輸出圓的面積s。不過(guò)大多數(shù)情況下順序結(jié)構(gòu)都是作為程序的一部分,與其它結(jié)構(gòu)一起構(gòu)成一個(gè)復(fù)雜的程序,例如分支結(jié)構(gòu)中的復(fù)合語(yǔ)句、循環(huán)結(jié)構(gòu)中的循環(huán)體等。

(2) 分支結(jié)構(gòu)

順序結(jié)構(gòu)的程序雖然能解決計(jì)算、輸出等問(wèn)題,但不能做判斷再選擇。對(duì)于要先做判斷再選擇的問(wèn)題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語(yǔ)句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ(yǔ)句。分支結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計(jì)算,設(shè)計(jì)這類程序時(shí)往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫(xiě)出源程序,這樣做把程序設(shè)計(jì)分析與語(yǔ)言分開(kāi),使得問(wèn)題簡(jiǎn)單化,易于理解。程序流程圖是根據(jù)解題分析所繪制的程序執(zhí)行流程圖。

學(xué)習(xí)分支結(jié)構(gòu)不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執(zhí)行的功能,嵌套結(jié)構(gòu)也就不難了。嵌套只不過(guò)是分支中又包括分支語(yǔ)句而已,不是新知識(shí),只要對(duì)雙分支的理解清楚,分支嵌套是不難的。下面我介紹幾種基本的分支結(jié)構(gòu)。

①if(條件)

這種分支結(jié)構(gòu)中的分支體可以是一條語(yǔ)句,此時(shí)“”可以省略,也可以是多條語(yǔ)句即復(fù)合語(yǔ)句。它有兩條分支路徑可選,一是當(dāng)條件為真,執(zhí)行分支體,否則跳過(guò)分支體,這時(shí)分支體就不會(huì)執(zhí)行。如:要計(jì)算x的絕對(duì)值,根據(jù)絕對(duì)值定義,我們知道,當(dāng)x=0時(shí),其絕對(duì)值不變,而x0時(shí)其絕對(duì)值是為x的反號(hào),因此程序段為:if(x0) x=-x;

②if(條件)

else

這是典型的分支結(jié)構(gòu),如果條件成立,執(zhí)行分支1,否則執(zhí)行分支2,分支1和分支2都可以是1條或若干條語(yǔ)句構(gòu)成。如:求ax^2+bx+c=0的根

分析:因?yàn)楫?dāng)b^2-4ac=0時(shí),方程有兩個(gè)實(shí)根,否則(b^2-4ac0)有兩個(gè)共軛復(fù)根。其程序段如下:

d=b*b-4*a*c;

if(d=0)

{x1=(-b+sqrt(d))/2a;

x2=(-b-sqrt(d))/2a;

printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);

}

else

{r=-b/(2*a);

i =sqrt(-d)/(2*a);

printf(“x1=%8.4f+%8.4fi\n”r, i);

printf(“x2=%8.4f-%8.4fi\n”r,i)

}

③嵌套分支語(yǔ)句:其語(yǔ)句格式為:

if(條件1) ;

else if(條件2)

else if(條件3)

……

else if(條件n)

else

嵌套分支語(yǔ)句雖可解決多個(gè)入口和出口的問(wèn)題,但超過(guò)3重嵌套后,語(yǔ)句結(jié)構(gòu)變得非常復(fù)雜,對(duì)于程序的閱讀和理解都極為不便,建議嵌套在3重以內(nèi),超過(guò)3重可以用下面的語(yǔ)句。

④switch開(kāi)關(guān)語(yǔ)句:該語(yǔ)句也是多分支選擇語(yǔ)句,到底執(zhí)行哪一塊,取決于開(kāi)關(guān)設(shè)置,也就是表達(dá)式的值與常量表達(dá)式相匹配的那一路,它不同if…else 語(yǔ)句,它的所有分支都是并列的,程序執(zhí)行時(shí),由第一分支開(kāi)始查找,如果相匹配,執(zhí)行其后的塊,接著執(zhí)行第2分支,第3分支……的塊,直到遇到break語(yǔ)句;如果不匹配,查找下一個(gè)分支是否匹配。這個(gè)語(yǔ)句在應(yīng)用時(shí)要特別注意開(kāi)關(guān)條件的合理設(shè)置以及break語(yǔ)句的合理應(yīng)用。

(3)循環(huán)結(jié)構(gòu):

循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書(shū)寫(xiě)的工作量,用來(lái)描述重復(fù)執(zhí)行某段算法的問(wèn)題,這是程序設(shè)計(jì)中最能發(fā)揮計(jì)算機(jī)特長(zhǎng)的程序結(jié)構(gòu),C語(yǔ)言中提供四種循環(huán),即goto循環(huán)、while循環(huán)、do ?Cwhile循環(huán)和for循環(huán)。四種循環(huán)可以用來(lái)處理同一問(wèn)題,一般情況下它們可以互相代替換,但一般不提倡用goto循環(huán),因?yàn)閺?qiáng)制改變程序的順序經(jīng)常會(huì)給程序的運(yùn)行帶來(lái)不可預(yù)料的錯(cuò)誤,在學(xué)習(xí)中我們主要學(xué)習(xí)while、do…while、for三種循環(huán)。常用的三種循環(huán)結(jié)構(gòu)學(xué)習(xí)的重點(diǎn)在于弄清它們相同與不同之處,以便在不同場(chǎng)合下使用,這就要清楚三種循環(huán)的格式和執(zhí)行順序,將每種循環(huán)的流程圖理解透徹后就會(huì)明白如何替換使用,如把while循環(huán)的例題,用for語(yǔ)句重新編寫(xiě)一個(gè)程序,這樣能更好地理解它們的作用。特別要注意在循環(huán)體內(nèi)應(yīng)包含趨于結(jié)束的語(yǔ)句(即循環(huán)變量值的改變),否則就可能成了一個(gè)死循環(huán),這是初學(xué)者的一個(gè)常見(jiàn)錯(cuò)誤。

在學(xué)完這三個(gè)循環(huán)后,應(yīng)明確它們的異同點(diǎn):用while和do…while循環(huán)時(shí),循環(huán)變量的初始化的操作應(yīng)在循環(huán)體之前,而for循環(huán)一般在語(yǔ)句1中進(jìn)行的;while 循環(huán)和for循環(huán)都是先判斷表達(dá)式,后執(zhí)行循環(huán)體,而do…while循環(huán)是先執(zhí)行循環(huán)體后判斷表達(dá)式,也就是說(shuō)do…while的循環(huán)體最少被執(zhí)行一次,而while 循環(huán)和for就可能一次都不執(zhí)行。另外還要注意的是這三種循環(huán)都可以用break語(yǔ)句跳出循環(huán),用continue語(yǔ)句結(jié)束本次循環(huán),而goto語(yǔ)句與if構(gòu)成的循環(huán),是不能用break和 continue語(yǔ)句進(jìn)行控制的。

順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)并不彼此孤立的,在循環(huán)中可以有分支、順序結(jié)構(gòu),分支中也可以有循環(huán)、順序結(jié)構(gòu),其實(shí)不管哪種結(jié)構(gòu),我們均可廣義的把它們看成一個(gè)語(yǔ)句。在實(shí)際編程過(guò)程中常將這三種結(jié)構(gòu)相互結(jié)合以實(shí)現(xiàn)各種算法,設(shè)計(jì)出相應(yīng)程序,但是要編程的問(wèn)題較大,編寫(xiě)出的程序就往往很長(zhǎng)、結(jié)構(gòu)重復(fù)多,造成可讀性差,難以理解,解決這個(gè)問(wèn)題的方法是將C程序設(shè)計(jì)成模塊化結(jié)構(gòu)。

(4)模塊化程序結(jié)構(gòu)

C語(yǔ)言的模塊化程序結(jié)構(gòu)用函數(shù)來(lái)實(shí)現(xiàn),即將復(fù)雜的C程序分為若干模塊,每個(gè)模塊都編寫(xiě)成一個(gè)C函數(shù),然后通過(guò)主函數(shù)調(diào)用函數(shù)及函數(shù)調(diào)用函數(shù)來(lái)實(shí)現(xiàn)一大型問(wèn)題的C程序編寫(xiě),因此常說(shuō):C程序=主函數(shù)+子函數(shù)。 因此,對(duì)函數(shù)的定義、調(diào)用、值的返回等中要尤其注重理解和應(yīng)用,并通過(guò)上機(jī)調(diào)試加以鞏固。

三.掌握一些簡(jiǎn)單的算法

編程其實(shí)一大部分工作就是分析問(wèn)題,找到解決問(wèn)題的方法,再以相應(yīng)的編程語(yǔ)言寫(xiě)出代碼。這就要求掌握算法,根據(jù)我們的《C程序設(shè)計(jì)》教學(xué)大綱中,只要求我們掌握一些簡(jiǎn)單的算法,在掌握這些基本算法后,要完成對(duì)問(wèn)題的分析就容易了。如兩個(gè)數(shù)的交換、三個(gè)數(shù)的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些算法的內(nèi)在含義

結(jié)語(yǔ):當(dāng)我們把握好上述幾方面后,只要同學(xué)們能克服畏難、厭學(xué)、上課能專心聽(tīng)講,做好練習(xí)與上機(jī)調(diào)試,其實(shí)C語(yǔ)言并不難學(xué)

C源程序的關(guān)鍵字---------------------------------------------------------------------------------------

所謂關(guān)鍵字就是已被C語(yǔ)言本身使用, 不能作其它用途使用的字。例如關(guān)鍵字不能用作變量名、函數(shù)名等

由ANSI標(biāo)準(zhǔn)定義的C語(yǔ)言關(guān)鍵字共32個(gè) :

auto double int struct break else long switch

case enum register typedef char extern return union

const float short unsigned continue for signed void

default goto sizeof volatile do if while static

根據(jù)關(guān)鍵字的作用,可以將關(guān)鍵字分為數(shù)據(jù)類型關(guān)鍵字和流程控制關(guān)鍵字兩大類。

1 數(shù)據(jù)類型關(guān)鍵字

A基本數(shù)據(jù)類型(5個(gè))

void :聲明函數(shù)無(wú)返回值或無(wú)參數(shù),聲明無(wú)類型指針,顯式丟棄運(yùn)算結(jié)果

char :字符型類型數(shù)據(jù),屬于整型數(shù)據(jù)的一種

int :整型數(shù)據(jù),通常為編譯器指定的機(jī)器字長(zhǎng)

float :?jiǎn)尉雀↑c(diǎn)型數(shù)據(jù),屬于浮點(diǎn)數(shù)據(jù)的一種

double :雙精度浮點(diǎn)型數(shù)據(jù),屬于浮點(diǎn)數(shù)據(jù)的一種

B 類型修飾關(guān)鍵字(4個(gè))

short :修飾int,短整型數(shù)據(jù),可省略被修飾的int。

long :修飾int,長(zhǎng)整形數(shù)據(jù),可省略被修飾的int。

signed :修飾整型數(shù)據(jù),有符號(hào)數(shù)據(jù)類型

unsigned :修飾整型數(shù)據(jù),無(wú)符號(hào)數(shù)據(jù)類型

C 復(fù)雜類型關(guān)鍵字(5個(gè))

struct :結(jié)構(gòu)體聲明

union :共用體聲明

enum :枚舉聲明

typedef :聲明類型別名

sizeof :得到特定類型或特定類型變量的大小

D 存儲(chǔ)級(jí)別關(guān)鍵字(6個(gè))

auto :指定為自動(dòng)變量,由編譯器自動(dòng)分配及釋放。通常在棧上分配

static :指定為靜態(tài)變量,分配在靜態(tài)變量區(qū),修飾函數(shù)時(shí),指定函數(shù)作用域?yàn)槲募?nèi)部

register :指定為寄存器變量,建議編譯器將變量存儲(chǔ)到寄存器中使用,也可以修飾函數(shù)形參,建議編譯器通過(guò)寄存器而不是堆棧傳遞參數(shù)

extern :指定對(duì)應(yīng)變量為外部變量,即標(biāo)示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。

const :與volatile合稱“cv特性”,指定變量不可被當(dāng)前線程/進(jìn)程改變(但有可能被系統(tǒng)或其他線程/進(jìn)程改變)

volatile :與const合稱“cv特性”,指定變量的值有可能會(huì)被系統(tǒng)或其他進(jìn)程/線程改變,強(qiáng)制編譯器每次從內(nèi)存中取得該變量的值

2 流程控制關(guān)鍵字

A 跳轉(zhuǎn)結(jié)構(gòu)(4個(gè))

return :用在函數(shù)體中,返回特定值(或者是void值,即不返回值)

continue :結(jié)束當(dāng)前循環(huán),開(kāi)始下一輪循環(huán)

break :跳出當(dāng)前循環(huán)或switch結(jié)構(gòu)

goto :無(wú)條件跳轉(zhuǎn)語(yǔ)句

B 分支結(jié)構(gòu)(5個(gè))

if :條件語(yǔ)句

else :條件語(yǔ)句否定分支(與if連用)

switch :開(kāi)關(guān)語(yǔ)句(多重分支語(yǔ)句)

case :開(kāi)關(guān)語(yǔ)句中的分支標(biāo)記

default :開(kāi)關(guān)語(yǔ)句中的“其他”分治,可選。

C 循環(huán)結(jié)構(gòu)(3個(gè))

for :for循環(huán)結(jié)構(gòu),for(1;2;3)4;的執(zhí)行順序?yàn)?-2-4-3-2...循環(huán),其中2為循環(huán)條件

do :do循環(huán)結(jié)構(gòu),do 1 while(2); 的執(zhí)行順序是 1-2-1...循環(huán),2為循環(huán)條件

while :while循環(huán)結(jié)構(gòu),while(1) 2; 的執(zhí)行順序是1-2-1...循環(huán),1為循環(huán)條件

以上循環(huán)語(yǔ)句,當(dāng)循環(huán)條件表達(dá)式為真則繼續(xù)循環(huán),為假則跳出循環(huán)。

[編輯本段]新標(biāo)準(zhǔn)

在ANSI標(biāo)準(zhǔn)化后,C語(yǔ)言的標(biāo)準(zhǔn)在一段相當(dāng)?shù)臅r(shí)間內(nèi)都保持不變,盡管C++繼續(xù)在改進(jìn)。(實(shí)際上,Normative Amendment1在1995年已經(jīng)開(kāi)發(fā)了一個(gè)新的C語(yǔ)言版本。但是這個(gè)版本很少為人所知。)標(biāo)準(zhǔn)在90年代才經(jīng)歷了改進(jìn),這就是ISO9899:1999(1999年出版)。這個(gè)版本就是通常提及的C99。它被ANSI于2000年三月采用。

在C99中包括的特性有:

對(duì)編譯器限制增加了,比如源程序每行要求至少支持到 4095 字節(jié),變量名函數(shù)名的要求支持到 63 字節(jié) (extern 要求支持到 31)

預(yù)處理增強(qiáng)了。例如:

宏支持取參數(shù) #define Macro(...) __VA_ARGS__

使用宏的時(shí)候,參數(shù)如果不寫(xiě),宏里用 #,## 這樣的東西會(huì)擴(kuò)展成空串。(以前會(huì)出錯(cuò)的)

支持 // 行注釋(這個(gè)特性實(shí)際上在C89的很多編譯器上已經(jīng)被支持了)

增加了新關(guān)鍵字 restrict, inline, _Complex, _Imaginary, _Bool

支持 long long, long double _Complex, float _Complex 這樣的類型

支持 : : % % %: %:%: ,等等奇怪的符號(hào)替代

支持了不定長(zhǎng)的數(shù)組。數(shù)組的長(zhǎng)度就可以用變量了。聲明類型的時(shí)候呢,就用 int a[*] 這樣的寫(xiě)法。不過(guò)考慮到效率和實(shí)現(xiàn),這玩意并不是一個(gè)新類型。所以就不能用在全局里,或者 struct union 里面,如果你用了這樣的東西,goto 語(yǔ)句就受限制了。

變量聲明不必放在語(yǔ)句塊的開(kāi)頭,for 語(yǔ)句提倡這么寫(xiě) for(int i=0;i100;++i) 就是說(shuō),int i 的聲明放在里面,i 只在 for 里面有效。(VC沒(méi)有遵守這條標(biāo)準(zhǔn),i 在 for 外也有效)

當(dāng)一個(gè)類似結(jié)構(gòu)的東西需要臨時(shí)構(gòu)造的時(shí)候,可以用 (type_name) 這有點(diǎn)像 C++ 的構(gòu)造函數(shù)

初始化結(jié)構(gòu)的時(shí)候現(xiàn)在可以這樣寫(xiě):

struct hehe[] = ;

struct hehe = // 3,4 是對(duì) .c,.d 賦值的

字符串里面,\u 支持 unicode 的字符

支持 16 進(jìn)制的浮點(diǎn)數(shù)的描述

所以 printf scanf 的格式化串多支持了 ll / LL (VC6 里用的 I64) 對(duì)應(yīng)新的 long long 類型。

浮點(diǎn)數(shù)的內(nèi)部數(shù)據(jù)描述支持了新標(biāo)準(zhǔn),這個(gè)可以用 #pragma 編譯器指定

除了已經(jīng)有的 __line__ __file__ 以外,又支持了一個(gè) __func__ 可以得到當(dāng)前的函數(shù)名

對(duì)于非常數(shù)的表達(dá)式,也允許編譯器做化簡(jiǎn)

修改了對(duì)于 / % 處理負(fù)數(shù)上的定義,比如老的標(biāo)準(zhǔn)里 -22 / 7 = -3, -22 % 7 = -1 而現(xiàn)在 -22 / 7 = -4, -22 % 7 = 6

取消了不寫(xiě)函數(shù)返回類型默認(rèn)就是 int 的規(guī)定

允許 struct 定義的最后一個(gè)數(shù)組寫(xiě)做 [] 不指定其長(zhǎng)度描述

const const int i; 將被當(dāng)作 const int i; 處理

增加和修改了一些標(biāo)準(zhǔn)頭文件, 比如定義 bool 的 stdbool.h 定義一些標(biāo)準(zhǔn)長(zhǎng)度的 int 的 inttypes.h 定義復(fù)數(shù)的 complex.h 定義寬字符的 wctype.h 有點(diǎn)泛型味道的數(shù)學(xué)函數(shù) tgmath.h 跟浮點(diǎn)數(shù)有關(guān)的 fenv.h。stdarg.h 里多了一個(gè) va_copy 可以復(fù)制 ... 的參數(shù)。time.h 里多了個(gè) struct tmx 對(duì) struct tm 做了擴(kuò)展

輸入輸出對(duì)寬字符還有長(zhǎng)整數(shù)等做了相應(yīng)的支持

相對(duì)于c89的變化還有

1、增加restrict指針

C99中增加了公適用于指針的restrict類型修飾符,它是初始訪問(wèn)指針?biāo)笇?duì)象的惟一途徑,因此只有借助restrict指針表達(dá)式才能訪問(wèn)對(duì)象。restrict指針指針主要用做函數(shù)變?cè)?,或者指向由malloc()函數(shù)所分配的內(nèi)存變量。restrict數(shù)據(jù)類型不改變程序的語(yǔ)義。

如果某個(gè)函數(shù)定義了兩個(gè)restrict指針變?cè)?,編譯程序就假定它們指向兩個(gè)不同的對(duì)象,memcpy()函數(shù)就是restrict指針的一個(gè)典型應(yīng)用示例。C89中memcpy()函數(shù)原型如下:

代碼: void *memcpy (void *s1, const void *s2, size_t size);

如果s1和s2所指向的對(duì)象重疊,其操作就是未定義的。memcpy()函數(shù)只能用于不重疊的對(duì)象。C99中memcpy()函數(shù)原型如下:代碼: void *memcpy(void *restrict s1, const void *restrict s2,size_t size);

通過(guò)使用restrict修飾s1和s2 變?cè)?,可確保它們?cè)谠撛椭兄赶虿煌膶?duì)象。

2、inline(內(nèi)聯(lián))關(guān)鍵字

內(nèi)聯(lián)函數(shù)除了保持結(jié)構(gòu)化和函數(shù)式的定義方式外,還能使程序員寫(xiě)出高效率的代碼.函數(shù)的每次調(diào)用與返回都會(huì)消耗相當(dāng)大的系統(tǒng)資源,尤其是當(dāng)函數(shù)調(diào)用發(fā)生在重復(fù)次數(shù)很多的循環(huán)語(yǔ)句中時(shí).一般情況下,當(dāng)發(fā)生一次函數(shù)調(diào)用時(shí),變?cè)枰M(jìn)棧,各種寄存器內(nèi)存需要保存.當(dāng)函數(shù)返回時(shí),寄存器的內(nèi)容需要恢復(fù)。如果該函數(shù)在代碼內(nèi)進(jìn)行聯(lián)機(jī)擴(kuò)展,當(dāng)代碼執(zhí)行時(shí),這些保存和恢復(fù)操作旅游活動(dòng)會(huì)再發(fā)生,而且函數(shù)調(diào)用的執(zhí)行速度也會(huì)大大加快。函數(shù)的聯(lián)機(jī)擴(kuò)展會(huì)產(chǎn)生較長(zhǎng)的代碼,所以只應(yīng)該內(nèi)聯(lián)對(duì)應(yīng)用程序性能有顯著影響的函數(shù)以及長(zhǎng)度較短的函數(shù)

3、新增數(shù)據(jù)類型

_Bool

值是0或1。C99中增加了用來(lái)定義bool、true以及false宏的頭文件夾stdbool.h,以便程序員能夠編寫(xiě)同時(shí)兼容于C與C++的應(yīng)用程序。在編寫(xiě)新的應(yīng)用程序時(shí),應(yīng)該使用

stdbool.h頭文件中的bool宏。

_Complex and _Imaginary

C99標(biāo)準(zhǔn)中定義的復(fù)數(shù)類型如下:float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary.

complex.h頭文件中定義了complex和imaginary宏,并將它們擴(kuò)展為_(kāi)Complex和_Imaginary,因此在編寫(xiě)新的應(yīng)用程序時(shí),應(yīng)該使用stdbool.h頭文件中的complex和imaginary宏。

long long int

C99標(biāo)準(zhǔn)中引進(jìn)了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能夠支持的整數(shù)長(zhǎng)度為64位。

4、對(duì)數(shù)組的增強(qiáng)

可變長(zhǎng)數(shù)組

C99中,程序員聲明數(shù)組時(shí),數(shù)組的維數(shù)可以由任一有效的整型表達(dá)式確定,包括只在運(yùn)行時(shí)才能確定其值的表達(dá)式,這類數(shù)組就叫做可變長(zhǎng)數(shù)組,但是只有局部數(shù)組才可以是變長(zhǎng)的.

可變長(zhǎng)數(shù)組的維數(shù)在數(shù)組生存期內(nèi)是不變的,也就是說(shuō),可變長(zhǎng)數(shù)組不是動(dòng)態(tài)的.可以變化的只是數(shù)組的大小.可以使用*來(lái)定義不確定長(zhǎng)的可變長(zhǎng)數(shù)組

JavaScript屬性可枚舉性?誰(shuí)能給我解釋下什么叫做屬性的可枚舉性,謝謝了

var?obj?=?{name:"張三",age:18}

for(var?key?in?obj){

console.log("key:"?+?key?+?",value:"?+?obj[key]);

}

//輸出:key:name,value:張三和key:age,value:18

//這里的可枚舉性就是說(shuō)for的這種寫(xiě)法可以得到這個(gè)對(duì)象的屬性名

var?obj1?=?{};

Object.defineProperties(obj1,?{

name:?{

value:?"張三",

enumerable:?false

},

age:?{

value:?18,

enumerable:?false

}

});

for(var?key?in?obj1){

console.log("key:"?+?key?+?",value:"?+?obj[key]);

}

//這里不會(huì)輸出任何東西,但是可以用obj1.name和obj1.age直接取值。

//當(dāng)然obj1["name"]也是可以得到張三的。

//但是不能用for來(lái)枚舉出他有什么屬性。

//以上代碼請(qǐng)?jiān)赾hrome或者火狐里面運(yùn)行,IE9以下運(yùn)行第二段代碼會(huì)出錯(cuò)

Java開(kāi)發(fā)都學(xué)什么?誰(shuí)在主導(dǎo)技術(shù)的革新?

學(xué)習(xí)內(nèi)容大致可分為bai以下10點(diǎn),都是我從動(dòng)力節(jié)點(diǎn)自du學(xué)教程里學(xué)習(xí)的時(shí)候總結(jié)出zhi來(lái)的,但java編程日新月異,每天都在dao變化,即便現(xiàn)在掌握了一些知識(shí)也不要驕傲,更要跟上技術(shù)發(fā)展的步伐,實(shí)時(shí)更新。

1、Java語(yǔ)言

Java語(yǔ)言體系比較龐大,包括多個(gè)模塊。從WEB項(xiàng)目應(yīng)用角度講有JSP、Servlet、JDBC、JavaBean(Application)四部分技術(shù)。

(1)、Java Database Connectivity(JDBC)技術(shù)

在Java Web應(yīng)用開(kāi)發(fā)中,數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)的使用是不可缺少的。JDBC(Java Database Connectivity) 是一種用于執(zhí)行SQL 語(yǔ)句的 Java API。它由一組用 Java 編程語(yǔ)言編寫(xiě)的類和接口組成。JDBC 為工具/數(shù)據(jù)庫(kù)開(kāi)發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,使他們能夠用純Java API 來(lái)編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。

簡(jiǎn)單地說(shuō),JDBC 可做三件事:

l 與數(shù)據(jù)庫(kù)建立連接,

l 發(fā)送SQL 語(yǔ)句,

l 處理結(jié)果。

(2)、Servlet技術(shù)

Servlet是運(yùn)行在服務(wù)器端的程序,可以被認(rèn)為是服務(wù)器端的applet。servlet被Web服務(wù)器(例如Tomcat)加載和執(zhí)行,就如同applet被瀏覽器加載和執(zhí)行一樣。servlet從客戶端(通過(guò)Web服務(wù)器)接收請(qǐng)求,執(zhí)行某種操作,然后返回結(jié)果。

Servlet的主要優(yōu)點(diǎn)包括

l Servlet是持久的。servlet只需Web服務(wù)器加載一次,而且可以在不同請(qǐng)求之間保持服務(wù)(例如一次數(shù)據(jù)庫(kù)連接)。

l Servlet是與平臺(tái)無(wú)關(guān)的。如前所述,servlet是用Java編寫(xiě)的,它自然也繼承了Java的平臺(tái)無(wú)關(guān)性。

l Servlet是可擴(kuò)展的。由于servlet是用Java編寫(xiě)的,它就具備了Java所能帶來(lái)的所有優(yōu)點(diǎn)。Java是健壯的、面向?qū)ο蟮木幊陶Z(yǔ)言,它很容易擴(kuò)展以適應(yīng)你的需求。servlet自然也具備了這些特征。

l Servlet是安全的。從外界調(diào)用一個(gè)servlet的惟一方法就是通過(guò)Web服務(wù)器。這提供了高水平的安全性保障,尤其是在你的Web服務(wù)器有防火墻保護(hù)的時(shí)候。

l Servlet可以在多種多樣的客戶機(jī)上使用。由于servlet是用Java編寫(xiě)的,所以你可以很方便地在HTML中使用它們。

(3)、JavaServer Pages(JSP)技術(shù)

JSP是從Servlet上分離出來(lái)的一小部分,簡(jiǎn)化了開(kāi)發(fā),加強(qiáng)了界面設(shè)計(jì)。JSP定位在交互網(wǎng)頁(yè)的開(kāi)發(fā)。運(yùn)用Java語(yǔ)法,但功能較Servlet弱了很多,并且高級(jí)開(kāi)發(fā)中只充當(dāng)用戶界面部分。JSP容器收到客戶端發(fā)出的請(qǐng)求時(shí),首先執(zhí)行其中的程序片段,然后將執(zhí)行結(jié)果以HTML格式響應(yīng)給客戶端。其中程序片段可以是:操作數(shù)據(jù)庫(kù)、重新定向網(wǎng)頁(yè)以及發(fā)送 E-Mail 等等,這些都是建立動(dòng)態(tài)網(wǎng)站所需要的功能。所有程序操作都在服務(wù)器端執(zhí)行,網(wǎng)絡(luò)上傳送給客戶端的僅是得到的結(jié)果,與客戶端的瀏覽器無(wú)關(guān),因此,JSP 稱為Server-Side Language。

JavaServer Pages的主要優(yōu)點(diǎn)包括

●一次編寫(xiě),各處執(zhí)行(Write Once, Run Anywhere)特性

作為Java 平臺(tái)的一部分,JavaServer Pages 技術(shù)擁有Java語(yǔ)言“一次編寫(xiě),各處執(zhí)行”的特點(diǎn)。隨著越來(lái)越多的供貨商將JavaServer Pages 技術(shù)添加到他們的產(chǎn)品中,您可以針對(duì)自己公司的需求,做出審慎評(píng)估后,選擇符合公司成本及規(guī)模的服務(wù)器,假若未來(lái)的需求有所變更時(shí),更換服務(wù)器平臺(tái)并不影響之前所投下的成本、人力所開(kāi)發(fā)的應(yīng)用程序。

● 搭配可重復(fù)使用的組件

JavaServer Pages技術(shù)可依賴于重復(fù)使用跨平臺(tái)的組件(如:JavaBean或Enterprise JavaBean組件)來(lái)執(zhí)行更復(fù)雜的運(yùn)算、數(shù)據(jù)處理。開(kāi)發(fā)人員能夠共享開(kāi)發(fā)完成的組件,或者能夠加強(qiáng)這些組件的功能,讓更多用戶或是客戶團(tuán)體使用?;谏萍永媒M件的方法,可以加快整體開(kāi)發(fā)過(guò)程,也大大降低公司的開(kāi)發(fā)成本和人力。

● 采用標(biāo)簽化頁(yè)面開(kāi)發(fā)

Web 網(wǎng)頁(yè)開(kāi)發(fā)人員不一定都是熟悉Java 語(yǔ)言的程序員。因此,JSP 技術(shù)能夠?qū)⒃S多功能封裝起來(lái),成為一個(gè)自定義的標(biāo)簽,這些功能是完全根據(jù)XML 的標(biāo)準(zhǔn)來(lái)制訂的,即JSP 技術(shù)中的標(biāo)簽庫(kù)(Tag Library)。因此,Web 頁(yè)面開(kāi)發(fā)人員可以運(yùn)用自定義好的標(biāo)簽來(lái)達(dá)成工作需求,而無(wú)須再寫(xiě)復(fù)雜的Java 語(yǔ)法,讓W(xué)eb 頁(yè)面開(kāi)發(fā)人員亦能快速開(kāi)發(fā)出一動(dòng)態(tài)內(nèi)容網(wǎng)頁(yè)。

今后,第三方開(kāi)發(fā)人員和其他人員可以為常用功能建立自己的標(biāo)簽庫(kù),讓W(xué)eb 網(wǎng)頁(yè)開(kāi)發(fā)人員能夠使用熟悉的開(kāi)發(fā)工具,如同HTML 一樣的標(biāo)簽語(yǔ)法來(lái)執(zhí)行特定功能的工作。

● N-tier 企業(yè)應(yīng)用架構(gòu)的支持

有鑒于網(wǎng)際網(wǎng)絡(luò)的發(fā)展,為因應(yīng)未來(lái)服務(wù)越來(lái)越繁雜的要求,且不再受地域的限制,因此,

必須放棄以往Client-Server的Two-tier 架構(gòu),進(jìn)而轉(zhuǎn)向更具威力、彈性的分散性對(duì)象系統(tǒng)。由于JavaServer Page 技術(shù)是Java 2 Platform Enterprise Edition (J2EE)集成中的一部分,它主要是負(fù)責(zé)前端顯示經(jīng)過(guò)復(fù)雜運(yùn)算后之結(jié)果內(nèi)容,而分散性的對(duì)象系統(tǒng)則是主要依賴EJB ( Enterprise JavaBean )和JNDI ( Java Naming and Directory Interface )構(gòu)建而成。

(4)、JavaBean(Application)應(yīng)用組件技術(shù)

Application是Java應(yīng)用程序,在WEB項(xiàng)目和一些開(kāi)發(fā)中主要應(yīng)用JavaBean。它就是Application的一部分,邏輯運(yùn)算能力很強(qiáng),能極大的發(fā)揮Java語(yǔ)言的優(yōu)點(diǎn)。JavaBean 被稱為是Java 組件技術(shù)的核心。JavaBean 的結(jié)構(gòu)必須滿足一定的命名約定。JavaBean能提供常用功能并且可以重復(fù)使用,這使得開(kāi)發(fā)人員可以把某些關(guān)鍵功能和核心算法提取出來(lái)封裝成為一個(gè)組件對(duì)象,這樣就增加了代碼的重用率和系統(tǒng)的安全性。

高級(jí)的WEB項(xiàng)目會(huì)應(yīng)用到以上所有技術(shù),它們之間聯(lián)合使用和協(xié)作開(kāi)發(fā)會(huì)提高開(kāi)發(fā)的效率和系統(tǒng)的性能。

2、面向?qū)ο蠓治鲈O(shè)計(jì)思想

Java語(yǔ)言是完全面向?qū)ο蟮恼Z(yǔ)言,所以在項(xiàng)目設(shè)計(jì)時(shí)會(huì)有很大的幫助,在設(shè)計(jì)時(shí)應(yīng)盡量舍棄以往的面向過(guò)程的設(shè)計(jì)方式。

在分析項(xiàng)目業(yè)務(wù)關(guān)系的時(shí)候,應(yīng)用一些UML(Unified Modeling Language)圖,例如常用的用例圖(use case diagram),類圖(class diagram),時(shí)序圖(sequence diagram)等等,會(huì)有很大的幫助,這樣能盡快找出業(yè)務(wù)邏輯主要面對(duì)的對(duì)象,然后對(duì)每個(gè)對(duì)象進(jìn)行行為劃分,最后再實(shí)現(xiàn)對(duì)象之間的集成和通信。

3、設(shè)計(jì)模式和框架結(jié)構(gòu)

Java從語(yǔ)言角度來(lái)講不是很難,但是從整體設(shè)計(jì)角度來(lái)講我們還需要了解一些高級(jí)應(yīng)用框架。如果要設(shè)計(jì)一個(gè)良好的框架結(jié)構(gòu),單單只掌握J(rèn)ava語(yǔ)言遠(yuǎn)遠(yuǎn)不夠。這就涉及到一個(gè)設(shè)計(jì)模式,還有和設(shè)計(jì)模式相關(guān)的一些知識(shí)。

設(shè)計(jì)模式在Java項(xiàng)目實(shí)施過(guò)程更是重中之重。主要在與兩層的設(shè)計(jì)模式、三層的設(shè)計(jì)模式和N層的設(shè)計(jì)模式。它直接決定著項(xiàng)目的應(yīng)用、部署和實(shí)際開(kāi)發(fā)設(shè)計(jì)。

在普通的WEB項(xiàng)目中很多采用兩層的開(kāi)發(fā)結(jié)構(gòu)。JSP+Servlet或JSP+JavaBean。當(dāng)對(duì)開(kāi)發(fā)要求高的項(xiàng)目中使用很多的還是MVC的三層開(kāi)發(fā)結(jié)構(gòu),也就是JSP+Servlet+JavaBean。它能分有效的分離邏輯開(kāi)發(fā),使開(kāi)發(fā)人員能專注于各自的開(kāi)發(fā)。同時(shí)也能時(shí)整個(gè)開(kāi)發(fā)結(jié)構(gòu)流程更清晰,但是需要比較高的開(kāi)發(fā)配合度。

在項(xiàng)目中,我們經(jīng)常使用著名的Model-View-Controller(MVC)架構(gòu)。MVC架構(gòu)是隨著smalltalk language語(yǔ)言的發(fā)展提出的,它是一個(gè)著名的用戶界面設(shè)計(jì)架構(gòu)。經(jīng)典的MVC架構(gòu)把一個(gè)組件(可認(rèn)為是整個(gè)應(yīng)用程序的一個(gè)模塊)劃分成三部分組 Model管理這個(gè)模塊中所用到的數(shù)據(jù)和業(yè)務(wù)邏輯。而View 管理模塊如何顯示給用戶,Controller 決定如何處理用戶和該模塊交互式時(shí)候產(chǎn)生的事件如用戶點(diǎn)擊一個(gè)按鈕等。

4、XML語(yǔ)言

在服務(wù)器和設(shè)計(jì)模式結(jié)構(gòu)中會(huì)應(yīng)用到自定義文件,而且在應(yīng)用高級(jí)設(shè)計(jì)時(shí)也會(huì)定義自用的標(biāo)簽,現(xiàn)在流行的是用XML去定義配置,所以XML語(yǔ)言應(yīng)該有一定掌握。

當(dāng)前,Java 2平臺(tái)企業(yè)版(J2EE)架構(gòu)在廠商市場(chǎng)和開(kāi)發(fā)者社區(qū)中倍受推崇。作為一種工具,可擴(kuò)展標(biāo)記語(yǔ)言(XML)簡(jiǎn)化了數(shù)據(jù)交換、進(jìn)程間消息交換這一類的事情,因而對(duì)開(kāi)發(fā)者逐漸變得有吸引力,并開(kāi)始流行起來(lái)。自然,在J2EE架構(gòu)中訪問(wèn)或集成XML解決方案的想法也很誘人。因?yàn)檫@將是強(qiáng)大系統(tǒng)架構(gòu)同高度靈活的數(shù)據(jù)管理方案的結(jié)合。

XML的應(yīng)用似乎是無(wú)窮無(wú)盡的,但它們大致上可以分為三大類:

1、簡(jiǎn)單數(shù)據(jù)的表示和交換(針對(duì)XML的簡(jiǎn)單API(SAX)和文檔對(duì)象模型(DOM)語(yǔ)法解析,不同的文檔類型定義(DTDs)和概要(schemas))

2、用戶界面相關(guān)、表示相關(guān)的上下文(可擴(kuò)展樣式表語(yǔ)言(XSL),可擴(kuò)展樣式表語(yǔ)言轉(zhuǎn)換(XSLT))

3、面向消息的計(jì)算(XML-RPC(遠(yuǎn)程過(guò)程調(diào)用),基于SOAP協(xié)議的Web 服務(wù)(Web Services),電子化業(yè)務(wù)XML(ebXML))

5、網(wǎng)頁(yè)腳本語(yǔ)言

為了提高WEB項(xiàng)目的整體性能,提高人機(jī)交互的友好界面,網(wǎng)頁(yè)的腳本語(yǔ)言是很有用處的,有的時(shí)候可以解決很大的難題或提高程序的性能和應(yīng)用性。

網(wǎng)頁(yè)腳本語(yǔ)言的執(zhí)行都是在客戶端執(zhí)行的,速度很很快,并且大多的操作與服務(wù)器沒(méi)有交互運(yùn)算,所以在一些應(yīng)用中非常理想。在設(shè)計(jì)WEB項(xiàng)目的應(yīng)用中,網(wǎng)頁(yè)的腳本語(yǔ)言起著不能忽視的作用,所以如果設(shè)計(jì)WEB項(xiàng)目的應(yīng)用中,對(duì)JavaScript應(yīng)有一定的了解。

JavaScript是一種基于對(duì)象(Object Based)和事件驅(qū)動(dòng)(Event Driven)并具有安全性能(Secure)的腳本語(yǔ)言。使用它的目的是與HTML超文本標(biāo)記語(yǔ)言、Java 腳本語(yǔ)言(Java小程序)一起實(shí)現(xiàn)在一個(gè)Web頁(yè)面中鏈接多個(gè)對(duì)象,與Web客戶交互作用。從而可以開(kāi)發(fā)客戶端的應(yīng)用程序等。它是通過(guò)嵌入或調(diào)入在標(biāo)準(zhǔn)的HTML語(yǔ)言中實(shí)現(xiàn)的。

Web前端工程師應(yīng)該知道的JavaScript創(chuàng)建對(duì)象的方式

今天小編要跟大家分享的文章是關(guān)于Web前端工程師應(yīng)該知道的JavaScript

創(chuàng)建對(duì)象的方式。JavaScript創(chuàng)建對(duì)象的方式有很多,通過(guò)Object構(gòu)造函數(shù)或?qū)ο笞置媪康姆绞揭部梢詣?chuàng)建單個(gè)對(duì)象,顯然這兩種方式會(huì)產(chǎn)生大量的重復(fù)代碼,并不適合量產(chǎn)。下面小編為大家介紹一些非常經(jīng)典的創(chuàng)建對(duì)象的方式,他們也各有優(yōu)缺點(diǎn)。我們一起來(lái)看一看吧!

1、工廠模式

functioncreatePerson(name,job){varo=newObject()

o.name=name

o.job=job

o.sayName=function(){console.log(this.name)

}returno

}varperson1=createPerson('Jiang','student')varperson2=createPerson('X','Doctor')

可以無(wú)數(shù)次調(diào)用這個(gè)工廠函數(shù),每次都會(huì)返回一個(gè)包含兩個(gè)屬性和一個(gè)方法的對(duì)象

工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問(wèn)題,但是沒(méi)有解決對(duì)象識(shí)別問(wèn)題,即不能知道一個(gè)對(duì)象的類型

2、構(gòu)造函數(shù)模式

functionPerson(name,job){this.name=namethis.job=jobthis.sayName=function(){console.log(this.name)

}

}varperson1=newPerson('Jiang','student')varperson2=newPerson('X','Doctor')

沒(méi)有顯示的創(chuàng)建對(duì)象,使用new來(lái)調(diào)用這個(gè)構(gòu)造函數(shù),使用new后會(huì)自動(dòng)執(zhí)行如下操作

·創(chuàng)建一個(gè)新對(duì)象

·這個(gè)新對(duì)象會(huì)被執(zhí)行[[prototype]]鏈接

·這個(gè)新對(duì)象會(huì)綁定到函數(shù)調(diào)用的this

·返回這個(gè)對(duì)象

使用這個(gè)方式創(chuàng)建對(duì)象可以檢測(cè)對(duì)象類型

person1instanceofObject//trueperson1instanceofPerson//true

但是使用構(gòu)造函數(shù)創(chuàng)建對(duì)象,每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一次

3、原型模式

functionPerson(){

}

Person.prototype.name='Jiang'Person.prototype.job='student'Person.prototype.sayName=function(){console.log(this.name)

}varperson1=newPerson()

將信息直接添加到原型對(duì)象上。使用原型的好處是可以讓所有的實(shí)例對(duì)象共享它所包含的屬性和方法,不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例信息。

原型是一個(gè)非常重要的概念,在一篇文章看懂proto和prototype的關(guān)系及區(qū)別中講的非常詳細(xì)

更簡(jiǎn)單的寫(xiě)法

functionPerson(){

}

Person.prototype={

ame:'jiang',

job:'student',

sayName:function(){console.log(this.name)

}

}varperson1=newPerson()

將Person.prototype設(shè)置為等于一個(gè)以對(duì)象字面量形式創(chuàng)建的對(duì)象,但是會(huì)導(dǎo)致.constructor不在指向Person了。

使用這種方式,完全重寫(xiě)了默認(rèn)的Person.prototype對(duì)象,因此.constructor也不會(huì)存在這里

Person.prototype.constructor===Person//false

如果需要這個(gè)屬性的話,可以手動(dòng)添加

functionPerson(){

}

Person.prototype={

constructor:Person

ame:'jiang',

job:'student',

sayName:function(){

console.log(this.name)

}

}

不過(guò)這種方式還是不夠好,應(yīng)為constructor屬性默認(rèn)是不可枚舉的,這樣直接設(shè)置,它將是可枚舉的。所以可以時(shí)候,Object.defineProperty方法

Object.defineProperty(Person.prototype,'constructor',{

enumerable:false,

value:Person

})

缺點(diǎn)

使用原型,所有的屬性都將被共享,這是個(gè)很大的優(yōu)點(diǎn),同樣會(huì)帶來(lái)一些缺點(diǎn)

原型中所有屬性實(shí)例是被很多實(shí)例共享的,這種共享對(duì)于函數(shù)非常合適。對(duì)于那些包含基本值的屬性也勉強(qiáng)可以,畢竟實(shí)例屬性可以屏蔽原型屬性。但是引用類型值,就會(huì)出現(xiàn)問(wèn)題了

functionPerson(){

}

Person.prototype={

ame:'jiang',

friends:['Shelby','Court']

}varperson1=newPerson()varperson2=newPerson()

person1.friends.push('Van')console.log(person1.friends)//["Shelby","Court","Van"]console.log(person2.friends)//["Shelby","Court","Van"]console.log(person1.friends===person2.friends)//true

friends存在與原型中,實(shí)例person1和person2指向同一個(gè)原型,person1修改了引用的數(shù)組,也會(huì)反應(yīng)到實(shí)例person2中

4、組合使用構(gòu)造函數(shù)模式和原型模式

這是使用最為廣泛、認(rèn)同度最高的一種創(chuàng)建自定義類型的方法。它可以解決上面那些模式的缺點(diǎn)

使用此模式可以讓每個(gè)實(shí)例都會(huì)有自己的一份實(shí)例屬性副本,但同時(shí)又共享著對(duì)方法的引用

這樣的話,即使實(shí)例屬性修改引用類型的值,也不會(huì)影響其他實(shí)例的屬性值了

functionPerson(name){this.name=namethis.friends=['Shelby','Court']

}

Person.prototype.sayName=function(){console.log(this.name)

}varperson1=newPerson()varperson2=newPerson()

person1.friends.push('Van')console.log(person1.friends)//["Shelby","Court","Van"]console.log(person2.friends)//["Shelby","Court"]console.log(person1.friends===person2.friends)//false

5、動(dòng)態(tài)原型模式

動(dòng)態(tài)原型模式將所有信息都封裝在了構(gòu)造函數(shù)中,初始化的時(shí)候,通過(guò)檢測(cè)某個(gè)應(yīng)該存在的方法時(shí)候有效,來(lái)決定是否需要初始化原型

functionPerson(name,job){//屬性

this.name=namethis.job=job//方法

if(typeofthis.sayName!=='function'){

Person.prototype.sayName=function(){console.log(this.name)

}

}

}varperson1=newPerson('Jiang','Student')

person1.sayName()

只有在sayName方法不存在的時(shí)候,才會(huì)將它添加到原型中。這段代碼只會(huì)初次調(diào)用構(gòu)造函數(shù)的時(shí)候才會(huì)執(zhí)行。

此后原型已經(jīng)完成初始化,不需要在做什么修改了

這里對(duì)原型所做的修改,能夠立即在所有實(shí)例中得到反映

其次,if語(yǔ)句檢查的可以是初始化之后應(yīng)該存在的任何屬性或方法,所以不必用一大堆的if語(yǔ)句檢查每一個(gè)屬性和方法,只要檢查一個(gè)就行

6、寄生構(gòu)造函數(shù)模式

這種模式的基本思想就是創(chuàng)建一個(gè)函數(shù),該函數(shù)的作用僅僅是封裝創(chuàng)建對(duì)象的代碼,然后再返回新建的對(duì)象

functionPerson(name,job){varo=newObject()

o.name=name

o.job=job

o.sayName=function(){console.log(this.name)

}returno

}varperson1=newPerson('Jiang','student')

person1.sayName()

這個(gè)模式,除了使用new操作符并把使用的包裝函數(shù)叫做構(gòu)造函數(shù)之外,和工廠模式幾乎一樣

構(gòu)造函數(shù)如果不返回對(duì)象,默認(rèn)也會(huì)返回一個(gè)新的對(duì)象,通過(guò)在構(gòu)造函數(shù)的末尾添加一個(gè)return語(yǔ)句,可以重寫(xiě)調(diào)用構(gòu)造函數(shù)時(shí)返回的值

7、穩(wěn)妥構(gòu)造函數(shù)模式

首先明白穩(wěn)妥對(duì)象指的是沒(méi)有公共屬性,而且其方法也不引用this。

穩(wěn)妥對(duì)象最適合在一些安全環(huán)境中(這些環(huán)境會(huì)禁止使用this和new),或防止數(shù)據(jù)被其他應(yīng)用程序改動(dòng)時(shí)使用

穩(wěn)妥構(gòu)造函數(shù)模式和寄生模式類似,有兩點(diǎn)不同:一是創(chuàng)建對(duì)象的實(shí)例方法不引用this,而是不使用new操作符調(diào)用構(gòu)造函數(shù)

functionPerson(name,job){varo=newObject()

o.name=name

o.job=job

o.sayName=function(){console.log(name)

}returno

}varperson1=Person('Jiang','student')

person1.sayName()

和寄生構(gòu)造函數(shù)模式一樣,這樣創(chuàng)建出來(lái)的對(duì)象與構(gòu)造函數(shù)之間沒(méi)有什么關(guān)系,instanceof操作符對(duì)他們沒(méi)有意義。

以上就是小編跟大家分享的關(guān)于JavaScript

創(chuàng)建對(duì)象的方式的文章,希望本篇文章能夠?qū)φ趶氖聎eb相關(guān)工作的小伙伴們有所幫助。想要了解更多web相關(guān)知識(shí)記得關(guān)注北大青鳥(niǎo)web培訓(xùn)官網(wǎng)。最后祝愿小伙伴們工作順利!

*聲明:內(nèi)容與圖片均來(lái)源于網(wǎng)絡(luò)(部分內(nèi)容有修改),版權(quán)歸原作者所有,如來(lái)源信息有誤或侵犯權(quán)益,請(qǐng)聯(lián)系我們刪除或授權(quán)事宜。

TypeScript 和 JavaScript 的區(qū)別

1.從歷史包袱角度說(shuō)JavaScript的包袱是前向兼容,即使老版本的ES中有落后的方面,為了兼容,也要支持,而TypeScript宣稱完全兼容JavaScript,這導(dǎo)致了TypeScript繼承了JavaScript一切的缺點(diǎn),所以從這點(diǎn)上看可以說(shuō)是不相伯仲。

2.TypeScript的作者也是C#的作者,這導(dǎo)致了TypeScript從C#繼承了很多優(yōu)雅的設(shè)計(jì)比如枚舉,泛型等語(yǔ)言特性,這讓TypeScript增色不少。

3.TypeScript帶有編譯期類型檢查,在寫(xiě)大程序的時(shí)候有優(yōu)勢(shì),更容易重構(gòu)和讓別人理解代碼的意圖,但是這帶來(lái)了一個(gè)問(wèn)題就是語(yǔ)法上的拖沓冗長(zhǎng),不夠漂亮。

4.知道Groovy和Java的朋友和容易看出來(lái),TypeScript和JavaScript的關(guān)系實(shí)際上就是Groovy和Java的關(guān)系,一個(gè)動(dòng)態(tài),一個(gè)靜態(tài),一個(gè)靈活,一個(gè)穩(wěn)健,哪個(gè)更先進(jìn),要看你從哪個(gè)方面來(lái)說(shuō)了。

5. 下面是完成同樣功能的兩段簡(jiǎn)單代碼,大家可以簡(jiǎn)單比較一下,看看自己喜歡那種品位。

TypeScript Code:

class Greeter {

greeting: string;

constructor (message: string) {

this.greeting = message;

如何在JavaScript中寫(xiě)枚舉

var obj = {name:"張三",age:18}for(var key in obj){ console.log("key:" + key + ",value:" + obj[key]);}//輸出:key:name,value:張三和key:age,value:18//這里的可枚舉性就是說(shuō)for的這種寫(xiě)法可以得到這個(gè)對(duì)象的屬性名 var obj1 = {};Object.defineProperties(obj1, { name: { value: "張三", enumerable: false }, age: { value: 18, enumerable: false }}); for(var key in obj1){ console.log("key:" + key + ",value:" + obj[key]);}


本文題目:javascript枚舉,java枚舉菜鳥(niǎo)教程
URL地址:http://weahome.cn/article/dsddohs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部