C语言笔记一

C语言的常见概念 

1.C语言是一种计算机语言,最初是作为Unix系统的开发工具而发明。

2.C语言是一门编译型计算机语言,C语言源代码都是文本文件,文本文件本身无法执行,必须通过编译器翻译和链接器的链接,生成二进制的可执行文件才可执行。

.c > .obj >.exe

3.main函数(主函数)

C语言程序是从main函数开始执行的,是程序的入口,有且仅有一个【。一个项目中即使有多个.c文件,但是只能有一个main函数,即入口唯一】

4.printf函数简单介绍

printf("hello C!");

printf是一个库函数,功能是在标准输出设备上进行信息的打印,上面的代码是使用printf函数打印字符串。

5.库函数:

为了不再重复实现常见的代码,让程序员提升开发效率,C语言标准规定了一组函数,这些函数再由不同编译器厂商根据标准进行实现,提供给程序员使用。这些函数组成一个函数库,被称为标准库,这些函数为库函数。【不同编译器部分不一定相互支持】

一个系列的库函数一般会声明在同一个头文件中,库函数的使用要包含对应的头文件。

库函数参考链接https://cplusplus.com/reference/clibrary/

6.关键字:

C语言中有一批保留的名字的符号,比如{int if return ···},这些符号被称为保留字或关键字。

注:程序员自己在创建标识符时不能和关键字重复。

32个关键字【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】

7.字符和ASCII码【字符由单引号括起来,%c】

printf("%c",'Q');

计算机中所有数据都是以二进制的形式存储,将字符中的每个字符编一个二进制序列叫做编码,C语言中字符遵循【ANSI】出台的标准ASCII编码方式。

参考:ASCII 码表 - cppreference.com

常用ASCII码:A~Z——65~90 【+32】->a~z——97~122

数字0~9——48~57

\n对应10,ASCII 0~31这32个字符为不可打印字符。

8.字符串和\0【字符串由双引号括起来,%s】

printf("%s\n","hello world!");

“\0“:是在字符串末尾的隐藏字符,是字符串的结束标志【葫芦娃里的老七】

<对于字符串"abcdef",可看到的是六个字符,但实际上末尾还隐藏着\0的转义字符,是字符串的结束标志,在使用库函数printf()打印字符串或者strlen()计算字符串长度时,遇到\0就自动停止。>

int main(){
char arr1[] = {'a','b','c'};
char arr2[] ="abc"
printf("%s\n",arr1);    
printf("%s\n",arr2);//arr1语句输出时会显示abc后面跟一堆乱码(脏数据),而arr2只显示abc`
return 0;
}

9.转义字符:在字符前\,将其本身意义进行变换,实现其他功能

【两个较为特殊的转移字符%ddd,%xdd,前者表示1~3(ddd)个八进制的数字,后者表示两个(dd)十六进制数字】

参考网址:转义序列 - cppreference.com

10.语句和语句分类

        1空语句:一个分号;

        2表达式语句:在表达式后加分号;

int a = 3;

       3 函数调用语句;

#include<stdio.h>
int Add(int x,int y)
{
    return x+y;
}
int main(){
    printf("damn!\n");//函数调用语句1
    int ret = Add(3,3)//函数调用语句2
    return 0;
}

        4符合语句:成对括号中的代码就构成一个代码块,也别称为复合语句;

for(int i=0;i<=3;i++)
    {
        printf("damn!");
    }   

5控制语句:用于控制程序的执行流程,以实现各种结果方式(C语言支持三种结构:顺序结构,选择结构和循环结构),他们由特定的语句定义符组成,C语言有九种控制语句

  • 条件判断语句:if语句,switch语句;

  • 循环执行语句:do while语句,while语句,for语句;

  • 转向语句:break语句,goto语句,continue语句,return语句;

11.注释:

两种形式:

  • /* */,内部可以分行,可以插在行内(不可嵌套);

  • //,单行注释

<编译时,注释会被空格代替>

C语言的数据类型和变量

1.数据类型——数据类型仍可细分为内置类型和自定义类型

  • 内置类型:字符型,整型,浮点型,布尔类型;

  • 自定义类型:数组,结构体-struct,枚举类型-enum,联合体-union;

1.1字符型:

char [signed]char unsigned char

1.2整型

short   [signed]short   unsignedshort//短整型
int     [signed]int     unsignedint//整型
long [int]  [signed]long [int]  unsigned long [int]//长整型
long long [int]     [signed]long long [int]                 unsigned long long [int]//更长的整型,在C99中引入

1.3浮点型

float   double  long double

1.4布尔类型(老北京“不儿”)

_Bool//布尔类型的使用得包含头文件<stdbool.h>
#define bool _Bool
#define false 0
#define true 1
_Bool flag = true;
if(flag)
    printf("不儿\n");

1.5数据类型的长度

sizeof操作符,专门用来计算sizeof的操作符数的类型长度,单位是字节;

sizeof(类型)      sizeof 表达式

注:

  • sizeof的操作数如果不是类型,是表达式时,可以省略后边的括号;

  • sizeof后边的表达式是不真实参与运算的,根据表达式的类型来得出大小(因为sizeof在编译期间就已经进行了处理,不会在运行阶段判定);

  • sizeof的计算结果是size_t类型的

printf("%zd\n",sizeof(a));//sizeof(int)
#include<stdio.h>
int main()
{
    printf("%zd\n", sizeof(char));//1
 printf("%zd\n", sizeof(_Bool));//1
 printf("%zd\n", sizeof(short));//2
 printf("%zd\n", sizeof(int));//4
 printf("%zd\n", sizeof(long));//4
 printf("%zd\n", sizeof(long long));//8
 printf("%zd\n", sizeof(float));//4
 printf("%zd\n", sizeof(double));//8
 printf("%zd\n", sizeof(long double));//8
 return 0;
}

2.signed和unsigned

C语言使用signed和unsigned关键字修饰字符型和整型类型。signed关键字,表示一个类型带有正负号,包含负值;unsigned关键字,表示该类型不带有正负号,只能表示零和正整数。【对于int类型,默认是带有正负号的,即int=signed int】

当使用int类型表示非负整数时,要说明 unsigned int.

整数变量声明为unsigned 的好处时,同样长度的内存能够表示的最大整数值增大了一倍。

对于char类型,默认是否带有正负号由当前系统决定。【不同于int】

3.数据类型的取值范围

【limits.h头文件中说明了整数类型的取值范围;float.h头文件中说明了浮点型类型的取值范围】

4.变量

4.1 变量的创建

清楚类型之后,就要明确类型是用来创建变量。在C中,将经常变化的值称为变量,不变的值称为常量

创建变量的语法形式:【数据类型 变量名】;在创建时给出变量的初始值叫做初始化。

4.2变量的分类

变量分为全局变量和局部变量。

  • 全局变量:在大括号外部定义的变量就是全局变量。使用过程更广,在整个工程中都可以通过手段使用。

  • 局部变量:在大括号内部定义的变量,适用范围较为局限,只能在自己所属的局部范围内使用。

【当全局变量和局部变量名字相同时,优先使用局部变量!】

在C语言的学习中,主要关注内存中的三个区域:栈区、堆区、静态区。

  • 局部变量放在内存的栈区;

  • 全局变量放在内存的静态区;

  • 堆区用来动态管理内存。

5.算术操作符【+、-、*、/、%】

5.1 +与- 对应加法和减法操作,操作数位于符号两端,这种操作符也叫双目操作符。

5.2 * 对应乘法操作。

5.3 / 用于除法操作,如果除号两端是整数,执行整数除法,得到整数结果;如果希望得到浮点数结果,两个运算数必须至少有一个浮点数,此时C语言进行浮点数除法。

5.4 % 求模运算,返回两个【整数】相除的余值。负数求模的规则是结果正负号由第一个运算数的政府决定。

6.赋值操作符:=和复合赋值

在变量创建时给一个初始值叫做初始化,在变量创建好后,再给一个值叫做赋值。

赋值操作符 =

6.1连续赋值

int a = b = c = 3;
c= b = a+3;//从左到右依次赋值

6.2复合赋值符

a = a+3 等价于 a +=3。其他运算符规则相同。

7.单目操作符

++和-- 自增/自减操作符

  • 前置++/--:先运算再使用;

  • 后置++/--:先使用再运算。

8.强制类型转换

instance
int a = 3.14;//此时编译器会报错,类型与赋值不符
int a = (int)3.14//没毛病了
//正常敲代码别用这种方法

9.scanf和printf

9.1printf

9.1.1基本用法

printf的作用是将参数文本输出到屏幕(f指的是format(格式化),表示可以定制输出文本形式);

printf()不会在末尾自动添加换行符,运行结束光标停留在输出结束的地方,不自动换行;

9.1.2占位符

printf()可以在输出文本中指定占位符(表示这个位置可由其他值代入)

printf("%d个和尚没水喝",3);//%d是占位符

输出文本中可有多个占位符

printf()参数与占位符是一一对应关系,n个占位符,有n+1个参数(包括“内容”)

9.1.3常用占位符列举

%c字符
%d十进制整数
%ffloat类型小数
%hd十进制short int类型
%huunsigned short int类型
%ld十进制long int类型
%luunsigned long int类型
%lfdouble类型小数
%p指针(打印地址)
%s字符串
%o八进制整数
%x十六进制整数
%zdsize_t类型

9.1.4输出格式

9.1.4.1限定宽度:printf()允许限定占位符的最小宽度

printf("%5d\n",123);//输出"  123",默认右对齐
printf("%-5d\n",123);//输出"123  ",此时左对齐
printf("%12f\n", 123.45);//输出"  123.450000"

9.1.4.2显示正负号

默认情况不对整数显示+号,只对负数显示-号,若想让整数输出+号,在占位符%后加上+号

printf("%+d\n", 12); // 输出 +12 
printf("%+d\n", -12); // 输出 -12 

9.1.4.3限定小数位数

printf("Number is %.2f\n", 0.5);//输出0.50
printf("%6.2f\n", 0.5);//输出"  0.50"(两个空格)

还有高手:最小宽度和小数位数这两个限定值可以用*号代替,通过printf()参数传入。

printf("%*.*f\n", 6, 2, 0.5);//效果同上

9.1.4.4输出部分字符串

%s占位符用来输出字符串,默认全部输出,如果只想输出开头部分,可以用%.[m]s指定输出长度,其中[m]代表一个数字,表示要输出的长度。

printf("%.5s\n", "hello world");//输出“hello”

9.2 scanf

9.2.1基本用法

scanf()函数用于读取用户的键盘输入,程序运行此语句时就会停止等待用户从键盘输入,当用户输入数据并按下回车键后,scanf()就会处理用户的输入将其存入变量。(包含在stdio.h中)

第一个参数是一个格式字符串,里面会放置占位符,输入数据需与其类型对应,其余参数就是存放用户输入的变量,占位符数量与变量数一一对应。

【变量前必须加&运算符(指针变量除外),因为scanf()函数传递的是地址而不是数值。】

scanf()函数处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等;处理用户输入的原理是:用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读,解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。

//举例理解
#include <stdio.h>
int main()
{
 int x;
 float y;
 // ⽤⼾输⼊ " -13.45e12# 0" 
 scanf("%d", &x);
 printf("%d\n", x);
 scanf("%f", &y);
 printf("%f\n", y);
 return 0;
}
//过滤空格,从-开始读取到13,“.”不属于整数的有效字符,停止解读;对于%lf,读取至#位置,取“.45e12”

9.2.2 scanf的返回值

scanf()的返回值是一个整数,表示成功读取的变量个数。

  • 如果没有读取任何项或者匹配失败,返回0;

  • 如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1) 。

9.2.3占位符

%c字符
%d整数
%ffloat类型浮点数
%lfdouble类型浮点数
%Lflong double类型浮点数
%s字符串
%[]在方括号中指定一组匹配的字符(%[0-9]),遇到不在集合之中的字符,匹配停止

【注:除了%c外,都会自动忽略起首的空白字符,若要强制跳过字符前的空白字符,写出scanf(" %c",&ch),在“%c”前加上一个空格,表示跳过零个或多个空白字符;对于%s,它的规则是从当前第一个非空白字符开始读取到一个空白字符(空格、换行符、制表符等)为止】

scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度(可以理解为吃饭不知道饱),所以储存字符串时,很可能超过数组边界,导致意想不到的结果。为防止此情况,可以限定最长长度写成%[m]s,输入超过整数m后的字符丢弃。

9.2.4赋值忽略符

作用:应对用户输入不符合预定的格式这一情况。

#include <stdio.h>
int main()
{
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d-%d-%d", &year, &month, &day);
 printf("%d %d %d\n", year, month, day);
 return 0;
}
/*如果用户按预定格式即某年-某月-某日,就会正确解读出对应数据,若不按规定输入scanf()解析数据失败*/

scanf赋值忽略符是在使用scanf函数时,用来跳过某些输入项而不进行赋值的特殊符号。它的语法形式是"%*字符",其中字符可以是任意类型的占位符,如%d、%f、%c等。

使用scanf赋值忽略符可以在读取输入时跳过某些不需要的数据,例如:

int a, b;
scanf("%d%*c%d", &a, &b);

上述代码中,%*c表示跳过一个字符,即跳过输入中的一个字符,而不进行赋值。这样就可以在读取输入时忽略掉某些字符。

注意,使用scanf赋值忽略符时需要注意输入的格式与占位符的对应关系,以免导致输入错误或者数据错位。

(此处仍有疑惑,这个赋值忽略符好像并没有解决输入不规范的问题=。=,只是跳过了某些占位符)

记录个人学习笔记,有问题请指正,万分感谢!


  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值