C语言词法符号

 在C语言中,词法符号(也称为词法单元或标记)是构成C语言程序的基本元素。以下是C语言的主要词法符号:

1. 关键字:这些是C语言预定义的保留字,如int, char, if, else, for, while等。

2. 标识符:这些是程序员定义的变量,函数,数组等的名称。

3. 常量:这些是固定的值,如数字123, 字符'a', 字符串"hello"等。

4. 运算符:这些是用于执行各种操作的符号,如+, -, *, /, =, ==等。

5. 分隔符:这些是用于分隔语句和表达式的符号,如,(逗号),;(分号),{(左大括号),}(右大括号)等。

6. 空白字符:这些包括空格,制表符,换行符等,主要用于分隔其他词法符号。

举个例子

int main() { // "int" 和 "main" 是标识符,"()" 和 "{}" 是分隔符
    int a = 10; // "int" 是关键字,"a" 是标识符,"=" 是运算符,"10" 是常量,";" 是分隔符
    if (a == 10) { // "if" 是关键字,"a" 是标识符,"==" 是运算符,"10" 是常量,"()" 和 "{}" 是分隔符
        printf("Hello, world!"); // "printf" 是标识符,"Hello, world!" 是常量,"();" 是分隔符
    }
}

关键字(32)

C语言有一些预定义的保留字,也被称为关键字。这些关键字不能用作变量名

分类:

存储类型:auto  static  extern  register

数据类型:char  int  long  short  float  double signed  unsigned

构造类型:struct  union  enum

选择类型:if  else  switch  case  default

循环类型:for  while  goto  do  break  continue

其他:void  typedef  const  sizeof  return  volatile


标识符

在C语言中,标识符是用来识别变量、函数、数组等编程元素的名称

用于标识变量  宏定义  函数名…

命名规范:

  1. 由数字、字母、下划线(_)组成
  2. 不能以数字开头
  3. 不能和关键字重名
  4. 见名知义
  5. 标识符是区分大小写的

运算符

在C语言中,运算符是用于执行特定的数学或逻辑操作的符号

参与运算的符号

算数运算符  逻辑运算符  位运算符  关系运算符  赋值运算符  三目运算符

算术运算符:如 +(加),-(减),*(乘),/(除),%(取余)等

整数进行相除  向下取整

% 取余

求7890个位、十位、百位、千位数

++  在自身进行加1操作

int  a=1;

++a-->a=a+1--->2

--a  -->a=a-1---->0

输出语句时

++在前  先运算再输出

++在后  先输出再运算

在赋值运算时

++在前:先计算再赋值

++在后:先赋值后计算·


逻辑运算符

&&  ||  !

需要的操作数

单目运算(1个 ):++  --

双目运算(2个):+  -  &&  ||

三目运算(3个):?:

&&(逻辑与):全真为真  一假则假(真:1  假:0)

||   (逻辑或):全假为假  一真全真

! (逻辑非):取反  非真即假   非假即真

截断法则

逻辑与运算中,前面为假后面不进行运算

逻辑或运算中,前面为真后面不进行计算


位运算符

&  |  ~  ^   <<   >>

& (位与):全1则1 有0则0;

|  (位或):有1则1 全0则0;

~ (按位取反):1-->0 0-->1

^ (异或):相同为0 不同为1

对于整数来说有原码  反码  补码

int ---> 4个字节 ---> 32位(1个字节 = 8位)

原码

反码

补码

正数 +

二进制本身

本身

本身

负数  - 

二进制本身

原码取反

反码加1

 1:0000  0000  0000  0000  0000  0000  0000  0001

原码  反码  补码一致

-1:1000  0000  0000  0000  0000  0000  0000  0001

反码:1111  1111  1111  1111  1111  1111  1111  1110

补码:1111  1111  1111  1111  1111  1111  1111  1111

最高位是符号位

& 按位与

int a=5, b=-2, c=a&b;

printf("%d,c");

a= 5 原码  反码  补码:

0000  0000  0000  0000  0000  0000  0000  0101

b=-2原码  反码  补码:

原码:1000  0000  0000  0000  0000  0000  0000  0010

反码:1111   1111   1111   1111   1111   1111   1111   1101

补码:1111   1111   1111   1111   1111   1111   1111   1110

&:

0000  0000  0000  0000  0000  0000  0000  0101

1111   1111   1111   1111   1111   1111   1111   1110

结果补码:0000  0000  0000  0000  0000  0000  0000  0100

结果:4(因为结果补码是正数所以原码也是补码)

|  按位或

5 | -2

5的原码  反码  补码:

 0000  0000  0000  0000  0000  0000  0000  0101

-2补码:1111   1111   1111   1111   1111   1111   1111   1110

结果的补码:1111   1111   1111   1111   1111   1111   1111    1111

反码:1111   1111   1111   1111   1111   1111   1111   1110

原码:1000  0000  0000  0000  0000  0000  0000  0001

结果:-1(因为结果补码是负数所以补码要还原成原码)

^ 按位异或

5^-2

5  原码  反码  补码:

 0000  0000  0000  0000  0000  0000  0000  0101

-2补码:1111   1111   1111   1111   1111   1111   1111   1110

^: 补码:1111   1111   1111   1111   1111   1111   1111   1011

    反码:1111   1111   1111   1111   1111   1111   1111   1010

    原码:1000  0000  0000  0000  0000  0000  0000   0101

结果:-5

~ 按位取反

~5

 原码  反码  补码: 

0000  0000  0000  0000  0000  0000  0000  0101

 ~:补码:1111   1111   1111   1111   1111   1111   1111   1010

反码:1111   1111   1111   1111   1111   1111   1111   1001

原码:1000  0000  0000  0000  0000  0000   0000  0110

结果:-6

练习1

~ 15

5的原码  反码  补码:0000  0000  0000  0000  0000  0000  0000  1111

 ~:补码:1111   1111   1111   1111  1111  1111  1111  0000

反码:1111   1111   1111   1111  1111  1111  1110  1111

原码:1000  0000  0000  0000  0000  0000  0001  0000 

结果:-16

变量x和y的值相等,且为非零值,则以下选项中,结果为0的表达式是(D

A.x||y       B.x|y    C.x&y     D.x^y

-4&9 

a= 9 原码  反码  补码:

0000  0000  0000  0000  0000  0000  0000  1001

b=-4原码  反码  补码:

原码:1000  0000  0000  0000  0000  0000  0000   0100

反码:1111   1111   1111   1111   1111   1111   1111   1011

补码:1111   1111   1111   1111   1111   1111   1111   1100

&:

0000  0000  0000  0000  0000  0000  0000  1001

1111   1111   1111   1111   1111   1111   1111   1100

结果补码:0000  0000  0000  0000  0000  0000  0000  1000

结果:(因为补码是正数所以原码也是补码)

左移<<

操作的补码  左边丢弃  右边补0

 5 的原码  反码  补码: 0000  0000  0000  0000  0000  0000  0000  0101

5<<3  补码:000  0000  0000  0000  0000  0000  0000    0101  000  ---> 32+8=40

-5的原码1000  0000  0000  0000  0000  0000  0000  0101

反码:1111   1111   1111   1111   1111   1111   1111   1010

补码:1111   1111   1111   1111   1111   1111   1111   1011

-5<<3

补码:1   1111   1111   1111   1111   1111   1111   1011   000(左移3位)

反码:1   1111   1111   1111   1111   1111   1111   1010   111

原码:1   0000  0000  0000  0000  0000  0000   0101   000 ---> -40

右移>>

正数移动

右边丢弃  左边补0

5>>2

5的原码  反码  补码: 

0000  0000  0000  0000  0000  0000  0000  0101

00  0000  0000  0000  0000  0000  0000  0000  01 ---> 1

负数移动

右边丢弃  左边补1

-5>>2

补码:11   1111   1111   1111   1111   1111   1111   1111   10

反码:11   1111   1111   1111   1111   1111   1111   1111    01

原码:10  0000  0000  0000  0000  0000   0000  0000    10 ---> -2

练习2

以下程序输出结果是(A

int main( )

{

char x=040;

printf("%o\n",x<<1);

return 0;

}

  1. 100       B.80   C.64     D.32

过程:040 ---> 000 .....    001   000   000 ---> 100

置1公式、置0公式

置1公式:a | ( 1 << n )

置0公式:a & ( ~ ( 1 << n ) )n:要置0或者1的位数

a:原本数(要改变的数)

1:0000  0000  0000  0000  0000  0000  0000 0001

1 | (1<<1)

0000  0000  0000  0000  0000  0000  0000  0010( 先将原本数 << 1位 

  0000  0000  0000  0000  0000  0000  0000  0001( 原本数 )

0000  0000  0000  0000  0000  0000  0000  0011( 与原本数进行按位或 )

---> 3


关系运算符

< > <= >= == !=

注意:

1<x<=10 --->x>1&&x<=10

a != b--->a=1, b=2 --->1真

a != b--->a=1, b=1 --->0假


赋值运算符

=    +=    -=   *=    /=……

a  =10;

a+=10; --->a=a+10;

a* =10; --->a=a*10;


条件运算符(三目运算符)

?:

格式:表达式1 表达式2  表达式3

运算规则:判断表达式1是否成立,如果成立执行表达式2,不成立执行表达式3

int  a=3, b=5;

int c= a>b ? a++ : ++b;

c ---> 6


运算符的优先级

单目运算:!  ~   ++   --

算术运算:*    /   %   +   -

移位运算:<<    >

关系运算:>   <    >=    <=   ==   !=

位与运算:&

异或运算:^   |

逻辑运算:&&   ||

条件运算:?:

赋值运算:=    +=    -=    *=....

口诀:

单算移动关与    异或逻条赋

单目运算,从右向左运算


标点符号,   ;   ()   {}   []

分隔符换行    空格    tab


变量

在C语言中,变量是用来存储数据的标识符。每个变量都有特定的类型,决定了变量存储的大小和布局,以及在存储位置中的位模式。

概念:在程序运行过程中会发生变化的量

定义格式:存储类型   数据类型   变量名

赋值方式:

1. 在定义的同时进行赋值

        int  a=10;

        int  a=10,b=20,c=30;

2. 定义之后进行赋值

        int  a;

        a=10;

        int a,b,c;

        a=10;

        b=20;

        c=30;

变量的分类:

全局变量:函数外声明的变量,可以在全局使用

局部变量:函数内声明的变量,只能在内部使用


两者区别

局部变量

全局变量

定义位置

定义在函数内部

定义在函数外部

作用域

在声明函数内可以使用

在全局可用

初始值(未赋值)

随机值

值为0

存储位置

栈区

全局区

生命周期

和定义函数共存亡

和整个程序共存亡


数据类型

类型

长度

char

字符型

1个字节

short

短整型 

2个字节

int 

整型

4个字节

long

 长整型

4个字节

float

单精度浮点型

4个字节

double

双精度浮点型

8个字节


常量

C语言中的常量是指在程序运行过程中其值不会发生改变的量。常量可以是整数、浮点数、字符或字符串。在C语言中,常量可以使用关键字const来声明,并且在声明时必须进行初始化。

在使用常量时,需要注意以下几点:

1. 常量的值在程序运行过程中不能被修改。
2. 常量的命名通常使用全大写字母,以便与变量区分开来。
3. 常量可以用于表达式中,但不能作为左值(即不能被赋值)。

概念:在程序运行过程中不会发生变化的量

分类:

字符型常量

  用单引号(' ')引起来的数据就是字符型的数据

 只能包裹单个字符

'a' ----> 字符a( a ---->变量)

'  ' ----> 空格字符

'\n'----> 换行符

'A'   '\x41'(16进制)   '\101'(8进制)  ----> 字符A

字符串常量

多个字符拼接起在一起,使用双引号(" ")引起来

"hello"----->6个字节       \0:字符串结束的标志

对于一个字符串来说字符串的个数是实际个数+1

 sizeof():查看数据所占内存大小  返回值是所占内存的字节数

整型常量

1  2  3  4

一般使用int定义存储

浮点型常量

0.9   1.23小数都是浮点型常量

一般定义使用:float  double

指数常量

3*10^3 ---> 3e3

5*10^3------>5e3

注意:e的前面可以是整数或者小数,e的后面只能是整数

标识常量

宏定义:起标识作用(宏替换  宏代替)

定义格式:#define  宏名  常量或者常量表达式

宏名遵循标识符的命名规则

特点:只能单纯的替换  不可以进行运算()


 练习:

    #define N 2

   #define M N+3   // 2+3

   #define NUM N+M/2+1   //2+2+3/2+1 ---> 2+2+1+1=6

   void main()

   {

      int a = NUM;     

      printf("%d\n",a);

   }

答案:6

#define N 2

#define M 3*N   //3*2

#define T M+N   //3*2+2

#define NUM N*T+M/2+1   //   2*3*2+2+3*2/2+1 ---> 12+2+3+1=18

   void main()

   {

      int a = NUM;     

      printf("%d\n",a);

   }

答案:18

2*3*2+2+3*2/2+1

12  2  3  1

18

练习:结合宏定义、三目运算实现输出宏时是两个数中最大值

答案:

        1. int  a=1,b=20;

        #define MAX  a>b?a:b

        2. #define  MAX(a,b)  a>b?a:b;

        printf("%d\n",MAX(10,12));

 制作不易,点个关注再走呗!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值