黑马程序员C语言基础(第五天)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑马程序员C语言基础(第五天)相关的知识,希望对你有一定的参考价值。

https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver

黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

文章目录

运算符与表达式

常用运算符分类

运算符类型	作用
算术运算符	用于处理四则运算
赋值运算符	用于将表达式的值赋给变量
比较运算符	用于表达式的比较,并返回一个真值或假值
逻辑运算符	用于根据表达式的值返回真值或假值
位运算符	用于处理数据的位运算
sizeof运算符	用于求字节数长度

算术运算符

运算符	术语	示例	结果
+	正号	+3	3
-	负号	-3	-3
+10 + 5	15
-10 - 5	5
*10 * 5	50
/10 / 5	2
%	取模(取余)	10 % 3	1
++	前自增	a=2; b=++a;	a=3; b=3;
++	后自增	a=2; b=a++;	a=3; b=2;
--	前自减	a=2; b=--a;	a=1; b=1;
--	后自减	a=2; b=a--;	a=1; b=2;

两个数相除,要想得到小数,分子分母必须有一个是小数,否则结果只会取整(可以把其中一个数乘以1.0)

示例:

#include <stdio.h>

int main()
{
	int a = 5;
	int b = 2;
	double c;
	double d;

	c= a/b;
	d = a*1.0/b;

	printf("%lf\\n", c);//2.000000
	printf("%lf\\n", d);//2.500000

	return 0;
}

前自增和后自增区别

b = a++ 是先把 a 的值赋给b,再自身+1

#include <stdio.h>

int main()
{
	int a;
	int b;

	
	
	//后置++
	a = 1;
	b = 0;
	b = a++;
	printf("%d %d\\n", a, b);//2 1

	//前置++
	a = 1;
	b = 0;
	b = ++a;
	printf("%d %d\\n", a ,b);//2 2
	
	//其他
	a = 1;
	b = 0;
	a++;//++a也一样的
	b = a;
	printf("%d %d\\n", a ,b);//2 2

	return 0;
}

赋值运算符

运算符	术语	示例	结果
=	赋值	a=2; b=3;	a=2; b=3;
+=	加等于	a=0; a+=2;	a=2;
-=	减等于	a=5; a-=3;	a=2;
*=	乘等于	a=2; a*=2;	a=4;
/=	除等于	a=4; a/=2;	a=2;
%=	模等于	a=3; a%2;	a=1;

比较运算符

C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。

运算符	术语	示例	结果
==	相等于	4 == 3	0
!=	不等于	4 != 3	1
<	小于	4 < 3	0
>	大于	4 > 3	1
<=	小于等于	4 <= 3	0
>=	大于等于	4 >= 1	1

逻辑运算符

逻辑运算中,只要不为0都为真

运算符 术语 示例 结果
! 非 !a 如果a为假,则!a为真;
如果a为真,则!a为假。
&& 与 a && b 如果a和b都为真,则结果为真,否则为假。
|| 或 a || b 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。

逻辑优化示例

//Dontla
#include <stdio.h>

int main()
{
	int c = 0;
	1 || (c = 250);
	printf("%d\\n", c);//0
	
	c = 0;
	0 || (c = 250);
	printf("%d\\n", c);//250

	return 0;
}

运算符优先级

注意特殊情况:
b = a++; 跟 b = (a++);等价,不会因为括号而影响结果
在这里插入图片描述
在这里插入图片描述

类型转换

数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。

转换的方法有两种:

  • 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成。
  • 强制类型转换:把表达式的运算结果强制转换成所需的数据类型。

类型转换的原则:占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。
在这里插入图片描述

隐式类型转换

示例1:

#include <stdio.h>

int main()
{
	int num = 5;
	printf("s1=%d\\n", num / 2);//s1=2
	printf("s2=%lf\\n", num / 2.0);//s2=2.500000

	return 0;
}

示例2:

#include <stdio.h>

int main()
{
	double a;
	int b = 10;
	a = b;
	printf("%lf\\n", a);//10.000000


	return 0;
}

强制类型转换

强制类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,其基本语法格式如下所示:

(类型说明符) (表达式)

示例1:

#include <stdio.h>

int main()
{
	float x = 0;
	int i = 0;
	x = 3.6f;

	i = x;			//x为实型, i为整型,直接赋值会有警告
	i = (int)x;		//使用强制类型转换

	printf("x=%f, i=%d\\n", x, i);//x=3.600000, i=3

	return 0;
}

示例2:

#include <stdio.h>

int main()
{
	double a;
	a = (double)1/2;
	printf("%lf\\n", a);//0.500000

	printf("%lu\\n", sizeof(int));//4
	printf("%u\\n", (unsigned int)sizeof(int));//4

	int b = 12;
	printf("%lf\\n", (double)b);//12.000000


	return 0;
}

发现同样的代码在不同编译器运行结果还不一样
linux上:
在这里插入图片描述

windows QT上:
在这里插入图片描述

程序流程结构

概述

C语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。

  • 顺序结构:程序按顺序执行,不发生跳转。
  • 选择结构:依据是否满足条件,有选择的执行相应功能。
  • 循环结构:依据条件是否满足,循环多次执行某段代码。

选择结构

if语句

注意:
1、果if 语句不加{},则只有后面第一句代码属于if 语句
2、判断时最好变量放常量放左边(防止少写一个等号导致难以找出错误所在)
在这里插入图片描述

在这里插入图片描述

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;

	if (a > b)
	{
		printf("%d\\n", a);
	}

	return 0;
} 

https://www.bilibili.com/video/BV1jW411K7v2/?spm_id_from=autoNext

if…else语句

在这里插入图片描述

#include <stdio.h>
int main()
{
	int a;
	int b;
	printf("请输入a的值:");
	scanf("%d", &a);
	printf("请输入b的值:");
	scanf("%d", &b);

	if (a > b)
	{
		printf("%d\\n", a);
	}
	else
	{
		printf("%d\\n", b);
	}
	return 0;
}

结果:
在这里插入图片描述

if…else if…else语句

在这里插入图片描述

#include <stdio.h>

int main()
{
	unsigned int a;
	scanf("%u", &a);

	if (a < 10)
	{
		printf("个位\\n");
	}
	else if (a < 100)
	{
		printf("十位\\n");
	}
	else if (a < 1000)
	{
		printf("百位\\n");
	}
	else
	{
		printf("很大\\n");
	}

	return 0;
}

结果:
在这里插入图片描述

三目运算符

#include <stdio.h>

int main()
{
	int a = 10;
	int b = 20;
	int c;

	if (a > b)
	{
		c = a;
	}
	else
	{
		c = b;
	}
	printf("c1 = %d\\n", c);//c1 = 20

	a = 1;
	b = 2;
	c = ( a > b ? a : b );
	printf("c2 = %d\\n", c);//c2 = 2

	return 0;
}

switch语句(电梯模型)

#include <stdio.h>

int main()
{
	char c;
	c = getchar();

	switch (c) //参数只能是整型变量
	{
	case '1':
		printf("OK\\n");
		break;//switch遇到break就中断了
	case '2':
		printf("not OK\\n");
		break;
	default://如果上面的条件都不满足,那么执行default
		printf("are u ok?\\n");
	}
	return 0;
}

结果:
在这里插入图片描述

循环结构

while语句

在这里插入图片描述

#include <stdio.h>

int main()
{
	int a = 20;
	while (a > 10)
	{
		scanf("%d", &a);
		printf("a = %d\\n", a);
	}

	return 0;
}

结果:
在这里插入图片描述

调试

QT的调试

qt creator创建cmake构建的程序,无法启动调试(点左下角运行不出结果 No executable specified.)
在这里插入图片描述
在这里插入图片描述

visual studio的调试

跟qt调试基本上是一样的操作,F9打断点,F5启动调试,F10逐步调试,F11进入函数
在这里插入图片描述

do…while语句

在这里插入图片描述

#include <stdio.h>

int main()
{
	int a = 1;
	do
	{
		a++;
		printf("a = %d\\n", a);
	} while (a < 10);

	return 0;
}

结果:

a = 2
a = 3
a = 4
a = 5
a = 6
a = 7
a = 8
a = 9
a = 10

for语句

#include <stdio.h>

int main()
{
	int i;
	int sum = 0;
	for (i = 0; i <= 100; i++)
	{
		sum += i;

	}

	printf("sum = %d\\n", sum);//sum = 5050

	return 0;
}

其实也可以这样:
在这里插入图片描述

死循环

在这里插入图片描述

嵌套循环

循环语句之间可以相互嵌套:

#include <stdio.h>

int main()
{
	int num = 0;
	int i, j, k;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			for (k = 0; k < 10; k++)
			{
				printf("hello world\\n");
				num++;
			}
		}
	}

	printf("num = %d\\n", num);

	return 0;
}

结果:
在这里插入图片描述

跳转语句break、continue、goto

break语句

在switch条件语句和循环语句中都可以使用break语句:

  • 当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。
  • 当它出现在循环语句中,作用是跳出当前内循环语句,执行后面的代码。
  • 当它出现在嵌套循环语句中,跳出最近的内循环语句,执行后面的代码。
#include <stdio.h>

int main()
{
	int i = 0;
	while (1)
	{
		i++;
		printf("i = %d\\n", i);

		if (i == 10)
		{
			break; //跳出while循环
		}
	}

	int flag = 0;
	int m = 0;
	int n = 0;

	for (m = 0; m < 10; m++)
	{
		for (n 以上是关于黑马程序员C语言基础(第五天)的主要内容,如果未能解决你的问题,请参考以下文章

零基础自学javase黑马课程第十五天

黑马程序员C语言基础第三天

《C语言基础学习笔记》—— 黑马程序员 <Part1-4>

黑马程序员C语言基础(第四天)

黑马程序员C语言基础第一天

黑马程序员C语言基础第二天