初识C语言_Part 1(零基础超详解!)(二)

简介: 初识C语言_Part 1(零基础超详解!)

5. 字符串


定义:类似于 “hello” 这种被双引号引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。


注意:字符串是以’\0’这个转义字符结尾的。我们来看下面的示例代码:


int main()
{
  char arr1[] = { 'a','b','c' };//将'a' 'b' 'c' 这三个字符存放在arr1数组中
  char arr2[] = { "abc" };//将"abc"这个字符串存放于arr2数组中
  printf("%s\n", arr1);//打印出abc和一堆乱码
  printf("%s\n", arr2);//正常打印abc
  return 0;
}


上述代码第6行在abc之后为何会出现乱码的情况呢?


因为字符串是以’\0’这个转义字符结尾,并且以’\0’作为结束标志,arr1存放的一个一个的字符,并没有将’\0’这个结束标志加在末尾,而arr2存放的字符串,自带’\0’,所以当printf函数打印字符串时,遇到’\0’就停止打印,arr2正常打印,打印arr1时会一直向后打印,直到遇到’\0’才停止,所以会出现乱码的情况。


怎么才能让arr1正常打印呢?我们只需要在arr1这个数组的末尾主动添加一个’\0’即可。


int main()
{
  char arr1[] = { 'a','b','c' ,'\0'};
  char arr2[] = { "abc" };
  printf("%s\n", arr1);
  printf("%s\n", arr2);
  return 0;
}


我们看下面一个例子:


#include<stdio.h>
#include<string.h>//使用strlen函数要引用头文件
int main()
{
  char arr1[] = { 'a','b','c' };
  char arr2[] = { "abc" };
    //strlen用于计算字符串长度
  printf("%d\n", strlen(arr1));//打印一个大于3的随机数
  printf("%d\n", strlen(arr2));//打印3
  return 0;
}


第8行为何会打印一个随机数呢?其实这里更加印证了字符串以’\0’作为结束标志这个知识点,不过’\0’本身只是一个结束标志,不会被算作字符串的内容。


6 转义字符


当我们想通过printf函数打印 c:\code\test.c 这样一个文件目录时,我们试试下面这个方法:


int main()
{
  printf("c:\code\test.c");
  return 0;
}


却打印出了这个内容


e3fbf1ba715783fa2d6fd2b2bc0900d3_d39d11c6b6b3420c857d68e51f4b18a3.png


显然,不是我们想要的,之所以出现这种情况,是因为这里的 ‘\t’ 被解释成为了其他的意义,也就是说,这里的t被转义了。所以,这里的 ‘\t’ 就是一个转义字符。


定义:在字符集中,以一个反斜杠 \ 开头,后面跟一个特定字符的形式被称为转义字符(又称:反斜杠字符),常见的转义字符大家可以去找找,也不用全部都记住,了解就可以。


这里我们重点讲解两个转义字符


  • \ddd d d d表示1~3个八进制的数字。 如: \130 表示字符X
  • \xdd d d表示2个十六进制数字。 如: \x30 表示字符0


看下边一段代码:


int main()
{
  printf("%c\n", '\130');//打印X
  printf("%c", '\x30');//打印0
  return 0;
}


这里打印出了X和0的原因是:我们日常生活中的每个字符都无法直接放入到内存之中,所以人们为了方便表示每个字符,就给每个字符设计一个编号,将常用的字符统计起来,就构成了ASCLL码表。


代码分析:我们将 ‘\130’ 转为10进制就是88,再去ASCLL码表中找到对应的字符就是X,因为是以%c的格式打印,所以就打印X这个字符,若是%d,则打印88。 ‘\x30’ 转为10进制就是48,对应字符0,最后将0打印出来。


注意:


  • ‘\ddd’ 这里的d代表的是八进制数,只能是0-7的数字。
  • ‘\xdd’ 这里的d代表的是十六进制数,只能是0-f。


7 注释


注释的分类:

  1. /*xxxxxx*/ 这种注释无论中间有多少行代码,都会被注释掉,但是不能嵌套注释。
  2. //xxxxxxxx 这种只能注释一行代码


注释的作用:


  • 代码中有不需要的代码可以直接删除,也可以注释掉
  • 代码中有些代码比较难懂,可以加一下注释文字
  • 被注释掉的内容是不会被编译器编译的,编译器在编译时会将这部分内容忽视掉


8 函数


当我们想要完成两个数的相加时,我们可以用下面这段代码:


int main()
{
    int num1 = 0;
   int num2 = 0;
    int sum = 0;
    printf("输入两个操作数:>");
    scanf("%d %d", &num1, &num2);
    sum = num1 + num2;
    printf("sum = %d\n", sum);
    return 0;
}


而假如我们有很多组数据等着我们相加,我们就得每一次都使用这段代码,这样显得过于冗杂,对此,我们可以将两个数相加这种功能封装起来,组成一个函数,一般而言,一个函数对应完成一种功能。


我们将上面的代码改进一下:


//定义了一个Add函数
int Add(int x, int y)
{
  int z = x + y;
  return z;
}
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  int sum = Add(a, b);//调用Add函数
  printf("%d", sum);
  return 0;
}


这段代码不理解没关系,后期会讲解函数的相关部分。


9 数组


定义:数组就是一组相同类型元素的集合。


//数组的定义方式
int arr[3] = {1,2,3};//定义了能存放三个元素的整型数组,


数组元素的访问:


int main()
{
  int arr[3] = { 1,2,3 };
    //分别访问数组的三个元素
  printf("%d\n", arr[0]);
  printf("%d\n", arr[1]);
  printf("%d\n", arr[2]);
  return 0;
}


e424fc4af5301d39c3eb42b136895abc_741a3ae194474d1abf19e7e5075df859.png


注意:数组中的元素是连续存储的,并且数组的下标是从0开始的,数组的最后的一个元素的下标就是元素个数-1,


10 操作符


操作符的分类:


  • 算术操作符:+ - * / %


  • 移位操作符: >> <<


  • 位操作符:& ^ |


  • 赋值操作符:= += -= *= /= &= ^= |= >>= <<=


  • 单目操作符:


1: !(逻辑反操作)


C语言中,0表示假,非0表示真,我们来看下面一段示例代码:


int main()
{
  printf("%d", 1 > 2);//在屏幕上打印0
  return 0;
}


上述的代码的原因是因为:1>2这个条件的结果是假,所以最后用0表示,最终就会打印0.


那当我们在1>2之前加一个!会怎样呢?


int main()
{
  printf("%d",! (1 > 2));//打印1
  return 0;
}


!会将表达式的逻辑值进行取反操作,只要是一个非0的数,经过这个!的操作,就会变成0,反之,表达式为0的经过!的操作,就会变成0。


2:- (负值) +(正值)


3:&(取地址符)


4:sizeof ( 操作数的类型长度,以字节为单位) ,有关sizeof,我们来看下边一段示例代码:


int main()
{
  int a = 10;
  printf("%d", sizeof(a));//4
  printf("%d", sizeof(int));//4
  //printf("%d", sizeof int); 报错
  return 0;
}


注意:用sizeof操作符时,当操作对象是关键字时括号不可以省略,但操作对象是变量时就可以省略,由此可见,sizeof并不总是需要括号的,所以,更加印证了sizeof并不是一个函数,因为函数的括号是不可以省略的。


5:~ ( 对一个数的二进制按位取反)


6: – 前置、后置–


7:++ 前置、后置++


关于前置和后置的++和–,我们看下面一段代码:


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


注意:


  • 后置++是先运算,再++,所以第4行先将10赋值给b,a再++变成11.
  • 前置++是先++,再运算,所以第6行,a先++变成12,再将12赋值给b。
  • 前置后置–运算符类似,这里就不作过多解释了。
  • 关系操作符:>,>=,<,<=,==,!=.


  • 逻辑操作符:&& ||


  • 条件操作符: exp1 ? exp2 : exp3


注意:条件表达式的执行逻辑是先判断exp1是否为真,为真则执行exp2,否则执行exp3。我们看下边一段示例代码:


int main()
{
  int a = 2;
  int b = 3;
  a > b ? printf("%d", a) : printf("%d", b);//用于判断a b中的较大值。
  return 0;
}


  • 逗号表达式: exp1, exp2, exp3, …expN


注意:逗号表达式会从左至右依次执行,但是整个表达式的结果是最后一个表达式的结果。例如:


int main()
{
  int a = 3;
  int b = 2;
  int c = 5;
  //逗号表达式,是从左向右依次计算的,逗号表达式的结果是最后一个表达式的结果
  int d = (a+=3, b=5, c=a+b, c-4);
  //      a=6    b=5  c=11   7
  printf("%d\n", d);
  return 0;


所以这段代码最终打印 7


11.总结


本章的内容就到这里啦,若有不足,欢迎评论区指正,最后,希望大佬们多多三连吧,下期见!


相关文章
|
C语言
初识C语言_Part 2(零基础超详解!)(二)
初识C语言_Part 2(零基础超详解!)
|
存储 编译器 C语言
初识C语言_Part 2(零基础超详解!)(一)
初识C语言_Part 2(零基础超详解!)
|
C语言
初识C语言_Part 1(零基础超详解!)(一)
初识C语言_Part 1(零基础超详解!)
117 0
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
37 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
20 2
|
1月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
66 16
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
52 1
|
1月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
61 24
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
63 23
|
1月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
68 15

热门文章

最新文章