我已经想出了这个难以阅读的if
声明,我无法弄清楚我应该将其格式化的最佳方式,以使其更具可读性和做法所以用C方式。
if (((value == intMax) && (intMax != 0)) || // Deals with upper bound
(value > (intMax/10)) ||
((value == (intMax/10)) && (digitAdjusted > digitLastIntMax)) ||
((value == intMin) && (intMin != 0)) || // Deals with lower bound
(value < (intMin/10)) ||
((value == (intMin/10)) && (digitAdjusted < digitLastIntMin))) {
// Some code
}
如果这是对SO的不当使用,请告诉我 - 我将删除此问题。
答案 0 :(得分:4)
实际上,由于&&
位于||
之前,因此内括号不是必需的 - 您可以删除它们。
另外:(intMin != 0)
与intMax
相同。
if ((value == intMax) && intMax || // Deals with upper bound
(value > intMax/10) ||
(value == intMax/10) && (digitAdjusted > digitLastIntMax) ||
(value == intMin) && intMin || // Deals with lower bound
(value < intMin/10) ||
(value == intMin/10) && (digitAdjusted < digitLastIntMin)) {
// Some code
}
答案 1 :(得分:3)
所以这就是我按照我收到的所有建议提出的。
// Upper bound
maxReached = (value == intMax) && (intMax != 0);
maxDivTenExceeded = value > (intMax/10);
maxLastDigitExceeded = (value == (intMax/10)) && (digitAdjusted > digitLastIntMax);
// Lower bound
minReached = (value == intMin) && (intMin != 0);
minDivTenExceeded = value < (intMin/10);
minLastDigitExceeded = (value == (intMin/10)) && (digitAdjusted < digitLastIntMin);
// Stop conditions
stopMax = maxReached || maxDivTenExceeded || maxLastDigitExceeded;
stopMin = minReached || minDivTenExceeded || minLastDigitExceeded;
// Prevent integer overflow
if (stopMax || stopMin) {
// Code
}
答案 2 :(得分:2)
我会将每个由||
分隔的子句放入返回布尔值的函数中。
if ( test1(value, intMax) || // ((value == intMax) && (intMax != 0)) || // Deals with upper bound
test2(value, intMax) || // (value > (intMax/10)) ||
test3(value, intmax, digitAdjusted, digitLastIntMax) || // ((value == (intMax/10)) && (digitAdjusted > digitLastIntMax)) |
test4(value, intMin) // ((value == intMin) && (intMin != 0)) || // Deals with lower bound
test5(value, intMin) || // (value < (intMin/10)) ||
test6(value, intMin, digitAdjusted, digitLastIntMin) //((value == (intMin/10)) && (digitAdjusted < digitLastIntMin))
)
{
// Some code
}
答案 3 :(得分:1)
如果你想让它更具可读性,可以在评论中使用嵌套的ifs以及关于每个阶段正在做什么的好解释。在一条线上完成这一切并没有太大的实际好处,而且它确实看起来似乎不可读。
答案 4 :(得分:1)
垂直排列有助于一点点,但真正的问题是,“你正在尝试实施哪些要求?”。它看起来像是在尝试避免溢出时将输入字符串转换为整数,但在这种情况下intMin检查没有任何意义。多一点上下文可能有助于解决这个问题。
if (((value == intMax) && (intMax != 0)) || (value > (intMax/10)) || ((value == (intMax/10)) && (digitAdjusted > digitLastIntMax)) ||
((value == intMin) && (intMin != 0)) || (value < (intMin/10)) || ((value == (intMin/10)) && (digitAdjusted < digitLastIntMin)) )
请注意,垂直对齐会使按位OR与逻辑OR错误立即显而易见。