練習7:更多變數和一些算術
原文:Exercise 7: More Variables, Some Math
譯者:飛龍
你可以通過宣告int
,float
,char
和double
型別的變數,來對它們做更多的事情,讓我們來熟悉它們吧。接下來我們會在各種數學表示式中使用它們,所以我會向你介紹C的基本算術操作。
int main(int argc, char *argv[])
{
int bugs = 100;
double bug_rate = 1.2;
printf("You have %d bugs at the imaginary rate of %f.
",
bugs, bug_rate);
long universe_of_defects = 1L * 1024L * 1024L * 1024L;
printf("The entire universe has %ld bugs.
",
universe_of_defects);
double expected_bugs = bugs * bug_rate;
printf("You are expected to have %f bugs.
",
expected_bugs);
double part_of_universe = expected_bugs / universe_of_defects;
printf("That is only a %e portion of the universe.
",
part_of_universe);
// this makes no sense, just a demo of something weird
char nul_byte = ` `;
int care_percentage = bugs * nul_byte;
printf("Which means you should care %d%%.
",
care_percentage);
return 0;
}
下面是這一小段無意義程式碼背後發生的事情:
ex7.c:1-4
C程式的通常開始。
ex7.c:5-6
為一些偽造的bug資料宣告瞭一個int
和一個double
變數。
ex7.c:8-9
列印這兩個變數,沒有什麼新東西。
ex7.c:11
使用了一個新的型別long
來宣告一個大的數值,它可以儲存比較大的數。
ex7.c:12-13
使用%ld
列印出這個變數,我們新增了個修飾符到%d
上面。新增的”l”表示將它當作長整形列印。
ex7.c:15-17
只是更多的算術運算和列印。
ex7.c:19-21
編撰了一段你的bug率的描述,這裡的計算非常不精確。結果非常小,所以我們要使用%e
以科學記數法的形式列印它。
ex7.c:24
以特殊的語法` `
宣告瞭一個字元。這樣建立了一個“空位元組”字元,實際上是數字0。
ex7.c:25
使用這個字元乘上bug的數量,它產生了0,作為“有多少是你需要關心的”的結果。這條語句展示了你有時會碰到的醜陋做法。
ex7.c:26-27
將它列印出來,注意我使用了%%
(兩個百分號)來列印一個%
字元。
ex7.c:28-30
main
函式的結尾。
這一段程式碼只是個練習,它演示了許多算術運算。在最後,它也展示了許多你能在C中看到,但是其它語言中沒有的技巧。對於C來說,一個“字元”同時也是一個整數,雖然它很小,但的確如此。這意味著你可以對它做算術運算,無論是好是壞,許多軟體中也是這樣做的。
在最後一部分中,你第一次見到C語言是如何直接訪問機器的。我們會在後面的章節中深入。
你會看到什麼
通常,你應該看到如下輸出:
$ make ex7
cc -Wall -g ex7.c -o ex7
$ ./ex7
You have 100 bugs at the imaginary rate of 1.200000.
The entire universe has 1073741824 bugs.
You are expected to have 120.000000 bugs.
That is only a 1.117587e-07 portion of the universe.
Which means you should care 0%.
$
如何使它崩潰
像之前一樣,向printf
傳入錯誤的引數來使它崩潰。對比%c
,看看當你使用%s
來列印nul_byte
變數時會發生什麼。做完這些之後,在Valgrind
下執行它看看關於你的這次嘗試會輸出什麼。
附加題
-
把為
universe_of_defects
賦值的數改為不同的大小,觀察編譯器的警告。 -
這些巨大的數字實際上列印成了什麼?
-
將
long
改為unsigned long
,並試著找到對它來說太大的數字。 -
上網搜尋
unsigned
做了什麼。 -
試著自己解釋(在下個練習之前)為什麼
char
可以和int
相乘。