如果我想将要分配给整数的值的范围限制为三种不同的条件。例如;必须介于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
答案 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.