学习C语言第三天 :关系操作符、逻辑操作符

1.关系操作符

        C语言用于比较的表达式,称为“关系表达式”里面使用的运算符就称(relationalexpression),为“关系运算符” (relationaloperator) ,主要有下面6个。

  • >   大于运算符

  • <   小于运算符

  • >=  大于等于运算符

  • <=  小于等于运算符

  • ==  等于运算符

  • !=   不相等运算符

        以下是例子:

a > b;

a < b;

a >= b;

a <= b;

a == b;

a != b;

        关系表达式通常返回 0 或 1,表示真假。

        C语言中,0 表示假,所有非零值表示真。比如,20 > 12 返回 1, 12 > 20 返回 0

        关系表达式常用于 if 或 while 结构。例如下例子:

if (i == 3)
{
    printf("i is 3.");
}

        注意:相等运算符 == 与赋值运算符  = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

if (i = 3)
{....}

        上面示例中,原意是 i == 3,但是不小心写成 i = 3。这个式子表示对变量 i 赋值 3,它的返回值为 3,所以 if 判断总是为真。
为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。

if (3 == x)
{...}

        如果把 == 误 写成了 = ,编译器会报错的。注意。

        还有一个需要避免的错误:多个关系运算符不宜连用。

        例子:

        i < j < k

        上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果即不是保证变量j的值在 i和 k 之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。

(i < j ) < k 

        上面式子中,i< j 返回 或 1 ,所以最终是  或 1与变量  进行比较。如果想要判断变量 j的值是否在i和 k 之间,应该使用下面的写法。

i < j && j < k

        例子:输入一个年龄,如果年龄在18岁~36岁之间,输出青年        

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d", &age);

	if (18 <= age <= 36)
	{
		printf("青年");
	}

	return 0;
}

        当输入10的时候,也是青年,如图:

        这是因为,我们先拿18和age中存放的10比较,表达式18<=10为假,18<=age 的结果是0,再拿0和36比较,0<=36为真,所以打印了 青年,所以即使当age是10的时候,也能打印 青年,逻辑上是有问题,这个代码应该怎么写呢? 

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d", &age);

	if (age <= 18 && age <= 36)
	{
		printf("青年");
	}

	return 0;
}

2.逻辑操作符

        逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符

  • ( ! ) :逻辑取反运算符(改变单个表达式的真假)

  • ( && ) : 与运算符,就是并且的意思 (两侧的表达式都为真,则为真,否则为假)

  • ( || ) : 或运算符,就是或者的意思 (两侧至少有一个表达式为真,则为真,否则为假)

            

 

         注:C语言中,非0表示真,0表示假。

        2.1.逻辑取反运算符

                比如,我们有一个变量叫 flag ,如果flag为假,要做一个什么事情,就可以这样写代码:

if(!flag)
{
  printf("do study");  
}

                如果 flag 为真,!flag 就是假,如果 flag 为假, !flag 就是真所以上面的代码的意思就是 flag 为假,执行if语句中的代码。

        2.2.与运算符

                && 就是与运算符,也是并且的意思, && 是一个双目操作符,使用的方式是 a&&b,&& 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
比如:如果我们说月份是3月到5月,是春天,那使用代码怎么体现呢?

#include <stdio.h>

int month = 0;

scanf("%d", &month);

if(month >= 3 && month <= 5)
{
    printf("春季\n");
}

        这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足。

        2.3.或运算符

               || 就是或运算符,也就是或者的意思,(||)也是一个双目操作符,使用的方式是 (a || b),两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

比如:我们说一年中月份是12月或者1月或者2月是冬天,那么我们怎么使用代码体现呢?

#include <stdio.h>

int month = 0;

scanf("%d", &mont);

if(month == 12 || month == 1 || month == 2)
{
    printf("冬季\n");
}

         使用闰年进行练习:

                输入一个年份year,判断year是否是闰年。

                1.能被4整除并且不能被100整除是闰年。

                2.能被400整除是闰年。

#include <stdio.h>

int main()
{
    int year = 0;

    scanf("%d", &year);


    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
    {
        printf("%d是闰年!", year);
    }

    return 0;
}

        运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于V51单片机设计的电子计算器的程序代码示例。该代码实现了基本的加、减、乘、除四则运算,以及清除、等号、小数点等功能,同时在计算过程中对各种可能发生的错误进行了处理。 ```c #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit key1 = P1^0; //16个按键 sbit key2 = P1^1; sbit key3 = P1^2; sbit key4 = P1^3; sbit key5 = P1^4; sbit key6 = P1^5; sbit key7 = P1^6; sbit key8 = P1^7; sbit key9 = P3^0; sbit key0 = P3^1; sbit key_add = P3^2; sbit key_sub = P3^3; sbit key_mul = P3^4; sbit key_div = P3^5; sbit key_point = P3^6; sbit key_clear = P3^7; sbit key_equal = P2^7; sbit buzzer = P2^6; //蜂鸣器 uchar code num_code[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //数码管0-9的编码 uchar key, last_key, flag, decimal_flag, result_flag; //key-当前按键编码,last_key-上一次按键编码,flag-当前状态标志,decimal_flag-小数点标志,result_flag-计算结果标志 float num1, num2, result; //num1-第一个数字,num2-第二个数字,result-计算结果 void delay(uint x) { uint i; for(i = 0; i < x; i++); } void display(uchar a, uchar b, uchar c, uchar d, uchar e, uchar f, uchar g, uchar h) //在数码管上显示数字或符号 { P0 = 0; //选择第一位数码管 P2 = 0xfe; //第一位数码管的段选信号 P0 = num_code[a]; //显示第一位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第二位数码管 P2 = 0xfd; //第二位数码管的段选信号 P0 = num_code[b]; //显示第二位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第三位数码管 P2 = 0xfb; //第三位数码管的段选信号 P0 = num_code[c]; //显示第三位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第四位数码管 P2 = 0xf7; //第四位数码管的段选信号 P0 = num_code[d]; //显示第四位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第五位数码管 P2 = 0xef; //第五位数码管的段选信号 P0 = num_code[e]; //显示第五位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第六位数码管 P2 = 0xdf; //第六位数码管的段选信号 P0 = num_code[f]; //显示第六位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第七位数码管 P2 = 0xbf; //第七位数码管的段选信号 P0 = num_code[g]; //显示第七位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第八位数码管 P2 = 0x7f; //第八位数码管的段选信号 P0 = num_code[h]; //显示第八位数字或符号 delay(10); //延时一段时间 } void calculate() //进行计算 { switch(last_key) //根据上一次按键选择计算方式 { case 0x0b: //加 result = num1 + num2; break; case 0x0c: //减 result = num1 - num2; break; case 0x0d: //乘 result = num1 * num2; break; case 0x0e: //除 if(num2 == 0) //除数为0 { flag = 0; //状态标志设置为0 buzzer = 1; //蜂鸣器响 display(0, 0, 0, 0, 0, 0, 0, 1); //在数码管上显示false return; //返回 } else { result = num1 / num2; } break; default: break; } if(result > 99999999 || result < -9999999) //结果超出范围 { flag = 0; //状态标志设置为0 buzzer = 1; //蜂鸣器响 display(0, 0, 0, 0, 0, 0, 0, 1); //在数码管上显示false return; //返回 } flag = 1; //状态标志设置为1 buzzer = 0; //蜂鸣器停止响 result_flag = 1; //计算结果标志设置为1 num1 = result; //将计算结果存储为第一个数字 } void main() { P0 = 0xff; //P0口初始化 P2 = 0xff; //P2口初始化 P3 = 0xff; //P3口初始化 while(1) { key = 0xff; //key初始化为无效值 if(!key_clear) //清除键 { num1 = 0; //清除数字缓存 num2 = 0; result = 0; flag = 0; decimal_flag = 0; result_flag = 0; buzzer = 0; //停止蜂鸣器响 display(0, 0, 0, 0, 0, 0, 0, 0); //在数码管上清除显示 delay(1000); //延时一段时间 continue; //跳过当前循环 } if(key_equal) //等号键 { if(flag == 1 && result_flag == 0) //状态标志为1且计算结果标志为0时,进行计算 { num2 = num1; //将当前数字存储为第二个数字 calculate(); //进行计算 } continue; //跳过当前循环 } if(!key0) key = 0; //按键编码 if(!key1) key = 1; if(!key2) key = 2; if(!key3) key = 3; if(!key4) key = 4; if(!key5) key = 5; if(!key6) key = 6; if(!key7) key = 7; if(!key8) key = 8; if(!key9) key = 9; if(!key_add) key = 0x0b; if(!key_sub) key = 0x0c; if(!key_mul) key = 0x0d; if(!key_div) key = 0x0e; if(!key_point) //小数点 { if(decimal_flag == 0) //小数点标志为0时,设置小数点标志为1 { decimal_flag = 1; } else //小数点标志为1时,跳过当前循环 { continue; } } if(key == 0xff || key == last_key) //按键无效或重复按下同一键,跳过当前循环 { continue; } if(result_flag == 1) //计算结果标志为1时,清空数字缓存和小数点标志 { num1 = 0; num2 = 0; decimal_flag = 0; result_flag = 0; } if(key <= 9) //数字键 { if(decimal_flag == 0) //小数点标志为0时,将当前数字添加到第一个数字 { num1 = num1 * 10 + key; } else //小数点标志为1时,将当前数字添加到第一个数字的小数部分 { num1 += key / 10.0; } } else //操作符键 { if(num1 == 0 && num2 == 0) //当前没有数字时,跳过当前循环 { continue; } if(last_key >= 0x0b && last_key <= 0x0e) //上一次按键为操作符键时,将当前数字存储为第二个数字 { num2 = num1; num1 = 0; } if(flag == 1) //状态标志为1时,将计算结果存储为第一个数字 { num1 = result; num2 = 0; flag = 0; } last_key = key; //记录当前按键编码 switch(key) //根据当前按键编码,在数码管上显示相应的符号 { case 0x0b: //加 display(10, 0, 0, 0, 10, 0, 0, 0); break; case 0x0c: //减 display(11, 0, 0, 0, 10, 0, 0, 0); break; case 0x0d: //乘 display(12, 0, 0, 0, 10, 0, 0, 0); break; case 0x0e: //除 display(13, 0, 0, 0, 10, 0, 0, 0); break; default: break; } } last_key = key; //记录当前按键编码 if(num1 > 99999999 || num1 < -9999999) //数字超出范围 { flag = 0; //状态标志设置为0 buzzer = 1; //蜂鸣器响 display(0, 0, 0, 0, 0, 0, 0, 1); //在数码管上显示false continue; //跳过当前循环 } if(decimal_flag == 0) //小数点标志为0时,在数码管上显示第一个数字 { display(num1 / 10000000 % 10, num1 / 1000000 % 10, num1 / 100000 % 10, num1 / 10000 % 10, num1 / 1000 % 10, num1 / 100 % 10, num1 / 10 % 10, num1 % 10); } else //小数点标志为1时,在数码管上显示第一个数字的小数部分 { display(num1 / 10000000 % 10, num1 / 1000000 % 10, num1 / 100000 % 10, num1 / 10000 % 10, num1 / 1000 % 10, num1 / 100 % 10, 10, num1 * 10 % 10); } } } ``` 在这个程序中,我们通过16个按键实现了数字和操作符的输入,并对清除键和等号键进行了处理。程序通过数字缓存实现了加、减、乘、除等基本运算,并在数码管上显示数字和操作符,同时给出计算结果。在计算过程中,程序对各种可能发生的错误进行了处理,例如除数为零、数字超出范围和操作符错误等,并在LCD上显示相应的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南城猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值