在没有OR运算符的情况下测试相同条件

时间:2018-11-20 12:59:02

标签: c

我的讲师不希望我们在使用if语句时使用OR运算符,也不希望两个条件测试都在同一行上。 例如。

if(condition1 || condition2){
  statement
}
if(condition1 || condition3){
  statement
}

但是我们收到了一个项目,要求我们更新书籍,用户可以选择其中一个或两个。我尝试使用开关,但是我认为它太长了。

下面是代码示例。但是,有什么方法可以缩短它而无需使用case 3并键入冗余代码。

#include  <stdio.h>
#include <stdlib.h>
int main()
{
    int opt;

    printf("(1) Option 1");
    printf("\n(2) Option 2");
    printf("\n(3) Both\n");
    printf("Choice: ");
    scanf(" %d", &opt);
    switch(opt){
        case 1:
            printf("\nThis is option one");
            break;
        case 2:
            printf("\nThis is option two");
            break;
        case 3:
            printf("\nThis is option one");
            printf("\nThis is option two");
            break;
    }
    return 0;
}

4 个答案:

答案 0 :(得分:7)

在这种情况下,您可以改用按位AND运算符(&):

1

十进制数<<&if(opt & 1) { // option 1 or 3 chosen } if(opt & 2) { // option 2 or 3 chosen } 分别为二进制123。 (以下分别表示为011011,以区别于十进制数字。

当且仅当两个位均为0b01时,按位AND运算符产生0b10
0b11111 & 1 = 1

真值表:

0 & 1 = 0

1 & 0 = 0等于1时,则只有第一个if语句为true。
0 & 0 = 0 true )和& 0 1 ----- 0 | 0 0 1 | 0 1 false

opt等于2时,则仅第二个if语句为true。
0b01 & 0b01 = 0b01 false )和0b01 & 0b10 = 0b00 true

opt等于3时,两个if语句均为true。
0b10 & 0b01 = 0b00 true )和0b10 & 0b10 = 0b10 true

任何非零值都是正确的,因此您的所有条件都得到了满足。

答案 1 :(得分:7)

您可以使用De Morgan's laws来避免OR。相关的

not (A or B) = not A and not B

当转化为您的情况时,会变成

A or B = not (not A and not B)

这是展示这个逻辑的真相表

+-------+-------+--------+-------+-------+-----------------+----------------------+
|   A   |   B   | A or B | not A | not B | not A and not B | not(not A and not B) |
+-------+-------+--------+-------+-------+-----------------+----------------------+
| true  | true  | true   | false | false | false           | true                 |
| true  | false | true   | false | true  | false           | true                 |
| false | true  | true   | true  | false | false           | true                 |
| false | false | false  | true  | true  | true            | false                |
+-------+-------+--------+-------+-------+-----------------+----------------------+

因此请牢记条件

if(condition1 || condition2)

变成

if (! (!condition1 && !condition2) )

答案 2 :(得分:3)

1是0b01,2是0b10,而3是0b11

因此请使用惯用语

if (opt & 0b01){
    // 1 or 3 selected
}
if (opt & 0b10){
    // 2 or 3 selected
}

我的二进制文字 0b01&c。是编译器扩展。如果您的编译器不支持它们,则使用替代方法,例如不太清晰的1、2和3或标准十六进制常量,例如0x01&c。可以向您的代码阅读器标记位的位置很重要。

答案 3 :(得分:0)

您也可以使用“ else if”语法。

#include <stdio.h>

int main()
{
    int opt;

    printf("(1) Option 1");
    printf("\n(2) Option 2");
    printf("\n(3) Both\n");
    printf("Choice: ");
    scanf(" %d", &opt);

    if (opt == 3){
        printf("\nBoth");
    }
    else if (opt == 2){
        printf("\n2");
    }
    else{
        printf("\n1");
    }
    return 0;
}