#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
/*int main()
{
int a, b, c, d, e, f = 0;
unsigned h = 10; //定义无符号数h
a = 12;
b = 10;
e = 1;
c = a + h;
d = b + h;
printf("c=%d\nd=%d\n", c, d);
return 0;
}基本输出格式
*/
/*int main()
{
float a, b;
a = 123456.789e5;//12345678900
b = a + 20;
printf("a=%f\nb=%f\n", a, b);
return 0;
}//输出结果为12345678848.000000 只能保证7位有效数字 后面的数字无意义。
*/
/*int main()
{
char c1 = 'a'; //字符常量‘a’
char c2 = '\x61'; //'\x..' 十六进制字符常量 61H变为01100001B变为97D
char c3 = '\141'; //'\...'八进制字符常量 141O变为001100001最高位的0舍去变为01100001B=97D
char c4 = 97; //十进制数转换成字符常量
char c5 = 0x61; //十六进制数转换成字符常量 0x.. 等价于上面的
char c6 = 0141; //八进制数转换为字符常量 0...
printf("c1=%c,c2=%c,c3=%c.c4=%c,c5=%c,c6=%c\n", c1, c2, c3, c4, c5, c6); //输出结果都为a因为字符型常量以ASCII码,2进制形式存放 上面的都表示
//2进制的01100001 对应ASCII码表的a; 并且为字符形式输出
printf("c1=%d,c2=%d,c3=%d.c4=%d,c5=%d,c6=%d\n",c1,c2,c3, c4, c5, c6);//以数值形式输出 都为0110001B=97D 97为结果
return 0;
}*/
/*int main()
{
char c1, c2, c3;
c1 = 'a';
c2 = 'b';
c1 = c1 - 32; //ASCII码中 a与A相差32 a为97 A为65
c2 = c2 - 32;
c3 = 130;
//整型数据在计算机内部用四个字节表示,取低8位赋值给字符变量。
//第二步130是int类型是占4个字节的,所以在内存的表现形式是
//00000000 00000000 00000000 10000010
// 做了截取后的结果为
// 10000010
// 通过观察最高位符号位是1,这是一个负数,因为在计算机中所有的数据都是以补码的形式出现的所以要算它的补码
// 原码:1 0000010 原码变反码,最高位符号位不变,其他数值位1变0, 0变1得反码
// 反码:1 1111101 反码变补码就是反码加1得
// 补码;1 1111110
// 最终的看到的结果就是
// 1 1111110最高为是符号位不运算,数值为转化为十进制是64 + 32 + 16 + 8 + 4 + 2 = 126符号位负
// 所以为 - 126
//ASCII码中128以下都有对应0~127 按照上面举例127
//00000000 00000000 00000000 01111111
//截取01111111
//开头为0 看作一个正数,所以补码相同 还是127
//查ASCII码中为多少
//都是用4个字节表示所以能取很大的数,但是只取最后8bite。如256最后输出结果为0。
printf("%c %c %c\n", c1, c2, c3);
printf("%d %d %d\n", c1, c2, c3);
return 0;
}*/
//整型常量可以用“U"或者“u”明确说明为无符号整型数;用“L”或者“l”说明为长整型数
//例如358u,0x38Au,235Lu均为长整型数
/*
#define PI 3.14 //符号常量PI的定义 宏定义用大写PI 注意没有=号 在执行这条预处理命令后,计算机会把所有的符号常量用所定义的值代替
#define R 3
int main()
{
double circumference, area;
circumference = 2 * PI * R;
area = PI * R * R;
printf("circumference是=%f\n,area是=%f\n", circumference, area);
return 0;
}*/
/*int main()
{
const double pi = 3.14; //只读变量(Read-Only Variable)作用与符号变量作用差不多,并且以后不允许修改变量的值;
float circumference, area;
float r = 3;
circumference = 2 * pi * r;
area = pi * r * r;
printf("周长=%f\n,面积=%f\n", circumference, area);
return 0;
}*/
/*int main()
{
int a = 5;
int b = 3;
int c =-3;
int d = a / b;
int e = a / c;
int f = a % b;
int g = 2;
int h = g / c;
printf("%d\n", d); //1 //除:/并不是四舍五入
printf("%d\n", e); //-1
printf("%d\n", f); //2 //取余
printf("%d\n", h); //0 //注意
return 0;
}*/
/*
a&&b&&c 如果a为假那么b和c都不再计算(处理)
a||b||c如果a为真那么 b和c都不再计算(处理)
*/
/*void main()
{
char c = 'k';
int i = 1, j = 2, k = 3;
float x = 3e+5, y = 0.85;
printf("%d,%d\n", !x * !y, !!!x);//x为真,!x为假!y为假 0*0等于0; !x为假!!x为真!!!x为假;
printf("%d,%d\n", x || i && j - 3, i < j&& x < y);//先计算j-3的值为非0,再求i&&j-3的值逻辑值为1 所以表达式的逻辑值为1;&&优先级大于||
printf("%d,%d\n", i == 5 && c && (j = 8), x + y || i + j + k);//i等于5为假 后面的不用看输出0; x+y为真 后面不用看;
//&&和||同时出现 不管a && b || c 还是 c || a && b 只要c不为假 逻辑值都是1
//输出结果 0,0
// 1,0
// 0,1
}*/
/*int main()
{
int i = 1, j = 2, k = 3;
printf("%d\n", j && k-3||i++);
printf("%d\n",++i);
return 0; 结果1和3
}*/
/*void main()
{
int a = (0 || 0 && 0); //0
int b = (1 || 1 && 0); //1
int c = ((1 || 1 )&& 0); //0
int d = (1 || (1 && 0)); //1
int e = (1 || (1 && 0));//1
printf("%d\n%d\n%d\n%d\n%d\n", a, b, c, d,e);
}*/
//算术运算符大于 关系运算符(<,<=,>,>=,==,!=) 大于 赋值运算符
//例如<优先于== c>a+b 等价于c>(a+b)
// a>b = = c 等价于 (a>b) = = c
/*int main()
{
int i = 8; // i++ 返回原来的值,++i 返回加1后的值。
int a = i++;//返回8 i变成9 a = i++ 等价 a = i;i = i + 1
int b = ++i;//返回10 i变为10 b = ++i 等价 i = i + 1; b = i
int c = i--;//返回10(因为i++ i--都是返回原来的值 再+或-)i变成9
int d = --i;//返回8 (++i --i,返回加或减之后的值)
printf("%d\n%d\n%d\n%d\n", a, b, c, d);
return 0;
//输出结果8 10 10 8
//i++是先赋值,然后再自增;++i是先自增,后赋值;
}*/
/*
* ++i,--i称为前置运算,i先自增或者自减,表达式的值与i改编后的值相等 即先增(减)再参与运算
* i++ i--后置运算,i的值加1(-1),表达式的值与i改变之前的相等
* i = 3,j=++i // i=4 j=4
* i = 3 ,j=i++ //i=4,j=3
* 自增,自减运算符只用于变量,而不能用于常量或表达式 例如6++,(a+b)++,(-i)++都不合法
* -i++等价于-(i++)
*/
/*int main()
{
int i = 3;
int j,d;
j = -i++; //返回3 i变4
d = - -- i;
printf("%d\n", j);//-3
printf("%d\n", d);//-3
return 0;
}*/
/*void main()
{
int a = 0, b = 0, c = 0;
c = ((a -= a - 5), (a = b));//a=a-(a-5) a=5 之后 把b的值赋值给a a=0 c的值是逗号表达式最后的值所以c=0;
printf("%d,%d,%d\n", a, b, c);// 0 0 0
}*/
/*void main()
{
int a = 0, b = 0, c = 0;
c = ((a -= a - 5),(a = b, b + 3)); // a = 5 之后 把b的值赋值给a a = 0 b+3为3 c的值等于最后的值为3
printf("%d,%d,%d\n", a, b, c); //0 0 3
}*/
/*void main()
{
int a = 0, b = 0, c = 0;
c = (a -= a - 5), (a = b, b + 3);//等价于后面吧括号去掉 单独执行 b+3啥也不是
printf("%d,%d,%d\n", a, b, c);//0 0 5
}*/
//(int)a 将a的结果强制转换为整形量
//(int)(x+y) 将x+y的结果强制转换为整形量
//(float)a+b 将a的内容强制转换为浮点数,再与b相加
//(int)a + b 把a的值变为int 之后与b相加
/*int main()
{
float a = 1.3;
int b = 2;
printf("%d\n", (int)a + b);
return 0;
}*/
/*void main()
{
float f = 5.75;
printf("(int)f=%d\n", (int)f); //5
printf("f=%f\n", f); //5.750000
}*/
/*void main()
{
unsigned short a, b;
short i, j;
a = 65535;
i = -1;
j = a; //隐式类型转换
b = i; //隐式类型转换
printf("(unsigned)%u->(int)%d\n", a, j);
printf("(int)%d->(unsigned)%u\n", i, b);
}
*/
/*
& 按位与 两个二进制位都为1,则该位的结果值位1,否则为0
| 按位或 两个二进制位中有一个为1,结果值为1,否则为0
^ 按位异或 两个二进制位值相同为0;否则为1;
~ 取反 单目运算符,对一个二进制数按位取反,0变1,1变0
<< 左移 二进制位全部左移若干位,右边补0
>> 右移 二进制位右移若干位 低位舍去,对于无符号数,高位补0.对于有符号数,通常高位补0,也有可能因为系统不同会有所差别
*/
/*int main()
{
int m = 3, n = 5;
m += m++ || ++n; //原式相当于m+=(m++||++n) 先看(m++||++n) m++是把m的当前值3作为表达式的值,之后m自增。所以相当于3||++n,++n不计算因为前面
//3为真所以后面短路 所以原式变成m+=1,m=m+1,而m的值是4(m++自增),所以m 为5 n不变为5
printf("m=%d,n=%d\n", m, n);// 5 5
return 0;
}*/
/*
* int a=3, 求a+=a-=a*a a=a+(a-=a*a) 里面的a=a-a*a a先变成a-a*a等于-6 -6+-6等于-12
* c语言中,要求运算数必须是整数的运算符是 %(取余)
*/
/* main()
{
int i = 010, j = 10;
printf("%d,%d\n", ++i, j--);//001000 为i=8
}// ++i为i自增后的值为9 j--为自减之前的值10
*/ //
/*void main()
{
unsigned a = 32768;
printf("a=%d\n", a); //32678
}
*/
//x=(y=4,z=16,k=32)后x的值为32
//int k=7,x=12;则(x%=k)-(k%=5)的值
// x=x%k 12%7=5 k=k%5 7%5=2 所以5-2等于3
/*void main()
{
int a = 12;
printf("%d,%d,%d\n",a, --a,a++);//先算右边a++为12 a变13 --a为12 a自减为12 所以输出为12 12 12
}*/
//自右向左计算
/*void main()
{
int a = 0, c = 0;
c = (c -= a - 5);//c=c-a+5
printf("%d %d", a, c);// 0 5
}*/
//当运行以下程序时,在键盘上从第一列开始输入9876543210<CR>(回车)则程序的输出结果为
/*void main()
{
int a;
float b, c;
scanf("%2d%3f%4f", &a, &b, &c);
printf("\na=%d,b=%f,c=%f", a, b, c);//a98 b 765.000000 c 4321.000000
}*/
/*void main()
{
double d = 3.2;
int x, y;
x = 1.2;
y = (x + 3.8) / 5.0;//x为int 所以为1 y也是int为4 4/5.0取int为0
printf("%d\n",d * y);//输出结果为0
}*/
//a的二进制位为01011101 b的进制11110000,把a的高4位取反第四位不变所要执行的运算是按位异或
// 01011101
// 11110000
// 10101101 相同为0 不同为1
/*void main()
{
int a = 1, b = 2, c = 3, x;
x = (a ^ b) & c; //00000001
printf("%d\n",x); //00000010
} */ //00000011按位异或
//00000011
//00000011
//00000011按位与 结果为3
/*void main()
{
int a = 1, b = 2, c; //00000010
c = a ^ (b << 2); //0000001000 变成00001000
printf("%d\n", c); //00000001
}*/ //9 //00001001 按位异或为9
/*void main()
{
unsigned char a = 2, b = 4, c = 5, d; // 00000010
d = a | b; // 00000100
d &= c; // d 00000110 按位或
printf("%d\n", d); // c 00000101
}*/ // d 00000100 按位与 为4
/*int main()
{
int a, b, c, d;
int max, min;
printf("please input 4intergers\n");
scanf("%d%d%d%d", &a, &b, &c, &d);
max = min = a; //初始化最大值最小值
max = max > b ? max : b; max与b比较较大的存入max
min = min < b ? min : b; min与b比较较小的存入min
max = max > c ? max : c;
min = min < c ? min : c;
max = max > d ? max : d;
min = min < d ? min : d;
printf("max=%d\nmin=%d\n", max, min);
return 0;
}*/
/*int main()
{
int a; //定义正整数a
printf("请输入一个三位正整数:\n");
scanf("%d", &a);
int x, y, z;
x = a / 100; //百位的数字
y = a / 10 % 10; //十位的数字
z = a % 10; //个位的数字
int ra;
ra = z * 100 + y * 10 + x;
printf("a的逆序数为%d:",ra);
return 0;
}*/