C语言第三课

1.补充第二课

(1)~   二进制按位取反//一个二进制数,首位0表示该数是正数,首位是1表示该数是负数。

(如:0101取反为1010)

源码,反码,补码的概念

源码:范围:-127 ~ +127,最高位是符号位,0表示正数,1表示负数  字长8位

[+0]原 = 0000 0000
[-0]原 = 1000 0000

反码:源码的范围:-127 ~ +127

负数--符号位(即第一位)不变,其他为取反      正数--跟源码一样

补码:源码的范围:-128 ~ +127

正数--跟源码相同  负数--x补=x反+1

如果 [-0]补 = [-0]反 +1 = 1 1111111 + 1 = 1 00000000,这个结果是用来表示 -128,而8位字长的0000 0000是表示[+0]的,产生冲突。其中反码+1,结果只保留低位的7位数字位,溢出的会置位溢出,而结果只保留低七位

**只要是整数,内存中存储的都是二进制的补码

解释代码

int main()
{
    int a = 0;//4个字节,32个比特位
    int b = ~a;//b是有符号的整型
    //000000000000000000000000
    //~二进制取反:111111111111111111111111
    printf("%d\n", b);//打印b的源码
    //111111111111111111111111(b的补码)
    //111111111111111111111110(先算b的反码 即补码-1)
    //100000000000000000000001=-1(b的结果)
    return 0;
}

(2)++    后置++:自增(先使用,后++)     前置++(与后置相反)

int a=10;
    int b = ++a;
    printf("a=%d,b=%d\n",a, b);//a=11,b=11

int a=10;
    int b = a++;
    printf("a=%d,b=%d\n",a, b);//a=11,b=10

--同理

2.其他操作符

(1)关系操作符

C语言第三课_第1张图片

(2)逻辑操作符

C语言第三课_第2张图片

假 :0       真 :非0

int a = 5;
    int b = 3;
    int c = a && b;
    printf("c=%d\n", c);//c=1(a,b都为真-->真,a,b其中有一个为假-->假)

||(a和b中有一个为真-->真)

(3)条件操作符(三目操作符)

exp1?exp2:exp3

(4)常见下标引用,函数调用

[]:下标引用操作符 arr[4]//数组

():函数调用操作符

(5)常用关键字

break  continue  case  char  const  default  do  enum  extern goto register signed unsigned

static struct switch tyepdef  union  void  volatile  

unsigned  无符号

unsigned int

typedef--类型定义--类型重定义  如typedef unsingned int=typedef u_int

(就是给unsingned int重新起一个名u_int)

static修饰局部变量,改变局部变量的生命周期

修饰全局变量,改变了变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用

修饰函数,改变了函数的链接属性。(一般的函数都具有外部链接属性,就是可以随便被extern声明然后修改。而static把函数的外部连接属性改为内部链接属性,既无法被随便声明)

void test()
{
    static int a = 1;
    a++;
    printf("a=%d\n", a);//2,3,4,5,6
}
int main()
{
    int i = 0;
    while (i < 5)
    {
        test();
        i++;
    }
    return 0;

extern:申明外部符号

#define1.定义标识符常量 #define MAX 100

2.定义宏--带参数

#define MAX(X,Y) (X>Y?X:Y)
int main()
{
    int a = 10;
    int b = 20;
    int max = MAX(a, b);
    printf("max=%d\n", max);//有了define这两行就等于下面两行了
    max = MAX(a, b);
    printf("max=%d\n", max);
    return 0;
}

2.指针

(1)内存

如何产生地址?32位-->32跟地址线/数据线-->当作电线,里面有正电和负电(1和0)-->二进制

-->可以产生2^32位地址   符号&+变量

int a = 10;//4个字节
    int*p = &a;//用来存放地址的变量--指针变量
    //printf("%p\n", p);
    *p=20;//*解引用操作符/间接访问操作符,使p找到a并改为20
    printf("a=%d\n",a);

注意:指针大小在32位平台是4个字节,64位平台是8个字节,不管是谁的地址,统统看是多少位

char ch = 'w';
    char* pc = &ch;//p+操作符关键字首字母
    printf("%d\n", sizeof(pc));//可以用这个来验证

在上方Debug处点击配置管理器可以调32位和64位加以验证

(2)结构体:C语言怎么描述复杂对象

以书为例:描述一本书需要书名+价格等

struct Book
{
    char name[20];//名字
    short price;//价格
};//不能漏掉!
int main()
{
    //利用结构体类型创建一个该类型的结构体变量
    struct Book b1 = { "C语言",55 };
        printf("书名:%s\n", b1.name);//.找到b1里面的name
    printf("价格:%d元\n", b1.price);
    b1.price = 15;
    printf("修改后的价格:%d\n", b1.price);

return 0;}

用指针写(.版)

struct Book b1 = { "C语言",55 };
    struct Book* pb = &b1;
    printf("%s\n", (*pb). name);//结构体变量.成员
    printf("%d\n", (*pb).price);

(->版)

struct Book b1 = { "C语言",55 };
    struct Book* pb = &b1;

printf("%s\n", pb->name);//结构体指针->成员
    printf("%d\n", pb->price);

ps怎么改上述程序的书名

struct Book b1 = { "C语言",55 };
    strcpy(b1.name, "C++");//strcpy-string copy-字符串函数-库函数-string.h
    printf("%s\n", b1.name);
    return 0;
}

你可能感兴趣的:(C语言学习(初阶),开发语言,c语言,学习)