Bootstrap

Linux C系列学习笔记_第三集

运算符

1.1 逻辑运算符

&&逻辑与:     一假则假

||逻辑或:        一真则真

!逻辑非:         非真则假,非假则真

0为假   1为真
printf("%d\n",2>3);             //0
printf("%d\n",22>3);            //1

printf("%d\n",12>3&&8<6);       //0
printf("%d\n",12>3||8<6);       //1
printf("%d\n",12>3 && !(8<6));  //1
printf("%d\n",!1);              //0

0为假  非0值为真
printf("%d\n",81&&10);	        //1

截断法则

逻辑与运算中,前边的表达式结果为假,后边的表达式不再执行,直接返回假

逻辑或运算中,前边的表达式结果为真,后边的表达式不再执行,直接返回真

#include <stdio.h>
int main()
{
	int a=5,b=6,c=7,d=8,m=2,n=2;
	(m=a>b)&&(n=c>d);
	printf("%d  %d",m,n);		//0  2
}
int a = 1 ,b=2, c=3, d=4, m=2, n=2;执行(m = a > b) && (n = c > d) 后 n = 2

1.2 位运算符

二进制数 0 1

& | ^ ~ << >>

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

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

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

~取反:1——》0, 0——》1

int a = 12,b = 10;
int c = a & b;
//12:1100
//10:1010
//& :1000---8
printf("%d\n",c); //8
return 0;

  练习:

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

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

a=a^b;//0110==6

b=a^b;//0110 1010 1100=12a=a^b;//0110 1100 1010=10

原码、反码、补码

原码

反码

补码

正数

相同

相同

相同

负数

相同

除符号位外,其他按位取反

反码+1

计算机中,整数以二进制的补码形式存储,计算的

int 4字节=32位 1字节=8位

符号位:最左边 0正数 1负数

例:-12补码

1000 0000 0000 0000 0000 0000 0000 1100

1111 1111 1111 1111 1111 1111 1111 0011

1111 1111 1111 1111 1111 1111 1111 0100

~取反

移位

<<左移

左移n位,右边补充n个0

6<<2==24

公式:

        6*2^2=24

        -6*2^2=-24

>>右移

右移n位,最右边舍弃n位

6>>2==1

公式:

        6/2^2=1

        -6/2^2=-2

补充

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

置零公式:a&(~(1<<n))

#include <stdio.h>
int main()
{
    printf("%d\n", 2 > 3);           //0
    printf("%d\n", 22 > 3);          //1
    printf("%d\n", 12 > 3 && 8 < 6); //0
    printf("%d\n", 12 > 3 || 8 < 6); //1

    int a = 5, b = 6, c = 7, d = 8, m = 2, n = 2;
    (m = a > b) && (n = c > d);
    printf("m=%d  n=%d\n", m, n);

    a = 10, b = 8; //1010&1000
    c = a & b;     //8
    printf("a&b=%d\n", c);

    a = 7;
    printf("取反~7=%d\n", ~a);

    char x = 040;
    printf("%o\n", x);      //000 100 000 << 001 000 000
    printf("%o\n", x << 1); //左移1位

    x = 1;
    int y = -1;
    printf("%d\n", (x-- & ++y));

    b = 2;
    printf("(b>>2)/(b>>1) =%d\n", (b >> 2) / (b >> 1));

    a = 3, b = 6;
    printf("a^b<<2=%d\n", a ^ b << 2);

    return 0;
}

练习:

以下程序升输出结果是()

int main()
{
    char x=040; //100 000
    printf("%o\n",x<<1);//001 000 000
    return 0;
}

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

已知:intx=1,y=-1;,则语句printf("%d\n",(x-- & ++y));的输出结果是( 0)

已知 a = 13,a <<2 的十进制数值为(52)//110100

1.3 关系运算符

> >= < <= == !=

=赋值

2--9 x>2&&x<9

1.4 三目运算符 (选择运算符)

? :

表达式1表达式2表达式3;

int a=5,b=9;

int c=a>b?a:b;

printf("%d\n",c); //9

1.5 赋值运算符

= += -= *= /= %=

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

1.6 运算符优先级

异或

单目运算符 ~ ++ -- !

算术运算符 * / % + -

移位运算符 << >>

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

运算符 &

异或运算符 ^

运算符 |

逻辑运算符 && ||

条件运算符 ?:

赋值运算符 = += -= *= /= %=

练习:

1.设int b=2;表达式 (b>>2)/(b>>1)的值是(0)

2.设有以下语句,则c的二进制值是(A)

char a=3,b=6,c;    //a:11,b:110
c = a^b<<2;        //b<<2:11000

a. 00011011
c.00011100
b.00010100
d.00011000

3.int x= 2,y= 3,z = 4; 则表达式 x+ (y >!z)的值为(3)

2+1

标点符号

英文 , ; [ ] {} () ....

分隔符

空格 tab \n

变量

程序运行过程中会发生变化

格式

存储类型 数据类型 变量名

int a;

存储类型决定变量存储位置

数据类型决定变量开辟空间大小

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

#include <stdio.h>
int main()
{
    printf("sizeof int =%ld\n",sizeof (int));
    printf("sizeof float =%ld\n",sizeof (float));
    printf("sizeof char =%ld\n",sizeof (char));
    printf("sizeof long =%ld\n",sizeof (long));
    printf("sizeof double =%ld\n",sizeof (double));
    
    return 0;
}

名字

字节大小

取值范围(了解)

int

整型

4

-2^31~2^31-1    (2147483648)

char

字符型

1

-2^7~2^7-1        (128)

short

短整型

2

-2^15~1^15-1    (32768)

long

长整型

8

-2^63~2^63-1

float

单精度浮点型

4

double

双精度浮点型

8

局部变量和全局变量的区别

局部变量

全局变量

定义位置

函数体内部

函数体外部

初值

初始化随机值

初始化0

存储位置

栈区

全局区

生命周期

当前函数体共存亡

整个程序共存亡

作用域

当前函数体内部

整个程序

常量

程序运行过程中不会发生变化

3.1 整型常量

八进制 十进制 十六进制

3.2 字符常量

字符 ' '包裹一个字符

字符串 由" "包裹,由'\0'作为字符串的结束标志

字符数组----》

3.3 浮点常量

float double

3.4 标识常量

宏定义

格式#define 宏名 常量表达式代码段

宏名一般大写表示为了普通变量区分开

注意原样替换计算

#include <stdio.h>
#define N 2
#define M N+2   //2+2
#define NUM 2+M*3+1
#define QWER(m,n) m>n?m:n
int b; //全局变量初值默认是0

int main()
{
    int a; //局部变量初值可能随机
    printf("%d,%d\n", a, b);
    printf ("%d\n",NUM);//2+2+2*3+1=11
    printf ("%d\n",QWER(88,999));     //999
}

作业题:

程序运行后输出的结果是(1)

#include <stdio.h>
#define SQR(X) X *X
void main()
{
    int a = 10, k = 2, m = 1;
    a /= SQR(k + m) / SQR(k + m) ;
    printf("%d\n", a);
}

以下程序的输出结果是(55)

#include <stdio.h>
#define M 5
#define N M + M
void main()
{
    int k;
    k = N * N * 5;
    printf("%d\n", k);
}

;