学习C语言第二天

2020/7/2

永远不要假设计算机为你假设了任何前提(Never assume the computer assumes anything)。

变量

  • 程序运行中,数值可以变化的数据内存。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TtIGaIii-1594831557934)(D:/%E9%BB%91%E9%A9%AC/fzs%E7%9A%84%E7%AC%94%E8%AE%B0/day02%E7%AC%94%E8%AE%B0/1593654007990.png)]

  • 三要素:

    • 变量名
    • 变量类型
    • 变量值
int var = 10;
var =5;//数值变了

格式化输出in

printf("%d\n",var);

常量

  • 在程序运行中不允许修改。

  • 常量语法:

    • 数值常量:字符串常量“heillo”、字符常量‘a’、整形常量10、实型(浮点型)3.1415926

    • 宏定义常量

      #define MAX 100
      //#define 宏名 宏值
      
      //注意
      1、使用空格隔分,不使用 =
      2、没有;结束标志
      3、通常 宏名 为大写字符
      
    • const定义常量

      const int a = 10;

      限制a变量为可读,不可修改。

标识符

  • 标识符是变量和常量的统称。
  • 使用规范:
    • 语法规范:
      • 不能使用关键字、库函数名。
      • 只能使用字母、数字、下划线。
      • 只能字母或下划线开头,不能用数字开头。
      • 大小写区分。
    • 命名习惯
      • 通常采用大写 命名常量,小写命名 变量。
      • 较长时:
        • 大驼峰法: int ThisIsATestForVar = 10;
        • 小驼峰法:int thisIsATestForVar = 10;
        • 小写+下划线:int this_is_a_test_for_var =10;

C语言数据类型

计算机存储知识

  • 一个二进制,叫做一个比特位。 bit
  • 内存的最小单位为——内存单元-——一个字节 1byte = 8bit
  • 硬盘的最小单位为扇区——512字节 = 0.5KB.

sizeof关键字

  • 作用:用来求一个变量、数据类型占用的内存空间的大小 ——单位是字节
  • 方法:sizeof(int); int a = 10; sizeof(a);
  • 它不是函数,而是关键字。

整型

有符号整型

  • 能用来表示正负号的数据值。 ——摄氏度
整型名名称格式匹配符占用的大小最小值最大值
int整型%d4字节-21474836482147483647
short短整型%hd2字节-3276832767
long长整型%ldwindows: 32/64位:4字节; Linux下:32位:4字节、64位:8字节。-21474836482147483647
long long长长整型%lld8字节-92233720368547758089223372036854775807
  • 查看有符号整型的取值范围,要借助#include <limits.h>头文件使用其中的宏名
  • 各种类型占用的内存空间大小 使用sizeof关键字 32位程序中,使用 %u 显示空间大小
#include <stdio.h>
#include <limits.h>  // 此头文件中的 宏 记录着各种数据类型的 最大、最小值。

int main(void)
{
	// sizeof(int) 得到的大小应该为 4,该4的类型为 unsigned int。因此 用 %u显示。
	printf("int类型占用的内存大小:%u\n", sizeof(int));
	// sizeof(short) 得到的大小应该为 2,该2的类型为 unsigned int。因此 用 %u显示。
	printf("short类型占用的内存大小:%u\n", sizeof(short));
	printf("long类型占用的内存大小:%u\n", sizeof(long));
	printf("long long类型占用的内存大小:%u\n", sizeof(long long));

	printf("\n ----------------华丽分割线-----------------\n");

	// 查看各种数据类型的,取值范围
	printf("int:min = %d, max = %d\n", INT_MIN, INT_MAX);
	printf("short:min = %hd, max = %hd\n", SHRT_MIN, SHRT_MAX);
	printf("long:min = %ld, max = %ld\n", LONG_MIN, LONG_MAX);
	printf("long long:min = %lld, max = %lld\n", LLONG_MIN, LLONG_MAX);

	system("pause");
	return 0;
}

无符号整形

  • 数值没有负数,只有 ”数值“。 ——没有正负之 ——年龄
整型名名称
unsigned int无符号整型%u4字节04294967295
unsigned short无符号短整型%hu2字节065535
unsigned long无符号长整型%luwindows: 32/64位:4字节 Linux下:32位:4字节、64位:8字节。04294967295
unsigned long long无符号长长整型%llu8字节018446744073709551615
  • 求无符号整型,占用的内存大小和取值范围
#include <stdio.h>
#include <limits.h> 

// 获取无符号整型大小、取值范围
int main(void)
{
	//sizeof(unsigned int) 得到的大小为 4,该4的类型为 unsigned int。因此用 %u显示。
	printf("unsigned int内存大小:%u\n", sizeof(unsigned int));
	printf("unsigned short内存大小:%u\n", sizeof(unsigned short));
	printf("unsigned long内存大小:%u\n", sizeof(unsigned long));
	printf("unsigned long long内存大小:%u\n", sizeof(unsigned long long));

	printf("unsigned int:min=0, max = %u\n", UINT_MAX);
	printf("unsigned short:min=0, max = %hu\n", USHRT_MAX);
	printf("unsigned long:min=0, max = %lu\n", ULONG_MAX);
	printf("unsigned long long:min=0, max = %llu\n", ULLONG_MAX);

	return 0;
}

其他知识

  • 没有限定类型的整数,默认为 int 类型。c
123  // int ---- %dc
  • 可以使用后缀标识 指定的整数类型。
123U123u   	// unsigned int
123ul123UL  	// unsigned long
123ull123ULL // unsigned long long
123L123l  	// long

数值溢出

  • 参照日常生活中,小时、分钟、秒 理解数值溢出。

  • 种类:

    • 上溢出:最大值 + 1 ——> 最小值
    • 下溢出:最小值 -1 ——> 最大值
  • 当前我们所接触到的大多数系统的编译器,采用处理方式 : 无符号 和 有符号等同。

在这里插入图片描述

结论

  • 不允许在编写的C语言程序中,使用数值溢出的特性。—— 因为不同编译处理方式可能不同。
  • 在编写程序时,需要预见到数据溢出发现的可能性。—— 选择正确的数据类型使用。

字符型

  • 字符型:占用1字节大小。
    • 有符号:char
      • 专用格式匹配符:%hhd (通常用 %d 较多,%hd也可以用)
      • 取值范围:-128 - 127
    • 无符号:unsigned char
      • 专用格式匹配符:%hhu
      • 取值范围:0 ~ 255
        在这里插入图片描述

ASCII码

  • 是无符号的整数。取值范围 0 ~ 255。 常用 0 ~ 127
本质
  • 每个 char 类型的数据,本质都是一个 “数值”。该数值,称之为 ASCII 码。该数值 代表一个唯一的字符。
  • 给 char 变量赋值。查看:
    • 查看数值:%hhd、%d、%hd
    • 查看对应的字符:%c
      在这里插入图片描述
常用ASCII码
  • ‘0’ : ASCII 表值 为 48

  • ‘a’ : ASCII 表值 为 97

  • ‘A’ : ASCII 表值 为 65

  • ‘\0’ : ASCII 表值 为 0

  • ‘\n’ : ASCII 表值 为 10

  • ‘\t’ : ASCII 表值 为 9

  • 注意:

    • ‘a’ 字符 a 和 “a” 字符串 a—— 不同!
    • abc’ 既不是一个字符,也不是一个字符串——错误书写!

转义字符

  • ‘\’ 反斜杠,表示转义字符。
  • 转义字符的作用:
    • 将普通字符转换为特殊意义
      • 如: n —> \n, t —> \t, 0 —> \0
      • 将特殊字符转换为本身意。
        在这里插入图片描述

浮点型(实型)

常用浮点型

  • float:单精度浮点型。 %f 默认保留6位小数。 大小:4字节 —— sizeof(float) 可求。

  • double:双精度浮点型。%lf 默认保留6位小数。 大小:8字节—— sizeof(double) 可求。

float v1 = 3.14f;

// 不加 f, 直接 3.14, 默认为 double 类型。
  • loat 和 double 不存在 unsigned 类型。只有 有符号类型。
// 浮点型基本使用
int main(void)
{
	float v1 = 4.135324f;  
	double v2 = 1.45479802;

	printf("v1 = %.2f\n", v1);
	printf("v2 = %.3lf\n", v2);  // 保留3位小数,对第4位四舍五入。

	// 共显示8位数(包含小数点),不足8位用 空格 填充。保留3位小数,对第4位四舍五入。
	printf("v2 = %8.3lf\n", v2); 

	// 共显示8位数(包含小数点),不足8位用 0 填充。保留3位小数,对第4位四舍五入。
	printf("v2 = %08.3lf\n", v2);

	return EXIT_SUCCESS;
}

精度问题

  • 产生精度问题的原因:计算机底层实现浮点数时,采用的是 “近似值” 方法实现。

  • 浮点数取值范围,不需要讨论,因为精度问题。

  • 精度:c

    • float: 精度范围 6 ~ 7 位。
      • 整数部分 + 小数部分 <= 6位,准确。
      • 整数部分 + 小数部分 = 7位,可能准确, 也可能不准确。
      • 整数部分 + 小数部分 > 7位,准确率极低。
    • double:精度范围 15 ~ 16 位。
      • 整数部分 + 小数部分 <= 15位,准确。
      • 整数部分 + 小数部分 = 16位,可能准确, 也可能不准确。
      • 整数部分 + 小数部分 > 16位,准确率极低。
        在这里插入图片描述

隐式类型转换

  1. 由编译器自动完成的转换。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7zWAx8o-1594831557948)(day02%E7%AC%94%E8%AE%B0.assets/1593679273633.png)]

#define PI 3.1415f
int r = 3;
PI * r * r;  // 此表达式,将 float 类型 和 int 类型做运算。转换为 double 
//float 与float相互运算时,为避免丢失精度,结果类型提升为double类型

2.有赋值产生。

float s = PI * r * r; 
// 表达式为 double, s类型为 float。 当赋值时 将 double 类型转换为 float
  • 小数据类型 —> 大数据类型: 一定没问题。
  • 大数据类型 —> 小数据类型:可能没问题,也可能有问题。

在这里插入图片描述

强制类型转换

  • 强转变量 —— (目标类型) 变量名
  • 强转表达式 —— (目标类型) 表达式
#include <stdio.h>

int main(void)
{
	float price = 3.4;  // 黄瓜单价。

	int weight = 4;  // 斤数

	int sum1 = weight * (int)price;  // 强转变量
	printf("4斤黄瓜总价为:%d\n", sum1);

	int sum2 = (int)(weight * price);  // 强转 表达式
	printf("4斤黄瓜总价为:%d\n", sum2);

	return 0;
}

编程练习

1.使用 printf 结合 %d 格式匹配符,在屏幕上显示算式:10 + 20 = 30

#include <stdio.h>

int main(void)
{
	int a = 10, b = 20;
	printf("%d + %d = %d\n", a, b, a + b);
	return 0;
}

2.已知矩形长为 3.426, 宽为1.728。编写程序求矩形面积。要求输出面积结果,保留2位小数,对第3位做四舍五入

#include <stdio.h>

int main(void)
{
	float a = 3.426;
	float b = 1.728;
	printf("该矩形面积为:%.2f", a * b);
	return 0;
}

3.编写程序,依次输出int、short、unsigned int 、unsigned short 数据类型占用空间的大小,及的取值范围

#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf("int类型占用空间的大小为:%u\n", sizeof(int));
	printf("short类型占用空间的大小为:%u\n", sizeof(short));
	printf("unsigned int类型占用空间的大小为:%u\n", sizeof(unsigned int));
	printf("unsigned short类型占用空间的大小为:%u\n", sizeof(unsigned short));

	printf("int类型的取值范围为: %d -- %d\n", INT_MIN, INT_MAX);
	printf("short类型的取值范围为: %hd -- %hd\n", SHRT_MIN, SHRT_MAX);
	printf("unsigned int类型的取值范围为: %u -- %u\n", 0, UINT_MAX);
	printf("unsigned short类型的取值范围为: %hu -- %hu\n", 0, USHRT_MAX);
	return 0;
}

4.已知 ‘k’ 的ASCII码为107。编程,根据 ‘k’ 的ASCII码值,计算出 ‘o’ 的ASCII值,打印输出。

#include <stdio.h>

int main(void)
{
	char ch1 = 'K', ch2 = 'O';
	int cha = ch2 - ch1;
	printf("'o'的ASCII的值为%d\n", 107 + cha);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值