[C#, CSharp] 語彙基元
語彙基元(Token)
- 語彙基元(token):獨立不可分割的元素
- 含識別項(Identifier)、關鍵字(Keyword)、常值(Literal)、運算子(Operator)、標點符號(Punctuator)
- 語彙基元是編譯器剖析(Parsing)程式碼時的基本單位,不同的語彙基元通常以泛空白字元(Ex:空白、換行、...)隔開
- 泛空白字元和註解不於語彙基元
- 編譯器會盡可能選擇最長的字串做為語彙基元
- using、System、string、Main、)、Program、...
識別項(Identifier)
- 識別項(Identifier):程式中由使用者自行命名的名稱,如命名空間名稱、類別名稱、物件名稱、欄位名稱、...等。
- 識別項可以由字母、Unicode序列、_、數字組成
- 識別項首字不可為數字
- 逐字識別項:若要將關鍵字做為識別項,需以@做為前置詞
常值(Literal)
- 常值(Literal):又叫字面值,代表布林值、數字、字元、字串的值
- 布林常值(Boolean-Literal):可以是true或false
- 整數常值(Integer-Literal)
- 沒有後置字元(Suffix),表示為int、uint、long、ulong中第一個符合的型別
- 具有後置字元u或U之一,表示為uint、ulong中第一個符合的型別
- 具有後置字元l或L之一,表示為long、ulong中第一個符合的型別
- 具有後置字元UL、Ul、ul、LU、Lu、lU、lu之一,表示為ulong型別
- 整數常值的值不可超過ulong所能表示的範圍,否則會發生編譯錯誤
-
Console.WriteLine("25 ⇒ " + 25.GetType() ); // 顯示: 25 ⇒ System.Int32 Console.WriteLine("25U ⇒ " + 25U.GetType() ); // 顯示: 25U ⇒ System.UInt32 Console.WriteLine("25L ⇒ " + 25L.GetType() ); // 顯示: 25L ⇒ System.Int64 Console.WriteLine("25UL ⇒ " + 25UL.GetType() ); // 顯示: 25UL ⇒ System.UInt64
- 實數常值(Real-Literal):包括float、double、decimal型別的值
- 沒有後置字元(Suffix),表示為double型別
- 具有後置字元f或F,代表其型別為float
- 具有後置字元d或D,代表其型別為double
- 具有字元e或E,代表其後為10的指數
-
Console.WriteLine(1e1); // 顯示: 10 Console.WriteLine(1e2); // 顯示: 100 Console.WriteLine(1e3); // 顯示: 1000
-
- 具有後置字元m或M,代表其型別為decimal
-
Console.WriteLine("2.5 ⇒ " + 2.5.GetType() ); // 顯示: 2.5 ⇒ System.Double Console.WriteLine("2.5F ⇒ " + 2.5F.GetType() ); // 顯示: 2.5F ⇒ System.Single Console.WriteLine("2.5D ⇒ " + 2.5D.GetType() ); // 顯示: 2.5D ⇒ System.Double Console.WriteLine("2e2D ⇒ " + 2e2D.GetType() ); // 顯示: 2e2D ⇒ System.Double Console.WriteLine("2.5M ⇒ " + 2.5M.GetType() ); // 顯示: 2.5M ⇒ System.Decimal
-
- decimal的捨位採用四拾六入五成雙(Banker's Rounding),亦即要捨位的前一位數是奇數就進位,偶數則捨去
-
Console.WriteLine(Math.Round( 0.5 )); //顯示: 0 Console.WriteLine(Math.Round( 1.5 )); //顯示: 2 奇數 ⇒ 進位 Console.WriteLine(Math.Round( 2.5 )); //顯示: 2 偶數 ⇒ 捨去
-
- 16進位:常值可以加上前置字元(Prefix)0x或0X來表示其值為16進位
-
int a = 0x10; // 相當於指派10進位的值16給變數a Console.WriteLine(a.ToString("D")); // 顯示: 16 (10進位) Console.WriteLine(a.ToString("X")); // 顯示: 10 (16進位) Console.Write("{0:X}", a); // 顯示: 10 (16進位)
-
- 字元常值(Character-Literal):單一字元,通常用單引號括住
- 含簡單脫逸序列(Simple-escape-sequence): \' \" \\ \0 \a \b \f \n \r \t \v
- 單一Unicode字元可用\x接16進位數字表示
- 字串常值(String-Literal):以雙引號括住的連續字元,可分為規則字串常值及逐字字串常值
- 規則字串常值:以雙引號"括住的字串,可包含簡單脫逸字元,
- 字串起始的雙引號與結束的雙引號需在同一行
- 若要表示雙引號則需以脫逸字元\"代表
- 不可以直接換行,需以脫逸字元\n表示換行
-
Console.Write("字串"); // 顯示: 字串 Console.Write("字'串"); // 顯示: 字'串 Console.Write("字\'串"); // 顯示: 字'串 Console.Write("字\"串"); // 顯示: 字"串
- 逐字字串常值:@接雙引號括住的字串,脫逸字元會失去效果,被譯為2個字元
- 字串起始的雙引號與結束的雙引號不需在同一行
- 要表示雙引號則要用""
- 可以直接換行
-
Console.Write(@"字串"); // 顯示: 字串 Console.Write(@"字'串"); // 顯示: 字'串 Console.Write(@"字\"串"); // 顯示: 字\"串 Console.Write(@"字""串"); // 顯示: 字""串 Console.Write(@"字 // 顯示: 字 串"); // 串
- 規則字串常值:以雙引號"括住的字串,可包含簡單脫逸字元,
- null常值(Null-Literal):通常用來表示變數尚未被指派的狀態
-
string 字串1 = ""; // 空字串 string 字串2 = null; // 字串2沒有值
-
- 標點符號(Punctuator):可以為 { } [ ] ( ) . , : ;
- 運算子(Operator):可以為 + - * / % & / ^ ! ~ = < > ? ?? :: ++ -- && || -> == != <= >= += -= *= /= %= &= |= ^= << <<= => >> >>=
- 常值(Literal)與常數(Const):常值是指固定不變的數值,常數是賦予常值一個名稱方便使用
-
const PI = 3.1415926; // PI是常數, 3.1415926是常值 int num = 5; // num是變數, 5是常值
-
關鍵字(Keyword)
- 關鍵字(Keyword):在C#中已定義且代表特定功能的字,如void, int, return
C#關鍵字表 abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual void volatile while