HeadFirstC笔记_1.C语言入门

来源:互联网 发布:美工工资高吗 编辑:程序博客网 时间:2024/05/01 22:42
比其他大多数语言,C语言的工作层次更低,因此理解C语言可以让你更清楚程序
在运行时到底发生了什么,C语言还可以帮助你更好地理解其他语言。

C语言旨在创建空间小、速度快的程序。它比其他大多数语言的抽象
层次更低,也就是说用C语言写的代码更加接近机器语言。

绝大多数的操作系统、其他计算机语言和大多数游戏软件都是用C语言写的 。

三种C标准:
1.ANSI C始于20世纪80年代后期,适用于最古老的代码;
2.1999年开始的C99标准有了很大的改进;
3.在2011年发布的最新标准C11中,加入了一些很酷、很新的语言特性。
不同版本的标准之间差别不是很大。
对gcc编译器来讲,ANSI C、C99和C11这三种标准它全部支持。
如果你想让编译器遵循C99标准,可以使用-std=99选项。

磨笔上阵
  1. int card_count = 11; // 创建整型变量并将其设为11
  2. if (card_count > 10)                       // 计数超过10
  3. puts(" 这副牌赢面很大,我要加注! ");        // 是的话就在命令提示符显示消息。  
  4. int c = 10;                                // 创建整型变量并将其设为10。
  5. while (c > 0) {                            // 只要值为正……
  6. puts(" 我决不在课堂上写代码! ");            // ……显示消息……
  7. c = c - 1;                                 // ……计数减小
  8. }                                          // 这是一段需要重复执行的代码的尾部。   
  9. /* 假设人名小于20个字符。 */ // 这是注释。
  10. char ex[20];                              // 创建一个有20个字符的数组。
  11. puts(" 输入男友的名字: ");                 // 在屏幕上显示消息
  12. scanf("%19s", ex);                         // 将用户输入的内容保存在数组中
  13. printf(" 亲爱的 %s ,我们分手吧。 \n", ex); // 显示一条包含输入文本的消息
  14. char suit = 'H';                           // 创建字符变量,保存字母“H”
  15. switch(suit) {                             // 查看变量的值
  16. case 'C':                                  // 是“C”吗?
  17. puts(" 梅花( Clubs ) ");                  // 是则显示“梅花(Clubs)”这个词
  18. break;                                     // 然后跳过其他检查
  19. case 'D':                                  // 是“D”吗?
  20. puts(" 方块( Diamonds ) ");               // 是则显示“方块(Diamonds)”这个词
  21. break;                                     // 然后跳过其他检查
  22. case 'H':                                  // 是“H”吗?
  23. puts(" 红心( Hearts ) ");                 // 是则显示“红心(Hearts)”这个词
  24. break;                                     // 然后跳过其他检查
  25. default:                                   // 否则……
  26. puts(" 黑桃( Spades ) ");                 // 显示“黑桃(Spades)”这个词
  27. }                                          // 检测到此结束

典型的C源文件,以.c为后缀
1.C程序通常以注释开头。
    注释描述了文件中这段代码的意图。
2.接下去是include部分
    为了告诉编译器程序要使用哪些外部代码,需要包含(include)相关库的头文件。stdio.h是最常见的头文件。
3.接着是函数
    最重要的函数是main() 函数。 main() 函数是程序中所有代码的起点。
示例:
  1. /*
  2. * 计算牌盒中牌数量的程序。
  3. * 本代码使用“拉斯维加斯公共许可证”。
  4. * (c)2014, 学院21点扑克游戏小组。
  5. */
  6. #include <stdio.h>
  7. int main()
  8. {
  9. int decks;
  10. puts(" 输入有几副牌 ");
  11. scanf("%i", &decks);
  12. if (decks < 1) {
  13. puts(" 无效的副数 ");
  14. return 1;
  15. }
  16. printf(" 一共有 %i 张牌 \n", (decks * 52));
  17. return 0;
  18. }

main()函数介绍
main() 函数的 返回类型 是 int,如果让 main() 函数返回0,就表明程序运行成功;如果让它返回其他值,就表示程序在运行时出了问题。
注1:在早期的ANSI C标准中,main()函数可以是void类型。但是在C99标准中main函数的返回类型必须是int。
注2:如果想检查程序的退出状态,可以在Windows命令提示符中输入:echo %ErrorLevel%。
           或在Linux或Mac终端中输入:echo $?

printf()函数介绍
用于显示格式化输出,它用变量的值来替换格式符,像这样:
printf("%s 说计数是 %i", " 阿星 ", 21); // s对应 阿星,i对应 21.
当调用printf()时,可以包含任意数量的参数,但确保每个参数都要有一个对应的%格式符。

代码冰箱贴:cards.c源文件
  1. /*
  2. * 计算牌面点数的程序。
  3. * 使用“拉斯维加斯公开许可证”。
  4. * (c)2014 学院21点扑克游戏小组。
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. int main() {
  9. char card_name[3];
  10. puts(" 输入牌名 : ");
  11. scanf("%2s", card_name);
  12. int val = 0;
  13. if (card_name[0] == 'K') {
  14. val = 10;
  15. } else if (card_name[0] == 'Q') {
  16. val = 10;
  17. } else if (card_name[0] == 'J') {
  18. val = 10;
  19. } else if (card_name[0] == 'A') {
  20. val = 11;
  21. } else {        
  22.        // atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数
            // 如果参数不能转换成 int 或者参数为空字符串,那么将返回 0
            // 类似于java里的Integer.parse(str);
  23. val = atoi(card_name);
  24. }
  25. printf(" 这张牌的点数是 : %i\n", val);
  26. return 0;
  27. }

编译运行

 可以用&& 符号,将编译和运行一次执行。

 注:在Linux和Mac中运行程序时必须在程序前加上./,如./cards

C语言中的字符串
1.C语言不支持现成的字符串,只能用字符数组来代替。
2.C语言比大多数语言更低层,它无法确切地知道数组有多长,如果C语言想在屏幕上显示字符串,
   它就需要知道什么时候会到达字符数组的尾部,为此C语言在字符串末尾加入了一个哨兵字符---> \0
所以,在定义字符数组时,要多预留一个位置。比如要装“hello”,要定义成char s[6];
3. \0是ASCII字符,它的值为0。C程序员通常叫它空(NULL)字符。
4.用双引号定义的字符串叫字符串字面值(string literal)。
5.字符串字面值和字符数组有没有区别?答: 只有一个区别:字符串字面值是常量,无法修改。

C语言中的布尔值
在C语言中,布尔值是用数字表示的。对C语言来讲,数字0代表假的值。
那什么数字代表真呢?任何不等于0的数字都将被当成真处理,因此下面的C代码也没错:
int people_moshing = 34;
if (people_moshing)
   take_off_glasses();
注:ANSI C标准没有用来表示真和假的值,C程序把0这个值当做假处理,把0以外的任何值当做真处理。
C99标准则允许在程序中使用true和false关键字。但编译器还是会把它们当做1和0这两个值来处理。

链式赋值
在 C 语 言 中 , 几 乎 每 样 东西 都 有 返 回 值 , 不 仅 仅 是函 数 调 用 , 就 连 赋 值 表达式也有返回值。
如:x = 4; y=x;  可以写成:y = x = 4;

代码示例:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4. char card_name[3];
  5. int count = 0;
  6. do {
  7. puts(" 输入牌名 : ");
  8. scanf("%2s", card_name);
  9. int val = 0;
  10. switch(card_name[0]) {
  11. case 'K':
  12. case 'Q':
  13. case 'J':
  14. val = 10;
  15. break;
  16. case 'A':
  17. val = 11;
  18. break;
  19. case 'X':
  20. // 在这里用break不能退出循环,因为我们现在位于switch语句中。
  21. //我们需要用continue回到循环开始,然后再次检查循环条件。
  22. continue;
  23. default:
  24. val = atoi(card_name);
  25. if ((val < 1) || (val > 10)) {
  26. puts("我无法理解这个值!");
  27. //在这个地方还需要一个continue,因为你想让循环继续
  28. continue;
  29. }
  30. }
  31. if ((val > 2) && (val < 7)) {
  32. count++;
  33. } else if (val == 10) {
  34. count--;
  35. }
  36. printf(" 当前的计数 : %i\n", count);
  37. } while (card_name[0]!='X' );
  38. return 0;
  39. }

运行结果

 
问:C语言为什么需要编译?其他一些语言就不需要编译,比如JavaScript,是吗?
答:为了让代码执行起来更快,C语言需要编译。尽管有些语言不是编译型语言,但它们中的一些,
像JavaScript和Python,为了提高速度通常会在幕后使用一些编译技术。

问:gcc这三个字母分别代表什么含义?
答: GNU编译器套装(GNU Compiler Collection)。


0 0
原创粉丝点击