第一个 C 程序
创建项目
Product Name : 产品名称/项目名称 (baidu)
Organization Name : 组织机构名称/公司名称 (百度)
Organization Identifier : 组织机构标识,一般填公司逆向名称 (com.baidu)
Bundle Identifier : 产品唯一标识 (设计上线之后,钱有关)
Language : 语言类型 (C、OC、Swift)
代码
// C语言程序是由很多"程序段"组成
#include<stdio.h>// 告诉系统printf函数在什么地方
int call()
{
return 0;
}
// command + b 将代码翻译为计算机能够识别的语言(0/1)
// command + r 在xcode中运行程序
int main()
{
call(); // 调用函数
// \n让输出的内容换行,固定格式
printf("hello world"); // 调用系统函数
return 0;
}
整个项目的细节
在左侧里面
有一个文件夹:Products 中 day01 是一个可执行文件 (默认时红色的)
需要通过代码 进行编译才能执行 (编译过后 变成了黑色)
可以通过show in finder (双击打开 是以终端打开)
会输出 hello worldlogout
练习
项目的执行流程
1.编写代码
2.编译____生成.o 目标文件
3.链接____与系统的函数库进行连接
4.生成一个 可执行文件.out
5.运行
创建多个项目
1.点击 蓝色项目
2.点击 同行的收缩按钮
3.在下面 点击加号 创建(TARGETS)即可
代码
#include <stdio.h>
int main() {
/*
printf(" *** ***\n");
printf("*********\n");
printf(" *******\n");
printf(" *****\n");
printf(" **\n");
*/
printf(" *** ***\n*********\n *******\n *****\n **\n");
return 0;
}
运行其它的项目
1.在左上角的停止键 的旁边 进行选择
开发中应该注意的地方
注意点
#include <stdio.h>
int main()
{
// C语言每一条语句后面都必须有;号
// C语言中除了""引起来的地方,其它`任何地方都不能出现中文
// main函数的 return 0; 可以写, 也可以不写
// main函数前面的int可以写,可以不写
// main函数后面的()不可省略
// 不要把main写错了
// 同一程序中只能有一个main函数
printf("lyh\n");
return 0;
}
关键字
1.关键字 都是小写
2.有特殊的颜色
3.C语言一共有32个关键字
————————————————————————————————————————————————————————————————————————————————————————-———————————————————————————————
# <数据类型 关键字>
# 1.基本数据类型(5个)
void : 声明函数 无返回值 或 无参数, 声明无类型
char : 字符型类型数据, 属性整形数据的一种
int : 整型数据, 通常为编译器指定的机器字
float : 单精度浮点型数据, 属性浮点数据的一种
double : 双精度浮点型数据, 数据浮点数据
# 2.类型修饰 关键字(4个)
short : 修饰int, 短整型数据,可省略被修饰的
long : 修饰int, 长整型数据,可省略被修饰的
signed : 修饰整型数据, 有符号数据类型
unsigned: 修饰整型数据, 无符号数据类型
# 3.复杂类型 关键字(5个)
struct : 结构体 声明
union : 共用体 声明
enum : 枚举 声明
typedef : 声明类型别名
sizepf : 得到特定类型 或 特定类型变量的大小
# 4.存储级别关键字(6个)
auto : 指定为自动变量,由编译器自动分配
static : 指定为静态变量,分配在静态变量区
register: 指定为寄存器变量,建议编译器将通过寄存器而不是堆栈传递数据
extern : 指定对应变量为外部变量,即标示变函数时在其它模块中寻找其定义
const : 与volatile合称"cv特性",指定变量不改变
volatile: 与const合称"cv特性",指定变量的内存中取得该变量的值
————————————————————————————————————————————————————————————————————————————————————————-———————————————————————————————
# <数据类型 关键字>
# 1.跳转结构(4个)
return : 用户函数体中, 返回特定值(或者是)
continue: 结束当前循环, 开始下一轮循环
break : 跳出当前循环或 switch结构
goto : 无条件跳转语句
# 2.分支结构(5个)
if : 条件语句,后面不需要放分号
else : 条件语句 否定分支(与if连用)
switch : 开关语句(多重分支语句)
case : 开关语句中的分支标记
default : 开关语句中的"其它"分支,可选
# 3.循环结构(3个)
for : for循环结构,for(1;2;3)4;的执行顺序为程序中,表达式1只计算一次,表达式2和表达式 执行页可以能一次都不执行
do : do循环结构, do 1 while(2);的执行顺序
while : while循环结构, while(1)2;的执行顺序
表达式为真,则继续循环, 为假则跳出循环
————————————————————————————————————————————————————————————————————————————————————————-———————————————————————————————
#include <stdio.h>
int main() {
// insert code here...
printf("Hello, World!\n");
return 0;
}
标识符
1. '标识符' 就是程序员自己在程序中起的一些名字
2. '不能' 与关键字名字 '相同'
3. 标识符的作用: 用来区分我们的函数和名字
4. 标识符的命名规则:
# 1. 只能由26个英文字母的大小写、10个阿拉伯数字0-9、下划线_组成
# 2. 严格区分大小写,比如test和Test是2个不同的标识符
# 3. 不能以数字开头
# 4. 不可以使用关键字作为标识符
#include <stdio.h>
int text()
{
return 0;
}
int Text()
{
return 0;
}
int main() {
// insert code here...
printf("Hello, World!\n");
return 0;
}
标识符的命名规范 (可以遵守\可以不遵守)
命名规范
1. 起一个有意义名字,能够提高代码的可读性
2. 驼峰命名(除了第一个单词后面每个单词首字母大写) 如 sendMessage
3. 下划线 如: send_message
#include <stdio.h>
int sendMessage() // 驼峰
{
return 0;
}
int send_message() // 下划线
{
return 0;
}
int faxinxi() // 拼音
{
return 0;
}
int faMessage() // 拼音+英文
{
return 0;
}
int dasdhasdjkh() // 大牛
{
return 0;
}
int main() {
// insert code here...
printf("Hello, World!\n");
return 0;
}
注释
// 注释是在所有计算机中都是非常重要的一个概念,从字面上看,就是注释,解释的意思
// 单行注释
// 单行注释 有自己的作用范围,范围就是从第二个斜线开始,一直到这一行的末尾
// 注释不会参与编译,也就是说注释不会被翻译为0和1
/*
多行注释
与/星 开头
以星/ 结尾
*/
// 多行注释有自己的作用范围,范围就是从/星开始,一直遇到第一个星/为止
# XCode 9 快捷键
# 在有 '-(void)' 方法的地方 option + command + /
#include <stdio.h>
// 程序一启动就回自动调用名称叫main的函数
/*
该方法用于根据一个电话号码发送一条信息
其中num就是电话号码
*/
int sendMessageWithNumber (int num)
{
return 0;
}
int main() {
printf("11111!\n");
printf("22222!\n");
printf("33333!\n");
printf("44444!\n");
printf("55555!\n");
return 0;
}
注释的注意点
# 注释的注意点
/*
需要注释的内容
*/
————————————————————————————————————————
# 1.单行注释可以嵌套多行注释
/* 需要注释的内容 */
————————————————————————————————————————
# 2.单行注释潜逃多行注释的时候,多行注释必须在同一行内
/*
需要注释的内容
*/
————————————————————————————————————————
# 3.多行注释可以嵌套单行注释
/*
需要注释的内容
*/
————————————————————————————————————————
# 4.多行注释不能嵌套多行注释
/*
/*
需要注释的内容
*/
*/
————————————————————————————————————————
# 一般情况下,建议初学者,在刚开始学习编程的时候 先写注释再写代码
数据及数据类型
数据
# 数据类型
{
# 1.静态的数据
:一般指的是永久性的数据,一般存储在硬盘中。
(文档、照片、视频) 计算机重启,还会存储在磁盘上。
# 2.动态的数据
:动态数据指程序运行过程中, 动态产生的临时数据。一般存储在内存中。
开启一个网页:输入一些搜索 比如:今天天气 其中今天天气就是 动态数据 重启电脑 动态数据就不在了
# 3.静态跟动态的区别
静态 存在 磁盘
动态 存在 内存
内存的 读写速度 远远大于 磁盘的 读写速度
# 4. 静态数据 转成 动态数据
比如: 播放视频 通过 播放器 播放 (静态数据 转成 动态数据)
# 5. 动态数据 转成 静态数据
比如:手机拍照 保存 到手机磁盘
# 6. 数据的计量单位
静态数据 占用 磁盘空间
动态数据 占用 内存空间
1 B (Btye 字节) = 8 bit(位)
1 KB = 1024 B
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
}
# C语言数据类型概述
{
# C语言有4种数据类型
# 1. 基本类型
[
1.1 整型
短整型 (short)
整型 (int)
长整型 (long)
1.2 字符型
char
1.3 实型
单精度 float
双精度 double
]
# 2. 构造类型
[
2.1 数组
2.2 结构体
2.3 枚举
2.4 共用体
]
# 3. 指针类型
# 4. 空类型
void
}
常量
1. 整型常量
2. 实型常量
3. 字符常量
{
字符的特殊情况
'\n' 换行,相当于敲一下回车。
'\t' 跳到下一个tab位置,相当于按了一下键盘上的tab键。
\b 退格,相当于按了一下backspace
'\r' 回车。
'\f' 换页,光标移动到到下页开头。
'\\' 输出\字符,也就是在屏幕上显示一个\字符。
'\'' 输出'字符,也就是在屏幕上显示一个'字符。
'\"' 输出"字符,也就是在屏幕上显示一个"字符。
'\ddd' 1位到3位八进制数表示的字符。
[
如:\376, 则屏幕上显示一个黑块的方块。
\xhh, 1位到2位十六进制数表示的字符。其中x不能丢了
]
}
4. 字符串常量
5. 自定义常量
#include <stdio.h>
int main() {
// 整型常量
10;
// 实型常量(小数)
// 单精度float / 双精度 double
// 注意: 默认情况下 编写的小数 都是双精度
10.1;// 双精度double
88.8;// 双精度double
5.2f; // 单精度float
// 字符型常量,用单引号括起来的就是字符型常量
// 注意:字符型常量的单引号只能写一个字符,如果写多个会报错
'a'; // 字符型常量
'ab';// 错误
'1';
'12';// 错误, 12是由两个字符组成, 由1和2组成
// '李';// 错误写法,因为一个汉字占3个字节
// 字符型常量的特殊情况, 在C语言中,系统给某些字符的组合定义了特殊的函数,这些字符的组合可以当做单个字符来使用
'\n'; // 回车 换行
// 字符串型常量, 用双引号括起来的就是字符串型常量
// 注意: 无论你用双引号扩起来了几个字符串,只要使用双引号括起来的都是字符串常量
"abc";
"a";
// 自定义常量
const int NUM = 998;
return 0;
}
变量
- 1.什么是变量
表示的数据是可以经常修改的。当一个数据的值需要经常改变或者不确定时,就应该用变量表示。
- 2.如何定义变量
定义变量(声明),任何变量在使用之前,必须先进行定义。
定义变量的目的:在内存中分配一块存储空间给变量,方便以后存储数据。
如果定义了多个变量,就会为这多个变量分别分配不同的存储空间。
#include <stdio.h>
int main()
{
// 1. 申请一块存储空间, 也就是定义一个变量
// 定义变量的格式: 数据类型 变量名称
// 定义一个基本数据类型的变量
// int float double char
int number; // 定义了一个名称叫做number的变量
// 会在内存中开辟一块存储空间给number, 用于存储数据
int value; // 定义了一个名称叫做value的变量
// 会在内存中开辟一块存储空间给value, 用于存储数据
return 0;
}
变量的初始化
# 1.什么是变量
表示的数据是可以经常修改的。当一个数据的值需要经常改变或者不确定时,就应该用变量表示。
# 2.如何定义变量
定义变量(声明),任何变量在使用之前,必须先进行定义。
定义变量的目的:在内存中分配一块存储空间给变量,方便以后存储数据。
如果定义了多个变量,就会为这多个变量分别分配不同的存储空间。
#include <stdio.h>
int main()
{
/*
// 1. 申请一块存储空间, 也就是定义一个变量
// 定义变量的格式: 数据类型 变量名称
// 定义一个基本数据类型的变量
// int float double char
int number; // 定义了一个名称叫做number的变量
// 会在内存中开辟一块存储空间给number, 用于存储数据
int value; // 定义了一个名称叫做value的变量
// 会在内存中开辟一块存储空间给value, 用于存储数据
*/
/*
// 连续定义,如果多个变量都是相同类型的,那么可以采用连续定义
int number, value;
// 如何往变量对应的存储空间当中存储数据
// 注意: 变量中不能随便存储数据, 只能存储与之对应的数据
// 概念: 变量的第一次赋值, 我们称之为初始化, 注意, 要想使用变量都必须对变量进行初始化,然后才能够使用。
// 如果不对变量进行初始化, 那么其实变量中存储的是一些垃圾数据
number = 10; // 会将等号右边的数据放到数据放到等号左边的变量对应的存储空间中
// 如何使用变量
// 占位符号, %号是占位符号的启动起始符号
printf("%i\n",number);
float floatValue; // 定义了一个实型的变量
floatValue = 10.1f; // 往floatValue对应的存储空间中存储了10.1这个值
printf("%f\n",floatValue);
*/
// 初始化的两种方式
/*
// 1.先定义再初始化
int number;
number = 10;
// 2.定义的同时初始化
int value = 10;
*/
// 3.完全初始化
// int number, value ;
// number = value = 10;
int number;
number = 10;
int value;
value = number;
// 4.部分初始化
// int number, value = 10;
return 0;
}
变量的作用域
本小节知识点:
1.【掌握】变量的作用域
2.【掌握】局部变量
3.【掌握】全局变量
4.【掌握】常见错误
变量的作用域
C语言中所有变量都有自己的作用域,申明变量的类型不同,其作用域也不同。
C语言中的变量,按照作用域的范围可分两种,即局部变量和全局变量。
局部变量
局部变量也称之为内部变量。
局部变量是在函数内作定义说明的。
其作用域仅限于函数内(代码块),离开该函数后再使用这种变量是非法的。
#pragma mark 变量的作用域
/**
1. 什么是局部变量
定义在函数的都是局部变量
2. 什么是全局变量
定义在函数的外面
*/
#include <stdio.h>
int call()
{
int number; // 定义变量
return 0;
}
int value; // 全局变量
int main()
{
/*
// number = 10;
int number; //变量有自己的作用域
// 变量的作用域 从定义的哪一行开始,一直到大括号结束或者遇到return为止
number = 10;
printf("%i\n", number);
return 0; // 结束函数,只要执行到return 就 和执行到{}一样,代表着函数结束了
*/
// call();
// number = 50;
/*
{
int number;
}
number = 50;
*/
/*
int number;
{
// 自己没有 找爸爸
number = 10;
printf("%i\n", number);
}
*/
int number;
// int number; 同意范围内不能出现同名的变量
{
// 1. 如果自己对应的范围中有,就使用自己的
// 2. 不同的范围可以有相同名称的变量
int number;
number = 10;
printf("%i\n", number); // 10
}
printf("%i\n", number); // 有可能输出0 有可能输出随机一个数
return 0;
}
变量内存分析
1. 字节和地址
内存就是字节,内存以“字节为单位”
2. 变量的存储 占据的存储空间
一个变量所占用的存储空间,不仅跟变量类型有关,而且还跟编译器环境有关。同一种类型的变量,在不同编译器环境下所占用的存储空间又是不一样的
* 所占用字节数跟类型有关,也跟编译器环境有关
* 内存由大到下寻址
* 变量存储单元的第一个字节的地址就是该变量的地址
* 任何变量在内存中都是以二进制的形式存储。一个负数的二进制形式,其实就是对它的正数的二进制形式进行取反后再+1(取反的意思就是0变1,1变0)
编译器
类型 16位 32位 64位(只关注64 因为是Mac都是64位的)
char 1 1 1
int 2 4 4
float 4 4 4
double 8 8 8
short 2 2 2
long 2 2 2
long long 2 2 2
void* 2 4 8
- 代码
#import <Foundation/Foundation.h>
int main()
{
// 内存寻址从大到小 , 如果按照这种规则,那么先定义的变量内存地址一定大于后定义的变量
/**
* 比如当前地址有 0ffc1~0ffc16
*/
int number = 0; // 0ffc13~0ff16
int value = 0; // 0ffc9~0ff12
// 如何获得变量的详细地址(变量地址),&变量名称
// 利用%p展位符来打印变量的详细地址
// 输出的是一个十六进制的数
// a/b/c/d/f/j
// 10/11/12/13/14/15
// 10/11/12/13/14/15
printf("%p\n",&number);// 先定义的 内存地址越大
printf("%p\n",&value);
return 0;
}
printf 输出
printf 输出
* printf
* 折叠代码快捷键 : command + option + 方向键
* 单行注释的快捷键: command + /
* 1. 指定位宽
* 2. float 有效位只有7位 <包含了整数部分>
* 3. double 有效位有15位 <包含了整数部分>
* 4. 提升比格 输出的实型 类型 不确定 使用%.*f * 就是代表要输出的几个小数位
#include <stdio.h>
int main()
{
/*
int number = 10;
int value = 20;
printf("%i,%i\n",number, value);
float floatValue = 10.1f;
printf("%f\n",floatValue);
char charValue = 'a';
printf("%c\n",charValue);
double doubleValue = 9.9;
printf("%lf",doubleValue);
*/
/*
// 1.指定位宽
// 如何指定位宽? %mi; // 其中m就是位宽 而i输出对应类型的数据
// 默认情况下位宽是右对齐,如果需要输出的类型宽度不够,会在左边补空格
// 如果在位宽前面加上-号, 就会改变位宽的对齐方式为左对齐,如果需要输出的类型不够,会在右边补空格
// int number = 99;
// printf("%5i!!!\n",number);
// printf("%-5i!!!\n",number);
// 注意: 如果制定了位宽,但是实际输出的内容超出了宽度,会按照实际的宽度来输出
// int number = 9999;
// printf("%2i\n",number);
// 可以在位宽前面加上0,如果输入的内容不够就会用0来补,如果宽度已经够了, 那么会按照实际的宽度输出
int number = 1;
// 01
// 2015-05-05
printf("%02i\n",number);
*/
/*
// 2. 保留位数
// %f 默认会保留6位小数
// 指定保留多少位小数: %.nf , 其中n就是需要保留多少位小数,f用于输出实型
float floatValue = 3.14;
printf("%f",floatValue);
*/
/*
// 3. %f 各种坑
// 为什么指定保留10位之后还不对呢 因为float类型有效位数是7位
// 如何计算有效位? 从第一个开始计算
// 如果输出的数据超出了有效位数,那么就会出现一些垃圾数据
float floatValue = 3.1415966255f; // 3.141596 5557
printf("%.10f\n",floatValue); // 默认情况保留6位
// 如果想完整的输出 那么必须将数据保存为double类型,因为都double类型的有效位是15位
double doubleValue = 3.1415966255;
printf("%.10lf\n",doubleValue);
*/
// 如何提高比格
float floatValue = 3.1415926;
printf("%.*f\n",2,floatValue);
printf("%.*f\n",5,floatValue);
return 0;
}
scanf 输入 - 代码
#include <stdio.h>
int main()
{
/*
// 要求: 存储用户输入的整数
// 1.用户输入的整数确定吗? 不确定
// 2.如何接受用户输入的整数? scanf函数
// scanf格式: scanf("格式化字符串",列表项); --> scanf("%i", 变量);
// 1.定义变量
int number;
// 2.利用scanf函数接受用户输入的数据
scanf("%i",&number);// 注意:必须告诉scanf函数变量的详细地址,才能存储用户输入的数据 // 如果您给一个房间,不给地址。他怎么知道这个房间在哪里
// 3.输出接收到的数据
printf("number = %i\n", number);
*/
/*
// 要求从控制台接收用户输入的两个整数,然后计算两个整数的和
// 0.提示用户输入数据
printf("亲,请输入第一个数字,已回车键结束\n");
// 1.定义两个变量保存用户输入的数据
int num1, num2;
// 2.利用scanf接收用户输入的数据
// 2.1 接收第一个数
scanf("%i",&num1);
printf("亲,请输入第二个数字,已回车键结束\n");
scanf("%i",&num2);
// 3.将接收到两个相加
int result = num1 + num2;
// 4.输入两个数验证结果
printf("result = %d\n", result);
*/
/*
int num1, num2;
num1 = num2 = 10;
printf("num1 = %i, num2 =%i",num1,num2);
*/
/*
// 0.提示用户输入数据
printf("亲,请输入两个数字,已回车键结束\n");
// 1.定义两个变量保存用户输入的数据
int num1, num2;
// 2.利用scanf接收用户输入的数据
// 注意: 利用scanf接收多个数据的时候,输入的内容要求和"格式化字符串"中的一模一样
// 如果输入的数据与格式化字符串中的不匹配,那么scanf函数会自动终止
// scanf("%i,%i",&num1, &num2);
// 如果多个数据之间没有其他字符,那么可以利用 空格, 回车,table来作分隔
// 但是,如果格式化字符串中有%c除外
// scanf("%i%i",&num1, &num2);
char charValue;
// 输入 : 123->num1 a-->charValue, 456-->num2
// 技巧 : 无论想接受什么类型的数据,只要有需要一次性接收多个,就给每一个数据之间加上固定的符号作为分隔符(例如:,)
scanf("%i,%c,%i",&num1,&charValue,&num2);
// 3.将接收到的两个数相加
// int result = (num1 + num2);
// 4.输出两个数验证结果
// printf("result = %d",result);
printf("num1 = %i , char = %c, num2 = %i",num1,charValue,num2);
*/
int number, number2;
// \n 代表换行
// 如何告诉scanf函数输入完毕? 回车 == \n
// 因为回车是scanf的结束符,所以不能scanf的格式化字符串末尾协商\n
// 如果不小心把\n放到了scanf格式化字符串的末尾,也可以破,原样输入 或输入一个不匹配的
scanf("%i\n%i\n",&number,&number2);
printf("number = %i , number2 = %i\n",number, number2);
return 0;
}
scanf函数的实现原理
快捷键
添加断点: command +\
利用scanf从输入缓存区中获取用户输入的数据
中只要类型不匹配,那么scanf函数的函数就会自动结束,并且不会修改对应的变量的值。也不会取走输入缓存区中保存
#include <stdio.h>
int main()
{
// 1. 提醒用户
// printf("请输入两个整数,整数之间用逗号隔开,使用回车结束\n");
// 2.定义变量保存用户输入的数据
int num1, num2;
char charValue;
// 3.接收用户输入的数据
// num1 = 123, charValue = + ,num2 = 456;
scanf("%i%c%i",&num1,&charValue,&num2);
// 4.求差
// int result = num1 - num2;
// 5.输出验证
// printf("result = %i\n",result);
printf("num1 = %i, charVlaue = %c, num2 = %i",num1,charValue,num2);
// 用户输入 --> 输入缓存区 --> scanf
char charValue2;
int num3;
scanf("%c%i",&charValue2 ,&num3);
printf("charValue2 = %c,num3 = %i",charValue2,num3);
//
return 0;
}