1. 程式人生 > >《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記三:C語言基本概念(2)

《C語言程式設計:現代方法(第2版)(K.N.King 著)》學習筆記三:C語言基本概念(2)

2.3 註釋

  1. 每一個程式都應該包含識別資訊,即程式名、編寫日期、作者、程式的用途以及其他相關資訊。C語言把這類資訊放在註釋comment)中。
  2. 符號 /* 標記註釋的開始,而符號 */ 則標記註釋的結束。例如:
/* This is a comment */
  1. 註釋幾乎可以出現在程式的任何位置上。它既可以單獨佔行也可以和其他程式文字出現在同一行中。註釋還可以佔用多行。一旦遇到符號 /*,那麼編輯器讀入(並且忽略)隨後的內容直到遇到符號 */
  2. 一般的註釋形式如下:
/* Name: pun.c
    Purpose: Prints a bad pun.
    Author: K.N.King */
  1. 但是,上面這樣的註釋可能難於閱讀,因為人們閱讀程式時可能不易發現註釋的結束位置。所以,單獨把 */ 符號放在一行會很有幫助:
/* Name: pun.c
    Purpose: Prints a bad pun.
    Author: K.N.King
*/
  1. 更好的方法是用一個“盒形”格式把註釋單獨標記出來:
/**********************************
 * Name: pun.c                    *
 * Purpose: Prints a bad pun.     *
 * Author: K.N.King	          *
 **********************************/
  1. 有些程式設計師通過忽略3條邊框的方法來簡化盒形註釋:
/*
 * Name: pun.c
 * Purpose: Prints a bad pun.
 * Author: K.N.King
 */
  1. 簡短的註釋還可以與程式中的其他程式碼放在同一行,這類註釋有時也稱作“翼型註釋”:
int main(void)    /* Beginning of main program */
  1. 如果忘記終止註釋可能會導致編譯器忽略程式的一部分。例如下面這段程式碼,因為在第一條註釋中遺漏了結束標誌,所以編譯器忽略掉了中間的兩條語句,因此程式最終只打印了“My fleas”:
    printf("My "
); /* forgot to close this comment... printf("car "); printf("has "); /* so it ends here */ printf("fleas");
  1. C99提供了另一種型別的註釋,以 //(兩個相鄰的斜杆)開始:
// This is a comment
  1. 這種風格的註釋會在行末自動終止。如果要建立多於一行的註釋,既可以使用以前的註釋風格(/* ... */),也可以在每一行的前面加上 //
// Name: pun.c
// Purpose: Prints a bad pun.
// Author: K.N.King
  1. 新的註釋風格有兩個主要優點:首先,因為註釋會在行末自動終止,所以不會出現未終止的註釋意外吞噬部分程式的情況;其次,因為每行前面都必須有 //,所以多行的註釋更加醒目。

2.4 變數和賦值

  • 大多數程式在產生輸出之前往往需要執行一系列的計算,因此需要在程式執行過程中有一種臨時儲存資料的方法。和大多數程式語言一樣,C語言中的這類儲存單元被稱為變數(variable)

2.4.1 型別

  1. 每一個變數都必須有一個型別(type)。型別用來說明變數所儲存的資料的種類。C語言擁有廣泛多樣的型別。由於型別會影響變數的儲存方式以及允許對變數進行的操作,所以選擇合適的型別是非常關鍵的。數值型變數的型別決定了變數所能儲存的最大值和最小值,同時也決定了是否允許在小數點後出現數字。
  2. int(即integer的簡寫)型變數可以儲存整數。但是,整數的取值範圍是受限制的。最大的整數通常是 2 147 483 647,但在某些計算機上也可能只有 32 767。
  3. float(即floating-point的簡寫)型變數可以儲存比int型變數大得多的數值。而且,float型變數可以儲存帶小數位的數。但float型變數也有一些缺陷。進行算術運算時float型變數通常比int型變數慢;更重要的是,float型變數所儲存的數值往往只是實際數值的一個近似值。如果在一個float型變數中儲存 0.1,以後可能會發現變數的值為 0.099 999 999 999 999 87,這是舍入造成的誤差。

2.4.2 宣告

  1. 在使用變數之前必須對其進行宣告(為編譯器所做的描述)。為了宣告變數,首先要指定變數的型別,然後說明變數的名字。例如,我們可能這樣宣告變數 height 和 profit:
int height;
float profit;
  1. 如果幾個變數具有相同的型別,就可以把它們的宣告合併。注意每一條完整的宣告語句都要以分號結尾:
int height, length, width, volume;
float profit, loss;
  1. 當main函式包含宣告時,必須把宣告放置在語句之前。就書寫格式而言,建議在宣告和語句之間留出一個空行。但在C99中,宣告可以不在語句之前。例如,main函式中可以先有一個宣告,後面跟一條語句,然後再跟一個宣告。

2.4.3 賦值

  1. 變數通過賦值assignment)的方式獲得值。例如下面的三條賦值語句分別把數值 8、12 和 10 賦值給變數 height、length 和 width,8、12 和 10 稱為常量constant):
height = 8;
length = 12;
width = 10;
  1. 變數在賦值前或以其他方式使用之前必須先宣告。
  2. 賦給 float 型變數的常量通常都帶小數點,即使小數部分為 0,比如說 24,也要寫成 24.0。當我們把一個包含小數點的常量賦值給 float 型變數時,最好在該常量後面加一個字母f(代表 float),比如說 24.0f。不加f可能會引發編輯器的警告。
  3. 混合型別賦值(如把 int 型變數的值賦給 float 型變數或者把 float 型的值賦給 int 型變數)是可以的,但不一定安全。
  4. 在C語言中,符號 * 表示乘法運算。
  5. 通常情況下,賦值運算的右側可以是一個含有常量、變數和運算子的公式(在C語言的術語中稱為表示式)。

2.4.4 顯示變數的值

  1. 用 printf 函式可以顯示出變數的當前值。
  2. 語句 printf("Height: %d\n", height); 在螢幕上打印出變數 height 的當前值。佔位符 %d 用來指明在顯示過程中變數 height 的值的顯示位置。由於在 %d 後面放置了 \n,所以 printf 函式在顯示完變數 height 的值後會跳到下一行。
  3. %d 僅用於 int 型變數。如果要顯示 float 型變數,需要用 %f 來代替 %d。預設情況下,%f 會顯示出小數點後 6 位數字。如果要強制 %f 顯示小數點後 p 位數字,可以把 .p 放置在 % 和 f 之間。例如,為了顯示資訊“Profit: $2150.48”,可以這樣呼叫 printf 函式:
printf("Profit: $%.2f\n", profit);
  1. 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 初始化

  1. 當程式開始執行時,某些變數會被自動設定為零,而大多數變數則不會。沒有預設值並且尚未在程式中被賦值的變數是未初始化的(uninitialized)。如果試圖訪問未初始化的變數,可能會得到不可預知的結果,在某些編譯器中,可能會發生更壞的情況(甚至是程式崩潰)。
  2. 可以在變數宣告中加入初始值,例如:
int height = 8;
  1. 按照C語言的術語,數值 8 是一個初始化式(initializer)。在同一個宣告中可以對任意數量的變數進行初始化,但無法用一個初始化式初始化多個變數。例如下面這個變數宣告,只有變數 width 擁有初始化式而被初始化:
int height, length, width = 10;

2.4.6 顯示錶達式的值

  1. printf 函式的功能不侷限於顯示變數中儲存的數,它可以顯示任意數值表示式的值。利用這一特性既可以簡化程式,又可以減少變數的數量。例如:
volume = height * length * width;
printf("%d\n", volume);
// 可替換為:
printf("%d\n", height * length * width);
  1. printf 函式顯示錶達式的能力說明了C語言的一個通用原則:在任何需要數值的地方,都可以使用具有相同型別的表示式。