对于这种情况,这是最优雅/安全/推荐的解决方案吗?

时间:2016-03-19 13:16:21

标签: c++ c format

我希望第一个elseif条指令。像这样:

if (vowels_counter >= consonants_counter)
    for (i = 0; ntca[i]; i++)
        for (j = 0; vowels[j]; j++)
            if (ntca[i] == vowels[j])
            {   ntca[i] += 1;
                break;
            }
else
    for (i = 0; ntca[i]; i++)...

但您看到else如何与第二个if

相关联
if (vowels_counter >= consonants_counter)
        for (i = 0; ntca[i]; i++)
            for (j = 0; vowels[j]; j++)
                if (ntca[i] == vowels[j])
                {   ntca[i] += 1;
                    break;
                }

                else
                    for (i = 0; ntca[i]; i++)...

我通过将嵌套的iffor放在这样的大括号中解决了这种情况:

   if (vowels_counter >= consonants_counter)
        for (i = 0; ntca[i]; i++)
            {for (j = 0; vowels[j]; j++)
                {if (ntca[i] == vowels[j])
                   {ntca[i] += 1;
                    break;
                   }
                }
            }

   else
        for (i = 0; ntca[i]; i++)...

这是最优雅/安全/推荐的解决方案吗?谢谢!

5 个答案:

答案 0 :(得分:6)

  

在没有使用大括号的情况下是否有其他解决方案?

这是错误的问题。真正的问题是:有没有理由不使用大括号?没有。只需使用大括号。你的同事和未来 - 你将在以后感谢你。

答案 1 :(得分:4)

您要做的不是那么简单:else绑定到最近的待定if语句。您需要至少在其中一个for语句的主体周围放置大括号,或者更糟糕的是,在嵌套的else;中添加一个空的if子句。

但这是 NOT 你应该做的事情!

请记住,对于ifforwhiledo等不限制的语句,不使用大括号被视为不良风格单行。它容易出错且不太可读。慷慨地使用大括号,让不太精明(或不那么清醒)的程序员可以保护你的代码免受以后更改的影响。

Classic Kernighan和Ritchie风格如下所示:

    if (vowels_counter >= consonants_counter) {
        for (i = 0; ntca[i]; i++) {
            for (j = 0; vowels[j]; j++) {
                if (ntca[i] == vowels[j]) {
                    ntca[i] += 1;
                    break;
                }
            }
        }
    } else {
        for (i = 0; ntca[i]; i++) {
            ...
        }
    }

答案 2 :(得分:1)

我在if语句的主体周围使用大括号,这是最简单,最易读的选项:

if (vowels_counter >= consonants_counter)
{
  for (...
}
else
{
  for (...
}

但只是为了好玩:

if (vowels_counter >= consonants_counter)
  for (i = 0; ntca[i]; i++)
  {
    for (j = 0; vowels[j] && ntca[i] != vowels[j]; j++)
      ;

    ntca[i] += (vowels[j] && ntca[i] == vowels[j]);
  }
else
  for (i = 0; ntca[i]; i++) // ...

答案 3 :(得分:-2)

显而易见的方法是添加另一个else,然后添加一个空语句(即紧接着;

if (vowels_counter >= consonants_counter)
    for (i = 0; ntca[i]; i++)
        for (j = 0; vowels[j]; j++)
            if (ntca[i] == vowels[j])
            {   ntca[i] += 1;
                break;
            }
            else ;      // note presence of ; here
else
    for (i = 0; ntca[i]; i++)

然而,虽然它回答了问题,但这不是我推荐的技术。有很多方法可以让这些黑客混淆程序员 - 包括将来自己 - 这根本不值得。易于误解的代码很容易出错。

养成将ifforelse等的身体放在花括号中的习惯,除非你有一个非常具体和令人信服的(对其他人)理由不至。在大多数风格指南中强烈建议这样的事情是有充分理由的。请记住,缩进不会以任何方式改变代码的含义。

答案 4 :(得分:-4)

一种解决方案是否定内部if的条件并将过程置于else闭合。

if (vowels_counter >= consonants_counter)
    for (i = 0; ntca[i]; i++)
        for (j = 0; vowels[j]; j++)
            if (!(ntca[i] == vowels[j])); else
            {   ntca[i] += 1;
                break;
            }
else
    for (i = 0; ntca[i]; i++)...