c语言学习-3
二、运算符与表达式
C语言优先级
/*
算术运算符的优先级高于关系运算符、关系运算符的优先级高于逻辑与和逻辑或运算符
单目运算符 ! 逻辑非
算术运算符 加、减,乘除,取模
关系运算符 > < >= <= == !=
逻辑运算符 && ||
if里边99%是放关系表达式,逻辑表达式,剩余的1%的情况,直接放入一个值
零代表假,非零代表真
*/
1.算术运算符–倒叙输出:输入152->输出251
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
//算术运算符
//先乘除,取模,后加减
int main()
{
long a;//4字节
int g;
int s = 4 + 5 * 2 - 6 / 3 + 11 % 4;
printf("s=%d\n", s);
scanf("%d", &a);
printf("a=%d\n", a);//如果输入的是1234,那么输出的就是4321
while(a != 0) {//当a不等于零就可以进入循环
g = a % 10;//区域运算符
printf("%c", g + 48);//数字变字符
a = a / 10;//除法运算符
}
return 0;
}
s=15
152
a=152
251
D:\cbook\数据类型与运算符\Debug\14.算术运算符.exe (进程 19792)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
2.关系运算符
#include<stdio.h>
#include<stdlib.h>
//C语言认为一切非零值都是真
//判断浮点数是否等于某个值
//关系运算符和逻辑运算符
int main()
{
int a = 18;
if (3 < a && a < 10) {//如果要判断3<a 同时 a<10,要用逻辑运算符
printf("a is right\n");
}
else {
printf("a is wrong\n");
}
printf("判断两个浮点数是否相等:\n");
//判断两个浮点数是否相等,必须用第二种方法
float f = 234.56;
//第一种方法
if (f == 234.56) {
printf("第一种方法:f 等于 234.56\n");
}
else {
printf("第一种方法:f 不等于 234.56\n");
}
//第二种方法
if (f - 234.56 > -0.0001 && f - 234.56 < 0.0001)
{
printf("第二种方法:f 等于 234.56\n");
}
else {
printf("第二种方法:f 不等于 234.56\n");
}
return 0;
}
a is wrong
判断两个浮点数是否相等:
第一种方法:f 不等于 234.56
第二种方法:f 等于 234.56
D:\cbook\数据类型与运算符\Debug\15.关系运算符.exe (进程 12604)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
3.逻辑运算符
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
#include<stdlib.h>
//逻辑运算符 组成的式子叫 逻辑表达式,逻辑表达式只有真和假
/*
! 逻辑非 如果原来是真,取非就是假;如果是假,取非就是真
&& 逻辑与 a&&b,a和b任何一个为假,就是假;如果均为真,整体为真
|| 逻辑或 a||b,a和b任何一个为真,为真;如果两个都为假,整体才是假
*/
//逻辑与、或的短路运算
int main()
{
int i = 0, j;
while (scanf("%d", &i) != EOF)
{
//可以被4整除,不可以被100整除,或者可以被400整除
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("j == 0,system is error\n");
j == 1 && printf("j == 1,system is error\n");
printf("j = %d\n",j);
j = 0;//当j为0时,j==0为真,后面一个表达式不会得到执行
j == 0 || printf("j == 0,system is error\n");
j == 2 || printf("j == 2,system is error\n");
printf("j = %d\n", j);
j = 10;//下面我们来看一下逻辑非运算符
i = !j;
printf("j = %d\n", j);
printf("i的值=%d\n", i);
i = !!j;
printf("j = %d\n", j);
printf("i的值=%d\n", i);
return 0;
}
2009
i is not leap year
^Z
^Z
^Z
j == 1,system is error
j = 1
j == 2,system is error
j = 0
j = 10
i的值=0
j = 10
i的值=1
D:\cbook\数据类型与运算符\Debug\16.逻辑运算符.exe (进程 2464)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
4.赋值运算符
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
#include<stdlib.h>
//表达式的值存在于运算过程中的
//赋值运算符的左边只能放变量
int main()
{
int a = 5;
//a + 3 = 10;//如果报出左操作数必须为左值,这时说明等号左边必须为变量
char c;
while ((c = getchar()) != EOF)
{
printf("%c", c);
}
return 0;
}
hello
hello
^Z
D:\cbook\数据类型与运算符\Debug\17.赋值运算符.exe (进程 1124)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
5.加后赋值与乘后赋值的用法
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
#include<stdlib.h>
int main()
{
int iNum, iResult;
iNum = 10;
iResult = 3;
iNum += 5;
iResult *= iNum;
printf("iNum = %d\n", iNum);
printf("iResult = %d\n", iResult);
return EXIT_SUCCESS;
}
iNum = 15
iResult = 45
D:\cbook\数据类型与运算符\Debug\18.加后赋值与乘后赋值的用法.exe (进程 12452)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
6.条件运算符与逗号运算符
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
#include<stdlib.h>
//逗号表达式整体的值,是最后一个表达式的值
// 条件运算符优先级高于赋值运算符
int main()
{
int a, b, c, max, copymax;
while (fflush(stdin), scanf("%d%d%d", &a, &b, &c) != EOF)
{
max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
copymax = a > b ? (a > c ? a : c) : (b > c ? b : c);
printf("max = %d\n", max);
printf("copymax = %d\n", copymax);
}
return EXIT_SUCCESS;
}
15 6 58
max = 58
copymax = 58
^Z
^Z
^Z
D:\cbook\数据类型与运算符\Debug\19.条件运算符与逗号运算符.exe (进程 18348)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
7.自增、自减运算符及求字节运算符
#include<stdio.h>
#include<stdlib.h>
//sizeof不是函数,是C的关键字,是一个运算符
//自增自减注意分清是前加加,还是后加加,自减类似
//针对后加加,后减减,按照备注理念,可以保证简单准确!
//i++代表的是i=i+1;比较难理解的是后加加和后减减
//++i直接按优先级进行正常运算即可
int main()
{
int i = -1;
int j;
//5++;//如果打开语句,会造成编译不通
j = i++ > -1;//后++,或后者--等价于j=i>-1;i=i+1
//拆成两步,j=i>-1;i++
printf("i = %d ,j = %d \n", i, j);
j = !++i;//当时前加加时,直接按优先级结合顺序
printf("i = %d , j = %d ,sizeof(i) = %d\n", i, j, sizeof(i));
return EXIT_SUCCESS;
}
i = 0 ,j = 0
i = 1 , j = 0 ,sizeof(i) = 4
D:\cbook\数据类型与运算符\Debug\20.自增、自减运算符及求字节运算符.exe (进程 18848)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
8.读取整数输出字符
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
/*
当你操作的空间,超出了变量本身占用的空间的大小时
引发异常信息
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
Description
读取一个65到122之间的整型数,然后以字符形式输出它,比如读取了97,输出字符a
Input
读取一个整型数,整型数大于等于65,小于等于122
Outputt
输出整型数在ASCII表中对应的字符
*/
int main()
{
int a;
scanf("%d",&a);
printf("%c\n", a);//整型数在0-128之间可以用%c输出
return 0;
}
97
a
D:\cbook\数据类型与运算符\Debug\21.读取整数输出字符.exe (进程 10092)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .