运算符
逻辑运算符
&& 逻辑与
|| 逻辑或
! 逻辑非
#include<stdio.h>
int main ()
{
printf("%d\n",2>3); //2>3为假返回0,反之为1
printf("%d\n",2>3&&3>2); //0&&1 -> 0; 0&&0 ->0; 1&&1 ->1
//&&逻辑与:全真则真,一假则假
printf("%d\n",2>3||3>2); //0||1 -> 1; 0||0 ->0; 1||1 ->1
//||逻辑或:一真则真,全假则假
printf("%d\n",!(2>3)); // !(2>3)返回1! 逻辑非:非真则假,非假则真
//截断法则:
//逻辑与运算中,前边的表达式结果为假,后边的表达式不再执行,直接返回假
//逻辑或运算中,前边的表达式结果为真,后边的表达式不再执行,直接返回真
int a=5,b=6,c=7,d=8,m=2,n=2;
(m=a>b)&&(n=c>d);
printf("%d %d\n",m,n);// m=0 n=2
//0为假,非0为真
printf("%d\n",10&&-10);//返回1
return 0;
}
位运算符
对二进制数进行运算
& | ^ ~ << >>
&位与:全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;
int d=a|b;
int e=a^b;
//12----1100
//10----1010
//& 1000
//| 1110
//^ 0110 对二进制数对应位的数进行运算
printf("%d\n",c);//c=8
printf("%d\n",d);//d=14
printf("%d\n",e);//e=6
}
对调两个变量的值
#include<stdio.h>
int main()
{
int a=12,b=10;
//int c;
//c=a;a=b;b=c;
a=a^b;
b=a^b;
a=a^b;
return 0;
}
对于负数
计算机中,整数以二进制的补码形式存储,计算的
原码、反码、补码
原码 | 反码 | 补码 | |
正数 | 相同 | 相同 | 相同 |
负数 | 相同 | 除符号位外,其他按位取反 | 反码+1 |
int 类型大小为:4字节=32位
符号位:最左边 0正数 1负数
12的原码:
0000 0000 0000 0000 0000 0000 0000 1100
-12的原码:
1000 0000 0000 0000 0000 0000 0000 1100
#include<stdio.h>
int main()
{
int a=12,b=-10;
int c=a&b;
int d=a|b;
int e=a^b;
// 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补码: 0000 0000 0000 0000 0000 0000 0000 1100
// -10补码: 1111 1111 1111 1111 1111 1111 1111 0110
//& 0000 0000 0000 0000 0000 0000 0000 0100
//| 补码1111 1111 1111 1111 1111 1111 1111 1110
// 反码1111 1111 1111 1111 1111 1111 1111 1101
// 原码1000 0000 0000 0000 0000 0000 0000 0010
//^ 补码1111 1111 1111 1111 1111 1111 1111 1010
// 反码1111 1111 1111 1111 1111 1111 1111 1001
// 原码1000 0000 0000 0000 0000 0000 0000 0110
printf("%d\n",c);//c=4
printf("%d\n",d);//d=-2
printf("%d\n",e);//e=-6
return 0;
}
~取反:
#include <stdio.h>
int main(){
int a=7;
int c=~a;
对7进行取反运算
/*7补码:
0000 0000 0000 0000 0000 0000 0000 0111
补码取反:
1111 1111 1111 1111 1111 1111 1111 1000
转换为反码:
1111 1111 1111 1111 1111 1111 1111 0111
取反得到原码:
1000 0000 0000 0000 0000 0000 0000 1000*/
printf("%d\n",c);//-8
return 0;
}
<<左移
对数的原码进行操作
如:6左移2位
6的原码 0000 0000 0000 0000 0000 0000 0000 0110
左移2位 0000 0000 0000 0000 0000 0000 0001 1000
结果为24
超出34位范围的值忽略
#include <stdio.h>
int main(){
printf("%d\n",6<<2);//24
printf("%d\n",-6<<2);//-24
return 0;
}
6<<2==24
公式计算:
6左移两位
6*2^2=24
-6左移两位
-6*2^2=-24
>>右移
对数的原码进行操作
如:6右移2位
6的原码 0000 0000 0000 0000 0000 0000 0000 0110
右移2位 0000 0000 0000 0000 0000 0000 0000 0001
结果为2
超出34位范围的值忽略
#include <stdio.h>
int main(){
printf("%d\n",6>>2);//1
printf("%d\n",-6>>2);//-2
return 0;
}
6>>2==1
公式:
6/2^2=1
-6/2^2=-2
结果若不为整数,向下取整.
将 第n位 置一
a|(1<<n)
将第n位置零
a&(~(1<<n))
#include <stdio.h>
int main(){
//将 第n-1位 置一
printf("%d\n",9|(1<<2));//13 1011
//将第n位置一
printf("%d\n",9&(~(1<<3)));//1 0001
return 0;
}
关系运算符
> >= < <= == !=
==等于 =赋值
数据范围表示: x>2&&x<9
2<x<9 不可用
三目运算符 (选择运算符)
? :
表达式1?表达式2:表达式3;
#include<stdio.h>
int main(int argc,char const*argv[]){
int a=5,b=9;
int c=a>b?a:b;
printf("%d\n",c);//9
return 0;
}
单目运算符:运算中有三个变量 如: ~ ++ -- !
赋值运算符
= += -= *= /= %=
a-=5 相当于 a=a-5
运算符优先级
口诀:单算移关与 异或逻条赋
运算顺序:
单目运算符: ~ ++ -- !
算术运算符: * / % + -
移位运算符: << >>
关系运算符: > >= < <= == !=
位与运算符: &
异或运算符: ^
位或运算符: |
逻辑运算符: && ||
条件运算符: ?:
赋值运算符: = += -= *= /= %=
标点符号
英文 , ; [ ] {} () ....
分隔符
空格 tab \n
变量
数据定义格式:
存储类型 数据类型 变量名
auto int a;
存储类型:决定变量存储位置(不写默认auto)
数据类型:决定变量开辟空间大小
变量名:遵循标识符命名规则
名字 | 字节大小 | 取值范围 | |
int | 整型 | 4 | |
char | 字符型 | 1 | -2^7——2^7-1 |
short | 短整型 | 2 | |
long | 长整型 | 8 | |
float | 单精度浮点型 | 4 | |
double | 双精度浮点型 | 8 |
sizeof() 返回数据括号中类型大小
该函数返回数值类型为长整型 long (%ld)
printf(“%ld\n”,sizeof());
有效位数
float 6-7
double 15-16
#include <stdio.h>
int main()
{
float a=1234.567891;
double b=1234.567891;
printf("%f\n",a);//1234.567871
printf("%lf\n",b);//1234.567891
return 0;
}
局部变量于全局变量的区别
局部变量 | 全局变量 | |
定义位置 | 函数体内部 | 函数体外部 |
初值 | 未初始化,值不定 | 未初始化,值为0 |
存储位置 | 栈区 | 全局区 |
生命周期 | 所在函数结束 变量结束 | 程序结束 变量结束 |
作用域 | 所在函数中 | 整个程序 |
作用域的特殊情况:
全局与局部有相同变量(就近原则)
#include <stdio.h>
int a=10;
int main()
{
int a=8;
printf("%d\n",a);//8
return 0;
}
#include <stdio.h>
int a=10;
int main()
{
int a=8;
fun();//10
printf("%d\n",a);//8
return 0;
}
void fun()
{
printf("%d\n",a);
}
常量
程序运行过程中不会发生变化
整型常量
八进制 十进制 十六进制
字符常量
字符 用' '包裹,一对单引号仅能包裹一个字符
字符串 由" "包裹,存在空字符'\0'作为字符串的结束标志
浮点型常量
float double
标识常量
宏定义:
格式:#define 宏名 常量值或表达式或代码段
宏名:一般使用大写字母表示,方便与一般变量区分
注意:先原样替换,再计算
#include<stdio.h>
#define N 2
#define M N+2
#define NUM 2+M*3+1 //2+2+2*3+1
int main(int argc,char const *argv[])
{
printf("%d\n",NUM);//11 若先计算结果为15
return 0;
}
#include<stdio.h>
#define NUM a>b?a:b
int main(int argc,char const *argv[])
{
int a=6,b=8;
printf("%d\n",NUM);//8
a=69;
b=522;
printf("%d\n",NUM);//522
return 0;
}
宏函数
#include<stdio.h>
#define NUM(a,b) a>b?a:b
int main(int argc,char const *argv[])
{
printf("%d\n",NUM(9,2));//9
printf("%d\n",NUM(52,95));//95
return 0;
}
作业
a= a/(k+m*k+m/k+m*k+m)=10/(2+1*2+1/2+1*2+1)=1 (整型计算 1/2=0 10/7=1)