C语言编程


C语言学习第三节

一、变量

1. 变量介绍与初始化

1)变量

介绍完数据类型之后,我们可以用类型创建变量,

  • 变量——数据发生变化的量
  • 常量——数据不变化的量

代码示例:

int main()
{
int a;
int b;
int c, d, e;//这些都是可以的,但不推荐用这个
float a;
char a;
return 0;
}

变量命名规则:

  • 只能由字母(包含大小写)、数字、下划线'_')组成
  • 不能以数字开头
  • 长度不能超过63个字符
  • 变量名中区分大小写
  • 变量名不可用关键字

代码示例:

//命名规则
int abc;
int ABC;//区分大小写,两者不同
char 2b;//错误
char _2b;//正确-不能以数字开头,可以下划线开头
int char;//错误——变量名称不可以用关键字

2)初始化——对变量赋初值

  • 不初始化,一些编辑器会报错

代码示例:

int a = 10;
float b = 2.4;
char ch1 = ‘x’;

2. 变量分类

变量分为全局变量与局部变量

  • 全局变量——在大括号外部定义的变量
  • 局部变量——在大括号内部定义的变量

局部变量只能在其所在的括号内被打印,在括号外是不可以被打印的;但是若局部变量包含一个大括号,那么可以在其所在的括号内打印,也可以在包含的大括号内打印

代码示例(变量名称不一样):

int a = 10;//全局变量

int main()
{
	int b = 100;//局部变量
	{
		int c = 1000;//局部变量
		printf("%d\n", c);
		printf("%d\n", a);
		printf("%d\n", b);
	}
	printf("%d\n", a);
	printf("%d\n", b);
	//printf("%d\n", c);报错——c是局部变量,只针对于其所在的括号内
	return 0;
}

1000 10 100 10 100

为方便理解,我们将这个代码的a假设为社会的共享单车,b假设为学校的共享单车,c假设为个人的自行车,那么c所在的括号内,我可以骑自己的自行车也可以骑学校和社会的;但是学校里的人是不能骑我的自行车,只能骑学校和社会的

代码示例(变量名称一样)

  • 变量名称一样时,局部变量优先输出
#include <stdio.h>

int main()
{
	int a = 100;
	{
		int a = 10;
		printf("%d\n", a);//变量名称一样,局部变量优先输出
	}
	printf("%d\n", a);
	return 0;
}

10;100

3. 变量存储位置

内存可以分为多个区域,这里我们只重点说明三个区域:栈区、堆区、静态区

  • 栈区:存放局部变量、函数参数(后面介绍)
  • 堆区:动态内存管理(后面介绍)
  • 静态区:存放全局变量、静态变量

二、操作符

操作符又称为运算符,算术操作符是其中一种,包含+-*/%,这些又称为双目操作符

  • +-*/%称为操作符
  • 24+36中24与36为操作数
  • 双目操作符——有两个操作数

1. 算术操作符

1)+

#include <stdio.h>

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

30 110

2)-

#include <stdio.h>

int main()
{
	//-
	int b = 10 - 100;
	printf("%d\n", 10 - 20);
	printf("%d\n", b);
	return 0;
}

-10 -90

3)*

进行乘法运算时要注意计算结果不能超过数据类型取值的最大值,否则计算机将会随机得到结果,这个结果是错误的

#include <stdio.h>

int main()
{
	//*
	int c = 10 * 100;//这里进行的整数乘法,算出来的结果不能超过int取值范围的最大值
	int d = 10000000 * 1000000000000;
	printf("%d\n", 10 * 20);
	printf("%d\n", c);
	printf("%d\n", d);
	return 0;
}

200 1000 -1981284352

4)/

  • 对于除号来说,整数 / 整数是执行的整数除法,得到的结果是商,不带余数
  • 对于除号来说,想要得到小数,即执行小数除法,需要在除号两边至少有一个是小数
  • 输出小数结果时,一定要注意打印格式是%f,不能是%d

代码示例一:

#include <stdio.h>

int main()
{
	// /
	//对于除号来说,整数 / 整数是执行的整数除法,得到的结果是商,不带余数
	//对于除号来说,想要得到小数,即执行小数除法,需要在除号两边至少有一个是小数
	printf("%d\n", 10 / 20);
	printf("%f\n", 10.0 / 20);
	printf("%f\n", 10 / 20.0);
	printf("%f\n", 10.0 / 20.0);
	printf("%f\n", 10.0 / 20);//%f打印默认保留6位小数
	return 0;
}

0 0.500000 0.500000 0.500000 0.500000

代码示例二:

#include <stdio.h>

int main()
{
	int score = 5;//这里是int,下面打印使用%d
	{
		score = (score / 20.0) * 100;//需有小数才能计算出25,否则得到的是0
		printf("%d\n", score);
	}
	return 0;
}

25

5)%——取模运算(取余)

  • 两个整数相除之后得到的余数,这里只能进行整数除法,不能用小数

正数取模运算代码示例:

#include <stdio.h>

//%——取模(余),表示两个整数相除之后得到的余数
//这里只能进行整数除法,不能用小数
int main()
{
	printf("%d\n", 50 % 4);
	int a = 100 % 6;
	printf("%d\n", a);
	return 0;
}

2;4

负数取模运算代码示例:

  • 结果的符号与%之前的数符号相同
#include <stdio.h>

//负数求模,结果的正负号与%前面的数的符号相同
int main()
{
	printf("%d\n", 11 % -3);
	printf("%d\n", -11 % -3);
    printf("%d\n", -11 % 3);
	return 0;
}

2 -2 -2

2. 赋值操作符

=进行赋值操作

1)连续赋值

代码示例:

#include <stdio.h>

//连续赋值
int main()
{
	int a = 2;
	int b = 4;
	int c = 5;
	c = a = b + 2;//连续赋值,但是不推荐;一般拆开一步一步运行
	printf("%d\n", c);
	printf("%d\n", a);
	a = b + 2;
	c = a;
	printf("%d\n", c);
	printf("%d\n", a);
	return 0;
}

6;6;6;6

2)复合赋值

复合赋值中包含+=、-=、*=、/=、%=、>>=、<<=、|=、^=、&=

  • 本节中只重点说明+=、-=、*=、/=、%=
  • +=等价于a=a+?
  • -=等价于a=a-?
  • *=等价于a=a*?
  • /=等价于a=a/?
  • %=等价于a=a%?

代码示例:

#include <stdio.h>

//复合赋值
int main()
{
	// +=
	int a = 9;
	a + 2;
	printf("%d\n", a);
	a = a + 2;
	printf("%d\n", a);
	a += 2;
	printf("%d\n", a);

	// -=
	int b = 9;
	b - 2;
	printf("%d\n", b);
	b = b - 2;
	printf("%d\n",b);
	b -= 2;
	printf("%d\n", b);

	// *=
	int c = 9;
	c * 2;
	printf("%d\n", c);
	c = c * 2;
	printf("%d\n", c);
	c *= 2;
	printf("%d\n", c);

	// /=
	int d = 9;
	d / 2;
	printf("%d\n", d);
	d = d / 2;
	printf("%d\n", d);
	d /= 2;
	printf("%d\n", d);

	// %=
	int e = 9;
	e % 2;
	printf("%d\n", e);
	e = e % 2;
	printf("%d\n", e);
	e %= 2;
	printf("%d\n", e);
	return 0;
}

9 11 13 9 7 5 9 18 36 9 4 2 9 1 1

3. 单目操作符

根据双目操作符定义,单目操作符是指只有一个操作数,这里我们介绍++、--、+(正)、-(负)

1)++

++是自增的符号,分为前置++与后置++

  • a++与++a都是a自增1,对a来说无区别,但是性质不同
  • a++是后置++,先使用,后+1;即先打印出a的值,再+1
  • ++a是前置++,先+1,后使用;即先+1,再打印出a的值

前置++代码如下:

#include <stdio.h>

//单目操作符
//前置++
int main()
{
	int a = 2;
	++a;
	printf("%d\n", a);
	return 0;
}

3
后置++代码示例:

#include <stdio.h>

//单目操作符
//后置++
int main()
{
	int a = 2;
	a++;
	printf("%d\n", a);
	return 0;
}

3
性质示例:

#include <stdio.h>

//单目操作符
//性质——前置++是先+1再使用;后置++是先使用再+1
int main()
{
	int a = 1;
	int b = a++;//后置++,先给b赋值,a再+1
	printf("%d\n", a);
	printf("%d\n", b);

	int c = 1;
	int d = ++c;//前置++,c先+1,之后给d赋值
	printf("%d\n", c);
	printf("%d\n", d);
	return 0;
}

2;1;2;2

2)--

--是自减的符号,分为前置–与后置–

  • a–与–a都是a自减1,对a来说无区别,但是性质不同
  • a–是后置–,先使用,后-1;即先打印出a的值,再-1
  • –a是前置–,先-1,后使用;即先-1,再打印出a的值

前置–与后置–代码如下:

#include <stdio.h>

//单目操作符
//前置--与后置--
int main()
{
	int a = 2;
	--a;
	printf("%d\n", a);
	a--;
	printf("%d\n", a);
	return 0;
}

1;0
性质示例:

#include <stdio.h>

//单目操作符
//性质——前置--是先-1再使用;后置--是先使用再-1
int main()
{
	int a = 1;
	int b = a--;//后置--,先给b赋值,a再-1
	printf("%d\n", a);
	printf("%d\n", b);

	int c = 1;
	int d = --c;//前置--,c先-1,之后给d赋值
	printf("%d\n", c);
	printf("%d\n", d);
	return 0;
}

0;1;0;0

3)+(正)与-(负)

  • 正号、负号都是操作符,并且正号操作符是可以省略的

示例如下:

//单目操作符
//+、-(正号、负号)
int main()
{
	int a = 10;
	int b = +10;
	int c = -10;
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);
	return 0;
}

10;10;-10

4. 强制类型转换操作符

  • 将一个数据类型转换为其他数据类型,用()实现
  • 作用:将类型转换的警告消除

代码示例:

#include <stdio.h>

//强制类型转换操作符——消除警告
int main()
{
	int a = 3.14;
	printf("%d\n", a);//这里会出现警告
	int b = (int)3.14;
	printf("%d\n", b);//这里不出现警告
	return 0;
}

3;3——结果一样,差别在于有无警告

三、scanfprintf

1. printf函数

在第一篇文章中已经介绍printf的一些基础内容和使用,这里我们详细的来说明该函数

  • printf函数的写法: printf(“****”, “", "”,…); 这里面逗号之前的可以称为一个参数
  • printf中的f为format(格式化),表示定制输出格式,如:%d输出为整数,%c输出为字符
  • printf函数不能自动换行,需要\n进行换行,可以放置字符串末尾换行,也可以放置中间进行换行

1)占位符

  • 占位符是占位置,指这个位置可以用其他值代替
  • 占位符是一一对应的,若有n个占位符,则printf函数有n+1个参数
  • 若参数少于对应占位符的个数,则printf函数将会输出内存中的任意值
  • 占位符必须%在前

代码示例:

#include <stdio.h>

//printf函数的占位符
int main()
{
	printf("这有3个苹果\n");//这里只能输出这一句,但我不一定有三个苹果

	int a = 8;
	printf("这有%d个苹果\n",a);//这里的%d就是一个占位置的作用,我们可以改变a的值
	//多个占位符——第一个参数就是输出的东西,第二个和第三个就是占位符要填进去的东西
	//占位符是一一对应的,有n个占位符,则printf函数有n+1个参数
	printf("%s will come back at %d o'clock\n", "zhangsan", 8);
	printf("%s will come back at %d o'clock\n", "zhangsan");
	return 0;
}

这有3个苹果;这有8个苹果;zhangsan will come back at 8 o'clock; zhangsan will come back at -641 o'clock;

2)占位符列举

  • %c:字符 //char
  • %d:十进制整数(有符号的10进制整数)//int
  • %f:小数(包含float 类型和double 类型)//float——%f double——%lf

用printf函数打印小数类型时,float与double类型的数据都可以用%f打印
但详细说明:float用%f打印,double用%lf打印,long double用%Lf打印

  • %hd:⼗进制short int类型
  • %hu:unsigned short int类型
  • %ld:⼗进制long int类型
  • %lu:unsigned long int类型
  • %lld:⼗进制long long int类型
  • %llu:unsigned long long int类型
  • %Lf:long double类型浮点数
  • %p:指针(⽤来打印地址)
  • %s:字符串
  • %u:⽆符号整数(unsigned int)
  • %x:⼗六进制整数
  • %zusize_t 类型——sizeof的长度计算
  • %%:输出⼀个百分号

3) 输出格式

printf()函数可以限制输出的格式,如下

(1)限制宽度与限制小数位数
  • printf函数可以限定占位符的最小宽度,如%5d限制整数最小长度为五个单位
  • 默认右对齐,若整数不满设定的宽度,则会在整数前面加空格,保证总长度在五个长度;若整数长度超过五个长度,则正常输出
  • 左对齐需要在%与多少d之间加一个-
  • 对于小数来说,用%f打印,限制小数宽度方法跟上面一致
  • 限制小数位数。形如%.2f的形式,限制小数位数两位
  • 限宽与小数位数可以用*代替,但是必须将参数放在前面

代码示例:

#include <stdio.h>

//限制最小宽度
int main()
{
	printf("%d\n",123);
	printf("%6d\n", 123);//这里123占三个宽度,一共六个宽度,123前面有三个空格
	//左对齐
	printf("%-6d\n", 123);
	printf("%9f\n", 123.45);//这里123.45占十个宽度,因为f保留六位小数
	printf("%12f\n", 123.45);
	//保留小数位数用.
	printf("%.2f\n", 123.45);
	printf("%.7f\n", 123.45);
	//混合使用
	printf("%12.4f\n", 123.45);
	//限宽与小数位数可以用*代替,但是必须将参数放在前面
	printf("%*.*f\n", 12,4,123.45);
	return 0;
}

代码结果

(2)总是显示正负号

打印负数时会出现,但是正数不出现正号,因此这里我们让正数一直出现正号,使用%+

代码示例:

#include <stdio.h>

//让正数出现正号
int main()
{
	printf("%+d\n", 123);
	printf("%+d\n", -123);
	return 0;
}

+123;-123

(3)打印部分字符串

对于一个字符串,只想打印其中的一部分,使用%.[m]s,也可以省略[],这里的m为数字,表示要输出的长度是多少

代码示例:

#include <stdio.h>

//打印部分字符串
int main()
{
	printf("%s\n", "abcdefghij");
	printf("%.5s\n", "abcdefghij");
	return 0;
}

abcdefghij; abcde

2. scanf函数

  • scanf函数是输入变量值函数,printf函数是输出变量值函数
  • 形式为scanf("%d",&变量名),scanf函数输入的变量数是放在一个地址中,所以需要一个地址,这里的地址就是变量名
  • &是取地址符号,如&score是指取score变量的地址

代码示例:

#include <stdio.h>

//scanf函数
//输入数使用scanf函数,输出数使用printf函数
int main()
{
	int score = 0;//初始化
	printf("请输入成绩:");
	scanf("%d", &score);
	//scanf("%d", score);这样是不能直接写的,需要加上&
	// 因为scanf函数输入的值是放在一个地址上的,所以需要一个地址
	//&是取地址符号,&score是取score变量的地址
	printf("成绩是:%d\n",score);
	return 0;
}

代码结果
这里可能会有小伙伴出现问题,在下一篇会重点讲一下这个问题


附录

代码详情——在gitee中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值