C语言学习重点概要(2)——数据,变量,操作符,printf和scanf函数

文章目录

目录

前言

一、数据类型(内置)

1.字符型

2.整型

短整型

整型

长整型

更长的整型

3.浮点型

4.布尔类型

注:

二、变量

1.变量的创建

2.初始化

3.变量的分类

4.变量存储的位置

三、数据类型的长度和sizeof操作符

1.sizeof操作符

注意:

2. 在VS2022环境下各数据类型的长度

3.数据类型的取值范围

四、操作符

1.算数操作符

2.赋值操作符

        1.赋值与=

         2.复合赋值符

3. 单目操作符:++,--,+(正),-(负)

        1.++,--

        2.+和-

        3. 强制类型转换

五、printf

1.作用

2.占位符

3. 几种简单的定制输出格式

1.限定宽度

2. 总是显示正负号

3.限定小数位数

4.输出部分字符串

六、scanf

1.用法

2.占位符

3. scanf的返回值

4.赋值忽略符 *

5.关于返回值被忽略和scanf_s

        1.关于返回值被忽略

        2.关于scanf_s

结尾



前言

本文紧接上文的前置内容介绍,开始为大家介绍数据,变量,printf和scanf函数。

从这里开始就真正开始进入编程之路了。

赠言:千里之行,始于足下。祝愿我与大家的编程之路一帆风顺。


一、数据类型(内置)

C语言为大家提供了丰富的数据类型来描述数据,我们在创建变量时往往要先描述变量的数据类型。其中又可以分为内置类型自定义类型,下面先为大家介绍一些内置类型

[ ]表示在使用时可以省略

signed表示有符号的,unsigned表示无符号的。(signed类型不是只能储存有符号的数据,无符号的数据也可以储存,而unsigned只能储存无符号的数据。但使用unsigned的好处是只储存无符号数据时,可以储存更多

1.字符型

用来表示字符类型

char

[signed] char

unsigned char

2.整型

表示整数类型

短整型

short [int]

[signed] short [int]

unsigned short [int]

整型

int

[signed] int

unsigned int

长整型

long [int]

[signed] int

unsigned int

更长的整型

long long [int]

[signed] long long [int]

unsigned long long [int]

3.浮点型

表示小数类型

float

double //双精度浮点型

long double

4.布尔类型

表述真假,取值为:true或者false,使用时要包含头文件<stdbool.h>

_Bool

注:头文件中有这样的描述,即为了方便可以写为bool,而false的值实际上是0,true的值实际上是1。在C语言中,0表示假非0表示真

#define bool _Bool

#define false 0
#define ture 1

注:

int默认为signed int,但char却不一定,不同的开发环境下默认不一样。

二、变量

变量简而言之就是可以变化的值。与之相对的,不变的值成为常量

1.变量的创建

上述介绍数据类型的意义是,它可以用来创建变量。创建变量的语法是这样的

数据类型 + 变量名(起名规则参照标识符规则)
如
int age;

2.初始化

在创建变量时给一个初始值,这被成为初始化。创建变量时通常会进行初始化操作,因为这样可以明确变量的初始值。比如

int age = 10;

3.变量的分类

全局变量:在函数外部定义,作用范围是从定义处开始到程序文件的结尾。

局部变量:在大括号内部定义的变量,作用范围是从定义出开始到大括号的结尾。

若全局变量和局部变量的名字相同,那么在执行操作时会优先使用局部变量(前提是在局部变量的作用范围内),如下面的代码

#include <stdio.>

int age = 10;
int main()
{
  int age = 20;
  printf("%d",age);
  return 0;
}

在这段代码会打印“age”的值,结果显示为20。

4.变量存储的位置

C语言中我们一般会关注内存的三个区域:栈区、堆区、静态区

全局变量放在静态区

局部变量放在栈区

三、数据类型的长度和sizeof操作符

每种数据类型都可以创建出长度不同的变量,变量长度不同,存储数据的范围不同。

1.sizeof操作符

sizeof是专门计算类型长度的操作符,单位是字节(等于8比特)

语法如下

sizeof(数据类型)
sizeof 表达式  
sizeof 变量名字  

//可以看到,计算表达式和变量名字时可以省略括号

注意:

              1.sizeof后面的表达式不参与运算,输出的值只是数据类型的长度,并不会计算结果。                        整型+整型还是整型,整型+浮点型变为浮点型

              (这是因为sizeof在编译期间就已经根据表达式的类型来确定长度了,而表达式的执行却                    是在程序运行期间。)

               2.sizeof返回值的类型为size_t类型,对应的占位符是%zd

2. 在VS2022环境下各数据类型的长度

                     单位:字节

char

1
short2
int4
long4
long long8
float4
double8
long double8
char1

可能有人要发出疑问:为什么int和long,double和long double是一样长的呢?

这是因为C语言规定后者只要大于等于前者就可以了,在不同的集成开发环境下可能不同

3.数据类型的取值范围

由上文可以知道,数据类型的长度并不一定是确定的,而有时我们却需要明确或使用到一种数据的最大值或最小值,那么我们可以使用以下常量来表示某一数据类型的最大值或最小值。

  • SCHAR_MINSCHAR_MAX: signed char 的最小值和最大值。
  • SHRT_MINSHRT_MAXshort 的最小值和最大值。
  • INT_MININT_MAXint 的最小值和最大值。
  • LONG_MINLONG_MAXlong 的最小值和最大值。
  • LLONG_MINLLONG_MAXlong long 的最小值和最大值。
  • UCHAR_MAXunsigned char 的最大值。
  • USHRT_MAXunsigned short 的最大值。
  • UINT_MAXunsigned int 的最大值。
  • ULONG_MAXunsigned long 的最大值。
  • ULLONG_MAXunsigned long long 的最大值。

四、操作符

1.算数操作符

   算术操作符                                           作用 
           +                                       完成加法
           -                                       完成减法
           *                                       完成乘法
           /                                       完成除法
           %                         完成整数除法的求模(余数)

注:1.像+,-这种有两个操作数(操作符两端的数)的操作符被称为双目操作符

        2.对于/,若两端都是整数,则会执行整数除法,结果是整数,如20/100会算出0。

          两端至少有一个浮点数时,会执行浮点数除法。

        3.%可作用于整数,且结果(余数)的正负号由第一个运算数决定

           第一个运算数是正号,结果就是正号,同理负号。

2.赋值操作符

        1.赋值与=

给创建好的变量一个值叫做赋值。=是一个可以随时给变量赋值的操作符。如

int a = 0;
int b = 3;
int c = 5;
a = 10;    //赋值
c = b = a+5; //连续赋值,顺序从右往左

其中最后一行的操作称为连续赋值,顺序是从右往左

虽然C语言支持连续赋值,但不建议这样做,因为不方便观察。而是拆成一个一个的算式。

         2.复合赋值符

+=    -=   
*=    /=    %=
>>=   <<=
&=    |=    ^=

这些操作符可以使变量完成自加自减等操作。

比如下面两端代码的意义是一样的

int a = 10;
a = a+2;

int a = 10;
a += 2;

3. 单目操作符:++,--,+(正),-(负)

        1.++,--

++或--表示自加1自减1, 和+=1或-=1的效果是一致的,但有前置和后置之分。下面以++举例说明

前置++先+1,再使用

后置++先使用,再+1

int a = 1;
int b = ++a; //a先自加1, 再赋值给b,所以b是2

int c = 1;
int d = a--; //c先赋值给d,再自加1,所以d是1

这使得两种++在赋值等操作时会产生不同的结果

        2.+和-

这里是指正号和负号

正号可以省略,对于赋值没有影响。负号可以用来改变数值的正负号。

如在负数前加负号,改值变为整数

        3. 强制类型转换

这是一种特殊的操作符,语法为(类型)

顾名思义,可以强制地转换数值的类型,不到万不得已请不要使用

int a = (int)3.14;//这里强制将3.14转为了int类型

五、printf

printf包含于库文件<stdio/h>,在使用时要先声明,其余包含于库函数的函数也如此,在本系列中,后续将不会再重复说明。

1.作用

print表示打印,f表示format(格式),printf可以定制格式打印。

这里展示一段基本代码

#include <stdio.h>
int main()
{
  printf("Hello world!\n");
  return 0;
}

2.占位符

上文说到了printf支持定制格式。在定制格式时,可以使用占位符。

占位符的作用是让printf函数知道,这个位置将会被某一特定格式的值来植入。

语法和举例如下

#include <stdio.h>
int main()
{
  printf("%d",3);
  return 0;
}

这里的%d就是一种占位符,它会先占位,然后等待植入,后面的3就是植入的值,会代替掉%d,

可以如上面的代码般直接植入,也可以植入自己创建的变量,将上述“3”的位置用变量名代替即可。同时占位符可以有多个,会被后续的值从左到右依次替代,用逗号隔开即可。

由此可知,printf函数的参数和占位符有对应关系,有n个占位符,就会有n+1个参数,以上图为例“ ”中的打印内容是一个参数,3是一个参数

下面是一些常用的占位符

  • %a:十六进制浮点数,字母输出为小写。
  • %A:十六进制浮点数,字母输出为大写。
  • %c:字符。//char
  • %d:十进制整数。//int
  • %e:使用科学计数法的浮点数,指数部分的 e 为小写。
  • %E:使用科学计数法的浮点数,指数部分的 E 为大写。
  • %i:整数,基本等同于 %d
  • %f:小数(包含 float 类型和 double 类型)。//float % f double - % lf
  • %g:6 个有效数字的浮点数。整数部分一旦超过 6 位,就会自动转为科学计数法,指数部分的 e 为小写。
  • %G:等同于 %g,唯一的区别是指数部分的 E 为大写。
  • %hd:十进制 short int 类型。
  • %ho:八进制 short int 类型。
  • %hx:十六进制 short int 类型。
  • %huunsigned short int 类型。
  • %ld:十进制 long int 类型。
  • %lo:八进制 long int 类型。
  • %lx:十六进制 long int 类型。
  • %luunsigned long int 类型。
  • %lld:十进制 long long int 类型。
  • %llo:八进制 long long int 类型。
  • %llx:十六进制 long long int 类型。
  • %lluunsigned long long int 类型。
  • %Le:科学计数法表示的 long double 类型浮点数。
  • %Lflong double 类型浮点数。
  • %n:已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。
  • %o:八进制整数。
  • %p:指针(用来打印地址)。
  • %s:字符串。
  • %u:无符号整数(unsigned int)。
  • %x:十六进制整数。
  • %%:输出一个百分号定制输出格式

3. 几种简单的定制输出格式

1.限定宽度

printf()允许限定占位符的最小宽度,在%后加上数字即可。比如

printf("%5d",123);

注:1.这里是定制打印宽度至少为5,123不足5位,会用空格补齐,默认右对齐。也就是说会在                123的左边补空格,输出为  123。

       2.当长度超过限定的最小宽度时,会正常打印。因为限定的是最小宽度。

       3.对于小数,限定的是所有数字的数目,即整数部分和小数部分都算。

       4. 若想改成左对齐,则在数字前加-

2. 总是显示正负号

在百分号后加+即可。如

printf("%+d",123);//会打印+123

3.限定小数位数

输出小数时在百分号后加.n,其中n表示数字。这时只会打印n位小数。如

printf("%.2f",0.5); //会输出为0.50

这种输出可以与上面两种混用,如

4.输出部分字符串

%.ns表示输出前n个字符。如

六、scanf

scnaf用来从键盘向变量里输入值。

1.用法

int i;
int a;
scanf("%d,%d",&i,&a);

同样使用占位符,&是取地址符号,除指针变量(如字符串变量)外的变量前必须加上。

因为scanf()传递的不是值,而是地址。

同样,可以使用多个占位符,但在输入时,必须按照前面的格式输入,如例子中必须输入

数字,数字,不可以用不一样的符号隔开,如空格。

scanf()在处理数值的占位符时,会自动过滤空白字符(空格,指标符,占位符等),所以输入的数据中含有空格等也没关系。但%c是例外。如果非要跳过空白字符,可以在c前面加空格,写成% c。

scanf()的原理是:用户的输入会先放入缓存,当回车键按下后,scanf按照占位符对缓存进行解读。解读时,会从上一次解读遗留的第一个字符开始,直到缓存读完或是遇到第一个不符合条件的字符为止。

2.占位符

scanf常用的占位符如下

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

:%s并不能简单地理解为字符串,它是从当前第一个非空白字符开始读起,直到遇到遇到空白字符为止。

3. scanf的返回值

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

若没有读取任何项,或者匹配失败,返回0

若在成功读取到数据前,发生了读取错误或是读取到文件结尾,返回EOF(-1)

EOF是end of file的意思。

在VS中,想要返回EOF,需要输入三次crtl+z

4.赋值忽略符 *

上文中提到scanf的输入必须和格式一致,但这样输入十分麻烦,所以可以使用赋值忽略符*

将赋值忽略符加在任何占位符的百分号后面,该占位符的值就不会返回,解析后就会被丢弃。

例如

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

这样无论是输入1,2,3;还是1 2 3;或是1-2-3就都可以被读取了。

5.关于返回值被忽略和scanf_s

我们在VS使用scanf时,总会出现下面两个提示

        1.关于返回值被忽略

这是因为我们只使用了scanf,但是却没有创建一个变量来存储scanf的返回值,我们只需要创建一个变量来存储它的值,或是直接忽视就好了。

        2.关于scanf_s

图中第二个报错翻译过来大概就是scanf函数不安全,请考虑使用scnaf_s。

scnaf不安全的一个原因是,如果输入的数据过多,会造成数据丢失。

但仍不推荐使用scanf_s进行替代,这是因为scnaf_s是微软自己开发的函数,也就是说其他的开发环境是不存在的,这就使得程序的可移植性得到了极大的限制。

同样忽视即可。如果一直报错感觉很烦,还可以用下面这种方法。

#define _CRT_SECURE_NO_WARNINGS 1

在源文件的第一行添加如图所示的代码,VS就不会再提示了。其中数字1可以不加,也可以自己定义个别的数字。

如果觉得每次新建文件都要加还是麻烦,可以找到下图的文件

并在里面写入上面的代码。如果提示不具有权限,可以将该文件拖动到桌面,任何进行写入,保存后再拖回到原文件夹的位置。

这样每次创建新的源文件,都会自动在开头自动加上这段代码了。

这是因为VS在创建源文件时,实际上就是在拷贝这个文件。

同理,自己想加入其他的代码也可以。


结尾

在本文中作者按照自己的理解为大家简述了printf和scnaf的使用及前置知识,以及作者本人认为必须了解到的一些注意事项。希望可以帮助到大家。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值