复习C语言随笔 六

24 篇文章 0 订阅
20 篇文章 0 订阅

1 define 与 const 与 typedef 与 enum

  • 1 define 不是一个关键字,用于宏定义。
#define M 3     //宏常量
int i=M;        //预编译期间进行宏替换,分配内存
int j=M;        //再次进行宏替换,又一次分配内存!

这里的 #define 宏常量在预编译阶段进行简单替换,本身没有类型。

  • 2 const 关键字之一,用于修饰只读变量。定义方法如下:
const int i=100;    //此时并未将 i 放入内存
int j=i;            //此时为 i 分配内存,以后不再分配!
int n=i;            //没有内存分配!   

const修饰指针时先忽略类型名,看const离哪个近就修饰哪个。例如:

const int *p;        //修饰*p,p可变,p指向的对象不可变
int coinst *p;       //修饰*p,p可变,p指向的对象不可变
int *const p;        //修饰p,p不可变,p指向的对象可变
const int *const p;  //修饰*p和p,p和p指向的对象都不可变

const 修饰的只读变量是在编译的时候确定值。 修饰符可以在类型说明符前,也可以在类型说明符后。例如: int const i=2;或 const int i=2;

  • 3 typedef 关键字之一,用于给一个已存在的数据类型取别名
typedef struct student
{
//code
}Stu_st,*Stu_pst;
A), struct student stu1;和 Stu_st stu1;没有区别。
B), struct student *stu2;和 Stu_pst stu2;和 Stu_st *stu2;没有区别。
C),const Stu_pst stu3;
D),Stu_pst const stu3;

这里的C和D组中 const 修饰的都是stu3

Stu_pst 是 struct student {//code}; 的别名。对于编译器来说,只认为Stu_pst 是一个类型名,所以在解析的时候自然的把“Stu_pst”这个数据类型名忽略掉。

  • 4 enum 关键字之一,内置类型之枚举类型
    一般定义方法如下:
enum enum_type_name
    {
        ENUM_CONST_1,
        ENUM_CONST_2,
        ENUM_CONST_3,
        ...
        ENUM_CONST_N
    }enum_variable_name;

这里的 enum_type_name 是自定义的一种数据类型名; enum_variable_name 为 enum_type_name 类型的一个变量,也就是我们平时常说的枚举变量;。ENUM_CONST_1、ENUM_CONST_2、…、ENUM_CONST_n,这些成员都是常量,也就是我们平时所说的枚举常量(常量一般用大写)。

枚举常量在编译时确定其值,可以调试,可以一次定义大量相关的常量。

2 操作符

  • 1 优先级
#include<stdio.h>

int main(){
    char a = 1;       //a :  00000001
    char b = 127;     //b :  01111111
    char c = a + b;   //c :  10000000
    printf("%d  %d\n", a+b, c);
    return 0;
}

输出结果为 128和-128.

我们知道,计算机是以补码对带符号数进行运算的。对于char型数据,占1个字节,8位二进制数。若表示数字,则范围是 -128~127。于是 char 型的 a, b, c的值以8位二进制数存储,将它们以整型(4字节,32位)输出时要进行位扩展。即:

// a: 00000000 00000000 00000000 00000001     // 1 的补码的位扩展
// b: 00000000 00000000 00000000 01111111     // 127 的补码的位扩展
// c: 11111111 11111111 11111111 10000000     // 1的补码加127的补码的结果的位扩展
// c: 10000000 00000000 00000000 10000000     // 补码再次求补

和的补码等于补码的和。所以 printf函数中 a+b 的补码为128的补码,即 00000000 00000000 00000000 1000000,为正数,再次求补后仍为这么多,输入结果当然为128啦; 在 print函数中 c 最高位为1,负数,再次求补后为 10000000 00000000 00000000 10000000 ,输出结果自然就是-128。

  • 2 结合性

    • 1 歧义表达式


      a*b + c*d + e*f;


      c + –c;


      int a=1;
      printf(“%d “,(++a)+(++a)+(++a));


    fun(void){
                static int i=0;
                return ++i;
            }
    int main(){
        printf("%d",fun()+fun()*fun());
        return 0;
    }

  • 3 是否控制求值顺序
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值