《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記三:C語言基本概念(2)
阿新 • • 發佈:2018-12-13
2.3 註釋
- 每一個程式都應該包含識別資訊,即程式名、編寫日期、作者、程式的用途以及其他相關資訊。C語言把這類資訊放在註釋(comment)中。
- 符號
/*
標記註釋的開始,而符號*/
則標記註釋的結束。例如:
/* This is a comment */
- 註釋幾乎可以出現在程式的任何位置上。它既可以單獨佔行也可以和其他程式文字出現在同一行中。註釋還可以佔用多行。一旦遇到符號
/*
,那麼編輯器讀入(並且忽略)隨後的內容直到遇到符號*/
。 - 一般的註釋形式如下:
/* Name: pun.c
Purpose: Prints a bad pun.
Author: K.N.King */
- 但是,上面這樣的註釋可能難於閱讀,因為人們閱讀程式時可能不易發現註釋的結束位置。所以,單獨把
*/
符號放在一行會很有幫助:
/* Name: pun.c
Purpose: Prints a bad pun.
Author: K.N.King
*/
- 更好的方法是用一個“盒形”格式把註釋單獨標記出來:
/**********************************
* Name: pun.c *
* Purpose: Prints a bad pun. *
* Author: K.N.King *
**********************************/
- 有些程式設計師通過忽略3條邊框的方法來簡化盒形註釋:
/*
* Name: pun.c
* Purpose: Prints a bad pun.
* Author: K.N.King
*/
- 簡短的註釋還可以與程式中的其他程式碼放在同一行,這類註釋有時也稱作“翼型註釋”:
int main(void) /* Beginning of main program */
- 如果忘記終止註釋可能會導致編譯器忽略程式的一部分。例如下面這段程式碼,因為在第一條註釋中遺漏了結束標誌,所以編譯器忽略掉了中間的兩條語句,因此程式最終只打印了“My fleas”:
printf("My " ); /* forgot to close this comment...
printf("car ");
printf("has "); /* so it ends here */
printf("fleas");
- C99提供了另一種型別的註釋,以
//
(兩個相鄰的斜杆)開始:
// This is a comment
- 這種風格的註釋會在行末自動終止。如果要建立多於一行的註釋,既可以使用以前的註釋風格(
/* ... */
),也可以在每一行的前面加上//
:
// Name: pun.c
// Purpose: Prints a bad pun.
// Author: K.N.King
- 新的註釋風格有兩個主要優點:首先,因為註釋會在行末自動終止,所以不會出現未終止的註釋意外吞噬部分程式的情況;其次,因為每行前面都必須有
//
,所以多行的註釋更加醒目。
2.4 變數和賦值
- 大多數程式在產生輸出之前往往需要執行一系列的計算,因此需要在程式執行過程中有一種臨時儲存資料的方法。和大多數程式語言一樣,C語言中的這類儲存單元被稱為變數(variable)。
2.4.1 型別
- 每一個變數都必須有一個型別(type)。型別用來說明變數所儲存的資料的種類。C語言擁有廣泛多樣的型別。由於型別會影響變數的儲存方式以及允許對變數進行的操作,所以選擇合適的型別是非常關鍵的。數值型變數的型別決定了變數所能儲存的最大值和最小值,同時也決定了是否允許在小數點後出現數字。
- int(即integer的簡寫)型變數可以儲存整數。但是,整數的取值範圍是受限制的。最大的整數通常是 2 147 483 647,但在某些計算機上也可能只有 32 767。
- float(即floating-point的簡寫)型變數可以儲存比int型變數大得多的數值。而且,float型變數可以儲存帶小數位的數。但float型變數也有一些缺陷。進行算術運算時float型變數通常比int型變數慢;更重要的是,float型變數所儲存的數值往往只是實際數值的一個近似值。如果在一個float型變數中儲存 0.1,以後可能會發現變數的值為 0.099 999 999 999 999 87,這是舍入造成的誤差。
2.4.2 宣告
- 在使用變數之前必須對其進行宣告(為編譯器所做的描述)。為了宣告變數,首先要指定變數的型別,然後說明變數的名字。例如,我們可能這樣宣告變數 height 和 profit:
int height;
float profit;
- 如果幾個變數具有相同的型別,就可以把它們的宣告合併。注意每一條完整的宣告語句都要以分號結尾:
int height, length, width, volume;
float profit, loss;
- 當main函式包含宣告時,必須把宣告放置在語句之前。就書寫格式而言,建議在宣告和語句之間留出一個空行。但在C99中,宣告可以不在語句之前。例如,main函式中可以先有一個宣告,後面跟一條語句,然後再跟一個宣告。
2.4.3 賦值
- 變數通過賦值(assignment)的方式獲得值。例如下面的三條賦值語句分別把數值 8、12 和 10 賦值給變數 height、length 和 width,8、12 和 10 稱為常量(constant):
height = 8;
length = 12;
width = 10;
- 變數在賦值前或以其他方式使用之前必須先宣告。
- 賦給 float 型變數的常量通常都帶小數點,即使小數部分為 0,比如說 24,也要寫成 24.0。當我們把一個包含小數點的常量賦值給 float 型變數時,最好在該常量後面加一個字母f(代表 float),比如說 24.0f。不加f可能會引發編輯器的警告。
- 混合型別賦值(如把 int 型變數的值賦給 float 型變數或者把 float 型的值賦給 int 型變數)是可以的,但不一定安全。
- 在C語言中,符號
*
表示乘法運算。 - 通常情況下,賦值運算的右側可以是一個含有常量、變數和運算子的公式(在C語言的術語中稱為表示式)。
2.4.4 顯示變數的值
- 用 printf 函式可以顯示出變數的當前值。
- 語句
printf("Height: %d\n", height);
在螢幕上打印出變數 height 的當前值。佔位符%d
用來指明在顯示過程中變數 height 的值的顯示位置。由於在 %d 後面放置了\n
,所以 printf 函式在顯示完變數 height 的值後會跳到下一行。 %d
僅用於 int 型變數。如果要顯示 float 型變數,需要用%f
來代替%d
。預設情況下,%f
會顯示出小數點後 6 位數字。如果要強制 %f 顯示小數點後 p 位數字,可以把.p
放置在 % 和 f 之間。例如,為了顯示資訊“Profit: $2150.48”,可以這樣呼叫 printf 函式:
printf("Profit: $%.2f\n", profit);
- C語言沒有限制呼叫一次 printf 函式可以顯示的變數的數量。
[程式] 計算箱子的空間重量:dweight.c
/* Computes the dimensional weight of a 12" x 10" x 8" box */
#include <stdio.h>
int main(void)
{
int height, length, width, volume, weight;
height = 8;
length = 12;
width = 10;
volume = height * length * width;
weight = (volume + 165) / 166; /* 在C語言中,如果兩個整數相除,那麼結果會被“截短”:小數點後的所有數字都會丟失。
例如,12 × 10 × 8 = 960,960 ÷ 166 = 5(而不是 5.783)。這就使得結果向下取整。
在本情境中,運輸公司肯定希望結果向上取整,因此在 volume 除以 166 前,先給它加上 165。*/
printf("Dimensions: %dx%dx%d\n", length, width, height);
printf("Volume (cubic inches): %d\n", volume);
printf("Dimensional weight (pounds): %d\n", weight);
return 0;
}
2.4.5 初始化
- 當程式開始執行時,某些變數會被自動設定為零,而大多數變數則不會。沒有預設值並且尚未在程式中被賦值的變數是未初始化的(uninitialized)。如果試圖訪問未初始化的變數,可能會得到不可預知的結果,在某些編譯器中,可能會發生更壞的情況(甚至是程式崩潰)。
- 可以在變數宣告中加入初始值,例如:
int height = 8;
- 按照C語言的術語,數值 8 是一個初始化式(initializer)。在同一個宣告中可以對任意數量的變數進行初始化,但無法用一個初始化式初始化多個變數。例如下面這個變數宣告,只有變數 width 擁有初始化式而被初始化:
int height, length, width = 10;
2.4.6 顯示錶達式的值
- printf 函式的功能不侷限於顯示變數中儲存的數,它可以顯示任意數值表示式的值。利用這一特性既可以簡化程式,又可以減少變數的數量。例如:
volume = height * length * width;
printf("%d\n", volume);
// 可替換為:
printf("%d\n", height * length * width);
- printf 函式顯示錶達式的能力說明了C語言的一個通用原則:在任何需要數值的地方,都可以使用具有相同型別的表示式。