运算符
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
}
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负数
原
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);
}