三、C语言的词法符号

【1】C语言的词法符号

1.概念:

程序设计语言中由若干字符组成的有意义的最小语法单位。
按照词法符号的作用,有如下分类:
关键字、标识符、运算符、分隔符、标点符号

【2】关键字(32个)

1.概念:

由系统预定义的具备特定功能的词法符号

2.分类:

​ 存储类型:auto(自动型)、static(静态型)、extern(外部引用类型)、register(寄存器类型)
​ 数据类型:char(字符型)、short(短整型)、int(整型)、long(长整型)、
​ float(单精度浮点型)、double(双精度浮点型)、signed(有符号)、unsigned(无符号)
​ 构造类型:struct(结构体类型)、union(共用体类型)、enum(枚举类型)
​ 分支结构语句:if、else、switch、case、default、break、
​ 循环结构语句:for、while、do、goto、continue、
​ 其他:void(空类型)、return(返回值)、sizeof(计算字节大小)、const(只读修饰)、
typedef(重定义类型名)、volatile(防止被编译器优化)

  typedef   原类型名        别名;
  示例:
  #include<stdio.h>
  typedef   unsigned char   uch;  //给unsigned char起别名为uch		
  int main()
  {
	 uch ch = 65;
     printf("%c\n",ch);		
     return 0;		
  }		

【3】运算符

1.算术运算符

​ + - * / % ++ –
​ / :整数相除,向下取整
​ % :取余运算只能是整数运算
​ 10 % 3 = 1

++ :自加1
注意:在进行++运算时,要分析++的前后位置,来判断先取值还是先自加。

1)在赋值语句中
     int a = 3;
	 int b = a++;  // ++在后,先取值参与赋值运算,再让a自加1.
     printf("a = %d b = %d\n",a,b);  //a = 4   b = 3
	 
	 int a = 3;
	 int b = ++a; //  ++在前,先让a自加1再赋值给b。
     printf("a = %d b = %d\n",a,b);  //a = 4   b = 4
2)在打印语句中
	 int a = 3;
​     printf("a = %d\n",a++);  //a = 3  先取a的值进行打印,再让a自加1。		 

​	 int a = 3;
​     printf("a = %d\n",++a);  //a = 4	先让a自加1,再打印a的值。  
3)独立成语句时
    两者一样,因为语句执行结束,a的值都会自加1.
​     int a = 3;
​	 a++;   	//  a++  =>  a = a+1 
​     printf("a = %d\n",a);   //a = 4  

​     int a = 3;
​	 ++a;       //  ++a  =>  a = a+1 
​     printf("a = %d\n",a); 	 //a = 4 

  --:自减1
    同++;

​    简答题:设i = 3,分析(++i)+(++i)+(++i)的结果? //15  12  
​	    答:这是C语言的一种未定义行为,由编译器厂家来决定。
​		//gcc的打印结果是16
​		

2.逻辑运算符

1.&& || !

逻辑运算一般用于判断条件是否成立,
在C语言中通常认为0为假,非0为真。

2. &&(逻辑与)

运算法则:
全真则真,一假则假。
||(逻辑或)
运算法则:
一真则真,全假则假。

截断法则:
&& :如果前面表达式为假,则后面表达式不执行。
|| :如果前面表达式为真,则后面表达式不执行。

3. !(逻辑非)

运算法则:非真则假,非假则真。

3.位运算符

  1. & | ~ ^ << >>
      一般用于二进制位的运算中	  
      &(位与)
      运算法则:
        全1则1,有0则0.
      例:
         0x3c & 0x56
         0011 1100
       & 0101 0110
       = 0001 0100 = 0x14	
    
  2. |(位或)
    运算法则:
        有1则1,全0则0.
          例:
            0x3c & 0x56
            0011 1100
          | 0101 0110    		
          = 0111 1110 = 0x7e
            
         ~(按位取反)
         运算法则:
           0取反得1,1取反得0(二进制位)
          ~0x3c
          ~0011 1100
          =1100 0011 = 0xc3
    
    ​    ~0  
    ​	正数原码  0000 0000
    ​	正数补码  0000 0000
    ​	~ =       1111 1111
    ​	负数补码  1111 1111
    ​	负数原码  1000 0001
    ​	        = -1
    ​	
    ​    ~15 
    ​    正数原码  0000 1111
    ​    正数补码  0000 1111
    ​    ~=        1111 0000
    ​    负数补码  1111 0000
    ​    负数原码  1001 0000		
    ​	        = -16
    ​			
    ​    ~(-20) 		
    ​    负数原码  1001 0100
    ​	负数补码  1110 1100
    ​	~=        0001 0011
    ​	正数补码  0001 0011
    ​	正数原码  0001 0011
    ​	        = 19
    

​ ~ x = -(x+1)

  1. ^(异或)
    3. #### 
    
         运算法则:
            相同为0,相异为1.
         例:
            0x3c ^ 0x56
            0011 1100
          ^ 0101 0110     		 
          = 0110 1010 = 0x6a
           
         << 左移
         左移几位,右边补几个0.
         公式:x << n = x * 2^n
         2 << 3 = 16 = 2 * 2^3  
         8 << 2 = 32 = 8 * 2^2
        -5 << 3 = -40 = -5 * 2^3
        负数原码  1000 0101
        负数补码  1111 1011
        <<3       1101 1000
        负数补码  1101 1000
        负数原码  1010 1000
                = -40	 
        -7 << 2 = -28 
    
    右移	
     右移几位,左边补几个符号位。
     公式:x >> n = x / 2^n
    8 >> 2 = 2  = 8 / 2^2
     12 >> 3 = 1  = 12 / 2^3 
    -48 >> 4 = -3 = -48 / 2^4 
     负数原码 1011 0000 
     负数补码 1101 0000
    4    1111 1101
     负数补码 1111 1101
     负数原码 1000 0011
      = -3
    

4.赋值运算符

  =  +=  -=  *=  /=  ...
  int a = 1;
  a += 1;  =>  a = a + 1
  a *= 3;  =>  a = a * 3

5.关系运算符

<   >=  <=  ==  !=
数学表达式: 10 < a < 20
C语言表达式: a>10 && a<20
== 相等

=  赋值   

6.条件运算符

  1. 三目运算符
    1.   ?:
         表达式1?表达式2:表达式3
         运算法则:
            判断表达式1是否成立,如果成立则执行表达式2,否则执行表达式3;
    
      int a = 1,b = 2;
      int c = --a ? b++ : a++;
      问:c = ?   // 先执行--a,a=0,再执行c = a++,c = 0;
    
      面试题:用宏定义配合三目运算符实现两数求最大值。
      要求:通过宏定义传值        
    
      //宏定义传值
      #define  ADD(a,b)   a+b
      ADD(1,2) = 3
    
      c  = a>b ? a : b;
      #define MAX(a,b)  a>b ? a : b
      printf("%d\n",MAX(3,5));
    

【4】运算符优先级

    单目运算符  ! ~  ++  --
    算术运算符  *  /  %   +  -
    移位运算符  <<  >>
    关系运算符  <  <=  >  >=  ==  !=
	位与运算符  &
	异或运算符  ^  |
    逻辑运算符  &&   ||
    条件运算符  ?:
    赋值运算符  =  +=  -=  *= ...	

口诀:单算移关与,异或逻条赋。 (优先级从高到低)
从右向左单条赋。

a = 3;
int c = a-=a*=a+=a	//赋值运算结合性从右向左
c = ?  // 0

a-=a*=a+=a
a+=a => a = a + a = 3 + 3 = 6	  
a-=a*=6
a*=6 => a = a * 6 = 6 * 6 = 36
a-=36
a = a - 36 = 36 - 36 = 0

【5】输入输出语句

  1. 格式化输出函数printf

    	int printf(const char *format, ...);
    	功能:按照用户指定的输出格式打印到终端界面
    	参数:const char *format 输出格式
           	  %c   ---   字符
    		  %s   ---   字符串
    		  %d   ---   十进制整数    %nd  右对齐占n位   %-nd 左对齐占n位   %0nd 右对齐占n位不够位补0
              %ld  ---   long   long int 4字节
              %lld ---   long long 8字节		  
    		  %#o  ---   八进制整数     %o 不带前缀标志  
    		  %#x  ---   十六进制整数   %x 不带前缀标志   %#X  -> 0XFF
    		  %f   ---   单精度浮点型小数 float    %.nf 指定保留到小数点后n位
    		  %lf  ---   双精度浮点型小数 double
    		  %p   ---   地址  &取地址符 
    		  %u   ---   无符号数
    		  %e   ---   指数    %.ne
    

​ … 要输出的变量或表达式
返回值:实际输出的字符个数

2.格式化输入函数scanf

int scanf(const char *format, ...);
功能:按照用户指定的输入格式从终端输入数据
参数:const char *format 格式 (同printf)
      ... 要输入的变量的地址
	  int num;
	  scanf("%d",&num);
	  
    char a,b;
	scanf("%c%c",&a,&b); //两个字符紧挨着输入
	// 若输入abc,只能成功输入字符a和字符b。
	// 如果输入a空格b,那么空格会被输入给b。
	
	int a,b;
	scanf("%d",&a)    10 20
	终端输入整型数能够成功输入,如果输入非整型数则输入失败。
	scanf("%d%d",&a,&b);
	// 10空格20 10回车20 10Tab20 能够成功输入两个数
	  
	scanf("%d\n",&a);
	scanf("%d\t",&a);
	scanf("%d\r",&a);
	输入整型数后按回车并不能结束,只有再次输入一个字符才能结束。
	
	结束进程:ctrl + c
	  
	int a;
	char b;
	scanf("%d%c",&a,&b); 
      //输入1空格a或者1回车a,会将空格符或换行符赋给b。		  
	scanf("%d %c",&a,&b);    
      //输入1空格a或者1回车a都可以成功输入。
	scanf("%d,%c",&a,&b); 
	  //输入1,a可以成功输入。
	scanf("%*c%c",&b);
      //%*c吞掉任意一个字符
	  //空格为scanf输入结束的标志	      
	  
返回值:成功输入的数据个数

3.字符输入函数getchar

int getchar(void)
功能:从终端输入一个字符
参数:无
返回值:输入字符的ASCII码
//作用:处理垃圾字符

4.字符输出函数putchar

int putchar(int c);
功能:向终端输出一个字符
参数:要输出字符的ascii
返回值:同参数

输出换行:
printf("\n");
putchar('\n');
putchar(10);

周末作业:
1.完成运算符练习题(适当写一下解题思路),交给陈剑,周日之前收齐并打包。
2.预习分支结构语句(if-else、switch-case),完成时钟代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值