基本語法比較之一
前言
對於前面所複習或新學的基本語法做相關比較。
本來想一次都寫完,發現文章內容會太多,所以決定分篇記錄之。
撰寫習慣
程式的撰寫要簡潔,方可提高執行的效率;提高程式的可讀性,以利後續維護與他人查閱。
如何提高可讀性?
- 程式碼使用固定字距的字體來表示,同時不要使用斜體字,以利程式碼的閱讀。
- 適當將程式敘述縮排,同一個層級的對齊在同一行中,可讓人較易了解程式的內容。
- 適時地程式碼加上註解,將會有助於程式的閱讀與偵錯。
註解方式
C 語言的註解方式,是以「∕*」與「*∕」記號來包圍註解文字。
/* 作為註解的文字敘述 */
C++ 的註解方式,單行是以「//」記號開始,至該行結束來表示註解的文字。而「//」所影響到的範圍,僅僅是在它之後的同一行敘述。
// 作為註解的文字敘述
但如果註解的文字是多行時,就要和 C 語言一樣用「∕*」與「*∕」將作註解的文字給包圍。
/* 作為註解的文字敘述第一行
作為註解的文字敘述第二行
...... */
Java 的註解方式,同於 C++ 的方式是以「//」記號開始,至該行結束來表示註解的文字。且「//」所影響到的範圍,也僅僅是在它之後的同一行敘述。
// 作為註解的文字敘述
不過在多行註解的方式上,則是「//」和「∕*…*∕」兩種方式都可以使用。
// 這是方式一
// 作為註解的文字敘述第一行
// 作為註解的文字敘述第二行
/* 這是方式二
作為註解的文字敘述第一行
作為註解的文字敘述第二行
...... */
Python 的註解方式,單行是以「#」開始,後面接續的內容即為註解。
# 作為註解的文字敘述
但若是多行時,則是以 3 個雙引號「“」(單引號「‘」也可)開始,填入註解內容,再以 3 個雙引號「”」(單引號「’」)作結束。
""" 作為註解的文字敘述第一行
作為註解的文字敘述第二行
...... """
程式組成
C 的程式是由 函數(function) 所組合。
C++ 的程式是由 函數(function) 與 類別(class) 所組成。
Java 的程式是由 類別(class) 所組成。
Python 的程式是由 模組(moudle) 所組成。
程式解析
解析每個語言的程式架構。
初始
C 與 C++ 在程式最開始必為以下敘述; C:
# include <stdio.h>
# include <stdlib.h>
C++:
# include <iostream>
# include <cstdlib>
這是為了要在程式執行前,就先含括標準輸出/輸入函數庫與標準函數庫進來。
Java 則沒有此規定,但若有需要引用套件(package)或類別時,則必須要在程式的最開始使用import這個指令做引用操作。
import (Package name);
import java.(Class name);
Python 同樣沒有此規定。但通常會在程式最開始放上編碼的支援敘述。這可以避免在直譯器編譯時,產生亂碼。
# -*- coding: encoding -*- #
除此之外,Python 跟 Java 相同,若有需要引用模組操作時,也是使用import指令在程式的最開始做進行。
import (Module name)
但與 Java 不同之處,若引用的是類別時,只要加上from指令,還能分別引用類別的屬性或是方法。
from (Class name) import (Class Attributes / Class Method)
主體
C 語言的主體為主函數main()。它是程式開始執行的起點,所以每一個獨立的 C 程式必定也只能有一個主函數main(),方可執行。其定義的範圍從左大括號({)開始,到右大括號(})為止。
在主函數main()前的int是宣告主函數main()有一個回傳值,其回傳的型態會為整數(int為integer之縮寫)。為什麼需要這個宣告?這是因為 C 語言在使用變數之前必須都先宣告其型態。
在主函數main()括號內的void則是代表了主函數main()不需要傳入任何的引數。
在主函數main()內的每個指令敘述結束時,都必須以分號「;」做結尾。但需特別注意,在函數的右大括號之後,則不需要有分號。
而一個用來完成特定工作的程式碼片段,稱之為區塊(Block),其範圍也是使用左右大括號包圍,所以右大括號之後,不需要有分號結尾。
因為 C++ 是由 C 語言衍生,所以其主體定義同於 C 語言的主體。
Java 的主體定義也和 C、C++ 相同都是主函數main()。它是程式開始執行的起點,所以每一個獨立的 Java 程式必定也只能有一個主函數main(),方可執行。其定義的範圍從左大括號({)開始,到右大括號(})為止。相同之處,還有在主函數main()內的每個指令敘述結束時,也都必須以分號「;」做結尾。並且同樣需特別注意,在函數的右大括號之後,是不需要有分號。一個用來完成特定工作的程式碼片段,稱之為區塊,其範圍也是使用左右大括號包圍,所以右大括號之後,不需要有分號結尾。
而不同之處是 Java 在主函數main()之前,必須冠上 public static void 三個修飾子。
另外, Java 的主函數main()引數為String agr[]。arg[]是用接收傳入程式的引數,此時arg[0]
會存放第一個引數,arg[1]會存放第二個引數,依此類推。而這些引數的型態皆為String(字串型態)。
Python 則相異於前面三種語言,並沒有主體此定義。所以,只要有內建函數,即可執行該程式。
資料
C、C++、Java:
變數在程式中都扮演著最基本的角色,因為它可以用來存放資料。
而使用變數之前必須先宣告它所欲儲存的資料型態,如此才能讓編譯器配置適合的記憶空間給它,並且方便管理。
三者對於變數宣告的敘述方式都一樣;
單一變數宣告:
int num; // 宣告 num 為整數變數
數個變數宣告,除了可以像上面的敘述一樣分別宣告它們外,也可以把它們都寫在同一個敘述中,再將每個變數以逗號(,)分開,其敘述如下:
int num, num1, num2; // 同時宣告num, num1, num2為整數變數
變數型態比較表
| C | C++ | Java |
|---|---|---|
| 整數(int) | 整數(int) | 整數(int) |
| 長整數(long) | 長整數(long) | 長整數(long) |
| 短整數(short) | 短整數(short) | 短整數(short) |
| 浮點數(float) | 浮點數(float) | |
| 倍精度浮點數(double) | 倍精度浮點數(double) | |
| 布林(bool) | ||
| 字元(char) | 字元(char) | 字元(char) |
| 字串(String) | ||
| 有號(sign) | ||
| 無號(unsigned) |
變數名稱和其限制;
變數的名稱,通常會以變數所代表的意義來取名。但不能使用到各語言的關鍵字。因為關鍵字是各語言預先定義好的識別字,它會有固定用途。
C 語言的命名限制;
在決定變數名稱時,要盡量避免過長的變數名稱,因為部分的編譯器可能會限制變數名稱的長度。
變數名稱的字元可以是英文字母、數字或底線,但名稱中不能有空白字元,而且第一個字元不能是數字。
C++ 的命名限制;
變數名稱的字元可以是英文字母、數字或底線。但名稱中不能有空白字元,而且不能使用底線以外的其它符號(如$、%等),還有第一個字元不能是數字。此外,還有大小寫之別。
Java 的命名限制;
變數名稱的字元可以是英文字母、數字或底線。但名稱中不能有空白字元,而且第一個字元不能是數字。此外,還有大小寫之別。
變數設值;
三語言都使用等號運算子(=)來設定。
C 語言設值方式;
- 在宣告的時候設值
- 宣告後再設值
C++ 設值方式; - 在宣告的時候設值
- 宣告後再設值
- 在程式中的任何位置宣告並設值
Java 設值方式; - 在宣告的時候設值
- 宣告後再設值
- 在程式中適當的位置宣告變數並設值
Python 與三語言不同,要存放資料會以內建型別為主,然後會以物件(Object)來表達資料。
所以每個物件都會具有身分、型別和值;
- 身分(Identity):每個物件的身分都是獨一無二的!產生之後就無法改變,可以透過內建函式的
id()來確認。 - 型別(Type):物件的型別決定了物件要以哪種資料來存放。可以透過內建函式的
type()來查詢。 - 值(Value):物件存放的資料,在某些情形下可以改變其值,意指是「可變(mutable)」;但有些物件的值宣告之後就「不可變(immutable)」。
因此不同的物件,其型別不同,分配的記憶體空間也會不同。
但為什麼需要記憶體空間?
主要目的是暫存資料,方便做運算。
那要如何存放記憶體暫存空間?
其他程式語言是使用「變數(Variable)」,它會隨著程式的執行來改變其值。
Python 則是使用「物件參照(Object reference)」來存放。
Python 的變數要賦予其名稱,作為「識別字(Identifier)」之一種。有了識別字名稱後,表示有了「身分」,系統才會配置記憶體空間。
因此 Python 的識別字其實包含了變數、常數、物件、類別、和方法等。
而命名規則如下;
- 第一個字必須是英文字母或者底線。
- 其餘字元可以搭配其他的英文字母或數字。
- 不能使用 Python 的關鍵字或保留字來當識別字名稱。
- 英文字母的大小寫是有差別。
Python 使用動態型別(Dynamics typing)。所以,要使用變數時,再給予變數和變數值即可。
動態型別是甚麼意思?
是指執行程式時,直譯器才會去找所宣告變數的型別。由於識別字的名稱和型別是各自獨立的,所以同一個名稱會依據程式碼不同來指向不同的型別。
Python 允許開發者同時指派一個變數,也可以利用「,」(分隔變數)以及「;」(分隔運算式)來連續宣告變數。
Python 的內建型別則有以下五類:數值型別(Numeric Type)、序列型別(Sequence Type)、迭代型別(Iterator Type)、集合型別(Set Type)、和映射型別(Mapping Type)。
其中數值型別皆由標準函式庫所提供,並且皆具有「不可變」的特性。
數值型態又可分成「整數」和「浮點數」兩型態。
整數:是指不含小數位數的數值。可分為整數(Integer)和布林(Boolean)兩種。
Python 並不會像其他語言會區分整數與長整數,所以整數的長度可以「無窮精確度」(Unlimited precision),也就意味著數值無論是大或是小皆依據電腦記憶體容量來呈現。數值的字面值(literal)通常以十進位(decimal)為主,Python是以內建函式int()來表達。然在某些特定情形下,則可能需要以二進位(Binary)、八進位(Octal)、或十六進位(Hexadecimal)來表示。
整數資料皆屬於類別「int」的實作物件。
布林:為整數的子類別。使用bool()函式。它只有True和False兩個值,而一般使用在流程控制做邏輯判斷。可以使用數值「1」或「0」來表示True或False。而以下項目,其布林值會以False回傳:
- 數值為 0。
- 特殊物件為 None。
- 序列和群集資料型別中的空字串、空串列(List)、或空序對(Tuple)。
浮點數:含有小數位數的數值,也就是實數。
分為以下三種資料型別:
- float:內建型別,儲存倍精度浮點數(等同雙精度浮點數),它會隨著作業平台來卻精確度範圍,使用
float()函式表示。 - complex:內建型別,處理複數數值資料,也就是由實數(real)和虛數(imaginary)所組成的數值資料。
- decimal:若處理數值時,需要精確的小數位數,可透過標準函式庫的decimal.Decimal類別支援。
浮點數除了帶有小數位數值外,也能利用科學符號(指數)來表示。
一般處理浮點數都是使用內建函式float(),它可以建立浮點數物件,並只接受一個參數。
此外,它也可以處理三個特殊的浮點數;正無窮大(Infinity)、負無窮大(NegativeInfinity)、非數(Not a number, nan)。其表示方式如下:float("Infinity") # 正無窮大 float("-Infinity") # 負無窮大 float("nan") # 非數
輸出
不論是哪種語言,程式執行後,都必定會有其輸出。
C 語言;
printf()函數係以格式化的輸出方式,將函數中的引數列印到螢幕上,其中引數與引數之間必須以逗號(,)做為區隔。
printf()函數中若有「%d」符號是用來告訴編譯器,把整數變數的值以十進位的格式輸出到這個位置。
「\n」是換行的控制字元,它告訴printf()函數必須在印出字串之後換行,也就是把游標移到下一行的開端。
C++ ;
使用cout與串接運算子(<<)來輸出。
敘述如下:
``` cout « “Hello CPP” « endl``
C++ 將雙引號之間的字元稱為字串(string),也就是說,字串是由字元串接而成。
cout是 C++ 預先定義好的一個物件,可以將字串或數字輸出到裝置上。
如果要把字串換行輸出,除了用endl外,也可以用換行字元 “\n”,即一個反斜線加上字母n,代表new line之意。
Java ;
System.out是指標準輸出,而接續在它後面的文字println,是由print與line所組成的縮寫,其意義是將後面括號中的內容列印於標準輸出設備上後,並將游標移到下一行的開端。若不用換行,可改用print。
敘述如下:
System.out.println("Hello Java");
左右括號之間的內容,就是欲顯示在螢幕上的內容,稱之為引數,引數可以是字元、字串、數值或是運算式,引數與引數之間使用加號(+)做為區隔。而在println()中若要印出的是字串型態時,則必須以一對雙引號(“)包圍住字串,若要印出的是變數的值,則直接將變數名稱填入即可。前述提到可用加號(+)在引數與引數之間做區隔,較多的使用意義是「合併、連接」。
Python ;
print()函式用來將內容輸出到螢幕。
語法說明:
print(value, ..., sep = '', end='\n', file = sys.stdout, flush = False)
value:欲輸出的資料,若是字串,還必須在前後加上單引號(雙引號)。
sep:以半形空白來隔開要輸出的值。
end=’\n’:為預設值。「’\n’」是換行符號,表示輸出之後,插入點會移向下一行。若要輸出不換行,可以空白字元「end=’‘」來取代換行符號。
file =sys.stdout:表示它是一個標準輸出裝置。
flush = False:執行print()函式時,可以決定資料要先暫存於緩衝區或者式全部輸出。
小結
目前先把各語言的組成、變數或型態,還有輸出方式做統整。
後篇則是以各語言的關鍵字比較為主。