[1]运算符
1.1逻辑运算符
&&:逻辑与
||:逻辑或
!:逻辑非
0为假,1为真,不成立为假,成立为真
printf("%d\n",2>3);
上面代码输出的结果为0
printf("%d\n",4>3);
上面代码输出的结果为1
printf("%d",4>3&&5>6);
&&两边要同时成立才能输出1,所以上面的代码输出0
||只要两边有一个成立就为真
0为假,非0值都为真
截断法则:
逻辑与运算中,前面表达式结果为假,后面的不再执行,直接返回假(一假则假)
逻辑或运算中,前面表达式结果为真,后面的不再执行,直接返回真(一真则真)
练习:
#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=()。
可以使用if语句来判断真假
#include<stdio.h> int main() { if(10) { printf("T"); } else { printf("F"); } } 则输出为T
1.2 位运算符
二进制数 0 1
& | ^ ~ << >>
&位与:全1则1,有0则0
|位或:有1则1,全0则0
^异或:相同为0,不同为1
~取反:1->0,0 ->1
#include<stdio.h> int main() { int a=12,b=10; int c=a&b; //12:1100 //10:1010 //a&b:1000 //a|b:1110 //a^b:0110 printf("%d\n",c);//8 return 0; }
练习
实现 两个 变量 值 的 交换 :变量x和y的值相等,且为非零值,则以下选项中,结果为0的表达式是() A.x||y B.x|y C.x&y D.x^y 解:D
int a=12,b=10; 1) int temp=0; temp=a; a=b; b=temp; printf("%d %d\n",a,b); 2) a=a^b;//0110==6 b=a^b;//0110 1010 1100=12 a=a^b;//0110 1100 1010=10 printf("%d %d\n",a,b);
计算机中,整数以二进制的补码形式存储、计算的
原码 反码 补码 正数 相同 相同 相同 负数 相同 除符号位外,其他按位取反 反码+1
int 4字节=32位 1字节=8位
12:
0000 0000 0000 0000 0000 0000 0000 1100 符号位在最左边,0指的是正数
-12:
1000 0000 0000 0000 0000 0000 0000 1100 符号位在最左边,1指的是负数
int a=12,b=-10; //12:1100 10:1010
int c=a&b;
printf("%d\n",c); //4
12补码:
0000 0000 0000 0000 0000 0000 0000 1100
-10原码:
1000 0000 0000 0000 0000 0000 0000 1010
-10反码:
1111 1111 1111 1111 1111 1111 1111 0101
-10补码:
1111 1111 1111 1111 1111 1111 1111 0110
12补码 & -10补码:
0000 0000 0000 0000 0000 0000 0000 1100
1111 1111 1111 1111 1111 1111 1111 0110
0000 0000 0000 0000 0000 0000 0000 0100===4
#include<stdio.h> int main() { int a = 7,b=-6; int c=a&b; printf("%d\n",c);//2 } //a 0000 0000 0000 0000 0000 0000 0000 0111 //b 1000 0000 0000 0000 0000 0000 0000 0110 //b的反码 1111 1111 1111 1111 1111 1111 1111 1001 //b的补码 1111 1111 1111 1111 1111 1111 1111 1010 //a&b 为a的补码&b的补码 0000 0000 0000 0000 0000 0000 0000 0010 所以为2
~取反:1->0 0->1
int a=7;
int c=~a;
printf("%d\n",c);//-8
===========================
7补码:
0000 0000 0000 0000 0000 0000 0000 0111
~: 补码
1111 1111 1111 1111 1111 1111 1111 1000 1000=8 0111
反码:
1111 1111 1111 1111 1111 1111 1111 0111
原码:
1000 0000 0000 0000 0000 0000 0000 1000===-8
<<左移
左移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
110010
000100 1<<2
110110
110100 &
111011
110000
置一公式:a|(1<<n)
置零公式:a&(~(1<<n))
练习:
以下程序输出结果是()。
int main()
{
char x=040;
printf("%o\n",x<<1);
return 0;
}
A.100 B.80 C.64 D.32
解:A,c语言中%o的意思是以8进制整型式输出整数
已知:int x = 1,y=-1;,则语句printf("%d\n",(x--&++y));的输出结果是()
A.1 B.0 C.-1 D.2
解:B
已知a=13,a<<2的十进制数值为()
解:1101->110100 为52
1.3 关系运算符
> >= < <= == != 大于 大于等于 小于 小于等于 赋值 ==等于 =赋值
表示2~9,则x>2&&x<9
1.4 三目运算符(选择运算符)
? : 表达式1?表达式2:表达式3;
int main() { int a=5,b=9; int c=a>b?a:b; printf("%d\n",c);//9 return 0; }
单目运算符
!(逻辑非) ~(按位取反)++(自增)--(自减)
赋值运算符
= += -= *= /= %=
a-=5;//a=a-5;
1.6 运算符与优先级
口诀:单算移关与 异或逻条赋
单目运算符: ~ ++ -- !
算数运算符:* / % + -
移位运算符:<< >>
关系运算符: > >= < <= == !=
位与运算符: &
异或运算符: ^
位或运算符: |
逻辑运算符: && ||
条件运算符: ?:
赋值运算符: = += -= *= /= %=
设int b=2;表达式 (b>>2)/(b>>1)的值是()
A.0 B.2 C.4 D.8
解:A
#include<stdio.h>
int main()
{
char a=3,b=6,c,d;
c=a^b<<2; //27
d=a^b; //5
printf("%d\n",d);
printf("%d\n",c);return 0;
}0011 ^ 1010相同为0 不同为1 0110
标点符号
要使用英文符号 , ; [ ] {} () ....
分隔符
空格 tab \n
[2]变量
程序运行过程中会发生变化
格式:
存储类型 数据类型 变量名
int a;
存储类型:决定变量存储位置
数据类型:决定变量开辟空间大小
变量名:遵循标识符命名规则
数据类型 | 名字 | 字节大小 | 取值范围(了解) |
int | 整型 | 4 | -2^31~2^31-1 |
char | 字符型 | 1 | -2^7~2^7-1 |
short | 短整型 | 2 | -2^15~2^15-1 |
long | 长整型 | 8 | -2^63~2^63-1 |
float | 单精度浮点型 | 4 | -2^31~2^31-1 |
double | 双精度浮点型 | 8 | -2^63~2^63-1 |
printf("%ld\n",sizeof(long));//可以使用这个显示数据类型的字节大小
局部变量和全局变量的区别:
局部变量 | 全局变量 | |
定义位置 | 函数体内部 | 函数体外部 |
初值 | 未初始化,值是随机值 | 未初始化,值是0 |
存储位置 | 栈区 | 全局区 |
生命周期 | 同当前函数体共存亡 | 同整个程序共存亡 |
作用域 | 当前函数体内部 | 整个程序 |
[3]常量
程序运行过程中不会发生变化
3.1 整型常量
八进制 十进制 十六进制
3.2 字符常量
字符 由' '包裹一个字符
字符串 由" "包裹,由'\0'作为字符串的结束标志
字符数组----》
3.3 浮点型常量
float double
3.4 标识常量
宏定义:
格式:#define 宏名 常量值或表达式或代码段
宏名:一般用大写表示,为了和普通变量区分开
注意:先原样替换,再计算。
#include<stdio.h> #define N 2 #define M N+2 #define NUM 2+M*3+1//2+2+2*3+1 int main() { printf("%d\n",N); printf("%d\n",M); printf("%d\n",NUM); }
#include<stdio.h> #define NUM a>b?a:b int main() { int a=6;b=8; printf("%d\n",NUM);//8 }
#include<stdio.h> #define NUM(a,b) a>b?a:b int main() { printf("%d\n",NUM(888,999));//999 }
程序运行后的输出结果是()
#include<stdio.h> #define SQR(X) X*X void main() { int a=10,k=2,m=1; a /= SQR(k+m)/SQR(k+m);//a/=k+m*k+m/k+m*k+m printf("%d\n",a);//a/=7 } 解:1
#include<stdio.h> #define M 5 #definr N M+M main() { int k; k=N*N*5;//5+5*5+5*5 printf("%d\n",k); } 解:选C