C語言的用法及特點_C語言怎樣輸出菱形 IT知識
電腦知識 由優(yōu)爾供稿C語言不但執(zhí)行效率高而且可移植性好,可以用來開發(fā)應用軟件、驅動、操作系統等。C語言也是其它眾多高級語言的鼻祖語言,所以說學習C語言是進入編程世界的必修課。下面是9252兒童網小編為大家整理的C語言的用法及特點,希望對你們有幫助。
C語言的特點
Microsoft.NET(以下簡稱.NET)框架是微軟提出的新一代Web軟件開發(fā)模型,C#語言是.NET框架中新一代的開發(fā)工具。C#語言是一種現代、面向對象的語言,它簡化了C++語言在類、命名空間、方法重載和異常處理等方面的操作,它摒棄了C++的復雜性,更易使用,更少出錯。它使用組件編程,和VB一樣容易使用。C#語法和C++和JAVA語法非常相似,如果讀者用過C++和JAVA,學習C#語言應是比較輕松的。
用C語言編寫的源程序,必須用C#語言編譯器將C#源程序編譯為中間語言(MicroSoft Intermediate Language,MSIL)代碼,形成擴展名為exe或dll文件。中間語言代碼不是CPU可執(zhí)行的機器碼,在程序運行時,必須由通用語言運行環(huán)境(Common Language Runtime,CLR)中的既時編譯器(JUST IN Time,JIT)將中間語言代碼翻譯為CPU可執(zhí)行的機器碼,由CPU執(zhí)行。CLR為C#語言中間語言代碼運行提供了一種運行時環(huán)境,C語言的'CLR和JAVA語言的虛擬機類似。這種執(zhí)行方法使運行速度變慢,但帶來其它一些好處,主要有:
通用語言規(guī)范(Common Language Specification,CLS):.NET系統包括如下語言:C#、C++、VB、J#,他們都遵守通用語言規(guī)范。任何遵守通用語言規(guī)范的語言源程序,都可編譯為相同的中間語言代碼,由CLR負責執(zhí)行。只要為其它操作系統編制相應的CLR,中間語言代碼也可在其它系統中運行。
自動內存管理:CLR內建垃圾收集器,當變量實例的生命周期結束時,垃圾收集器負責收回不被使用的實例占用的內存空間。不必象C和C++語言,用語句在堆中建立的實例,必須用語句釋放實例占用的內存空間。也就是說,CLR具有自動內存管理功能。
交叉語言處理:由于任何遵守通用語言規(guī)范的語言源程序,都可編譯為相同的中間語言代碼,不同語言設計的組件,可以互相通用,可以從其它語言定義的類派生出本語言的新類。由于中間語言代碼由CLR負責執(zhí)行,因此異常處理方法是一致的,這在調試一種語言調用另一種語言的子程序時,顯得特別方便。
增加安全:C#語言不支持指針,一切對內存的訪問都必須通過對象的引用變量來實現,只允許訪問內存中允許訪問的部分,這就防止病毒程序使用非法指針訪問私有成員。也避免指針的誤操作產生的錯誤。CLR執(zhí)行中間語言代碼前,要對中間語言代碼的安全性,完整性進行驗證,防止病毒對中間語言代碼的修改。
版本支持:系統中的組件或動態(tài)聯接庫可能要升級,由于這些組件或動態(tài)聯接庫都要在注冊表中注冊,由此可能帶來一系列問題,例如,安裝新程序時自動安裝新組件替換舊組件,有可能使某些必須使用舊組件才可以運行的程序,使用新組件運行不了。在.NET中這些組件或動態(tài)聯接庫不必在注冊表中注冊,每個程序都可以使用自帶的組件或動態(tài)聯接庫,只要把這些組件或動態(tài)聯接庫放到運行程序所在文件夾的子文件夾bin中,運行程序就自動使用在bin文件夾中的組件或動態(tài)聯接庫。由于不需要在注冊表中注冊,軟件的安裝也變得容易了,一般將運行程序及庫文件拷貝到指定文件夾中就可以了。
完全面向對象:不象C++語言,即支持面向過程程序設計,又支持面向對象程序設計,C語言是完全面向對象的,在C中不再存在全局函數、全區(qū)變量,所有的函數、變量和常量都必須定義在類中,避免了命名沖突。C語言不支持多重繼承。
C語言assert的用法
原型定義:
#include
void assert( int expression );
assert的作用是現計算表達式 expression ,如果其值為假(即為0),那么它先向stderr打印一條出錯信息,
然后通過調用 abort 來終止程序運行。
請看下面的程序清單badptr.c:
復制代碼 代碼如下:
#include
#include
#include
int main( void )
{
FILE *fp;
fp = fopen( "test.txt", "w" );//以可寫的方式打開一個文件,如果不存在就創(chuàng)建一個同名文件
assert( fp ); //所以這里不會出錯
fclose( fp );
fp = fopen( "noexitfile.txt", "r" );//以只讀的方式打開一個文件,如果不存在就打開文件失敗
assert( fp ); //所以這里出錯
fclose( fp ); //程序永遠都執(zhí)行不到這里來
return 0;
}
宏名: assert
功 能: 測試一個條件并可能使程序終止
用 法: void assert(int test);
程序例:
復制代碼 代碼如下:
#include
#include
#include
struct ITEM {
int key;
int value;
};
/* add item to list, make sure list is not null */
void additem(struct ITEM *itemptr) {
assert(itemptr != NULL);
/* add item to list */
}
int main(void)
{
additem(NULL);
return 0;
}
assert() 宏用法
注意:assert是宏,而不是函數。在C的assert.h頭文件中。
assert宏的原型定義在中,其作用是如果它的`條件返回錯誤,則終止程序執(zhí)行,原型定義:
復制代碼 代碼如下:
#include
void assert( int expression );
assert的作用是先計算表達式expression,如果其值為假(即為0),那么它先向標準錯誤流stderr打印一條出錯信息,然后通過調用abort來終止程序運行;否則,assert()無任何作用。宏assert()一般用于確認程序的正常操作,其中表達式構造無錯時才為真值。完成調試后,不必從源代碼中刪除assert()語句,因為宏NDEBUG有定義時,宏assert()的定義為空。
C語言怎樣輸出菱形
適有同學問起一些C語言題目,本想上網搜索了事,但網上的方法都是分為上下部分用兩個嵌套for循環(huán)輸出。我想有沒有合起來輸出的呢,這樣符合簡潔又美觀的要求呢?答案是有的。
題目:輸出行列都相等的菱形,如5行5列:
行列 12345
1 *
2 ***
3 *****
4 ***
5 *
分析:
當行數等于總行數的一半時,'*'是遞增的,遞增為2。
當行數大于總行數的一半時,'*'是遞減的,遞增為2。
設有一個行列為n的菱形,
我們用變量i作為行數,以0開始,i
k作為n菱第i行要輸出的'*'個數。
則i<=n的中值(用m表示,m=(n-1)/2)時,k遞增,i>m時,k遞減。
因為k相對于m行對稱,所以:
當i>m時,i每增加i-m時的k值就和第m-i行的.k值相等,即第i-m行和第m-(i-m)相對稱。
所以得出結果:
當i<=m時,k=2i+1
當i>m時,k=2(m-(i-m))+1,(m=(n-1)/2)。即k=2n-2i-1
由于我們只需要輸出'*'左邊的空格即可,所以每行'*'左邊的空格的個數為:(n-每行的k)/2。
每行循環(huán)輸出空格,再循環(huán)輸出每行的'*',再輸出回車,結束一行。
這樣我們就可以開始編程了。
#include
int main()
{
int i,j,k,n;//定義四個變量:i是行,j每行*號前的空格數,k每行的*號數
printf("please input odd n:");
scanf("%d",&n); //輸入奇數n
for (i=0;i
{
if(n>=2*i+1) //判斷k值
k=2*i+1;
else
k=2*n-2*i-1;
for(j=(n-k)/2;j>0;j--) //循環(huán)輸出空格
printf(" ");
for(;k>0;k--) //循環(huán)輸出*號
printf("*");
printf("n"); //輸出回車結束一行
}
本來呢題目就到止結束了,但上面的程序還不夠完美
比如說,別人輸入n值為偶數怎么辦?輸入非數值呢?
我們加一點東西進去:
#include
int main()
{
int i,j,k,n=0; //這里給n賦初值,即使輸入非數值,n也可有確切的值。
do{ //增加一個大循環(huán),可以令n可以輸入多次以觀察不同的結果。
printf("please input odd n, 0 to exit:");//當輸入0的時候,退出大循環(huán),結束程序。
scanf("%d",&n);
if (!(n%2)) //增加對輸入偶數的判斷。
{
printf("you input a even, please input again.n");
continue;
}
for (i=0;i
{
if(n>=2*i+1)
k=2*i+1;
else
k=2*n-2*i-1;
j=(n-k)/2;
for(;j>0;j--)
printf(" ");
for(;k>0;k--)
printf("*");
printf("n");
}
}while(n);
return 0;
}