天天看点

IOS之c语言笔记 day01day01

day01

c语言基础

常用快捷键

shift 切换中英文
windows 相当于mac中的command
command + q 退出程序
command + c 复制
command + v 粘贴
mac中enter重命名

mac中常用指令
./ 当前目录
../ 上一级目录
/ 根目录
mkdir 创建目录
rm 删除目录
touch 创建文件
open 打开文件
pwd 显示当前路径
ls -l 查看当前目录中的所有文件及目录
ls 查看
           

XCode显示行号

XCode - preference - TextEditing - show line numbers
           

Mac安装CommandLineTools

方式一
    终端安装:
      sudo xcode-select --install

 方式二
    finder--GOTO-/System/Library/CoreServices --打开 Install Command Line Developer Tools.app
           

程序的编译链接运行

编译
cc -c .c(file) --->> soure to .o
           
链接
cc .o(file) --->> .o to .out
           
运行
./a.out(默认生成的就是这个)
           
编译+链接
cc .c(file)
           
运行
./a.out
           
编译+链接+命名 (把编译和链接生成之后的文件给删除掉了)
cc .c(file) -o a3.out
./a3.out 
           
编译+命名
cc -c .c(file) -o a3.o
cc a3.o
./a.out
           

经验收集

输出语句中有特殊的输出需要注意如下:
/
例:
printf("*********** \n /hello \n *********** \n");


编译只会检查源代码中的语法问题,编译失败不会产生.o文件
能编译不一定能运行,就要有警告信息就一定会编译不通过
           

关键字

是 c 语言提供特殊信义的符号,也叫"保留字"
关键字全部小写
在xcode中显示的是红褐色

标识符是程序员自定义的一些符号和名称
 例: 函数名称

关键字是c语言默认提供的符号,标识符是程序员自定义的

 只要给事物贴标识符,就可以根据这个来区分事物
           

命名规则

只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_组成

命名规范(最好遵守)

     尽量起个有意义的名称,比如一个完整的英文单词,别人一看这个名称就能才能这个标识符的作用。如果不懂英文,你也可以用拼音,尽量不要起像abcde、sfsdfsdf等这类看起来没有意义的名称
   如果标识符中含有多个单词,可以使用驼峰标识(除开第一个单词,后面每个单词的首字母都是大写):firstName、myFirstName,或者使用下划线_来连接:first_name、my_first_name
           

注释:

  • 解释代码
  • 单行注释 //
  • 多行注释

- 注释掉的内容不会参与编译,编译的时候会忽略注释

练习

1.c语言
#include <stdio.h>    
        int main()
        {
            printf("hello\n");
            return 0;
        }
           
2.java
class Demo{
            public static void main(String[] args){
                System.out.prinfln("hello");
            }
        }
           
3.objective-c(OC)
` #import <Foundation/Foundation.h>`   
        int main()
        {
            NSLog(@"hello");
            return 0;
        }
           

数据

- 静态数据: 一般都是以文件的形式存储在硬盘上

- 动态数据: 在程序运行过程中不断产生在临时数据。运行在内存中

1. 软件被关了 
2.设备被关了
内存的访问速度比硬盘访问的数据要快
程序是安装在硬盘运行在内存
  android 的三级缓存
加载: 内存-sd卡-网络
    下载: 网络-sd卡+内存
           
  • bit 比特位
    • Byte 字节
    • 01010100 = 1字节
    • 1KB = 1024B
    • 1MB = 1024KB
    • 1GB = 1024MB
    • 1TB = 1024GB

C语言的数据类型

- 基本数据类型

整数类型:int
    浮点类型: 
     单精度float(默认6位),以f结尾 
     双精度double
    字符型:char
           

- 指针类型

- 构造类型

把多种基本数据类型凑合成的一种新的类型`
           

- 指针类型

C语言中没有boolean类型可以使用int类型来模拟
   0 暂停 
   1 开始
           

常量

就是些固定的数据
 存储经常变动的不确定的数据
 变量就是代表  内存中的一块存储空间
  定义变量的目的是为了在内存中申请一块内存空间(地址空间)
           

常量类型的分类:

整数类型、浮点类型、字符类型('')、字符串类型("")
  只要有不确定的数据就应该定义变量来保存
           

变量的定义

变量类型 变量名;
  变量在定义之后在内存中就有存储空间了
           

类型的作用

限定变量在内存空间中申请的空间大小(类型不同申请的内存空间不同),节省内存空间

int: 4 Byte

char: 1 Byte

变量的输出

  • 浮点型: %.nf .n小数的位数
  • 浮点默认是6位小数
  • 整数类型使用%d/%i都是可以的
  • 点位符位置的数据使用常量也是可以的

练习

int score = 100;<br/>
    float f = 32.5f;<br/>
    double d = 3.1415926;<br/>
    char name = 'c';<br/>
    printf("score:%d\n",score);<br/>
    printf("f:%.2f\n",f);<br/>
    printf("d:%.10f\n",d);<br/>
    printf("name:%c\n",name);<br/>     
    score:100<br/>
    f:32.50<br/>
    d:3.1415926000<br/>
    name:c<br/>
           

变量的作用域

变量在函数中的作用域

1.作用域(作用范围)
从变量定义的那一行开始,一直到所在的代码块结束<br/>
分配存储空间也是从定义变量的那一行开始分配的
           
2.代码块
及时回收不再使用的变量,为了提升性能<br/>
   代码块: 限制代码的作用域
           
3.不同类型所占据的存储空间(64位编译器)
char 1
int 4
float 4
double 8    
           

练习:交换两个变量的值(两种方式)

第一种方式(需要定义新的变量)
/*
 a = 10
 b = 11
 交换之后
 a -> 11
 b -> 10
 原理:
 交换两个杯子中的水
 */

int main()
{
    // 交换之前
    int v1 = 10; 
    int v2 = 20;
    printf("change before:%d\n",v1);
    printf("change before:%d\n",v2);

    // 第一种交换方式
    // 交换之后
    int tmp = v1;
    v1 = v2;
    v2 = tmp;
    printf("change after:%d\n",v1);
    printf("change after:%d\n",v2);
    return 0;

}
           
第二种方式(不需要定义新的变量)
/*
 a = 10
 b = 11
 交换之后
 a -> 11
 b -> 10
 原理:
 交换两个杯子中的水
 */
int main()
{
    int v1 = 10;
    int v2 = 20;
    printf("v1 change before:%d\n",v1);
    printf("v2 change before:%d\n",v2);

    // 第二种交换方式
    v1 = v2 - v1; // v1 = 20 - 10 = 10
    v2 = v2 - v1; // v2 = 20 - 10 = 10
    v1 = v1 + v2; // v1 = v1 + v2 = 20

    printf("v1 change after:%d\n",v1);
    printf("v2 change after:%d\n",v2);
    return 0;

}
           

scanf函数

  • printf 输出到终端
  • scanf 接收终端用户的输入
内存以以”字节为单位”
1个字节8位
  1GB=1024MB=1024*1024KB=1024*1024*1024B
 每个字节都有自己的内存地址,根据内存地址就能找到对应的字节
 相临字节的内存地址是连续的
 内存地址是十六进制的 0x
           
不同类型占用的字节是不一样的,数据越大,所需要的字节数越多
  • 内存寻址:内存寻找自己的地址
  • 内存分配的时候是从大到小进行分析。(优先分配大的地址给变量)
  • &地址运算符,取得变量在内存中的地址

总结

    1. 内存寻址由大到小,优先分配内存地址比较大的字节给变量
    1. 变量越先定义,内存地址就越大
    1. 取得变量地址:&变量名
    1. 输出地址:%p

java是强类型,变量定义未初始化不可以拿来使用

c是弱类型(变量定义直接拿来使用虽然不报错但是这样做是不对的)

scanf函数使用特点
  • scanf函数只接收变量的地址
  • scanf函数是一个阻塞式的函数,等待用户输入
  • 用户输入完毕后,就会将用户输入的值赋值给number变量
scanf练习
#include <stdio.h>
int main()
{
    // 1.定义两个变量记录用户的输入
    int num1,num2;
    // 2.提示用户输入
    printf("请您输入第一个数字\n");
    scanf("%d",&num1);
    printf("您输入的数字是:%d\n",num1);
    // 3.提示用户输入
    printf("请您输入第二个数字\n");
    scanf("%d",&num2);
    printf("您输入的数字是:%d\n",num2);
    printf("准备对结果进行计算...\n");
    // 4.计算两个数的和
    int sum = num1 + num2;
    printf("计算的结果:%d\n",sum);
    return 0;
}
           
其它练习总结
    1. 输入字符
    1. 一次性输入多个数值,并且以某些符号隔开
    1. 如果scanf参数中以空格隔开,实际输入可以以空格,tag,回车作为空格符
    1. scanf中不能写\n

输入多个字符练习:

int main()
{
    // 输入字符
    /*
    char c;
    scanf("%c",&c);
    printf("输入的字符:%c\n",c);
    */

    // 连续输入数字
    /*
    int num1,num2,num3;
    printf("请输入多个数字,以#隔开\n");
    scanf("%d#%d#%d",&num1,&num2,&num3);
    printf("num1 = %d,num2 = %d,num3 = %d\n",num1,num2,num3);
    */

    // 连续输入数字
    int num4,num5,num6;
    printf("请输入多个数字,以空格隔开\n");
    scanf("%d %d %d",&num4,&num5,&num6);
    printf("num4 = %d,num5 = %d,num6 = %d\n",num4,num5,num6);
    return 0;
}
           

结果展示

userdeMac:demos user$ ./a.out
请输入多个数字,以#隔开
25#33#47
num1=25,num2=33,num3=47
userdeMac:demos user$ cc scanf练习3.c 
userdeMac:demos user$ ./a.out
请输入多个数字,以空格隔开
44  22      35
num4 = 44,num5 = 22,num6 = 35
userdeMac:demos user$ ./a.out
请输入多个数字,以空格隔开
22
33
55
num4 = 22,num5 = 33,num6 = 55
           

继续阅读