c語言nb
樓上說的在理!C語言確實很NB!可以用來編程!1. C是高級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以像匯編語言一樣對位、位元組和地址進行操作,而這三者是計算機最基本的工作單元。 2.C是結構式語言。結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便於使用、維護以及調試。C 語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控製程序流向,從而使程序完全結構化。 3.C語言功能齊全。具有各種各樣的數據類型,並引入了指針概念,可使程序效率更高。而且計算功能、邏輯判斷功能也比較強大,可以實現決策目的的游戲。 4. C語言適用范圍大。適合於多種操作系統,如Windows、DOS、UNIX等等;也適用於多種機型。 C語言對編寫需要硬體進行操作的場合,明顯優於其它高級語言,有一些大型應用軟體也是用C語言編寫的。
2. 什麼是C語言
C語言是貝爾實驗室在20世紀70年代初開發的一種用途廣泛的編程語言。
1969年Ken Thompson在PDP-7上用匯編語言編寫了Unix的最初版本,用匯編語言編寫的程序是難以維護的,Ken Thompson 意識到需要一種更加高級的變成語言來完成Unix的開發,於是他設計了一種簡單的B語言,B語言是在BCPL語言的基礎上開發的(BCPL是上個世紀60年代中期產生的一種系統編程語言)。
不久後,Dennis Ritchie加入到了Unix項目,並開始用B語言編寫程序。1970年, 貝爾實驗室為Unix項目爭取到了一台PDP-11計算機。B語言經過改進運行在了PDP-11上時,Ken Thompson就用B語言重寫了部分Unix代碼。
到了1971年,B語言已經無法滿足Unix的開發了,於是Dennis Ritchie開始開發B語言的升級版。他最初將心開發的語言明明為NB(New B), 但後來,新語言與B語言差別越來越大,於是他決定將它命名為C語言。
1973年C語言已經足夠穩定,可以用來重新編寫Unix系統了。改用C語言編寫的程序顯示出一個非常重要的好處:可移植性。通過在貝爾實驗室里為其他類型的計算機編寫C語言編譯器,Unix也同樣可以在不同類型的計算機上運行了。
C語言自出現後,一直持續發展,1978年Brain Kernighan 和 Dennis Ritchie 合作編寫並出版了The C Programming Language (K&R)。此書一經出版就迅速成為了C程序員的寶典。由於當時缺少C語言的正式標准,所以這本書就成為了事實上的標准。
隨著C語言的迅速普及,編寫新的C語言編譯器的程序員們都參考"K&R",但"K&R"對一些語言特性的描述非常模糊,導致編譯器會對這些特徵進行不同的處理(目前C語言里依然有很多未定義行為)。
由於在「K&R」出版後,C語言一直在持續發展,對C語言進行全面、准確且最新描述的需求就顯得尤為迫切了,如果缺乏標准,就會出現各種方言(參考Lisp)會影響到C語言的可移植性。
1983年美國國家標准協會(ANSI)開始編制C語言標准。經過多次修訂,C語言標准於1988年完成,並在1989年12月正式通過, 簡稱C89, 1999年通過了C99標准,2007 年,C語言標准委員會又重新開始修訂C語言,到了 2011 年正式發布了C11。
3. C語言初學者,編寫一個統計空格、製表符和換行符個數程序
1、直接對每個字元進行判斷,如果是其中一種,數目加一即可。
2、常式:
#include<stdio.h>
main()
{
intc,hs,kgs,zfbs;
hs=0,kgs=0,zfbs=0;/*初始化*/
while((c=getchar())!='#')
{
if(c==' ')
++hs;
if(c=='')
++kgs;
if(c==' ')
++zfbs;
}
printf("%d%d%d ",hs,kgs,zfbs);/*zbfs改為zfbs*/
}
/*nl,cl,bl可能是代錶行數,空格數,製表符數的英文縮寫*/
4. C語言中兩個連續的雙引號是合法的字元串常量嗎
是的。可以賦給一個字元數組。
1.字元串常量是不可改變的,放在文字常量區,也就是在靜態存儲區上。
2.除了char buffer[20]= "hello ";和strcpy(p, "hello ");這兩個情況外,程序中出現的字元串都應該被視為字元串常量了.
如const char *p= "hello ";
簡單地說,除了存在棧和堆上的字元串才不是字元串常量.其餘的都是字元串常量.
舉一個例子:char buffer[20]= "hello ";這個字元串是用來初始化字元數組buffer的,存在棧上,不是一個字元串常量,可以用下標讀寫其值.又比如,char *p=malloc(...);
strcpy(p, "hello ");這個 "hello "也不是一個字元串常量,因為是在堆上,也可以用指針p進行讀寫.至於在這兩者的前面加上const修飾,雖然表明 "hello "是不允許更改的,但是對於字元串來說,不能說明是字元串常量.因為,const要修飾的不是明確說hello是不可寫的,而是說p指向的這段內存區域是不可寫的.修飾的對象是不同的,只是恰巧這段區域里存的是hello這個字元串(說得有點繞了吧,你再堅持一下).
除了這兩個情況以外,程序中出現的字元串都應該被視為字元串常量了.
比如const char *p= "hello ";這個字元串是存放在靜態存儲區上的,是不可以更改的.它的有效范圍是整個程序的生命期.如果有另外的語句p= "nb ";那麼,hello這個字元串將會永遠不被引用,但是它會存在於整個程序的生命期.這才是真正的字元串常量.
5. c語言位運算符的用法
c語言位運算符的用法1
c語言位運算符的用法如下:
一、位運算符C語言提供了六種位運算符:
& 按位與
| 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移
1. 按位與運算
按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
2. 按位或運算
按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下: 00001001|00000101
00001101 (十進制為13)可見9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
3. 按位異或運算
按位異或運算符「^」是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下: 00001001^00000101 00001100 (十進制為12)。
main(){
int a=9;
a=a^15;
printf("a=%d/n",a);
}
4. 求反運算
求反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。例如~9的運算為: ~(0000000000001001)結果為:1111111111110110。
5. 左移運算
左移運算符「<<」是雙目運算符。其功能把「<< 」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,高位丟棄,低位補0。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。
6. 右移運算
右移運算符「>>」是雙目運算符。其功能是把「>> 」左邊的運算數的`各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:設 a=15,a>>2 表示把000001111右移為00000011(十進制3)。 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。Turbo C和很多系統規定為補1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d/tb=%d/n",a,b);
}
請再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d/nb=%d/nc=%d/nd=%d/n",a,b,c,d);
}
c語言位運算符的用法2
C語言位運算。所謂位運算,就是對一個比特(Bit)位進行操作。比特(Bit)是一個電子元器件,8個比特構成一個位元組(Byte),它已經是粒度最小的可操作單元了。
C語言提供了六種位運算符:
按位與運算(&)
一個比特(Bit)位只有 0 和 1 兩個取值,只有參與&運算的兩個位都為 1 時,結果才為 1,否則為 0。例如1&1為 1,0&0為 0,1&0也為 0,這和邏輯運算符&&非常類似。
C語言中不能直接使用二進制,&兩邊的操作數可以是十進制、八進制、十六進制,它們在內存中最終都是以二進制形式存儲,&就是對這些內存中的二進制位進行運算。其他的位運算符也是相同的道理。
例如,9 & 5可以轉換成如下的運算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在內存中的存儲)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在內存中的存儲)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在內存中的存儲)
也就是說,按位與運算會對參與運算的兩個數的所有二進制位進行&運算,9 & 5的結果為 1。
又如,-9 & 5可以轉換成如下的運算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在內存中的存儲)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在內存中的存儲)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在內存中的存儲)
-9 & 5的結果是 5。
關於正數和負數在內存中的存儲形式,我們已在教程《整數在內存中是如何存儲的》中進行了講解。
再強調一遍,&是根據內存中的二進制位進行運算的,而不是數據的二進制形式;其他位運算符也一樣。以-9&5為例,-9 的在內存中的存儲和 -9 的二進制形式截然不同:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在內存中的存儲)
-0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (-9 的二進制形式,前面多餘的 0 可以抹掉)
按位與運算通常用來對某些位清 0,或者保留某些位。例如要把 n 的高 16 位清 0 ,保留低 16 位,可以進行n & 0XFFFF運算(0XFFFF 在內存中的存儲形式為 0000 0000 -- 0000 0000 -- 1111 1111 -- 1111 1111)。
【實例】對上面的分析進行檢驗。
00001. #include
00002.
00003. int main(){
00004. int n = 0X8FA6002D;
00005. printf("%d, %d, %X ", 9 & 5, -9 & 5, n & 0XFFFF);
00006. return 0;
00007. }
運行結果:
1, 5, 2D
按位或運算(|)
參與|運算的兩個二進制位有一個為 1 時,結果就為 1,兩個都為 0 時結果才為 0。例如1|1為1,0|0為0,1|0為1,這和邏輯運算中的||非常類似。
例如,9 | 5可以轉換成如下的運算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在內存中的存儲)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在內存中的存儲)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1101 (13 在內存中的存儲)
9 | 5的結果為 13。
又如,-9 | 5可以轉換成如下的運算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在內存中的存儲)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在內存中的存儲)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在內存中的存儲)
-9 | 5的結果是 -9。
按位或運算可以用來將某些位置 1,或者保留某些位。例如要把 n 的高 16 位置 1,保留低 16 位,可以進行n | 0XFFFF0000運算(0XFFFF0000 在內存中的存儲形式為 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。
【實例】對上面的分析進行校驗。
00001. #include
00002.
00003. int main(){
00004. int n = 0X2D;
00005. printf("%d, %d, %X ", 9 | 5, -9 | 5, n | 0XFFFF0000);
00006. return 0;
00007. }
運行結果:
13, -9, FFFF002D
按位異或運算(^)
參與^運算兩個二進制位不同時,結果為 1,相同時結果為 0。例如0^1為1,0^0為0,1^1為0。
例如,9 ^ 5可以轉換成如下的運算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在內存中的存儲)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在內存中的存儲)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1100 (12 在內存中的存儲)
9 ^ 5的結果為 12。
又如,-9 ^ 5可以轉換成如下的運算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在內存中的存儲)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在內存中的存儲)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0010 (-14 在內存中的存儲)
-9 ^ 5的結果是 -14。
按位異或運算可以用來將某些二進制位反轉。例如要把 n 的高 16 位反轉,保留低 16 位,可以進行n ^ 0XFFFF0000運算(0XFFFF0000 在內存中的存儲形式為 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。
【實例】對上面的分析進行校驗。
00001. #include
00002.
00003. int main(){
00004. unsigned n = 0X0A07002D;
00005. printf("%d, %d, %X ", 9 ^ 5, -9 ^ 5, n ^ 0XFFFF0000);
00006. return 0;
00007. }
運行結果:
12, -14, F5F8002D
取反運算(~)
取反運算符~為單目運算符,右結合性,作用是對參與運算的二進制位取反。例如~1為0,~0為1,這和邏輯運算中的!非常類似。。
例如,~9可以轉換為如下的運算:
~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在內存中的存儲)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110 (-10 在內存中的存儲)
所以~9的結果為 -10。
例如,~-9可以轉換為如下的運算:
~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在內存中的存儲)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000 (9 在內存中的存儲)
所以~-9的結果為 8。
【實例】對上面的分析進行校驗。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", ~9, ~-9 );
00005. return 0;
00006. }
運行結果:
-10, 8
左移運算(<<)
左移運算符<<用來把操作數的各個二進制位全部左移若干位,高位丟棄,低位補0。
例如,9<<3可以轉換為如下的運算:
<< 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在內存中的存儲)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0100 1000 (72 在內存中的存儲)
所以9<<3的結果為 72。
又如,(-9)<<3可以轉換為如下的運算:
<< 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在內存中的存儲)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1011 1000 (-72 在內存中的存儲)
所以(-9)<<3的結果為 -72
如果數據較小,被丟棄的高位不包含 1,那麼左移 n 位相當於乘以 2 的 n 次方。
【實例】對上面的結果進行校驗。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", 9<<3, (-9)<<3 );
00005. return 0;
00006. }
運行結果:
72, -72
右移運算(>>)
右移運算符>>用來把操作數的各個二進制位全部右移若干位,低位丟棄,高位補 0 或 1。如果數據的最高位是 0,那麼就補 0;如果最高位是 1,那麼就補 1。
例如,9>>3可以轉換為如下的運算:
>> 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在內存中的存儲)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在內存中的存儲)
所以9>>3的結果為 1。
又如,(-9)>>3可以轉換為如下的運算:
>> 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在內存中的存儲)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 1110 (-2 在內存中的存儲)
所以(-9)>>3的結果為 -2
如果被丟棄的低位不包含 1,那麼右移 n 位相當於除以 2 的 n 次方(但被移除的位中經常會包含 1)。
【實例】對上面的結果進行校驗。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", 9>>3, (-9)>>3 );
00005. return 0;
00006. }
運行結果:
1, -2
c語言位運算符的用法3
一、位運算符
在計算機中,數據都是以二進制數形式存放的,位運算就是指對存儲單元中二進制位的運算。C語言提供6種位運算符。
二、位運算
位運算符 & |~<< >> ∧ 按優先順序從高到低排列的順序是:
位運算符中求反運算「~「優先順序最高,而左移和右移相同,居於第二,接下來的順序是按位與 「&「、按位異或 「∧「和按位或 「|「。順序為~ << >> & ∧ | 。
例1:左移運算符「<<」是雙目運算符。其功能把「<< 」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,高位丟棄,低位補0。
例如:
a<<4
指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。
例2:右移運算符「>>」是雙目運算符。其功能是把「>> 」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:
設 a=15,
a>>2
表示把000001111右移為00000011(十進制3)。
應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。
例3:設二進制數a是00101101 ,若通過異或運算a∧b 使a的高4位取反,低4位不變,則二進制數b是。
解析:異或運算常用來使特定位翻轉,只要使需翻轉的位與1進行異或操作就可以了,因為原數中值為1的位與1進行異或運算得0 ,原數中值為0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變數。
如 int a=3 , b=4;,想將a與b的值互換,可用如下語句實現:
a=a∧b;
b=b∧a;
a=a∧b;
所以本題的答案為: 11110000 。
6. C語言 ; 下面「nb nt nl」是什麼意思
nb是你輸入空格的個數,nt是你輸入的製表符的個數,nl是你輸入的換行符的個數
如果輸入為0,結束循環
7. c語言編程問題
#include <stdio.h>
#include <stdlib.h>
struct student {
int num;
char name[20];
float score[4];
};
void input(struct student a[], int);
void aver(struct student a[], int,struct student b[]);
void order(struct student a[], int);
void output(struct student a[], int,struct student b[]);
int main() {
struct student stu[100];
struct student b[100];
int n;
printf("請輸入學生個數:");
scanf("%d", &n);
input(stu, n);
aver(stu, n,b);
order(stu, n);
output(stu, n,b);
return 0;
}
void input(struct student a[], int n) {
int i, j;
// printf("請輸入學生的學號,姓名,英語,數學,物理,語文成績: ");
for (i = 0; i < n; i++) {
printf("請輸入第%d個學生的學號,姓名,英語,數學,物理,語文成績: ", i + 1);
scanf("%d", &a[i].num);
//gets(a[i].name);
scanf("%s", &a[i].name);
for (j = 0; j < 4; j++)
scanf("%f", &a[i].score[j]);
}
}
void aver(struct student a[], int n,struct student b[]) {
int i=0, j;
for (i = 0; i < n; i++) {
b[i].score[0] = 0;
for (j = 0; j < 4; j++)
b[i].score[0] += a[i].score[j];
b[i].score[0] = b[i].score[0] / 4;
}
}
void order(struct student a[], int n) {
int i, j;
struct student t[1];
for (i = 1; i < n; i++)
for (j = 0; j < n - i; j++)
if (a[j].score[3] < a[j + 1].score[3]) {
t[1] = a[j];
a[j] = a[j + 1];
a[j + 1] = t[1];
}
}
void output(struct student a[], int n,struct student b[]) {
int i, j;
printf("學號 姓名 英語 數學 物理 語文 平均成績如下: ");
for (i = 0; i < n; i++) {
printf("%d %s ", a[i].num, a[i].name);
for (j = 0; j < 4; j++)
printf("%.2f ", a[i].score[j]);
printf("%.2f", b[i].score[0]);
printf(" ");
}
}
幫你改了一些,看看測試:
8. 為什麼n%=2 等價於 n=n%2這個式子的結果是什麼求計算過程
這是c語言的運算符,兩個是等價的,當成定義就行了,計算過程:n%2餘數賦給n
9. 在c語言中要怎麼來判斷整數和小數
你看一下這個方法符不符合你的要求
12.000算整數吧,只是後面多幾個零
#include<stdio.h>
void main()
{
float num;
int NB;
printf("輸入一個數");
scanf("%f",&num);
NB=(int)num;
while(1)
{
if((num-NB)!=0)
{
printf("\n您輸入的是小數,請重新輸入:");
scanf("%f",&num);
NB=(int)num;
}
else
{
break;
}
}
printf("\nnum=%f",num);
}
10. C#語言的誕生
樓上你就2吧,C#和C都不分你就敢來發帖
復制自新雲網路的Anders Hejlsberg訪談,講述了C#的種種背後:
在CNET News.com對微軟公司最傑出的軟體設計師 Hejlsberg的采訪過程中,雙方就C#的起源、Web服務的未來等問題進行了探討。
當微軟公司需要一項新技術來確保在軟體業的統治地位時,它需要Anders Hejlsberg的幫助。
對於成千上萬的使用Borland Turbo Pascal和 Delphi進行編程的軟體開發者來說,Anders Hejlsberg,這位40歲的軟體大師讓他們肅然起敬,是他創制了上述兩個備受歡迎的軟體開發工具。
現在微軟公司希望通過它最新的產品-C#軟體開發語言-來贏得軟體開發者的擁戴,在微軟公司把視窗操作系統和軟體向網路遷移的新市場戰略中,C#語言是最重要的環節。
經過幾年時間的埋頭苦幹,C#已成為微軟公司反擊Java語言的最有力武器。六年前,微軟公司的老對手Sun公司推出了Java語言,並獲得了Oracle和IBM公司的全力支持。
目前各大軟體公司都爭先恐後地把各自的應用程序移植為面向手持設備和個人電腦的互聯網服務,因此微軟公司希望軟體公司會採用C#語言來編寫各自的基於Web的軟體和服務。同樣,微軟公司也希望商家能採用.Net家族的電子商務軟體來運行Web服務。是的,微軟公司希望用C#來打倒Java。
但就目前來說,C#還處於劣勢,畢竟Java已經歷了6年的風風雨雨,而C#還處於孕育時期。C#的正式版本最早也要等到年底才能投放市場。
市場分析人員認為微軟公司希望利用C#來阻止原來的C++開發人員投向Java陣營。舉例來說,C#摹仿了Java提供的多種特性,包括「碎片回收機制」(garbage collection)、可以利用多種類型的語言進行開發的「通用引擎」等等。
在CNET News.com對 Hejlsberg的采訪過程中,雙方就C#的起源、Web服務的未來等問題進行了探討。Hejlsberg也就C#相對於Java的優點做了特別的說明。
問:創造C#的原因是什麼?它是C++語言的升級嗎,是否可以說C#是用來對抗Java的武器?
答:C#是立足於以往的基礎上進行開發的,應該說它混合了以往開發語言的精華,但C#不會是終結其它開發語言的終極語言。這是個進化的世界,C#只是面向市場的需求應運而生的。
在C#語言的幾個設計目標中,確保編程人員的高效生產率是最重要的一點。我們在設計C#的時候,就從大家熟悉的C++開始並對該語言進行了簡化。我們希望把C++具備的強大和靈活、VB具備的簡單易用同時賦予C#語言。C++確實需要升級了,但我們力求在增加更多的新特性-比如「碎片收集機制」-的同時,盡可能少地對它進行更動。
問:那麼C#主要面向哪些開發人員?C++、Java還是Visual Basic?
答:C#語言傳承自C和C++,它和Java一樣,屬於同一個語言體系。因此C#主要面向C和C++開發人員。
問:在與Java的競爭中,你認為C#將會表現出色嗎?
答:你需要注意到,Java的推出領先於.Net平台整整五年的時間。而我們的.Net正式產品還沒有投放市場。本公司也不會依靠現有的測試版C#進行市場競爭。但本公司認為C#測試版的表現符合預期水準。
問:說服開發人員棄Java而用C#的理由會有哪些?
答:當談到Java,大多數人是在談開發語言,但Java有時也被當作系統運行平台。本公司的C#就是純粹的開發語言,而.Net可以說是它的運行平台。
我可以說C#與C++靠的更近。Java傳承自C++,但當你觀察它的模塊,就會發現有些東西被省略了。而C#則保留了更多C++的特性。
C#語言首次引進了部件導向特性、方法以及事件。例如當你點擊滑鼠,就可以聲明一個稱為「點擊」事件。而同樣在Java語言中,開發人員就不得不進行特性和事件的模擬。盡管通過一個稱為「Java Bean」的部件模塊,開發人員也可以做同樣的事,但這要比在C#開發環境中困難的多。
此外互用性也是C#的重要特性之一。Java一向以平台無關性作為賣點,但我們認為對已有的軟體代碼做出支持才是最重要的。C#可以提供出色的代碼互用能力(例如已有的C++代碼),且不需要開發者增加兼容性代碼。
此外,Java和C#之間還有一點明顯不同之處。當兩三年前微軟公司著手C#的開發,就注意到了如何讓C#更適應新生的互聯網應用世界的需求,而Java是在後來才補充了Web服務。
問:每個大軟體廠商都在提出自己的Web服務版本。比如用戶可以通過手機來進行互動商務活動,但這些許諾大都是空頭支票,你認為何時互聯網服務才會真正的蓬勃發展起來?
答:首先我認為,技術的發展是逐步漸進的。今天人們使用互聯網,很大程度上是一種人對於機器的互動。開始人們會在門戶網站中使用Email和日程安排,但逐漸地會在網路上獲得更多的應用服務,相信再發展下去,人們日常需要的服務將會集成到智能設備和個人電腦中。這種進步會是自然而然的。
目前我們不得不等待寬頻網路的到來,我們還需要無線設備具有更大的數據吞吐量。技術發展的方方面面將會是一個齊頭並進的局面