C整数范围必须满足3种不同的条件

时间:2018-05-18 01:07:23

标签: c if-statement int

如果我想将要分配给整数的值的范围限制为三种不同的条件。例如;必须介于9和95之间,并且可以被5整除,这是否是正确的方法?

我被告知,只要他们被&&&&和但我的代码收效甚微。

guid guid
name name
work  Workspace(guid: "guid", name: "name")
wor  []
[Proj.Workspace(guid: "8a81b08e45467656fr467f51119047027", name: "test ok")]
(this print is inside the function in the structure)
success

2 个答案:

答案 0 :(得分:2)

您的代码对我来说似乎不错,除了这一行。

if (input >= 5 && input <= 95 && input %5)

表达式input % 5返回input/5的余数。您希望input可被5整除,这在input % 5返回0的余数时发生。由于C将0解释为false,并且几乎所有其他整数都为true,此表达式将完全相反你想要它做什么尝试使用

if (input >= 5 && input <= 95 && (input % 5 == 0))

那应该做你想做的事。

答案 1 :(得分:0)

您的代码存在问题。首先,直接的错误:

  • 表达式input % 5会在除以5时给出余数。这意味着如果 为多个,则将为零,否则为非零。不幸的是,零被视为 false ,因此只有当input 为倍数时才会这样。正确的表达式是(input % 5) == 0

  • 如果输入的内容无法解释为整数,scanf将失败,input将保留为事先的任何值。这应该通过检查返回值来捕获并采取行动 - 这将为您提供成功扫描的项目数量,因此应该是一个。

  • 如果没有问题,您的代码似乎会返回值,但如果它无效,则返回 nothing

接下来,虽然没有错误,但这些是我的个人偏好,可以使代码更易于阅读和维护:

  • 我更喜欢显式单独的子表达式,所以我不必担心优先级规则(前提是它不会使表达式在进程中不可读)。为此,我将制作完整的if声明if ((input >= 5) && (input <= 95) && ((input % 5 == 0))

  • 我不是if (condition) transferControl else ...构造的忠实粉丝,因为else 完全是多余的。

  • 我也更喜欢在开始时以本地化的方式进行错误捕获,尽早发现问题。只有在通过所有检查后,才能执行成功部分。

  • 一个函数(假设它是一个函数,似乎很可能)通常应该一个事物,例如检查该值是否有效。将问题写入标准输出可能最好留给调用者,以便该函数真正可重用。最好让函数执行检查并返回一些值以指示是否存在失败,如果有效,则 值。

  • 通常最好使用puts("something")而不是printf("something\n")printf调用最好留给您实际需要进行参数格式化的地方。

考虑到这一切,我想要的代码将是:

#include <stdbool.h>

bool InputValidRangeAndMultiple(
    unsigned *pValue,
    unsigned minVal,
    unsigned maxVal,
    unsigned multVal
) {
    unsigned input;

    // If no unsigned int available, error.

    if (scanf("%u", pValue) != 1) return false;

    // If value invalid in any way (range or multiple), error.

    if ((*pValue < minVal) || (*pValue > maxVal)) return false;

    if ((*pValue % multVal) != 0) return false;

    // Value is now deemed okay.

    return true;
}

可以这样调用该功能,并在<输入和检查“功能 处理提示和错误:

#include <stdio.h>

unsigned value;

puts("Enter Value.\nValue must be divisible by 5 and within 5 and 95...");
if (! InputValidRangeAndMultiple(&value, 5u, 95u, 5u)) {
    puts("Invalid input...");
    returnOrDoSomethingIntelligent();
}
// The 'value' variable is now valid.