Head First C - C语言入门

文章目录

  • Head First C - C语言入门
    • C语言的工作方式
    • 完整的C程序
    • printf()函数
    • 运行程序
    • 字符串
    • 布尔运算
    • switch语句
    • while循环
    • for循环
    • break语句
    • continue语句
    • 函数

C语言的工作方式

  • 源代码 创建一个源文件,源文件中是C代码
  • 编译 通过编译器运行源代码,编译器检查无错,就会编译源代码
  • 输出 编译器会创建一个交可执行文件的新文件,文件中是机器代码

完整的C程序

  1. C程序通常注释开头
    描述代码意图,包含许可证或者版权信息(可选)
/*
* 计算牌盒中牌数量的程序
* 本代码使用"拉斯维加斯公共许可证"
* (c)2014,学院21点扑克游戏小组
*/
  1. include部分
    C语言是一种很小的语言,不用外部库,几乎干不了什么。
#include <stdio.h>
  1. 在源文件中找到的最后一样东西是函数
    所有C代码都在函数中运行,main()是程序中所有代码的起点。
    main()函数的返回类型是int,如果main()返回0,表明程序运行成功,返回其他值,就表示程序运行时出了问题。
    早期的ANSI C标准中,main()函数可以时void类型。但是在C99标准中main函数的返回类型必须是int。
int main(){int decks;puts("输入有几副牌");scanf("%i", &decks);if(decks < 1){puts("无效的副数");return 1;}printf("一共有%i张牌\n", (decks * 52));return 0;

printf()函数

printf()函数用于显示格式化输出,用变量的值代替格式符
当调用printf()时,可以包含任意数量参数,但是要确保每个参数有一个对应的%格式符

printf("%s说计数时%i", "阿星", 21);

运行程序

C语言是一种编译型语言,需要将源代码编译为机器能够理解的机器代码,计算机才能够执行。
用gcc编译并运行程序

cards.c

/*
* 计算牌盒中牌数量的程序
* 本代码使用"拉斯维加斯公共许可证"
* (c)2014,学院21点扑克游戏小组
*/
#include <stdio.h>
#include <stdlib.h>
int main(){char card_name[3];puts("输入牌名:");scanf("%2s", card_name);int val = 0;if(card_name[0] == 'K'){val = 10;}else if(card_name[0] == 'Q'){val = 10;}else if(card_name[0] == 'J'){val = 10;}else if(card_name[0] == 'A'){val = 11;}else{val = atoi(card_name);}printf("这张牌的点数时:%i\n", val);return 0;
}
  1. 进入cards.c所在的目录中
  2. 在命令提示符中使用 gcc cards.c -o cards 命令进行编译
  3. 在Windows命令提示符中输入cards运行程序

或者直接用 gcc cards.c -o cards && cards
编译成功就会运行程序,出错则跳过运行显示错误消息。

字符串

字符串是字符数组,当C语言看到一个这样子的字符串时:

s = "Shatner" 会把它做一个数组读取,这个数组是由一个个独立的字符组成的: s = {'S', 'h', 'a' , 't', 'n', 'e', 'r'} C语言比大多数语言更低层,它无法确切地知道数组有多长,C语言需要知道什么时候会到达字符数组的尾部,为此C语言加入了哨兵字符。哨兵字符是一个出现在字符串末尾的附加字符,它的值为\0。逐一扫描字符数组中的所有元素,直到碰到\0。 s = "Shatner" 存储器中实际保存的是: S h a t n e r \0

这就是为什么在代码中定义card_name变量:

char card_name[3];

字符串card_name只需要记录1到2个字符,但因为需要哨兵字符结尾,所以必须定义数组大小为3。


字符为什么从0开始编号?为什么不是1?
字符的索引值是一个偏移量:表示当前要引用的字符到数组第一个字符之间有多少字符。

字符串字面值和字符数组区别?
字符串字面值是常量,这些字符一旦创建完毕,就不能再修改它。如果进行修改,gcc会显示总线错误(bus error)。C语言采取不同方式再存储器中保存字符串字面值。总线错误意味着程序无法更新那一块存储器空间。


布尔运算

ANSI C标准没有用来表示真假的值,C程序把0当作假处理,把除0以外的任何值当作真处理。C99标准允许在程序中使用true和false关键字,但是编译器还是会把他们当作1和0处理。

&&检查两个条件都为真

if( (dealer_up_card == 6) && (hand == 1))double_down();

如果第一个条件为假,就不会继续判断,因为知道有假则整个为假。


||检查至少一个为真

if(cupcakes_in_fridge || chips_on_table)eat_food();

如果第一个条件为真,就不会继续判断,因为知道有真则整个为真。


!把条件值反过来

if(!brad_on_phone)answer_phone();

为什么不能只写一个|和&?
也不是不行。| 和 &操作符总是计算两个条件,|| 和 && 可以跳过第二个条件。

| 和 &不仅能逻辑表达式求值,还能进行布尔运算
6 & 4 得到4 二进制(110 & 100 得到 100)


switch语句

写逻辑条件时,需要一次又一次检查同一变量的值。为了避免过多的if语句,可以使用switch语句。switch语句和if语句有些像,但它可以测试一个变量的多种取值。当计算机遇到switch语句,他会检查给出的值,然后匹配case,会运行case之后的所有代码,直到遇到break语句。
计算机会一直会运行下去直到switch语句结束。

switch(train){case 37:winnings = winnings + 50;//train==37,winnings加50,然后跳到终点break;case: 65:puts("头等奖!");//train==65,winnings加80,再加20,然后跳到终点winnings = winnings + 80;case 12:winnings = winnings + 20;//train==12,winnings加20,然后跳到终点break;default:winnings = 0;//对于其他任意train值,winnings归零
}
train == 37
train == 65
train == 12
train为其他值
train
winnings+50
winnings + 80
winning + 20
winnings = 0

为什么用switch语句取代if?
需要多次检查同一变量时,switch更方便。

switch语句能检查字符串吗?
switch语句只能检查值,不能检查字符串或者任何形式的数组。


while循环

while(<某个条件>){/*在这里做一些事情*/
}

花括号内是循环体。
当程序执行到循环体的末尾,计算机就会检查循环条件是否为真。真则继续,假则结束。

int counter = 1;
while(counter < 11){printf("%i个枣\n", counter);counter++;
}

do while循环

while循环的一种形式,总是在循环体运行后才检查循环条件,循环体至少执行一次。

do{/*买彩票*/
}while(have_not_won);

for循环

所有的循环都是这样的三部曲:首先为循环准备变量,其次在每一轮的循环前检查条件,最后在循环末尾更新计数器或实现类似功能。

因为这个模式是通用的,C语言的设计者创造了for循环。
控制counter变量值的代码都放在了for循环语句中,并从循环体中分离出来。

  for(<初始化循环变量>; <每次循环前对条件检查>; <每次循环后运行>){/*做一些事情*/}
int counter;
for(counter = 1; counter < 11; counter++){printf("%i个枣\n", counter);
}

break语句

想在循环中的某个地方跳出循环,使用break语句直接跳出循环。break语句直接退出当前循环,跳出循环体中break之后所有的语句。

while(feeling_hungry){eat_cake();if(feeling_queasy){/*从while循环中跳出*/break;}drink_coffee();
}

break不能从if语句中退出。


continue语句

想要跳过循环体的其余部分,然后回到循环的开始。

while(feeling_hungry){if(not_lunch_yet){/*回到循环条件*/continue;}eat_cake();
}

函数

以下的第一个int是返回值类型, larger是函数名, int a, int b是函数的参数。

int larger(int a, int b){if(a > b){return a;}
}

创建了一个void函数,是否就不能有return语句?
可以有return语句,但是会有一个warning,而且在返回类型为void的函数中return没有什么意义。如果试图读取void函数的值,编译器会报错。

在void函数中的return语句有时候可以用来提前退出函数。


Head First C - C语言入门相关推荐

  1. 写一篇C语言入门第一讲

     嗨~大家好~  我是小白,最近才使用这个博客,我是一个计算机系的学生,我会在这里发一些我给我们班其他同学讲C语言入门的博文,希望大家能共享这些资料,当然了,我也很希望大家给我提出好的意见或建议.(P ...

  2. C语言入门练习 - 第二期 判断语句与循环语句(题解)

    比赛地址:C语言入门练习 - 第二期 判断语句与循环语句 A.入门--基础语法(for) #include<stdio.h> int main(){int n,i;scanf(" ...

  3. 计算机书籍-Go语言入门经典SAMS Teach Yourself

    书名:Go语言入门经典 作者:[英]乔治 奥尔波(George Ornbo) 出版社:人民邮电出版社 出版时间:2018年08月 去当当网了解

  4. c语言中描述y是奇数,4章选择结构程序设计C语言入门习题

    C语言入门习题 第四章 选择结构程序设计 一.选择题 1.有以下程序 main() { int i=1,j=2,k=3; if(i++==1&&(++j==3||k++==3)) pr ...

  5. C#forUnity快速入门(连载2)-C#语言入门

     C# for Unity 编程语言快速入门教程(连载2)---C#语言入门 接上篇内容,我们把更多的C#语言入门级编程习题发布如下,希望能够对C#编程小白提高技能有帮助. 三:  学习循环语句(续) ...

  6. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析

    本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...

  7. VML编程之------VML语言入门《VML极道教程》原著:沐缘华

    <VML极道教程>原著:沐缘华 1章4节:VML语言入门 1:VML语言入门 - 极道学法 在我正式开始讲解.你正式开始学习VML语言以前,请务必遵循以下规则,可以达到最佳效果.极道学习方 ...

  8. c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...

  9. c语言作业ppt模板,C语言入门教学PPT模板

    目前要说发展前景最好的行业,那么就必然是互联网行业了,大部分行业现在都离不开计算机,也就是说学好计算机,走到哪里都不怕,特别是程序员,那么C语言就是首先需要接触的.本模板是由西西为大家整理的C语言入门 ...

  10. python语言入门m-「数据挖掘入门系列」Python快速入门

    Python环境搭建 本次入门系列将使用Python作为开发语言.要使用Python语言,我们先来搭建Python开发平台.我们将基于Python 2.7版本.以及Python的开发发行版本Anaco ...

最新文章

  1. java 产生的固体物的基础上 增删改的SQL声明
  2. 这款IDEA插件,可以让你用中文编码哟
  3. secureCRt中文乱码问题
  4. 标签的属性和样式属性有什么区别
  5. 2 HBase数据模型
  6. Android-完美解决在Activity中触摸返回键onBackPressed不能触发问题
  7. 买卖股票的最佳时机IV
  8. 如何搭建低延时、交互式的在线教育平台?(内附视频回放)
  9. 专题导读:学术大数据
  10. Sublime Text2 中文乱码
  11. java中this用法总结
  12. LeetCode.83. Remove Duplicates from Sorted List(删除单链表中的重复元素)
  13. python库中文手册_Python3.8.1标准库参考中文手册(The Python Library Reference) 高清pdf版...
  14. OFD文件在线阅读器
  15. 删除magisk模块
  16. 人大金仓数据库迁移步骤
  17. 备份自查-微博错误代码
  18. 如果你35岁恐慌了,那你真的该反思自己了···
  19. 十六进制编辑器HxD Hex Editor x64 v2.3.0.0
  20. sc-RNA seq与Illumina测序

热门文章

  1. windows云服务器部署web网站
  2. Atcoder CADDi 2018 Solution
  3. 【博学谷学习记录】超强总结,用心分享 | java基础
  4. 2023养老展,中福协养老展,中国国际养老服务业博览会
  5. 关于Windows10服务中没有SNMP Service问题以及SNMP没有安全选项的问题
  6. 【SqlServer】错误 0xc00470fe: 数据流任务: 产品级别对于 组件“源 - TestDB01$”(1) 而言不足
  7. 蠎周刊 188: Jays
  8. php 打开文件方式
  9. PHP—文件打开/读取
  10. BZOJ4887:[TJOI2017]可乐(矩阵乘法)