基本語法比較之一

前言

對於前面所複習或新學的基本語法做相關比較。
本來想一次都寫完,發現文章內容會太多,所以決定分篇記錄之。

撰寫習慣

程式的撰寫要簡潔,方可提高執行的效率;提高程式的可讀性,以利後續維護與他人查閱。

如何提高可讀性?

  1. 程式碼使用固定字距的字體來表示,同時不要使用斜體字,以利程式碼的閱讀。
  2. 適當將程式敘述縮排,同一個層級的對齊在同一行中,可讓人較易了解程式的內容。
  3. 適時地程式碼加上註解,將會有助於程式的閱讀與偵錯。

註解方式

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 語言設值方式;

  1. 在宣告的時候設值
  2. 宣告後再設值
    C++ 設值方式;
  3. 在宣告的時候設值
  4. 宣告後再設值
  5. 在程式中的任何位置宣告並設值
    Java 設值方式;
  6. 在宣告的時候設值
  7. 宣告後再設值
  8. 在程式中適當的位置宣告變數並設值

Python 與三語言不同,要存放資料會以內建型別為主,然後會以物件(Object)來表達資料。
所以每個物件都會具有身分型別

Python 的變數要賦予其名稱,作為「識別字(Identifier)」之一種。有了識別字名稱後,表示有了「身分」,系統才會配置記憶體空間。
因此 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()函式。它只有TrueFalse兩個值,而一般使用在流程控制做邏輯判斷。可以使用數值「1」或「0」來表示True或False。而以下項目,其布林值會以False回傳:

浮點數:含有小數位數的數值,也就是實數
分為以下三種資料型別:

輸出

不論是哪種語言,程式執行後,都必定會有其輸出。

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()函式時,可以決定資料要先暫存於緩衝區或者式全部輸出。

小結

目前先把各語言的組成、變數或型態,還有輸出方式做統整。
後篇則是以各語言的關鍵字比較為主。