iT邦幫忙

3

【C language part 2】變數&資料型態、輸入輸出、運算子&運算式

  • 分享至 

  • xImage
  •  

撰寫第一支程式!!

#include <stdio.h>
#include <stdlib.h>

void main() {
	
    /* some comments */

	printf("Hello World!");
	
	system("PAUSE");
	return 0;
}

我們一步一步拆開來看看

First Block

#include <stdio.h>
#include <stdlib.h>

這是在 C program 編譯之前要處理的內容,我們稱為預處理命令(preprocessing command)。預處理命令還有很多,它們也都以 # 開頭,並且不用分號結尾。
而 stdio 是 standard input output 的縮寫,也就是有關輸入輸出的標頭檔(head file)
stdlib 也就是 standard library,包含了 C 與 C++ 裡最常用的一些函數。

Second Block

void main()

main function,從這裡開始執行 C program。

Third Block

/* some comments */

註解,C program 不會編譯執行裡面的任何內容。單行註解的話使用雙斜線 //

Fourth Block

printf("Hello World!");

printf 指令可以輸出內容顯示在螢幕上。

Fifth Block

system(“PAUSE”);
return 0;

程式暫停,按任意鍵繼續。

Steps to Write C Programs and Get the Output

  • 以下四個步驟任何 C program 都要遵循的步驟,對所有專案都通用。
  • 無論是只有數行的小程式或是包含好幾個檔案的大專案無一例外。
  1. Create
  2. Compile
  3. Execute or Run
  4. Get the Output

資料型態 Data Type

  • 資料型態(data type)是在執行程式時用來定義變數(variable)的。
  • 變數、常數(constant)和陣列(array)在記憶體所佔的空間大小是由資料型態所決定的。
  • C 的基本資料型態主要區分為:
Types Data Types
Basic data types int, char, float, double
Enumeration data type enum
Derived data type pointer, array, structure, union
Void data type void

列舉 (enum 或 enumeration) 是另一種複合型別,主要是用在宣告僅有少數值的型別,像是一星期內的日期 (day of week) 或是一年內的月份等。

Basic data types – Integer

  • 整數資料型態(integer data type)允許變數來儲存數值(numeric values)。
  • 關鍵字 int 是用來宣告整數資料型態。
  • 記憶體所佔的儲存空間可以是 2、4 或 8 byte。配置的記憶體長度在不同編譯器上各不相同,可容納的大小各不相同。

Basic data types – Floating Point

  • 浮點數(floating point)是用來將實數數位化表示的一種表示法,簡單來講就是可以用來宣告含小數點的數字。我們現在使用的是由 IEEE 制定的浮點數表示標準。
  • 資料型態分為兩種:
    1. float
    2. double
  • 而兩者的差異在於「精確度」。
Keyword Byte Format String Comment
float 4 bytes %f 浮點數
double 8 bytes %lf、%l 雙精度浮點數

Basic data types – Character

  • 字元(character)資料型態只允許變數儲存一個字元。
  • 所佔用的記憶體空間為 1 byte。
  • 用來儲存英文字母及 ASCII 碼。(字元可以跟整數型態互相轉換,也就是 ASCII 碼)
  • 關鍵字 %c 用來宣告字元資料型態。

ASCII Code

變數 Variable

Variable is a named location in a memory where a program can manipulate the data. This location is used to hold the value of the variable.

  • 在程式設計的過程中,我們會需要紀錄某些資料,我們需要把這些資料紀錄在記憶體的某個位址中,並且給它一個名稱,這就是所謂的變數。
  • 變數的值(value)可以在程式中發生變化。
  • 變數可被宣告成任何 data type。

Rules for naming C variable

  • 變數名稱必須是由英文字母或是底線()開頭。
  • 英文字母大小寫有差。
  • 可以由數字或字母組成。
  • 除了底線以外,不得使用任何特殊符號
  • 不能跟 C語言的保留字(reserved word)相同。
  • 舉例合格的變數名稱:
    1. sum
    2. height
    3. value

保留字 Reserved word

變數宣告與初始化 Declaring and initializing C variables

  • 在 C 語言裡變數需要在使用前進行宣告。
  • 而變數初始化(variable initialization)是指設定變數的值(value)。

變數宣告需要在變數「初次」使用前完成,不可在其被使用後才進行宣告。
至於宣告的位置並沒有特別規定,可以在任何地方進行宣告。
不過還是習慣於最一開始的時候先進行宣告。

常數 Constant

  • C 常數觀念跟變數一樣,唯一的差別是:一旦定義其值,程式將無法對其進行修改。簡單來說,常數就是一個「唯讀」的變數。
  • 代數(algebra)裡所謂的常數與程式語言裡的常數概念上有些不同:
    • 代數中的常數,例如:在 $?(?)=?^3+?$ 中的 $?$ 表示在自變數與因變數改變時維持固定的數字,它的值不是問題觀察的重點,但可以是某些合理的數字中的一個。
    • 程式語言中的常數在觀念上和程式中的變數是一致的,也就是說,常數是一個 CPU 紀錄數值資料的地方,只是 CPU 在整個程式執行過程中,只會去讀取該資料,而不會修改它。
  • 經宣告並給定初始值後,就不再(且不允許)變更其數值的資料。

C 語言的變數四要件

  • C 語言變數包含四個要件:
    1. 資料型態 Data type
    2. 識別字 Identifier
      • 電腦程式中,編譯器或是直譯器會透過識別字來了解程式碼的意義,有些識別字是內建的,像是保留字、內建變數、內建函式、標準函式庫的韓式等等。有些識別字則是程式設計者宣告後創造出來的,像是變數。
    3. 值 value
    4. 可視度 Scope
      • Scope 較白話的講法應該可以解釋為「變數範圍」,涉及許多層次,由小到大可以分為:區塊可見(block scope)、函式可見(function scope)、區域可見(local scope)、全域可見(global scope)。詳細內容之後還會再提到。

printf & scanf

  • 輸入輸出函式(printf, scanf)是 C語言非常重要的函式,也是 C語言必學的兩個函式。在 C語言的程式中,幾乎每一個程式都會使用到這兩個函式,尤其是輸出函式。
  • 如果程式中需要使用 printf 或者是 scanf,那麼在撰寫時就需要引用標頭檔(head file)stdio.h。stdio 為 standard input output 的縮寫,而這兩個函式就包含在這個標頭檔裡。
  • 學習 C 的過程中,通常是從主控台(也就是文字模式)開始,為了與程式互動,在主控台下輸出程式結果,或是從主控台取得使用者的輸入資料是基本需求。其中 printf 的功能很強大,用法靈活,比較難掌握;而 scanf 用法相對比較固定。

printf

  • printf,print format 的縮寫。

Syntax:

# include <stdio.h>
int printf (const char *format, ...);

標準語法如上。
以下舉幾個例子來示範 printf 的使用方法。

printf("字符串\n");

# include <stdio.h>
int main(void)
{
    printf("Hello World!\n");
    return 0;
}
  • 其中 \n 表示換行的意思,是一個跳脫字元。
  • n 為 new line 的縮寫。
  • 除此之外要注意的是,printf 裡必須使用雙引號("),雙引號內的字幅串可以是英文,也可以是中文。

printf("輸出控制符",輸出參數);

# include <stdio.h>
int main(void)
{
    int i = 10;
    printf("%d\n", i);  
    return 0;
}
  • 這個程式的意思就是讓變數 i 以十進制的方式輸出。
  • 不過 i 本身就是十進制,又為甚麼還要將 i 以十進制輸出?因為程式碼中,雖然寫的是 i=10,但是在記憶體中並不是將「10」這個十進制的值存進去,而是以二進制的方式存進去。所以我們在輸出的時候就必須要有「輸出控制符」(或稱格式指定字,format specifier)來告訴系統應該怎麼解讀這個二進制的數值。

跳脫字元 Escape Character

格式指定字 Format Specifier

scanf

  • scanf,scan format 的縮寫。
  • scanf 與 printf 的用法幾乎完全一樣。但是需要注意以下兩點:
    1. scanf 裡面絕對不要包含 \n
    2. scanf 後面不是直接放變數,前面需要再加上 & ,不過字元或陣列不需要加上& (至於為甚麼,等之後上到指標的時候會再解釋)。

以下也示範幾個例子說明 scanf 的使用方法。

#include <stdio.h> 
int main() { 
	int a = 0, b = 0, c = 0, d = 0; 
	scanf("%d", &a); 
	scanf("%d", &b);
	printf("a+b = %d\n", a+b); 

	scanf("%d %d", &c, &d); 
	printf("c*d = %d", c*d); 
	
	return 0; 
}

從鍵盤上輸入 12,按下 Enter 鍵之後,scanf() 就會讀取輸入數據並給定給變數 a,本次輸入結束。接著執行下一個 scanf(),再從鍵盤輸入 60,按下 Enter 鍵就會將 60 給定給變數 b。
後面的 scanf() 有兩個用空格分開的 %d,後面跟著兩個變數 c、d,這個代表我們要一次輸入兩個整數,並且會分別給定給 c 和 d。注意,%d %d 之間是有空格的,所以我們在輸入數據時也要有空格。對於 scanf(),輸入數據的格式要和控制字符串的格式一樣。

scanf(“%d %d”, &a, &b); // 獲取使用者輸入的兩個整數,分別給定變數a和b
printf(“%d %d”, a, b); // 將變數a和b的值在螢幕上輸出

scanf 和 printf 非常相似,只是功能相反。

兩者都有格式控制字符串,都有變數,不同的是 scanf 的變數前需要加一個 & 符號。
而 &稱為取址符號,也就是可以獲得變數在記憶體的位址。(詳細內容會在指標單元詳細介紹)

#include <stdio.h>
int main() {
	int a, b, c; 
	scanf("%d %d", &a, &b); 
	printf("a+b=%d\n", a+b); 

	scanf("%d %d", &a, &b); 
	printf("a+b=%d\n", a+b); 

	scanf("%d, %d, %d", &a, &b, &c); 
	printf("a+b+c=%d\n", a+b+c);

	scanf("%d is bigger than %d", &a, &b); 
	printf("a-b=%d\n", a-b); 

	return 0; 
}

  1. 第一個scanf()格式控制符為”%d %d”,中間只有一個空格,但是輸入時,多輸入一個空格。
  2. 第二個scanf()格式控制符為”%d %d”,中間有兩個空格,輸入卻只輸入一個。不過就算如此,print 出來的格式是正確的。這代表scanf()對輸入數據之間的空格處理比較寬鬆,並沒有嚴格要求空格的對應數量,只要有空格就可以了。
  3. 第三個scanf()的控制符”%d, %d, %d”,中間用逗號分隔,所以輸入的整數也要用逗號分隔。
  4. 第四個scanf()要求兩整數之間以is bigger than分隔。

使用者每次按下 Enter 鍵,程式就會認為完成了一次輸入操作,scanf() 開始讀取使用者的輸入內容,並且根據格式控制符中提取有效的數據,只要使用者輸入的內容和格式控制符匹配,就能夠正確提取。


scanf 連續輸入

我們將前兩個程式碼改寫看看!

  • 一開始我們每輸入一個數值,就按一次 Enter 鍵,而這次我們一次輸入四個數值(中間以空格分隔)再按下 Enter,可以發現 scanf 都能正確讀取。
  • 到這邊,我們可以合理推斷第一個 scanf() 讀取完後並沒有拋棄多餘的值,而是將它們保存在某個地方,下次接著使用。
  • 而如果我們多輸入一個數字,依樣可以正確讀取,只是最後一個數值沒有使用而已。
  • 那如果我們少輸入一個數字呢?
  • 輸入三個整數後,前兩個 scanf() 把前面兩個整數給讀進去了,此時剩下一個整數 60。而第三個 scanf() 要求要輸入兩個整數,一個單獨的整數 60 並不能滿足其要求,所以我們還是必須輸入數值湊足兩個整數以後,第三個 scanf() 才能正確讀取。

所以,從基本上我們可以發現從鍵盤輸入進去的數值並沒有直接交給 scanf(),而是放入一個「緩衝區」,直到我們按下 Enter,scanf() 才會到緩衝區去讀取數值。如果緩衝區的數值符合 scanf() 的要求,那麼就可以讀取結束;如果不符合要求,那麼就繼續等待用戶輸入,或者乾脆讀取失敗。

運算子 & 運算式 Operators & Expressions

  • 在C語言中,用來執行邏輯和數學運算的符號我們稱為 C的運算子(C operator)。
  • 這些 operators 將各個 constants、variables 和 functions 組合起來,我們稱為運算式(C expression)。

以此算式為例:

C operators

Types of Operators Description
Arithmetic operators 用於執行數學計算,例如:加減乘除和取餘數。
Assignment operators 用在為變數分配值(value)。
Relational operators 用來比較兩個變數的值。
Logical operators 對給定的變數執行邏輯運算。
Bit wise operators 對於給定的兩個變數執行 bit operations。
Conditional (ternary) operators 如果條件為 true,則條件運算子會回傳一個值;如果是 false,則回傳另一個。
Increment / decrement operators 用於將變數的值增加或減少一。
Special operators &、*、sizeof() 和 ternary operators。

算數運算子 Arithmetic operators

  • 也就是一般數學四則運算會用到的運算子,再加上 ﹪、遞增運算子、遞減運算子。

  • ++ 遞增運算子與 -- 遞減運算子

  • 複合指定運算:指的是同時執行『算術運算子或位元運算子』以及『指定運算子』兩件工作。

  • 比較關係運算子

  • 邏輯運算子 Logical Operator

運算子的優先順序

  • 算術運算子 → 比較運算子 → 邏輯運算子
    • 先乘除,後加減;同一列中的運算,其優先順序相同時,是由左至右運算。
    • 常見運算子的優先順序如下:
順序 運算子
1 () 小括號
2 + 正數、- 負數
3 *、/、%
4 +、-
5 <、<=、>、>=
6 =、!=
7 &&
8 ||
9 = assign、*=、/=、%=、+=、-=

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言