嵌入式开发-【1】C程序学习-1.2 :C语言基础学习

目录

1进制转换

1.1一点小废话

1.2各类进制介绍

1.3进制之间转换

1.3.1 二进制转换

1.3.2八进制转换

1.3.3十进制转换

1.3.4十六进制转换

1.4 ASCII码介绍

2.词法符号

2.1关键字

2.1.1 存储类型

2.1.2 数据类型

2.1.3 构造类型

2.1.4 选择结构

2.1.5 循环结构

2.1.6 其他

2.2标识符

2.2.1 用途

2.2.2 命名规则

2.3运算符

2.3.1 算术运算符

2.3.2 逻辑运算符

2.3.3 关系运算符

2.3.4 位运算符

2.3.5 赋值运算符

2.3.6 三目运算符

2.3.7 运算符优先级

2.4标点符号

2.5分隔符

3 变量

3.1 定义格式

3.2 数据类型

3.3 全局变量和局部变量

4 常量

4.1 字符型常量

4.2 字符串常量        

4.3 整型常量

4.4 浮点型常量

4.5 指数常量

4.6 标识常量

5 输入输出

5.1 按字符输入输出

5.1.1 按字符输入getchar( )

5.1.2 按字符输出putchar( )

5.2 按格式输入输出

5.2.1 按格式输入scanf( )

5.2.2 按格式输出printf( )

5.3 垃圾字符回收

5.3.1 空格

5.3.2  %*c

5.3.3  getchar()


1进制转换

1.1一点小废话

       欢迎大家来到C语言第一课!今天介绍的是关于进制之间的转换,要学好C语言甚至后期的开发,首先需要明白我们要怎么和机器进行交流,就像与人与人之间的交流相同,但是不同地区交流的方式都不一定相同,山东人可能用山东话,东北人可能用东北话,虽然能听懂,但是总有一些“扑棱盖儿卡秃噜皮” “夜来轰上” 这种方言让其他地区的伙伴听不懂,这就好比C语言与C++的区别,代码我能看懂,但是咋有些关键字词我就是不明白呢?不管你明不明白,无论是C语言还是C++等,机器它都不明白!所以,程序语言在机器中到底是怎么运行的,我们写的程序都怎么让机器识别的,作者就从这一方面开始说起。

1.2各类进制介绍

      废话不多讲,能来这个高端论坛的肯定都知道,机器是通过二进制来识别代码的。我们目前的语言,无论是C、C#、C++,还是Java、Python,都需要经过一定的编译处理为机器识别的二进制。目前主要分为二进制、八进制、十进制和十六进制四类主要进制。

     二进制:英文为Binary,简写B。即0和1,特点为逢二进一,例如00、01、10、11 。无论是笔记本电脑还是32及51单片机中,都是通过二进制序列控制其实现某种功能的。

     十进制:英文为Decimal,简写为D。即0-9,特点为逢十进一,主要是方便工程师通过自己熟悉的数字及指令来进行仪器操作。在程序中,经常通过格式字符“%d”或“%i”来输出十进制整数。以下是将八进制15与十六进制1f输出为十进制数: 结果为a=13,b=21 。

#include <stdio.h>
int main(int argc, char const *argv[])
{
   int a = 015 ;
   int b = 0x1f ;
   printf("%d\n",a);
   printf("%i\n",b);
}
 

13
21

     八进制:英文为 Octal,简写为O。即0-7,特点为逢八进一,即0,1,2,3,4,5,6,7,10,11,12.......(此处不可以读十一/十二,而是一一、一二。)因为八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此经常常应用在计算机语言中。在程序中,经常通过格式字符“%o”来输出十进制整数,因为要区别八进制与十进制显示的区别,所以一般输出八进制整数时前边加“0”,这是格式字符为“%#o” ,如下图:  

#include <stdio.h>
int main(int argc, char const *argv[])
{
   int a = 15 ;
   printf("%o\n",a);
   printf("%#o\n",a);
}

17
017

    十六进制:英文为Hexadecimal,简写为H,或者hex。特点为逢十六进一,即0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 。十六进制一位对应二级制四位,所以也常用于计算机语言中。在程序中,经常通过格式字符“%x”来输出十六进制整数,与八进制相同,十六进制也是有前缀的,前缀为“0x”,可以通过“%#x”来实现,如下图:

#include <stdio.h>
int main(int argc, char const *argv[])
{
   int a = 15 ;
   printf("%x\n",a);
   printf("%#x\n",a);
}


f
0xf

各进制之间关系如下图所示:

十进制

二进制

八进制

十六进制

十进制

二进制

八进制

十六进制

0

0000

0

0

8

1000

10

8

1

0001

1

1

9

1001

11

9

2

0010

2

2

10

1010

12

a

3

0011

3

3

11

1011

13

b

4

0100

4

4

12

1100

14

c

5

0101

5

5

13

1101

15

d

6

0110

6

6

14

1110

16

e

7

0111

7

7

15

1111

17

f

1.3进制之间转换

1.3.1 二进制转换

二进制转为十进制:

       二进制转十进制通常使用对每一位的2的权重次幂累加进行计算,公式为

 A为各位次的值(0或者1),t为各位权 。例如二进制10110101转换为十进制如下图:

二进制转为八进制:

       因为2^3=8,所以二进制的三位可以作为八进制的一位,通常是从低位开始,二进制三位一组变一位八进制(也就是我们说的421码),最高位不足三位前方补0:

421码
二进制八进制二进制八进制
00001004
001   11015
01021106
01131117

       例如二进制10101100,三个分为一组,不够位数的最高位前方补0,就会得到010 101 100 ,把每三位二进制变为八进制为2 5 4 ,所以10101100变为八进制为0254 。

二进制转为十六进制:

       基本原理与二进制转八进制相同,不过此时应该将二进制的四位一组,不够四位的在最高位前方补0 (一般使用8421BCD码)。例如10101100 ,四位一组变为1010 1100 把每四位二进制转变为一位十六进制得到a c,所以10101100变为十六进制为0xac 。

8421BCD码
二进制十六进制二进制十六进制
0000010008
0001110019
001021010a
001131011b
010041100c
010151101d
011061110e
011171111f

1.3.2八进制转换

八进制转为二进制:

       八进制转为二进制与二进制转八进制的方法是互逆的,将八进制的一位分成三位二进制数字即可。例如:035 转变为二进制为 011101,即将3转变为011,将5转变为101,组合为11101(最前方0可以省略)。

八进制转为十进制:

      八进制转为十进制与二进制转为十进制的方法相同,公式如下:

例如:0271 变为十进制 

八进制转为十六进制:

       八进制转为十六进制目前还没有方法直接转,只能先将八进制转为二进制或者十进制,然后通过二进制和十进制进行转换。

      例:0254(八进制) ->10101100(二进制)->0xac(十六进制)

1.3.3十进制转换

十进制转为二进制:

      十进制转二进制主要有两种方法(其实还有第三种方法,后期偷偷的告诉大家~),第一种是短除法,此方法也可用于十进制转换为八进制和十六进制,算是比较通用的方法。第二种方法为拆分法,算是比较简单的对于低于8位的二进制数值应该是直接可以口算出来的。下面给大家具体介绍下这两种方法。

1)短除法:此方法主要是持续对2进行除法操作,写出每一步的余数,并断除到商为0的时候将所有余数倒序排列,得到该十位数的二进制。口诀为:除以2,商为0,倒取余。话不多说,上操作。

例如将52的十进制转换为二进制:

52/2=26     余0       ^

26/2=13     余0       |

13/2=6       余1       |

 6/2=3        余0       |  (希望大家能看出来,后边的这个符号是个从下往上的箭头)

3/2=1         余1       |

1/2=0         余1       |  商已经为0,那么倒取余,得到的数为110100 ,这就是52的二进制表示。

2)拆分法:将十进制数拆分为2的各次方相加的值,在各权位处值写1,其他地方写0。这个就需要大家对128  64  32 对2的位权数有一个直接的了解,比如128的对2的权重是7,32对2的权重为5等。1对2的权重为0,这样就可以将某一个整数拆为2的各幂次方相加的数值。

例如:52=32+16+4=2^5+2^4+2^2  所以在5,4,2 位置上写1,其他位置为0,得到二进制数110100  。这个就是52的二进制数值。用表格格式详细介绍一下:

数值

.......

128

64

32

16

8

4

2

1

次幂形式

......

27

26

25

24

23

22

21

20

......

7

6

5

4

3

2

1

0

(0/1)

.......

       将数值拆分后填入以上表格即可,255以内8位、1023以内9位二进制位即可。

3)神秘方法:当然,在编程中没有人会亲自运算32位甚至64位的二进制的数值,我们也可以利用电脑自带的计算器来进行各进制之间的转换,利用计算器的程序员模式,输入某一进制的数值就会同时得到其他进制的数值,方便又好用!

                

十进制转为八进制:

十进制转为八进制主要有两种方法:

       (1)首先转为二进制再转为八进制,此种方法过程请详细观看十进制转二进制与二进制转八进制的内容。

       (2)短除法。与十进制转二进制相同,通过短除法也可以实现十进制到八进制的转换,用一个十进制数值通过不断对8短除倒取余,得到的初值即为该数值的八进制。

例:将十进制96转为八进制。

96/8=12     余0

12/8=1       余4

1/8=0         余1      倒取余之后,得到的八进制数值为0140   所以96==0140   

十进制转为十六进制:

       十进制转为十六进制的方法步骤与十进制转八进制的方法步骤基本相同。使用短除法方法转换时要注意余数大于10时用a-f代替。

例:将十进制196转换为十六进制。

196/16=12     余4

12/16=0         余12(此处应写成c)  所以可以得到一个十六进制0xc4,即是十进制196的转换值。

 除此之外,也可以通过编写一段代码程序来输出相对应的进制数值:

#include <stdio.h>
int main(int argc, char const *argv[])
{
   int a ;
   printf("请输入一个整数:");
   scanf("%d",&a);   //输入一个十进制整数
  // scanf("%o",&a); //输入一个八进制整数
  // scanf("%x",&a); //输入一个十六进制整数
   printf("十进制:%d\n",a);
   printf("八进制:%#o\n",a);
   printf("十六进制:%#x\n",a);
}

结果:
请输入一个整数:6c
十进制:108
八进制:0154
十六进制:0x6c

请输入一个整数:056
十进制:46
八进制:056
十六进制:0x2e

请输入一个整数:196
十进制:196
八进制:0304
十六进制:0xc4

1.3.4十六进制转换

十六进制转换二进制:

        十六进制转换为二进制的方法与八进制转二进制的方法基本类似,将每一位十六进制拆为4位的二进制即可 。例如0xc6转变成二进制数值,通过8421BCD码可知,c 拆为二进制位1100,6 拆为二进制为0110,所以0xc6=11000110  。

十六进制转换八进制:

      十六进制转为八进制目前还没有方法直接转,只能先将十六进制转为二进制或者十进制,然后通过二进制和十进制进行转换。

      例如:将0xc6 变为八进制  0xc6==11000110==0306

十六进制转换十进制:

       十六进制转为十进制与二进制转为十进制的方法相同,公式如下:

      注意:此处应注意将A-F的符号换为数字,比如A6==10*16^1+6==166

        以上就是关于进制之间的所有内容,相信大家对这个应该是一点也不陌生了,之所以写的比较详细主要是为了能够使其他对计算机和数电模电等一窍不通的朋友提供一些教育资源,希望给大家带来帮助。

1.4 ASCII码介绍

        完成进制转换的介绍后,我们再介绍下ASCII码,那么什么是ASCII码呢?在解答这个问题之前,我们要先明白一个问题,既然计算机是通过二进制来传递信息的,那我们通常进行人机对话时,比如我们编辑一篇文章,电脑是怎么识别这些拼音字母的呢,比如我现在按下一个‘A’,那电脑代码中是传递A这个字符吗?结果是毋庸置疑的,电脑只能传递0 1 消息,所以要把A进行一个编码处理,让我们的机器来识别这个字母。这一套编码系统就是ASCII码。

        对于ASCII的用途,再借助百度百科来阐述一下:ASCII_百度百科 (baidu.com)

        在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

具体的ASCII码对照表如下图所示:

2.词法符号

      词法符号是指程序设计语言中由若干字符组成的有意义的最小的语法单位。这里主要包括两个内容,一个是词法,一个是符号。词法符号指的是一些已经有定义并有用途的关键字和标点符号等,这个是我们在编程时直接就可以用的东西,不需要再重新定义。

    注意:此处介绍不包括函数。

2.1关键字

     关键字共32个,简单介绍关于32个关键字的定义及内容。

2.1.1 存储类型

     存储类型决定我们开辟的空间(定义的变量或者常量)存放在内存的哪个区域。存储类型有auto(自动型),static(静态型),extern(外部引用)和register(寄存器类型)。

auto:只能用来修饰局部变量,有定义未赋值时默认值为随机值,数据存储在栈区;

static:可以用来修饰局部变量也可以修饰全局变量,未赋值时默认值为0,数据存储在静态区;

extern:只能用来修饰全局变量,可以跨文件使用。

register:寄存器变量,将定义数据存储在寄存器中。

以下是内存不同的存储空间:

2.1.2 数据类型

   数据类型是指我们要定义的变量是什么类型的,如果输入是数字的话,是整数还是小数,是正数还是负数,如果是字母要用什么数据类型,数据类型定义不同,所占内存空间大小是不同的。目前数据类型有:

整型:int  short(短整型) long(长整型)

浮点型型:float(单精度)double(双精度)

字符型:char 

符号表示:signed (有符号) unsigned(无符号)

具体数据类型的所占空间大小和值域范围在后期的变量章节中会讲到。

2.1.3 构造类型

      构造类型一般是指我们自定义的类型,有struct(结构体)、union(共用体)和enum(枚举)。

2.1.4 选择结构

     就是进行条件判断选择执行语句,就是平常我们想象的如果怎么怎么样,就怎么怎么样。这个形式的关键字主要有两大类。

    一类为if...else...  另一类就是switch    case   default 。第一类可以判断范围,第二类只能判断某一些特定的值和字符。

2.1.5 循环结构

    循环结构关键字有for、 while 、 do、goto、break、continue  。

2.1.6 其他

    void:空类型;

    volatile:防止编译器优化;

    sizeof:计算数据所占空间大小;

    typedef:重定义;

    const:只读修饰;

    return:返回值。

  

   以上为C程序中的32个关键词,具体用法大家不要着急哈,后期慢慢讲解~

2.2标识符

2.2.1 用途

    标识符是用来表示变量,函数,用户自定义项目的名称。比如通常我们所知的“大黄”,一听就是狗的名字,听见“小黑”,就可能是个皮肤黝黑的汉子,一说“强子”,那大家应该也都大概知道他怎么了。这里边的标识符也是一样的,比如我要求和,一般就会用sum,定义一个输入的数字,一般就用num。当然,肯定有人说我不就不用这个起名,我就想起一个狂拽炸天的名字。没问题!你可以起,但是必须要了解下我们的命名规则,就像给孩子起名字,你总不能以阿拉伯数字给人家命名吧。因此,和起名字一样,我们的标识符也是有一些自己的命名规则的。

2.2.2 命名规则

    1. 只能由数字,字母和下划线组成;

    2. 开头不能是数字;

    3. 不要与关键字相重复;

    4. 尽量见名知义。

 这个具体不详细解释了,大家都挺忙的,记住就行了。

2.3运算符

    运算符是我们在进行程序编辑中所使用的符号,就像咱们平常使用的加减乘除大于等于小于等,通过一些运算符号来判定一定的逻辑关系。主要分类由算数运算符、逻辑运算符、位运算符、赋值运算符、三目运算符等。

2.3.1 算术运算符

       故名思意就是加减乘除呗,但是程序语言中可不只是单单的加减乘除这么简单。在机器运算中,算数运算符包括(+ - * /  %  ++  -- )前边三个的加减乘就不给大家详细介绍,基本上与我们所熟知的用途是相同的。下边简单介绍以下后边四项运算符号。

      / (除号):这个除号与我们熟知的除号是不一样的,他的特点是:整数相除,向下取整。意思就是说如果定义的数据类型是整型(int),那么他是不会显示小数的,比如 int  5/2 这个值不是2.5,而是2,因为数据类型的原因,所以不会存小数的。如果需要显示小数的话可以把5定义位float类型,然后把 5 变成 5.0 ,这样得到的结果就是2.5了。

     % (取余):这个符号就是计算两数相除得到余数的,而且取余符号只能用于整数运算。比如5%2==1,这个就是说余数为1。

   ++ (自加)/ - - (自减):这个为自加自减符号,a++ 意味着a=a+1 ,b-- 意味着b=b-1 ;自加自减符号可以在变量常量的前边,也可以在后边,他们的表示意义是不相同的。

    ++/-- 在前:先自加再赋值或打印。

    ++/--在后:先赋值/打印再自加。

2.3.2 逻辑运算符

    逻辑运算符主要是对表达式进行判断,判断为真为假。经常与if语句结合使用。

    &&:逻辑与,全真则真,一真为假。

       | |:逻辑或,一真则真,全假为假。

   ! :逻辑非,非真即假,非假即真。

   另外介绍一下关于逻辑运算符与非的截断法则,就是说在逻辑与运算中,如果前面表达式为假,则后续表达式不再执行;在逻辑或运算中,如果前面表达式为真,则后续表达式不再执行。意思就是我通过前边的表达式就知道整个表达式的真假了,就没必要看后边的了,因此后边的语句也不再执行。

2.3.3 关系运算符

    关系运算符有>      <      ==      !=      >=      <=  这个就不详细介绍了,懂得都懂。

2.3.4 位运算符

&:位逻辑与  全1则1,有0则0  例:0xab & 03c == 0x28 (展开二进制)

|:位逻辑或   有1则1,全0则0   例:0xab | 03c == 0xbf

^:位逻辑异或 不同为1,相同为0 例:0xab ^ 03c == 0x97

~:位逻辑反   位0则1,位1则0

原码

反码

补码

正数

本身

本身

本身

负数

本身

符号不变,

其他位按位取反

反码+1

例子:unsigned int  ~(-12);

(-12)原码:1000 0000 0000 0000 0000 0000 0000 1100

(-12)反码:1111 1111 1111 1111 1111 1111 1111 0011

(-12)补码:1111 1111 1111 1111 1111 1111 1111 0100

~(-12):   0000 0000 0000 0000 0000 0000 0000 1011

总结:1.在计算机中:X+(~X)=(-1) ,X为unsigned int

2.原码变补码:取反码+1  补码变原码:取反码+1

3. 在负数取反时要先写出补码,计算机对数值的操作是对补码进行操作

<<:左位移  规则: 左移几位,右边就补几个0 

负数要拆分为补码,再进行移动 

例:-5<<3 = -40    x<<n = x*2的n次方(符号不变)

>>:右位移  规则:右移几位,左边补几个符号位(正数补0,负数补1)             

将一个数a的第n位置1:  a | (1<<n)

将一个数a的第n位置0:  a & (~(1<<n))

2.3.5 赋值运算符

数值运算与位运算符

运算符

功能说明

示例

+=

加赋值

a+=b -> a=a+b

-=

减赋值

a-=b -> a=a-b

*=

乘法赋值

a*=b ->  a=a*b

/=

除法赋值

a/=b -> a=a/b

%=

取余赋值

a%=b -> a=a%b

位运算

运算符

功能说明

示例

&=

                 位与赋值

a&=b    a=a&b

|=

位或赋值

a|=b     a=a|b

^=

位异或赋值

a^=b     a=a^b

>>=

位右移赋值

a>>=b     a=a>>b

<<=

位左移赋值

a<<=b     a=a<<b

2.3.6 三目运算符

    用法:[表达式1] ? [表达式2]  :[表达式3]   ;

   首先判断表达式1是否成立,若成立执行表达式2,否则执行表达式3

   这个运算符基本是 if 语句的简化用法,通过判断表达式1的值的真假来输出后边两个表达式。

例如:MAX = a > b ? a : b

通过三目运算符来实现最大值的输出。

2.3.7 运算符优先级

  运算符的优先级如下图表所示。

2.4标点符号

      这里就是在C语言中可以使用的标点符号,主要有   , ; :{  }  (  ) [  ]  

2.5分隔符

     分隔符主要有空格 tab键和enter键

3 变量

    变量就是在程序运行中会发生变化的量。

3.1 定义格式

    【存储类型】  【数据类型】  【变量名】  

存储类型就是指变量存储在内存的哪一块区域,默认的是自动型(auto),可以不写。

数据类型指的是定义的变量是什么类型的,是整数,小数,还是字符,都需要不同的数据类型进行定义。

变量名需要符合标识名的命名规则。

3.2 数据类型

这里的数据类型和2.1.2章节是一样的内容,具体的占用字节长度和值域可以看下表。

3.3 全局变量和局部变量

            全局变量是在函数外部定义的变量,局部变量实在函数内部定义的变量,具体的不同可以参照下表所示。

全局变量与局部变量
不同之处全局变量局部变量
定义位置定义在函数外部定义在函数内部
初始值初始值为0初始值为随机值
存储位置存储在全局区(静态区)存储在栈区
生命周期随着程序结束而结束随函数调用结束而结束
作用域作用于整个程序只作用于函数内部

4 常量

       常量是指在程序运行中不会变化的量。

4.1 字符型常量

      字符型常量一般用‘  ’(单引号来进行表示),这里有一个误区,不是说字符型常量只能是字母,大写字母和小写字母,数字和一些特殊符号也可以是字符,只要用单引号括起来的,都是字符型常量。

    字符型常量一般用char 数据类型来定义,char为字符型,在这里说明,char   ch=6 和char=‘6’是不相同的两个定义,前者打印出的是数值6对应的ASCII码值(当然在编译的时候是编译不出来的),后者是打印的字符6 。

   可以举例演示一下:已知‘A’的ASCII码值为65.

#include <stdio.h>
#include <math.h>

int main( )
{

	char ch1 = '65' ;
    char ch2 = 65 ;
	
	printf("%c\n",ch1);
	printf("%c\n",ch2);
    return 0 ;
}

结果是:

5

A       

为什么ch1输出的是5,而不是65呢?这是因为char类型占一个字节空间,所以高位的 6 溢出,因此不会显示6,只能显示5。

4.2 字符串常量        

       字符串常量一般用“ ”(双引号来进行表示),代表一些字符的集合,在这里需要注意的有两点。第一点是字符串常量可以修饰一个字符,“ a ” 与   ‘ a ’  代表的是不一样的,前者代表字符串,后者代表字符。第二点是字符串没有单独的数据类型去修饰,可以定义一个字符  char  ch=‘a’ ;但是无法用数据类型定义一个字符串。如果想要定义字符串的话可以用指针和数组来进行定义。

4.3 整型常量

    整型常量为整数,利用int 、short 、long 数据类型来修饰,例如 int a=10;负数也可以被赋值。

4.4 浮点型常量

    浮点型型常量为小数,利用 float 和 double 数据类型来修饰。

    例如 float a=10;打印的结果为10.000000 。

#include <stdio.h>
int main(int argc, char const *argv[])
{
   float a = 10;
    
    printf("%f\n",a);
    return 0;
}

输出:
10.000000

4.5 指数常量

           指数常量指的是利用科学计数法来表示的数值,但是因为在C程序中无法表示10^n,所以用e来表示10的次方,后边的数字为幂数字。比如3.25e8,代表3.25*10^8;   5.00e-2表示5.00*10^(-2)  。这边需要注意的是指数常量的数据类型用浮点型来表示,但是输出的时候格式符与浮点型的格式符不同。用"%e"来表示。

#include <stdio.h>
int main(int argc, char const *argv[])
{
   float a = 1234;
   float b = 0.000235;    
    printf("%f %e\n",a,a);
    printf("%f %e\n",b,b);
    return 0;
}

输出:
1234.000000 1.234000e+03
0.000235 2.350000e-04

4.6 标识常量

     标识常量是指利用宏定义一个常量,需要注意的是宏定义只是用来定义一个常量的,不能被赋值,它的作用主要是代替公式或者一些复杂的关系式等。

    宏定义的格式为:#define     [宏名称]  [常量或变量表达式]

    宏定义的特点:原样替换 。

    可以通过以下这个小程序来解释宏定义的原理,首先定义一个N,这个N是3+2,那我用给一个定义的 a 赋值,a=N*2 。那么将N更换之后,公式变为了a=3+2*2,结果为7,并不是先算出3+2的值再*2,所以宏定义属于原样替换,不会进行优先运算。

#include <stdio.h>
#define  N   3+2
int main(int argc, char const *argv[])
{
   int a ;
   a = N * 2;   
    printf("%d\n",a);
    return 0;
}


输出:
7

5 输入输出

      下面讲解一下关于C语言输入输出的函数,输入就是从终端获取数字、字符、数字等到程序中,输出就是将终端输入或者经过程序运行后得到的结果输出到终端。输入输出包括按字符输入输出和按照格式输入输出,按字符输入输出是指将字符一个个的输入输出,按照格式输出指的是按照一定格式将字符串或单个字符输入输出。

     下面主要从函数的三个要素来讲解输入输出功能,首先介绍下函数的三要素:功能、参数、返回值。

      功能:此函数实现的功能;

      参数:函数中要求的常量、变量或表达式;

      返回值:反馈到程序中的值。

5.1 按字符输入输出

5.1.1 按字符输入getchar( )

         格式:int getchar(void);

         功能:从终端获取一个字符;

         参数:无参数,不需要传参;

         返回值:无

getchar可以输入数字和字母等,但是是要单个输入的,如果输入过多的字符会输出第一个字符。

5.1.2 按字符输出putchar( )

         格式:  int putchar(int c);

         功能:向终端输出一个字符;

         参数:c:输出字符的ASCII码值;

         返回值:int 类型,返回输出字符的ASCII码值

putchar可以输出数字和字母等,但是也是单个输出的,无法一次性输出多个字符。

5.2 按格式输入输出

5.2.1 按格式输入scanf( )

       格式:int scanf(const char *format, ...);

       功能:按照指定的格式向终端输出;

       参数:format:字符串 。要注意,双引号中无“\n”,而且后边变量前要加&符号。

       返回值:正确输入数据的个数 , 如果第一个数据输入错误,就直接返回0 ; 

5.2.2 按格式输出printf( )

         格式:int printf (const char *format,...);

         功能:按照指定的格式向终端输出

         参数:format:字符串

字符串格式类型 字符串修饰类型
格式符修饰的数据类型修饰符解释
%dint-标识左对齐,默认右对齐
%ccharm位宽
%ffloatm>实际位宽时,输出m位宽
%lfdoublem<实际位宽时,输出实际位宽
%s字符串.n保留小数点n位
%#x输出十六进制  
%#o输出八进制  
%e输出指数形式  
 %p输出地址  
%u     无符号类型  

        返回值:输入字符的个数 。

5.3 垃圾字符回收

5.3.1 空格

       回收一个或者多个空格、\n和tab     需要在两个格式符中间加空格

5.3.2  %*c

      可以回收任意一个字符

5.3.3  getchar()

      可以回收任意一个字符,一般用于循环中回收“\n”

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值