Time of Update: 2018-12-07
1.
Time of Update: 2018-12-07
在這一節,我想主要來介紹一下C語言操作字串的常用函數。C語言的字串函數的原型都駐留在<string.h>標頭檔中,因此我們在處理字串時,需要引入這個標頭檔。但是,我不希望只是單純地介紹每個函數的用法,如果那樣,看API就可以了,我希望在介紹每個函數時都自己來實現一次。1. strcpy函數string copy,我們先來看一下該函數的用法。#include<stdio.h>#include<string.h>int main(){ char *str1=
Time of Update: 2018-12-07
一、 具名引數和選擇性參數 static void Print(string enName, cnName="李飛“, int age=25){...}Print("Prime Li");Print("Prime Li", "李飛");Print("Prime Li", "李飛", 25);Print(enName:"Prime Li");Print(”Prime Li", cnName:"李飛", age:25);規則: 1. 非選擇性參數必須首先聲明。 2.
Time of Update: 2018-12-07
今早看到了《你真的瞭解a ^= (b ^= (a ^= b))嗎?》一文,文章中提到了一個有趣的運算式:a ^= (b ^= (a ^= b)); 很簡單的一個程式: 1 int a = 2; 2 int b = 9; 3 a ^= (b ^= (a ^= b)); 4 Console.WriteLine("{0}, {1}", a.ToString(), b.ToString());最後的運算結果不是預期的9,2,而是0,2。同時,還有1個運算式:
Time of Update: 2018-12-07
1. 位域我們來看一個表示日期的結構體:typedef struct{ unsigned int year; unsigned int month; unsigned int day;}MyDate;但是我們可以發現,其實year最大也不會超過四位元,month也就是12,而day最大也就是31。但是我們在上述的結構體中,卻為其分配了4*3=12位元組的記憶體,是不是很浪費呢?C語言為瞭解決這個問題,提出了一個概念,叫位域。看段代碼:typedef struct{
Time of Update: 2018-12-07
1. 動態記憶體分配先來介紹三個動態記憶體分配的函數:malloc,calloc和realloc。說來慚愧,以前只知道malloc。現在來看下他們的區別:malloc:最常用的分配記憶體塊,但是不對記憶體進行初始化。calloc:分配記憶體塊,但是對記憶體塊進行清零操作,這就造成此函數的效率要比malloc要低。realloc:調整(增加或者減少)之前分配記憶體塊的大小。由於上面的函數只是開闢了一段記憶體,因此無法知道你要利用這段記憶體來儲存什麼類型的資料,因此只是返回一個void *類型的值,
Time of Update: 2018-12-07
在C語言中,經常會出現一些複雜的型別宣告。而大多數都是涉及到指標的類型。那麼就在這一節來集中認識一下。首先,我們先來瞭解*,()和[]的組合。在看實際例子前,先來看一個重要的規則:在做選擇時,始終使[]和()的優先順序大於*。舉個簡單的例子:int *arr[10]。由於[]的優先順序大於*。也就代表,首先這是一個含有10個元素數組,那麼數組內的內容是什麼呢?是int *arr。去掉類型名稱,數組內的類型是int *。所以這是一個含有10個整數類型指標的數組。同樣的規則繼續看:float
Time of Update: 2018-12-07
編譯器中負責將程式分解成一個一個token的部分,就是詞法分析器。token:程式的最基本組成單元,是程式表義的基本單元。一個token,無論出現在哪裡,都應該表示同樣的意思,同樣的語義。在C語言編譯器進行詞法分析時,會採用“貪進法”的處理策略。意思就是說,每一個token都會包含儘可能多的字元,具體地說,編譯器從左至右一個字元一個字元地杜甫,如果該字元可能組成一個token,那麼就繼續讀,直到不能組成token為止。因此我們可以解釋為什麼在符號之間,比如”==”之間不能包含空格,因為一旦包含空
Time of Update: 2018-12-07
園子裡的首頁已經在所謂的C#大論戰和語言大作戰上,風風火火地持續了快一個月了,我想也該告上那麼一段落了。我只在這裡寫下我眼中的看法。1.
Time of Update: 2018-12-07
1. 數組作為函數參數函數是我們學習程式設計語言最基本的東西了,我在此不再贅述。只討論一種特殊情況,就是數組作為函數的參數傳遞。我們都知道,其實在傳遞數組的時候,實際上是傳遞了數組首元素的指標。明確了這一點之後,我們就可以思考下面的問題。既然他只是傳遞了數組首元素的指標,那麼他必然無法知道整個數組的大小,因此,我們如果希望在函數中用到數組的長度,必須要進行顯式傳遞。int Sum(int a[],int size){int i ,sum=0;for(i=0;i<size;i++) {
Time of Update: 2018-12-07
1. typedef在前文中,我們用宏定義來定義了一個BOOL類型,那麼現在就用更專業的方式來定義類型。typedef int Bool;int main (void){ Bool flag=1;if(flag) { printf("True"); }else{ printf("false"); }}typedef 的作用就是類型定義(Type Definition)。類型定義有以下三個優點:1. 易於閱讀。比如我們可以把定義一個Dollar,
Time of Update: 2018-12-07
1. 數組大小我相信,在C#/Java中,更多的人願意用List<T>來取代數組,一方面是List提供了較多的方法,另一方面也無需我們去指定數組的大小。那麼在C語言中,我們既然需要必須指定數組的大小,而一般來講,很多數組大小事我們無法確定並且經常會發生變化的,那麼我們最好的方式就是用宏定義來限定數組的大小。#define SIZE 10int main (void){int a[SIZE];} 如果包含多個數組的話,用宏就很難記憶,那麼我們就可以利用sizeof運算子。int
Time of Update: 2018-12-07
1. 指標的來源在當代,大多數的現代電腦都會把記憶體分割成位元組,每個位元組都有著其唯一的地址。可執行程式由代碼和資料兩部分構成,而程式中的每個變數都佔有著一個或多個位元組,也就是說,每個變數都有著自己的地址。而這個就是指標的來源。其實每個地址就是一個數,但是我們卻不能用數來表示地址,儲存地址,我們需要用指標變數。例如int *p = i,我們就可以說p是指標變數,儲存著變數i的地址。那麼我們說int *p中,p就是指向int 類型對象的指標變數。2.
Time of Update: 2018-12-07
在《Javascript玩轉繼承(二)》中,我使用了原型繼承法來實現Javascript的繼承,那原型究竟奧秘何在。在這篇文章中,我就主要針對原型來展開討論。 拋開Javascript,我們先來看我們熟悉的常規的物件導向語言。在23種設計模式中,大家一定會記得有一種設計模式——原型模式。我們先來看一下結構圖: (原圖引自:http://terrylee.cnblogs.com/archive/2006/01/16/317896.html)
Time of Update: 2018-12-07
1. 字串入門字串也稱字串字面量,是用一對雙引號括起來的字元序列。我們也許經常會遇到字串特別長的情況,在C#中,我們一般會用@符號來表示。 Console.WriteLine(@"HelloWorld"); 但是在C中,我們會這樣來寫:int main(){ printf("Hello " "world");return 0;}還記得我曾經講的最多的一句話就是,把字串當做字元數組來玩。其實在本質上,C語言就是把字串作為字元數組來處理,當C語言編譯器遇到長度為N的字串時,
Time of Update: 2018-12-07
1. 指標和數組這個在最初學習C語言時就學過了,在此只是簡單提下。看一段代碼:#define SIZE 10int main (void){int a[SIZE],*p,sum;int i; p=a; sum=0;for(i =0;i<SIZE;i++) { a[i]=i+1; }for(;p<&a[SIZE];p++) { sum+=*p; }
Time of Update: 2018-12-07
1. 摘要在這篇文章中,我會通過IL去分析一個簡單的語句。如果覺得實在簡單,可以略過。2. 引子事情是這樣的,同事寫了一段類似這樣的代碼:class Program{ static void Main(string[] args) { object o = new object(); int i; Int32.TryParse(Console.ReadLine(), out
Time of Update: 2018-12-07
如果平時不習慣寫javascript的情況下,使用jquery validator寫起來就是比較頭痛的事情,為瞭解決這一問題所以寫了個針對jquery validator 的c# helper。使用helper後編寫驗證就能得到VS.NET的支援主要是提供感知功能方便編寫。<script> $().ready(function () { on_signupForm();
Time of Update: 2018-12-07
Ant是基於C#編寫的自動更新程式,其主要目的是簡單方便地對.net傳統型應用程式進行自動更新,解決版本更新的煩惱。Ant主要分為三個部分:服務端,管理端和程式端。 服務端主要用於提供檔案更新和下載用 管理端是用於把最新版本的程式更新到服務端 程式端,主要是擷取服務端的檔案資訊把最新的檔案更新到本地程式端使用前需要引用Ant.Component,在程式開始處使用檢測代碼private void Form1_Load(object sender, EventArgs e)
Time of Update: 2018-12-07
擷取 Windows 版本資料擷取 Windows 系統資訊判斷平台判斷 Windows 95, Windows 98, Windows 98 第二版或 Windows Me 的版本判斷 Windows NT, Windows 2000, 或 Windows XP 的版本編譯範例 --------------------------------------------------------------------------------