C语言--数据类型、运算符、表达式

C语言——第一章数据类型、运算符、表达式

  • 引言
    • 1.整型常量与变量
    • 2.整型的进制转换
    • 3.补码
    • 4.整型变量及溢出
    • 5.浮点数及精度丢失
    • 6.字符型常量
    • 7.字符变量打印及运算
    • 8.混合运算及类型强制转换
    • 9.scanf原理
    • 10.scanf_while
    • 11.scanf读取字符串打印
    • 12.多种数据类型混合输入
    • 13.算数运算符与算术表达式------倒序输出输入的数字
    • 14.关系运算符与关系表达式
    • 15.逻辑运算符与逻辑表达式------判断是否是闰年
    • 16.位运算符------找到数组中不重复的数
    • 17.条件运算符与逗号运算符------三个数里的最大值
    • 18.自增自减运算符及求字节数
  • 总结

引言

C语言的一些基本例题
全部例题来自于C语言王道训练营 链接如下

B站链接.
书籍:《跟“龙哥”学C语言编程》

1.整型常量与变量

下面展示 可以运行的例子

#include<stdio.h>
#include<stdlib.h>

#define PI 3+2

int main() {
	int i = 123;
	i = PI * 2;
	//PI=2:常量不可修改!!
	printf("PI=%d\n", PI);
	//PI=5
	printf("i=%d\n", i);
	//i=3+2*2=7
	system("pause");
	return 0;
}

2.整型的进制转换

下面展示 可以运行的例子

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i = 0x7b;//十六进制
	printf("the i=%d\n", i);//十进制数进行打印
	//the i=123
	i = 0173;//八进制
	printf("the i=%d\n", i);
	//the i=123
	system("pause");
	return 0;
}

C语言--数据类型、运算符、表达式_第1张图片

3.补码

下面展示 可以运行的例子
原码取反加一得到补码,补码取反加一得到原码

#include<stdio.h>
#include<stdlib.h>

//补码 对原码进行取反加一
int main()
{
	int i, j, k;
	i = -5; //5取反加一
	j = 2;
	k = i + j;
	printf("k=%d\n", k);
	return 0;
}

5的二进制数为101,称为原码。计算机用补码表示−5,补码是对原码取反后加1的结果,即计算机表示−5时会对5的二进制数(101)取反后加1。−5在内存中存储为0xfffffffb,因为对5取反后得0xfffffffa,加1后得0xfffffffb,对其加2后得0xfffffffd,它就是k的值。当最高位为1(代表负数)时,要得到原码才能知道0xfffffffd的值,即对其取反后加1(当然,也可以减1后取反,结果是一样的)得到3,所以其值为−3。

4.整型变量及溢出

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>

//不同类型的整型变量的定义方法:溢出、防止溢出
int main()
{
	int i = 10;
	short a = 32767;//两字节
	short b = 0;
	long c = 100;
	unsigned int m = 3;
	unsigned short n = 4;
	unsigned long k = 5;
	b = a + 1;//b=-32768发生溢出
	printf("b=%d\n", b);
	system("pause");
	return 0;
}

5.浮点数及精度丢失

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>

//验证精度丢失现象的程序
int main()
{
	float n = 1.456;
	long double m = 1.456;
	double e = 1e-6;
	//float a = 1.23456789e10;
	//因为float型数据能够表示的有效数字为7位,最多只保证1.234567e10的正确性
	//要使结果正确,就需要把a和b均改为double型
	double a = 1.23456789e10;
	//float b;将b改为double型
	double b;
	b = a + 20;
	printf("a=%f\n", a);
	printf("b=%f\n", b);
	system("pause");
	return 0;
}

C语言--数据类型、运算符、表达式_第2张图片

6.字符型常量

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char d, c = 'e';//占用一字节
	char e = '\t';//横向跳格,显示4个空格
	char f = '\b';
	char h = '\\';
	char i = '\0';
	d = c - 32;
	printf("\123\n");//转义八进制-十进制为83-打印字符s
	printf("\x40\n");//转义十六进制-十进制64-打印@
	printf("d=%c\n",d);
	printf("c=%d\n",c);
	printf("e=%chaha\n",e);
	printf("abc\rd\n");//\r回到行首 得到dbc
	printf("abc%cd\n",f);//\b是向前退一格
	printf("%c\\\n",h);//要输出\,需要转义
	printf("i=%cb\n",i);
	system("pause");
	return 0;
}

运行结果
C语言--数据类型、运算符、表达式_第3张图片

7.字符变量打印及运算

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>

int main()
{
	char c, d;
	c = 97;
	d = 'a';
	printf("c=%c,d=%c\n", c, d);
	printf("c=%d,d=%d\n", c, d);
	c = c - 32;//小写字母转换为大写字母
	printf("c=%c\n", c);
	system("pause");
	return 0;
}
运行结果
c=a,d=a
c=97,d=97
c=A

8.混合运算及类型强制转换

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i = 5;
	float f,g;
	short m,s;
	long l=66666666;
	s = l+1;//爆了
	printf("l=%d,s=%d\n",l,s);
	f = i / 2;
	g = (float)i / 2;
	m = (short)i + 2;//不加short强转编译会警告
	printf("i=%d,f=%f,g=%f,m=%d\n", i, f, g, m);
	system("pause");
	return 0;
}
运行结果
l=66666666,s=16555
i=5,f=2.000000,g=2.500000,m=7

9.scanf原理

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i;
	char c;
	scanf("%d", &i);//阻塞函数
	printf("i=%d\n", i);
	scanf("%c", &c);//这里没有阻塞,因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'\n'
	printf("c=%c", c);
	system("pause");
	return 0;
}
运行结果
1
i=1
c=
请按任意键继续. . .

10.scanf_while

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>

//因为fflush函数具有刷新(清空)标准输入缓冲区的作用
int main()
{
	int i;
	int ret;//用来获取sancf的返回值
	while (fflush(stdin),ret = scanf("%d", &i) != EOF)
	{
		printf("i=%d\n", i);
	}
	system("pause");
	return 0;
}
运行结果
1
i=1
2
i=2
3
i=3
^Z
^Z
^Z
请按任意键继续. . .

11.scanf读取字符串打印

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>

//由于一次性输入一个字符串,然后回车,而scanf函数是循环匹配的,所以不能加fflush(stdin)
int main()
{
	int ret;
	char c;
	while (scanf("%c", &c) != EOF)
	{
		if (c!='\n')
		{
			printf("%c", c - 32);
		}
		else{
			printf("\n");
		}
	}
	system("pause");
	return 0;
}
运行结果
hello world
HELLO WORLD
china
CHINA
^Z
^Z
请按任意键继续. . .

12.多种数据类型混合输入

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i = 5;
	double f;
	float l;
	char c;//字符不会忽略空格
	int ret;
	ret = scanf("%d %c%lf%f", &i, &c, &f, &l);
	printf("i=%d,c=%c,f=%5.2lf,l=%5.2f,ret=%d\n", i, c, f, l, ret);
	//%5.2f中的5代表输出的浮点数占5个空格的位置,2代表小数点后显示两位
	system("pause");
	return 0;
}
运行结果
1024 h 99.9 60.00
i=1024,c=h,f=99.90,l=60.00,ret=4
请按任意键继续. . .

13.算数运算符与算术表达式------倒序输出输入的数字

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
	long a;
	int g;
	int s = 4 + 5 * 2 - 6 / 3 + 10 % 4;
	printf("s=%d\n", s);
	scanf("%d", &a);
	printf("a=%d\n", a);
	//倒序输出输入的数字
	while (a!=0)
	{
		g = a % 10;
		printf("%c", g + 48);//数字变字符
		a = a / 10;
	}
	printf("\n");
	system("pause");
	return 0;
}
运行结果
s=14
1024
a=1024
4201
请按任意键继续. . .

14.关系运算符与关系表达式

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>

//判断浮点数是否等于某个值
int main()
{
	float f = 234.56;
	int a;
	//if(f==234.56) 直接跳到return 0
	if (f - 234.56 > -0.0001 && f - 234.56 < 0.0001)
	{
		printf("f 等于 234.56\n");
	}else
	{
		printf("f 不等于 234.56\n");
	}
	while (scanf("%d", &a) != EOF)
	{
		//若写成if (3 < a < 10),那么无论a是大于3还是小于3,对于3
		if(3<a&&a<10){
			printf("a在3和10之间\n");
		}
		else
		{
			printf("a不在3和10之间\n");
		}
	}
	system("pause");
	return 0;
}
运行结果
f 等于 234.56
5
a在3和10之间
12
a不在3和10之间
^Z
^Z
^Z
请按任意键继续. . .

15.逻辑运算符与逻辑表达式------判断是否是闰年

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
//逻辑与、逻辑或的短路运算
int main()
{
	int i = 0,j;
	//判断是否是闰年
	while (scanf("%d", &i) != EOF)
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
			printf("i is leap year\n");
		}
		else {
			printf("i is not leap year\n");
		}
	}
	j = 1;//当j不为0时,j==0为假,后面一个表达式不会执行
	j == 0 && printf("system is error\n");
	j = 0;//当j为0时,j==0为真,后面一个表达式不会执行
	j == 0 || printf("system is error\n");
	j = 10;
	i = !!j;
	printf("i=%d\n", i);
	system("pause");
	return 0;
}
运行结果
2000
i is leap year
2010
i is not leap year
2022
i is not leap year
^Z
^Z
^Z
i=1
请按任意键继续. . .

16.位运算符------找到数组中不重复的数

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>

//位运算符<<、>>、~、|、^、&依次是左移、右移、按位取反、按位或、按位异或、按位与
int main()
{
	short i = -5;
	int a[5] = { 11,4,5,4,11 };
	int f = 0;
	i >> 1;//单独的i右移或者左移不会改变i的值
	i = i >> 1;//i值改变
	//低位丢弃,正数的高位补0,负数的高位补1,相当于除以2。
	//负数右移,对偶数来说是除以2,但对奇数来说是先减1后除以2
	printf("i>>1后i=%d\n", i);
	//找到数组中不重复的数
	for (i = 0; i < 5; i++) 
	{
		f = f ^ a[i];
		//负数右移,对偶数来说是除以2,但对奇数来说是先减1后除以2
	}
	printf("a[5]中不重复的数=%d\n", f);
	i = 5;
	f = 7;
	//只有对应的两个二进位都为1时,结果位才为1
	printf("i&f=%d\n", i & f);//二进制101与111按位与
	//只要对应的二个二进位有一个为1时,结果位就为1
	printf("i|f=%d\n", i | f);
	//按位取反:数位上的数是1变为0,0变为1
	printf("~i=%d\n", ~i);//按位取反得到-6
	system("pause");
	return 0;
}
运行结果
i>>1后i=-3
a[5]中不重复的数=5
i&f=5
i|f=7
~i=-6
请按任意键继续. . .

17.条件运算符与逗号运算符------三个数里的最大值

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
//条件运算符的优先级高于赋值运算符
int main()
{
	int a, b, c, max;
	//快速找到三个数里的最大值
	while (scanf("%d%d%d", &a, &b, &c) != EOF)
	{
		max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
		printf("max=%d\n", max);
	}
	system("pause");
	return 0;
}
运行结果
1 2 3
max=3
5 55 555
max=555
159 357 456
max=456
^Z
^Z
^Z
请按任意键继续. . .

18.自增自减运算符及求字节数

下面展示一些 可运行的代码

#include<stdio.h>
#include<stdlib.h>
//sizeof不是函数,是C的关键字,是一个运算符
//自增自减注意分清是前加加还是后加加,自减类似
int main()
{
	int i = -1;
	int j;
	//5++;//如果打开语句,会造成编译不通过
	j = i++ > -1;//后++,等价于j=i>-1;i=i+1;
	printf("i=%d,j=%d\n", i, j);
	j = !++i;//前++,直接按照优先级结合
	printf("i=%d,j=%d,sizeof(i)=%d\n", i, j, sizeof(i));
	system("pause");
	return 0;
}
运行结果
i=0,j=0
i=1,j=0,sizeof(i)=4
请按任意键继续. . .

总结

第一次发表一篇完整的博客,对于一些遗漏,读者不要太过深究~
比较适合新手打基础大佬请绕路~
希望这些可以帮助你更好的理解C语言
马上就考研了 我居然还在纠结一些基础 真是闲的闲的闲的闲*10000!
过几天在更新后几章的内容
欢迎大家评论收藏点赞 !!!

你可能感兴趣的:(c语言)