什么是用于格式化该语句的惯用C方式

时间:2014-03-11 21:50:47

标签: c if-statement code-formatting

我已经想出了这个难以阅读的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的不当使用,请告诉我 - 我将删除此问题。

5 个答案:

答案 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错误立即显而易见。