30天学会C语言: Day 3-资料也要取名字!

型别

型别指的是资料的类型
因为电脑中的所有资料都是由1和0(二进位)表示,为了能表示不同种类的数值必须制定不同的规则,电脑必须知道资料的型别,才能以正确的规则储存资料

C语言的型别可以分成 整数(Integer) 和可以表示小数点的 浮点数(Floating point) 两大类,除了规定资料在电脑中(二进位)的表示方式,还规定能储存、表示的数值范围(也代表占用的容量),这边常用的型别有:

  • 整数:
    • char: -128~127的所有整数,常用於表示 字元(Character)
    • int: -2147483648~2147483647的所有整数
  • 浮点数:
    浮点数可以表示小数点,等同数学中的 实数,不过受限於硬体,浮点数实际能表示的位数有限(但也很够用了)
    • float: 称为单精度浮点数,之後提到的浮点数通常是指它
    • double: 双精度浮点数,比 float 占用更多容量,但可以表示的范围更大,位数更多

变数

像是数学中的未知数,可以用一个代号或名称(变数名称)代表一笔资料,差别在变数的数值(变数值)是可变的,但数值的型别是不变的

可以把变数想成箱子,箱子上贴有标签(变数名称),我们可以透过标签找到箱子,并取得其中的内容(变数值),同一个箱子中的内容可以改变,但同一个箱子只能装一个类型的东西,且同个名称的箱子只能有一个

宣告变数

就像在数学里面要先 设未知数,变数要先 宣告 才能被使用
C语言宣告变数的语法是<型别> <名称>

如果要宣告一个叫 x 的整数变数,和一个叫 y 的浮点数变数

#include<stdio.h>
#include<stdlib.h>

int main(){
 	int x;
 	float y;
	return 0;
}

在一行宣告多个同型别的变数,可以在变数名称之间加上逗号

#include<stdio.h>
#include<stdlib.h>

int main(){
 	int x, y;
	return 0;
}

指 派/定 变数值

用等号 = 可以设定变数的值,意思是 先算出等号右边的值,再将此值指派给左边的变数

下面例子会把变数 x 的值设为 100

#include<stdio.h>
#include<stdlib.h>

int main(){
 	int x;
 	x=100;
	return 0;
}

如果变数型别是 字元 时要用单引号标记,且只能有 一个文字或符号

#include<stdio.h>
#include<stdlib.h>

int main(){
 	char x;
 	x='a';
	return 0;
}

也可以在宣告的同时指定值,有多个变数时可以用逗号隔开

#include<stdio.h>
#include<stdlib.h>

int main(){
 	int a=0;
 	int x=1, y=10, z=100;
	return 0;
}

可以用多个等号把同一个值值指定给多个同型别的变数

#include<stdio.h>
#include<stdlib.h>

int main(){
 	int x=y=z=100;
	return 0;
}

指派整数给浮点数变数时,小数点可以省略

#include<stdio.h>
#include<stdlib.h>

int main(){
 	float x=1.0;
 	float y=1;
	return 0;
}

虽然没有硬性规定,但C语言中可以用 f, F 标示数值是浮点数,整数时可以用 . 标示

#include<stdio.h>
#include<stdlib.h>

int main(){
	float x=1.0F, y=1.12f, z=100.;
	return 0;
}

格式化字串

目前提到的内容中,程序显示的文字都是固定的,如果要让程序显示不同的文字,就只能更改程序码
为了在不更动程序码的情况下,让程序显示不一样的内容,必须透过变数储存要显示的内容

格式化字串的目的,是把变数的值转换成字串,再合并到字串中,达到显示变数值的目的

预留位置(Format placeholder)

代表在 字串中预留给变数的位置,格式化时变数的内容会转换成字串并依序填入
不同类型的资料使用的预留位置也不一样,整数用 %d,浮点数用 %f,字元用 %c

下面例子中,变数 a, b, c 的值会依照顺序填入字串中

#include<stdio.h>
#include<stdlib.h>

int main(){
  int a=10, b=20, c=30;
  printf("%d %d %d", a, b, c);
	return 0;
}

不同型别可以同时出现在同一个字串

#include<stdio.h>
#include<stdlib.h>

int main(){
  int x=10;
  float y=0.5;
  printf("%d %f", x, y);
	return 0;
}

除了变数,字串中也可以加入其他文字及符号

#include<stdio.h>
#include<stdlib.h>

int main(){
 	int age=18;
 	printf("I am %d years old.", age);
	return 0;
}

补充

其他型别

名称 范围 预留位置
char -2^7~2^7-1 %c(表示字元时)、%hd
short -2^15~2^15-1 %hd
int(long) -2^31~2^31-1 %d(%ld)
long long -2^63~2^63-1 %lld

加上 unsigned,会变成只能表示正数和0,但范围 大小 不变

名称 范围 预留位置
unsigned char 0~2^8 %hu
unsigned short 0~2^16 %hu
unsigned int(unsignedlong) 0~2^32 %u(%lu )
unsigned long long 0~2^64 %llu

关於预留位置

%d, %f, %c 等符号代表的是 要用哪种方式将二进位资料转换成人看得懂的资料,所以同一笔资料可以用任一种符号在格式化字串中显示,但显示的结果对人来说代表不同的数值

#include<stdio.h>
#include<stdlib.h>

int main(){
  int a=75;
  printf("%d %c %f", a, a, a);
	return 0;
}

%hd, %d, %lld 都是将资料转换成整数,差异是能处理的位数(可以转换的数值范围) %hd < %d < %lld

下面例子中三个符号都能正确显示出 75

#include<stdio.h>
#include<stdlib.h>

int main(){
  long long a=75;
  printf("%hd %d %lld", a, a, a);
	return 0;
}

数值超过 short 的范围,显示的结果错误

#include<stdio.h>
#include<stdlib.h>

int main(){
  long long a=45000;
  printf("%hd %d %lld", a, a, a);
	return 0;
}

数值超过 int 的范围

#include<stdio.h>
#include<stdlib.h>

int main(){
  long long a=3000000000;
  printf("%hd %d %lld", a, a, a);
	return 0;
}


挖坑清单:

  • main() 前面的 int,和最後一行的 return 0;
  • 可以拆成多行的情况
  • \0 在字串、字元中的意思

<<:  Day 18:「极速开发」- Vitawind

>>:  [DAY 6] _stm32f103c8t6_暂存器查找方法

Day 16:axios 先封装,API 轻松发

上篇我们在单一元件内使用 axios 发送 API,但如果专案规模愈来愈大,需要同时管理多个功能的 ...

爬虫怎麽爬 从零开始的爬虫自学 DAY4 开发环境-3 Visual Studio Code 使用设定

前言 各位早安,书接上回我们安装好python跟Visual Studio Code,完成了开发环境...

[ Day 38 ] - winston 记录下发生的错误

常见的故事 ... 客户 : 系统出错了 , 可以帮忙修一下吗 【・ヘ・?】 工程师 : 我这边看起...

Day 23:履历

前言 履历如果写不好,可能会糟蹋我们的专业能力,履历还能看出一个人的个性、细心程度,可以说是在面试之...

Day 4 : Git 分支与远端仓库

远端仓库 打RPG的时候,队友的占位与分配是很重要的! 後排玩家是要对准BOSS的弱点来个会心一击,...