C learning_2

简介: C learning_2

1.数据类型


       在计算机中,不同的数据在内存中占用不同大小的存储单元,而且它们所能表示的数据的取值也不同,为了方便我们在计算机中存入不同数值的数据,于是引入了数据类型。


例如:20   - 整数 - 整型   - int


         25.2 - 小数 - 浮点型 - flaot、double

char        //字符数据类型
short       //短整型
int         //整形
long        //长整型
long long   //更长的整形
float       //单精度浮点数
double      //双精度浮点数


在C99中还引入了 _Bool - 布尔类型 和 long doubel - 长双精度浮点型


2.数据类型的大小


 在现实生活中,我们放书都要放在某个格子里面。数据也是如此,数据想要存储,就需要在计算机的内存中开辟一段空间,至于开辟空间的大小,就取决于该数据存储时的数据类型。


"%d" - 以十进制的形式打印数据。


sizeof - 操作符 - 计算数据类型在计算机中所占内存空间的大小 - 单位是字节

#include <stdio.h>
int main()
{
    printf("%d\n", sizeof(char));//1
    printf("%d\n", sizeof(short));//2
    printf("%d\n", sizeof(int));//4
    printf("%d\n", sizeof(long));//4
    printf("%d\n", sizeof(long long));//8
    printf("%d\n", sizeof(float));//4
    printf("%d\n", sizeof(double));//8
    printf("%d\n", sizeof(long double));//8
    return 0;
}


计算机中的单位:

//计算机中的单位:
  /*
    bit 比特位
    Byte 字节 = 8 bit
    KB = 1024 Byte
    MB = 1024 KB
    GB = 1024 MB
    TB = 1024 GB
    PB = 1024 TB
  */
//计算机识别的是 二进制 0/1
//而十进制则是  0/1/2/3/4/5/6/7/8/9


这里很奇怪,为什么sizeof(int) 和 sizeof(long)大小一样呢?难道整型和长整型是一样的吗?


其实C语言标准规定:


       sizeof(int) <= sizeof(long)


       这里取4是由于我们当前是32位平台,在64位平台上它就是8啦。


这里我们详细了解一个变量创建的过程


3.变量和常量


常量:在程序中不能改变的其值的量。按照类型划分有以下几种:整型常量、实型常量、字符型常量、字符串字面量、枚举常量。


变量:变量不同与常量,其值在程序执行的过程是可以变化的。


定义变量的形式为:类型 变量名    

int mian()
{
  //定义变量的形式为:类型 变量名
  //定义年龄变量
  int age;
  //定义体重变量并赋予初值
  float weight = 66.6f;
  //这里 66.6f 带 f 是因为 66.6 在编译器中默认是double类型,加上f后就成为float类型
  return 0;
}


4.变量的命名


1.只能由字母(包括大写和小写)、数字和下划线( _ )组成。

2.不能以数字开头。

3.长度不能超过63个字符。

4.变量名中区分大小写的。

5.变量名不能使用关键字。


5.局部变量和全局变量


int a = 100;//全局变量 - 代码块外
int main()
{
  int a = 10;//局部变量 - 代码块外
  printf("%d\n", a);
  return 0;
}


此时输出的值为多少呢?100?还是10?


输出结果为10,printf优先选择最近的变量a的值,可以理解为"局部遍历优先原则"。


6.printf和scanf的使用方法


scanf 和 printf,库函数 - C语言编译器提供的现成的函数,直接可以使用。使用的时候要包含头文件stdio.h。


1.scanf的作用是输入数据,数据从键盘读取到内存中。

函数原型是:  int scanf( const char *format [,argument]... );


2.printf的作用是输出数据,数据从内存打印(输出)到屏幕上

函数原型是:int printf( const char *format [, argument]... );


这里的const char *format就是格式,以下是常见的格式:

//%c - 字符
//%d - 整型
//%s - 字符串
//%f - 单精度浮点数
//%lf - 双精度浮点数
//%p - 地址的打印
#include<stdio.h>
int main()
{
  //输入并输出一个整数
  int a = 0;
  scanf("%d", &a);// - 取地址a - 取出a的地址
  //%d - 输入的格式
  //&a - 这里需要的是地址,表示存放在哪里
  printf("%d", a);
  //%d - 输入的格式
  //a - 这里变量,表示从内存中拿到数据
  //输入并输出一个字符
  char ch = 0;
  scanf("%c", &ch);
  printf("%c", ch);
    return 0;
}


7.变量的使用以及scanf使用问题


先来看一段代码

#include<stdio.h>
int main()
{
  //写一个代码,求两个整数的和
  int num1 = 0;
  int num2 = 0;
  int sum = 0;
  //输入两个整数的和
  scanf("%d %d", &num1, &num2);
  sum = num1 + num2;
  printf("%d\n", sum);
  return 0;
}



此时程序出现错误了,但是我们的代码没有什么问题呀!为什么呢?这是因为在vs2022中该函数不安全,为了代码的跨平台性,我们仍然要使用scanf函数。


解决办法:


1.#define _CRT_SECURE_NO_WARNINGS 1

2.#pragma warning(disable:4996)


输入上面两个任何一个就可以使程序正常运行了。


8.变量的作用域和生命周期


作用域


       作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。


1. 局部变量的作用域是该局部变量所在的局部范围。

#include<stdio.h>
int main()
{
  {
    int a = 100;// - 局部变量
    printf("%d", a);//a在其作用域内可正常使用
  }
  //printf("%d", a);
  //此时程序报错:error C2065: “a”: 未声明的标识符
  //证明a变量出了作用域就不可以使用 - a在出作用域后就被释放了
  //当我们把修改一下:
  /*
    int a = 100;
    {
    }
    printf("%d", a);
  */
  //此时变量a又可以使用了
    return 0;
}


2. 全局变量的作用域是整个工程。


不同的源文件定义的变量一定不要重名。

#include<stdio.h>
int a = 20;//全局变量
extern int b;//声明外部文件的变量
void test()
{
  //test函数使用变量a - 可以打印a的值
  printf("2--->%d", a);
}
int main()
{
  //main函数使用变量a - 可以打印a的值
  printf("1--->%d", a);
  test();//调用自己创建的函数test
  //调用新建源文件test.c的变量b
  printf("test.c-->%d", b);
  //此时也报错了,是不是不能用呢
  //其实不是 - 此时错误是error C2065: “b”: 未声明的标识符 -\
  而不是未定义的标识符 - 说明变量已经存在 - 只需声明即可 - 声明外部符号\
  extern - 声明外部文件的关键字
  //此时就可以运行出b的值了
    return 0;
}


生命周期


       变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段


1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。

#include<stdio.h>
int main()
{
  {
    int a = 1;
    int b = 2;
    int c = a + b;
    printf("%d", c);
    //在这范围内是变量a,b,c的生命周期
  }
  //执行顺序是:
  //进入主函数
  //创建变量a,为其分配内存空间,存放数据1
  //创建变量b,为其分配内存空间,存放数据2
  //创建变量c,为其分配内存空间,存放数据a+b
  //打印
  //销毁变量a,b,c的空间,a,b,c就不能使用 - 把空间还给操作系统
  //结束main函数
  //变量创建的本质:在内存中开辟一段空间,存放数据
    return 0;
}


2. 全局变量的生命周期是:整个程序的生命周期。

#include<stdio.h> 
int a = 0;//全局变量
int main()
{
  //此时变量a的生命周期就是程序的生命周期
  //两者共存亡
    return 0;
}


9.常量


C语言中的常量分为以下以下几种:


1.字面常量

3、3.14、'a'、"abcdef"


2.const 修饰的常变量

#include<stdio.h>
int main()
{
  //a是变量
  //int a = 3;
  //const修饰常变量a - a具有常属性 - 不能改变 -\
  本质还是变量
  const int a=3;
  printf("%d\n", a);
  //a = 10;//error
  //此时报错:左值指定 const 对象
  printf("%d\n", a);
  int n = 10;
  int arr[n];
  //error
  //数组 arr[] 的[]内容必须是常量表达式或者常量
  const int n = 10;
  int arr[n];
  //error
  //数组 const修饰的仍然是变量 - 常变量
  return 0;
}


3.#define 定义的标识符常量

#include<stdio.h>
//#define 定义的标识符常量
#define SIZE 10
int main()
{
  int a = SIZE;
  int arr[SIZE] = { 0 };
    //#define 定义的标识符常量 - 彻彻底底的常量
  return 0;
}


4.枚举常量

#include<stdio.h>
//枚举常量
//枚举 - 一一列举
//生活中有些值是可以意义列举的
//三原色:红、绿、蓝
enum COLOR
{
  //列举了枚举类型enum COLOR的可能取值
  RED,
  GREEN,
  BLUE
};
int main()
{
  //RED = 5;//不可修改 - 枚举常量
  printf("%d", RED);//0
  printf("%d", GREEN);//1
  printf("%d", BLUE);//2
  return 0;
}
相关文章
|
5月前
|
机器学习/深度学习 传感器 自然语言处理
Deep Learning
【6月更文挑战第7天】
39 2
|
5月前
|
机器学习/深度学习 数据采集 人工智能
Supervised Learning
【6月更文挑战第7天】
46 2
|
6月前
|
编译器 C语言
C learning_1
C learning_1
|
6月前
|
算法 C语言 数据安全/隐私保护
C learning_6
C learning_6
|
6月前
|
存储 缓存 安全
C learning_4
C learning_4
|
6月前
|
存储 C语言 C++
|
6月前
|
C语言
|
6月前
|
存储 API 数据安全/隐私保护
C learning_7
C learning_7
|
6月前
|
存储 算法 Unix
C learning_8
C learning_8
|
6月前
|
存储 安全 程序员
C learning_5
C learning_5