初识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(零基础超详解!)
105 0
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
70 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
52 9
|
1月前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
43 8
|
1月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
53 6
|
1月前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
292 6
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
66 6
|
1月前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
44 5