黑马程序员C语言基础(第五天)
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑马程序员C语言基础(第五天)相关的知识,希望对你有一定的参考价值。
https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver
黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数
文章目录
- 运算符与表达式
- 程序流程结构
- 数组和字符串
- 概述
- 一维数组
- 二维数组
- 多维数组(了解)
- 字符数组`char a[]`与字符串 `char a[, , , , , ... , '\\0']`
- 字符数组与字符串区别
- 字符串的初始化
- 字符串的输入输出
- 强化训练:字符串追加(重要)
- 函数的调用:产生随机数(用系统时间做种子产生随机数 `time_t time(NULL) rand() srand()`)
- 字符串处理函数
- 1) gets() (从键盘获取输入字符【可含空格】,遇换行符结束)(被抛弃了)
- 2) fgets()(可指定字符数获取键盘输入字符,不够的话会取到换行符,超出字符的话只截取指定字符数)
- 3) puts()(输出字符串,能自动换行,但不能像printf那样用%格式化其他数据类型再输出)
- 4) fputs()(也是输出内容,但不止输出到屏幕,也能指定输出到某个文件)
- 5) strlen()(计算字符串长度,但遇到`\\0`会结束,感觉还不如用`sizeof`呢)
- 6) strcpy(拷贝字符串,遇到结束符`\\0`将停止拷贝,不能指定拷贝字符串长度)
- 7) strncpy()(拷贝字符串,遇到结束符`\\0`将停止拷贝,能指定拷贝字符串长度)
- 8) strcat()(字符串追加)
- 9) strncat()(字符串追加,n个字符)
- 10) strcmp()(按ascii码逐个比较字符串中的字符)
- 11) strncmp()(按ascii码逐个比较字符串中的前n个字符)
- 12) sprintf()(将格式化字符串输出到指定数组,返回值是实际格式化字符个数,失败返回 -1)(组包)
- 13) sscanf()(从字符串中以指定格式提取字符,提取字符串%s默认以空格分割,以逗号分割不行,提取数字%d可以以逗号分割)(拆包)
- 14) strchr()(字符类型查询)(int c 指字符)
- 15) strstr()(字符串类型查询)(char * 指字符串)
- 16) strtok()(字符串切割,一个一个返回,要用循环一个一个获取)(会破坏原来字符串,需要复制原字符串后使用)
- 17) atoi() atof() atol()(将字符串转换成整型、浮点、长整型)
- 函数
运算符与表达式
常用运算符分类
运算符类型 作用
算术运算符 用于处理四则运算
赋值运算符 用于将表达式的值赋给变量
比较运算符 用于表达式的比较,并返回一个真值或假值
逻辑运算符 用于根据表达式的值返回真值或假值
位运算符 用于处理数据的位运算
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语言基础(第五天)的主要内容,如果未能解决你的问题,请参考以下文章