C语言-基础知识总结2

目录

一、字符串+转义字符

1、字符串

2、转义字符 

二、注释  

三、 数组

1、数组的定义 

2、数组的下标

3、数组的使用 

四、操作符 

 五、常见关键字  

1、关键字typedef

2、关键字static 

六、#define定义常量和宏 


一、字符串+转义字符


1、字符串

由双引号引起来的一串字符称为字符串字面值,或者简称字符串。在C语言中,通常用字符数组来存放字符串。(字符串的结束标志是一个\0的转义字符 。在计算字符串长度的时候,'\0'是结束标志,不算作字符串内容。)

以下代码突出了在字符串中'\0'的重要性 :

#include<stdio.h>
#include<string.h>
int main()
{
	char a[] = "bit";
	char b[] = { 'b','i','t' };
	char c[] = { 'b','i','t','\0' };
	printf("%s\n", a);
	printf("%s\n", b);
	printf("%s\n", c);
	printf("%d\n", strlen(b));
	printf("%d\n", strlen(c));
	return 0;
}

其运行结果为:

由以上结果来看:

比较第二行输出跟第三行输出可知,在字符串没有'\0'结尾时,后面会接着输出随机值。在没有'\0'结尾的情况下,第四行输出的数组b的长度15就是一个随机值。

上述代码中,所用到的strlen函数是一个字符串函数,它用来求字符串的长度,就是从给定的地址,向后数字符,直到遇到'\0'结束,'\0'不统计在内。

关于更多更详细的字符串函数可以看这篇文章: http://t.csdn.cn/d321I

2、转义字符 

首先,让我们来思考一下这个问题,在屏幕上打印一个目录:c:\code\test.c,这时我们该如何编写代码呢?

我们就先直接用printf输出试试看,代码如下:

#include <stdio.h>
int main()
{
 printf("c:\code\test.c\n");
    return 0;
}

其运行结果为:

显然并不是我们想要的结果,我们要想输出正确的结果,这时候就要用到转义字符了。

转义字符顾名思义就是转变意思。下面列出一些转义字符:

转义字符                             释义      
\? 在书写连续多个问号时使用,防止他们被解析成三字母词
\' 用于表示字符常量'
\" 用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释成一个转义序列符
\a 警告字符,蜂鸣
\b 退格符
\f 换页符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd d d d表示1~3个八进制的数字。如:\130表示字符X
\xdd d d表示两个十六进制的数字。如:\x30表示字符0

转义字符\ddd和\xdd要使用到字符的ASCLL和进制转换,不熟悉ASCLL表的可以自己下去再认真记记常用的字符的ASCLL值。

那么在屏幕上打印一个目录:c:\code\test.c的正确代码就为:

#include <stdio.h>
int main()
{
	printf("c:\\code\\test.c\n");
	return 0;
}

运行结果为: 

对于转义字符\?,其分析代码如下:

#include <stdio.h>
int main()
{
	//\?是为了不让?被解析为三字母词
	//三字母词 - ??) ——>  ]
	printf("%s\n","(are you ok\?\?)");
	//输出结果为:(are you ok??),否则结果为:(are you ok]
	return 0;
}

 下面我们来看一道例题:

#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));
    // \x11和\62被解析成一个转义字符
    printf("%d\n", strlen("c:\test\x11\628\test.c"));
    return 0;
}

上述代码的输出结果应为多少?

其结果为6,15。第一个输出还容易理解,就是字符的个数,那么第二个输出为什么为15呢?答案是其字符串里面的\t、\x11和\62均是一个转义字符。

二、注释  


 注释有两种风格:

  • C 语言风格的注释 /*xxxxxx*/ ,缺陷:不能嵌套注释
  • C++ 风格的注释 //xxxxxxxx ,可以注释一行也可以注释多行

比如: 

#include <stdio.h>
int Add(int x, int y)
{
    return x+y;
}
/*C语言风格注释
int Sub(int x, int y)
{
    return x-y;
}
*/
int main()
{
    //C++注释风格
    //int a = 10;
    //调用Add函数,完成加法
    printf("%d\n", Add(1, 2));
    return 0;
}

三、 数组


C语言中这样定义数组:一组相同类型元素的集合。

1、数组的定义 

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素

数组arr,其中方括号[ ]中也可以没有大小,根据后面给出的元素个数确定大小。

2、数组的下标

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。数组可以通过下标来访问的。

比如:

int arr[10] = {0};
//如果数组有10个元素全为0,下标的范围是0-9

 

3、数组的使用 

代码:

#include <stdio.h>
int main()
{
 int i = 0;
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 for(i=0; i<10; i++)
 {
       printf("%d ", arr[i]);
 }
 printf("\n");
    return 0;
}

四、操作符 


算术操作符             +        -            *       /        %                                                                                       
移位操作符         >>        <<
位操作符         &          ^        |        (和移位操作符一样都是对于二进制位操作的)
赋值操作符 =        +=        -=        *=        /=        &=        |=        >>=        <<=
关系操作符 >        >=        <        <=        !=        ==
逻辑操作符 &&(逻辑与)        ||(逻辑或)
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1,   exp2 exp3,...expn
下标引用和函数调用 [ ]        ( )
结构成员       ->

 算术运算符中的 / 除法:

  1. 计算的结果是整除之后的商
  2. 除法有整数除法和浮点数除法,浮点数除法要保证除数和被除数中至少有一个数是浮点数。

 取模操作符%:得到的是余数,只适用于整数

条件操作符的使用代码: 

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	//输入
	scanf("%d %d", &a, &b);
	int m = 0;
	//(a>b) ? (m = a) : (m = b);
	m = (a > b ? a : b);

	/*if (a > b)
		m = a;
	else
		m = b;*/
	printf("%d\n", m);

	return 0;
}

即表达式exp1成立时,执行表达式exp2,否则,执行表达式exp3。

逗号表达式的使用代码: 

#include<stdio.h>
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;
}

单目操作符: 

                       逻辑反操作
-                         负值
+                         正值
&                         取地址
sizeof                         操作数的类型长度(以字节为单位)
~                         对一个数的二进制按位取反
--                         前置、后置--
++                         前置、后置++
*                         间接访问操作符(解引用操作符)
(类型)                         强制类型转换

 
五、常见关键字  


auto(自动)    break   case     char         const        continue        default        do         double else        enum        extern(声明外部符号的)       float         for   goto      if      int    long         register(寄存器)    return   short       signed     sizeof          static      struct        switch      typedef       union (联合体类型)     unsigned       void        volatile        while
C 语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。

1、关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。

代码:

//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
    //观察num1和num2,这两个变量的类型是一样的
    unsigned int num1 = 0;
    uint_32 num2 = 0;
    return 0;
}

2、关键字static 

C 语言中:
static 是用来修饰变量和函数的
        1. 修饰局部变量 - 称为静态局部变量
        2. 修饰全局变量 - 称为静态全局变量
        3. 修饰函数 - 称为静态函数 
  • 修饰局部变量

static 修饰局部变量的时候,本来一个局部变量是存放在栈区的,如果被static修饰就存储到静态区了,static 修饰局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束才结束但是作用域不变。

代码:

//代码1
#include <stdio.h>
void test()
{
    int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
 int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;
}
//运行结果为10个1
//代码2
#include <stdio.h>
void test()
{
    //static修饰局部变量
    static int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
    int i = 0;
    for(i=0; i<10; i++)
   {
        test();
   }
    return 0;
}
//运行结果为1 2 3 4 5 6 7 8 9 10
  • 修饰全局变量 

 全局变量具有外部链接属性,所以在其他源文件内部依然可以使用(方法要正确),static修饰全局变量,改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性,这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了,感觉像是作用域变小了。

代码:

//代码1
//add.c
int g_val = 2023;
//test.c
int main()
{
    printf("%d\n", g_val);
    return 0;
}
//代码2
//add.c
static int g_val = 2023;
//test.c
int main()
{
    printf("%d\n", g_val);
    return 0;
}

代码1正常,代码2在编译的时候会出现连接性错误。  

  • 修饰函数 

 static修饰函数和static修饰全局变量是一样的,函数是具有外部链接属性的,但是被static修饰,就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用。

代码:

//代码1
//add.c
int Add(int x, int y)
{
    return x+y;
}
//test.c
int main()
{
    printf("%d\n", Add(2, 3));
    return 0;
}
//代码2
//add.c
static int Add(int x, int y)
{
    return x+y;
}
//test.c
int main()
{
    printf("%d\n", Add(2, 3));
    return 0;
}

代码1正常,代码2在编译的时候会出现连接性错误 。

 在这里就先着重讲解 typedef 和 static 这两个关键字。

六、#define定义常量和宏 


 直接看代码理解:

//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
    int sum = ADD(2, 3);
    printf("sum = %d\n", sum);
    //输出sum = 5
    sum = 10*ADD(2, 3);
    printf("sum = %d\n", sum);
    //输出sum = 50
    return 0;
}

 #define定义的宏与函数的定义比较像。

#define定义的宏:

#define ADD(x, y) ((x)+(y))
//ADD为宏的名字
//(x,y)中x,y是参数
//((x)+(y))是宏的实现体

函数的定义:

int ADD(int x,int y)
{
    return x+y;
}

这次的总结就先到这里了,期待小伙伴们的点赞支持呀, 你们的鼓励就是我前进的动力!

猜你喜欢

转载自blog.csdn.net/m0_61876562/article/details/130072254