Linux第一课:c语言 学习记录day02

二、基础内容

2、词法符号

2.1、运算符

2.1.1、算术运算符

+    -    *    /    %    ++    --

1、/:相除,结果取整数部分

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a=5/2;
    printf("a=%d\n",a);
    float b=5/2;
    printf("b=%f\n",b);
    float c=5.0/2;
    printf("c=%f\n",c);
    float d=(float)5/2;  //强制转换只会改变一次
    printf("d=%f\n",d);
    float e=5/2;
    printf("e=%f\n",e);
    return 0;
}

dfd514fdf131428992f73f63c64c04d5.png

2、%:相除,结果取余数

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

92f24093e00c496e8953d2dbf3575164.png

3、++/--:

单独成句:

#include<stdio.h>
int main()
{
    int a=9;
    a++;
    int b=5;
    b=b+1;
    int c=2;
    ++c;
    printf("a=%d\nb=%d\nc=%d\n",a,b,c);
    return 0;
}

e924c67b77fc499f94cb9f3305f37654.png

在赋值语句中:
        ++在后:先赋值后算数

        ++在前:先算数后赋值

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

2.1.2、逻辑运算符

与或非:&&        ||        !

1、0为假,非0为真

#include<stdio.h>
int main()
{
    printf("%d\n",2>3);    // 0 假
    printf("%d\n",12>3);    // 1 真
    printf("%d\n",2>3 && 12>3);
    printf("%d\n",!(2>3));    // 非假则真
    printf("%d\n",!3);    // 0 非真则假
    return 0;
}

5b53dd4be2274cd1be7cd572ebac3732.png

2、截断法则:

逻辑与:

        前面结果为假,后面表达式不再执行,返回假

逻辑或:

        前面结果为真,后面表达式不再执行,返回真

#include<stdio.h>
int main()
{
    int a=1,b=2,c=3,d=4,m=2,n=2;
    (m=a>b) && (n=c>d);
    printf("%d",n);
    return 0;
}

fcdebc8089494a72845ef7ed2701dc9d.png

2.1.3、位运算符

        转换成二进制,每一位相互比较

整数的三种表现形式:
原反补:正数相同,只看负数

原码:自身二进制数,给人看的

反码:原码除符号位外其余取反

        符号位:首位,1为负数

补码:反码+1,遵循二进制加减规则

        计算机中整数以补码进行储存和计算,所以补码是给机器看的

//假设int类型是1个字节
#include <stdio.h>
int main()
{
    int a = 15;
    // 原码:0000 1111
    int b = -12;
    // 原码:1000 1100
    // 反码:1111 0011
    // 补码:1111 0100
    int c = a & b;
    // 15: 0000 1111
    // -12: 1111 0100
    // &: 0000 0100
    // 4: 0100
    printf("%d\n", c); // 4
}

&        位与        全1则1,有0则0

#include<stdio.h>
int main()
{
    int a=15;    //15:1111
    int b=12;    //12:1100;
    int c=a & b;    //&:1100==>12
    printf("c=%d",c);    //c=12
    int d=-12;
    int e=a&d;
    printf("e=%d",e);
    return 0;
}

b8c66c78e5724379b0a309eeeae2d72d.png

|         位或        有1则1,全0则0

^        异或        相同为0,不同为1

~        取反        1变成0,0变成1

<<        左移        左移n位,右边补零

>>        右移        右移n位,右边丢弃

#include<stdio.h>
int main()
{
    int a=6;
    int b=-6
    int c=a<<2;
    //6:110    11000    24
    //6*2*2=24
    int d=b<<2;
    //-6*2*2=-24
    int e=a>>2;
    //6:110    110>>2==>1    1
    //6/(2*2)=1
    int f=b>>2;
    //-6/(2*2)=-2
    printf("c=%d\nd=%d\ne=%d\nf=%d\n",c,d,e,f);
    return 0;
}

c42a3e94b5144e2fab8893184c172729.png

置一公式:

        a|(1<<n)

置零公式:

        a&(~(1<<n))

#include<stdio.h>
int main()
{
    int a=12;	//1100
    int b=12;	//1100
    for(int n=0;n<4;n++)
    {
    	a=a|(1<<n);	
    	//1100 | 0001	1101	n==0
    	//1101 | 0010	1111	n==1
    	//1111 | 0100	1111	n==2
    	//1111 | 1000	1111	n==3
    	b=b&(~(1<<n));
    	//1100 & 1110	1100	n==0
    	//1100 & 1101	1100	n==1
    	//1100 & 1011	1000	n==2
    	//1000 & 0111	0000	n==3
	}
    printf("%d	%d\n",a,b);
    return 0;
}

2.1.4、关系运算符

        > >= < <= == != 

        = 赋值        == 等于

2.1.5、三目运算符

        表达式1?表达式2:表达式3

判断表达式1是否成立,

        成立执行表达式2

        不成立执行表达式3

#include<stdio.h>
int main()
{
    int a=5,b=9;
    int max=a>b?a:b;
    printf("%d\n",max);
    return 0;
}

2.1.6、赋值运算符

        = += -= *= /= %=

a-=5;        //a=a-5;

2.1.7、运算符的优先级

        单算移关与,异或逻条赋

单目运算符:++  --  !  ~

算术运算符:+  -  *  /  %

移位运算符:<<  >>

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

位与运算符:&

异或运算符:^

位或运算符:|

逻辑运算符:&&  ||

条件运算符:……?……:……

赋值运算符:=

补充:逗号运算符

顺序计算,计算值为最后一个表达式的值

2.2、关键字

2.2.1、储存类型

        auto static extern register

虚拟内存空间

        32位:4G

        64位:2^64字节        有效2^48字节

储存区

        栈区        函数体内部定义的变量

        堆区        程序员手动开辟

        全局区/静态区        函数体外部定义的变量

        常量区        char *p="hello";

2.2.2、数据类型

        int char short long float double signed unsigned

2.2.3、分支语句

        if else switch case default

2.2.4、循环语句

        for do while go to break continue

2.2.5、构造数据

        struct union enum

2.2.6、其他类型

        void const sizeof volatile return typedef

2.3、标识符

命名规则

        由字母数字下划线组成

        开头不能是数字

        不能与关键字重名

        见名知意

2.4、分隔符

        空格        tab        \n

2.5、标点符号

        英文输入法

3、变量常量

3.1、变量

        int a;        运行过程中会发生变化

格式

        储存类型        auto        决定储存位置

        数据类型        int        决定开辟的空间大小

数据类型

char

int

shortlongfloatdouble
1b4b2b

32位:4b

64位:8b

4b8b
-2^7~2^7-1四个字节32位有效位数6-715-16位
1字节 =8位 1111 1111 0-255 256个数 0111 1111 -128-127

printf("%d\n",sizeof(char));

        变量名        a        遵循标识符命名规则

3.1.1、全局变量与局部变量

区别:

区别局部变量 全局变量
定义位置函数内部函数外部
初值(定义未赋值)随机数0
作用域仅作用于函数内部作用于整个程序
存储位置栈区全局区/静态区
生命周期函数返回,变量消失程序结束,变量消失

3.2、常量

3.2.1、整型常量

        十进制        八进制        十六进制

3.2.2、字符常量

        由' '引用        '\'转义字符

#include<stdio.h>
int main()
{
    char a='A';
    printf("%c\n",a);    // A
    printf("%d\n",a);    // 65
    printf("%c\n",'\\');    // \
    printf("%c\n",'\101');    // A    八进制
    printf("%c\n",'\x41');    // A    十六进制
}

3.2.3、字符串常量

        由" "引用

字符串由每个字符组合而成,字符串默认以\0为结束标志,定义数组时要为\0留空位。

3.2.4、浮点型常量

        float        double

3.2.5、标识常量——宏定义

格式

        #define 宏名 常量值或表达式或函数

宏名一般用大写,以便与普通变量区分

常量值

注意:先进性单纯的替换,在进行计算

#include<stdio.h>
#define N 5
#define M N+2
#define NUM N+M*3
int main()
{
    printf("%d\n",N);
    printf("%d\n",M);
    printf("%d\n",NUM);
    return 0;
}

1b1dc91abc3648c49bcb9998ae82e255.png

上述程序就是典型的先替换后计算:第四行表达式里的M先替换为N+2,此时表达式为NUM=N+N+2*3,计算结果为16.

表达式

#include<stdio.h>
#define N a>b?a:b
int main()
{
    int a=5,b=7;
    printf("%d\n",N);
    a=55;
    b=99;
    printf("%d\n",N);
    return 0;
}

73836baf41294153b50080276e85aabe.png

此过程还可以用宏函数来实现

#include<stdio.h>
#define N(a,b) a>b?a:b
int main()
{
    printf("%d\n",N(5,7));
    printf("%d\n",N(55,99));
    return 0;
}

111b8674134f4d95b4e889180d8eadb9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值