黑马程序员_ C语言基础(二)
概览
Hello World





//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
// #include <stdio.h> void showMessage(){
printf("Hello,World!\n");
} int main(int argc, const char * argv[]) {
showMessage();
return 0;
}
在上面的程序中我们需要解释几点:
main函数是程序入口,一个程序只能有一个main()函数,需要有一个整型返回值(事实上返回值int可以省略,但是这并不代表不返回值,而是默认为int;我们也可以在main()函数中不提供return,这是因为c语言语法要求不够严格);
#include是预处理指令,用于包含指定文件(注意在编译前即处理),它实际做的工作就是把对应文件复制到指定的位置; 包含的内容可以是任何类型的文件,而不仅仅是.h文件;
上面的showMessage函数必须写在main()函数上面,如果写在下面则必须在main()函数之前声明;
注意:#include 包含文件时有两种方式:使用<>和””。区别就是<>包含只会查找编译器库函数文件,因此适用于包含库函数;而“”包含则首先查找程序当前目录,如果没有找到则查找库函数路径,因此适用于自定义文件;
运行过程

C语言的运行分为两大步:编译和链接
编译:编译阶段会将对应的xxx.c源文件(ASCII格式)编译成目标文件xxx.obj,它是二进制格式(当然一般我们会有多个.c文件,也就会生成多个对应的.obj);在编译之前要进行预处理(例如#include指令),在编译的同时还要进行语法检查;生成的.obj文件并不能单独执行,因为各个.obj之间是有关联的,而且他们还各自引用了C语言库函数;
链接:链接的过程就是将各个.obj文件和C语言库函数一起组合生成一个可执行文件的过程;
扩展
在大型项目开发中程序中所有的代码都写到一个文件中是不现实的,我们通常将一个子操作分为两个文件:.c文件和.h文件。在.c文件中实现对应的函数,在.h中进行函数声明,这样只要在主函数上方包含对应的头文件就可以将子操作分离出来而且不用考虑顺序问题。例如改写“Hello World”的例子(注意message对应的.c和.h文件名完全可以不相同,但是出于规范的目的我们还是取相同的文件名):
message.h
//
// Message.h
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//
void showMessage();
message.c
//
// Message.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
// #include <stdio.h> void showMessage(){
printf("Hello,World!\n");
}
main.c
//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
// #include <stdio.h>
#include "Message.h" int main(int argc, const char * argv[]) {
showMessage();
return 0;
}
可以发现程序仍然可以正常运行,但是我们思考一个问题:如果我们不分成两个文件,直接在主函数文件中包含message.c是否也可以正常运行呢?答案是否定的,原因是由于编译生成的两个文件main.obj和 message.obj在链接时会发现main.obj中已经有message.obj中定义的showMessage函数,抛出“标示符重复”的错误。

数据类型

类型修饰符
从上图我们可以清晰的看到C语言的数据类型结构,当然对于这些类型我们还有一些类型修饰符(或叫限定符)
short 短型 ,修饰int、double
long 长型,修饰int、double
signed 有符号型,修饰int、char
unsigned 无符号型,修饰int、char
对于类型修饰符需要做如下解释
这些修饰符经常用来修饰int型,在修饰int类型时int可以省略;
short和long会改变int型的长度,不同编译器项长度不相同,但是short长度不大于int,int长度不大于long;
singed、unsigned不改变类型长度,仅仅表示最高位是否为符号位,signed表示大于等于0的正数;
当然有时候我们必须清楚每个类型占用的字节,下表列出常用数据类型占用的存储空间

注意:char类型是最小的数据类型单位,在任何类型的编译器下都是占用1个字节,char类型的变量赋值可以直接赋值等于某个字符也可以赋值为整数(对应的ASCII值)。
运算符
C语言中有34中运算符,同C#、Java等语言没有太大的区别,这里指列出一些注意事项
关系运算符为真就返回1,为假就返回0;在条件语言中非0即真(负数、正数均为真),只有0为假 ;
C语言可以不保存关系运算符的值 ;
逗号表达式最终的值是最后一个表达式的值;
针对上面几点看以下例子
//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) {
int a=2>1,b=2<1,c=99,d=0;
int f=0,g=0,h=0,e=(f=3,g=4,h=5); a>0;//没有保存运算结果 printf("%d,%d\n",a,b);//结果:1,0 if(c){//可以通过
printf("true.\n");
}
if(d){//无法通过
printf("false\n");
} printf("%d\n",e);//结果:5
return 0;
}
常用函数
printf()函数
printf()函数用于向标准输出设备输出数据,配合格式符可以完成强大的输出功能,上面的例子中我们已经使用了这个函数。
通常我们的输出不是固定内容而是包含某些变量,此时需要用到格式符,常用格式符如下

对于格式符的输出宽度和浮点数的小数位我们可以进行精确的控制
//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) {
int a=16;
float b=79.3f;
printf("[a=%4d]\n",a);
printf("[a=%-4d]\n",a);
printf("[b=%10f]\n",b);
printf("[b=%.2f]\n",b);
printf("[b=%4.2f]\n",b);
return 0;
}
运行结果如下

从运行结果我们不难发现格式符%前的正数可以设置前端补齐,负数设置后端对齐,如果数据的总长度超过设置的修饰长度,则按照实际长度显示;小数点后的整数用于控制小数点后保留小数位的长度。
scanf()函数
scanf()函数用于从标准输入设备接收输入数据
//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) {
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);//此时需要输入:1,2,3 然后回车
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
对于scanf()函数我们需求强调几点
- 参数接收以回车进行结束操作
- 如果需要接收多个参数,多个参数之间的分隔符是任意的,但是如果分隔符是“空格”则实际输入的时候分隔符可以使空格、tab和回车(最后一个回车认为是结束符
黑马程序员_ C语言基础(二)的更多相关文章
- 黑马程序员_ C语言基础(一)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 开发过程: 编写->编译(只编译源文件,编译成*.o 只会检测语法是否合理,不会检测函数是 ...
- 黑马程序员_ C语言基础之指针(三)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...
- 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17
黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...
- 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean
8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...
- 黑马程序员_高新技术之javaBean,注解,类加载器
----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...
- 黑马程序员_ JAVA中的多线程
------- android培训.java培训.期待与您交流! ---------- 尽管线程对象的常用方法可以通过API文档来了解,但是有很多方法仅仅从API说明是无法详细了解的. 本来打算用一节 ...
- JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典
总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...
- 黑马程序员_毕向东_Java基础视频教程——java语言组成部分(随笔)
java语言组成部分 Java是一种强类型语言,所谓强类型语言就是对具体的数据进行不同的定义.对类型的划分的十分细致,对内存中分配了不同大小的内u你空间 关键字 标识符 注释 变量和常量 运算符 语句 ...
- 黑马程序员_ Objective-c 之Foundation笔记(二)
NSArray NSArray的创建 NSArray *array = [NSArray arrayWithObject:@“jack”] 创建单个元素 NSArray *array3 = [NS ...
随机推荐
- grafana+graphit安装笔记
OS:MAC 10.11查看测试线运行demo请访问http://10.103.13.101:3000/dashboard/db/graphite-carbon-metrics?editorTab=O ...
- Nothing about semantics
Motivation fork a project in github, seriously. Candidates PasaLab / cichlid 80% Distributed RDFS &a ...
- ARP 扫描主机学习笔记
1.通用套接字地址结构与具体套接字地址结构之间可相互转化 1)通用转具体,某些函数将结果存储在通用套接字地址结构中,这时将通用转换为具体,具体通过访问成员名可以方便的得到结果. 2)具体转通用,为了消 ...
- test「Python」流程&中文
#例1 text='dShArpen骑草泥马在马勒隔壁玩Python时看到一群SB绿茶婊在逗逼,马上的他马上吓尿了' iftext = '马' for letter in text.decode('u ...
- Angularjs scope
$scope: var myapp = angular.module('myapp', []); myapp .controller('parent', function ($scope,$timeo ...
- Python 2x -> 3.x
Nowadays, Python 3 is becoming more and more popular than Python 2, but there are still a lot of cod ...
- 在shell script中进行数值运算的两种方法
方法1:使用"$((计算式))"的方式进行数值运算,不需要使用declare命令显示声明数值型变量来存储计算结果: 方法2:使用declare命令配合"-i"选 ...
- Linux 下如何安装软件
一.解析Linux应用软件安装包 通常Linux应用软件的安装包有三种: 1) tar包,如software-1.2.3-1.tar.gz.它是使用UNIX系统的打包工具tar打包的. 2) rpm包 ...
- TimeStamp
private void Form1_Load(object sender, EventArgs e) { textBox1.Text= GenerateTimeStamp(System.DateTi ...
- Quartz2D之生成圆形头像、打水印、截图三种方法的封装
我给UIImage类添加了一个类目,用于封装三个方法,每个方法都没有难度,做这个主要为了练习一下封装: 首先在类目.h文件中声明三个方法:以及创建了一个枚举.用于水印方法中设定水印位置:方法说明和参数 ...