Pergunta

Em muitas atribuições idiomas são legais em condições. Eu nunca entendi a razão por trás disso. Por que você escreve:

if (var1 = var2) {
  ...
}

em vez de:

var1 = var2;
if (var1) {
  ...
}
Foi útil?

Solução

É mais útil para loops do que se declarações.

while( var = GetNext() )
{
  ...do something with var 
}

O que de outra forma teria de ser escrito

var = GetNext();
while( var )
{
 ...do something
 var = GetNext();
}

Outras dicas

É mais útil se você estiver chamando uma função:

if (n = foo())
{
    /* foo returned a non-zero value, do something with the return value */
} else {
    /* foo returned zero, do something else */
}

Claro, você pode simplesmente colocar o n = foo (); em um comunicado separado, em seguida, se (n), mas acho que o acima é uma linguagem bastante legível.

Acho que é mais útil em cadeias de ações que muitas vezes envolvem a detecção de erros, etc.

if ((rc = first_check(arg1, arg2)) != 0)
{
    report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
    report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
    report error based on new rc
}
else
{
    do what you really wanted to do
}

A alternativa (não utilizar a designação na condição) é:

rc = first_check(arg1, arg2);
if (rc != 0)
{
    report error based on rc
}
else
{
    rc = second_check(arg2, arg3);
    if (rc != 0)
    {
        report error based on new rc
    }
    else
    {
        rc = third_check(arg3, arg4);
        if (rc != 0)
        {
            report error based on new rc
        }
        else
        {
            do what you really wanted to do
        }
    }
}

Com a verificação de erros prolongada, a alternativa pode ser executado fora do RHS da página enquanto a versão atribuição-in-condicional não faz isso.

As verificações de erro também poderia ser 'ações' - first_action(), second_action(), third_action() - naturalmente, em vez de cheques apenas. Ou seja, eles podem ser verificados passos no processo que a função está a gerir. (Na maioria das vezes, no trabalho de código I com, as funções estão ao longo das linhas de cheques pré-condição ou alocações de memória necessários para a função de trabalho, ou em moldes semelhantes).

Pode ser útil se você está chamando uma função que retorna ou dados para trabalhar em ou uma bandeira para indicar um erro (ou que você está feito).

Algo como:

while ((c = getchar()) != EOF) {
    // process the character
}

// end of file reached...

Pessoalmente é um idioma que eu não sou extremamente apaixonado por, mas às vezes a alternativa é mais feia.

GCC pode ajudar a detectar (com -Wall) se você acidentalmente tentar usar uma atribuição como um valor de verdade, no caso de ele recomenda que você escreve

if ((n = foo())) {
   ...
}

i. usar parêntese extra para indicar que este é realmente o que você quer.

O idioma é mais útil quando você está escrevendo um loop while em vez de uma declaração if. Para uma instrução if, você pode quebrá-lo como você descreve. Mas sem esta construção, você teria que repetir-se:

c = getchar();
while (c != EOF) {
    // ...
    c = getchar();
}

ou usar um loop-e-uma-metade estrutura:

while (true) {
    c = getchar();
    if (c == EOF) break;
    // ...
}

Eu geralmente preferem a-e-meia-circuito formulário.

A resposta curta é que linguagens de programação permitem que o código mais sucinto orientada a Expression. Eles não forçá-lo a comandos separados a partir de consultas .

Em PHP, por exemplo, é útil para looping através de resultados de banco de dados SQL:

while ($row = mysql_fetch_assoc($result)) {
    // Display row
}

Isso parece muito melhor do que:

$row = mysql_fetch_assoc($result);
while ($row) {
    // Display row
    $row = mysql_fetch_assoc($result);
}

A outra vantagem vem durante o uso do gdb. No código a seguir o código de erro não se sabe se estivéssemos a única etapa.

while (checkstatus() != -1) {
    // process
}

Em vez

while (true) {
    int error = checkstatus();
    if (error != -1)
        // process
    else
        //fail
}

Agora, durante único passo podemos saber o que era o código de erro de retorno do checkStatus ().

A razão é a seguinte:

  1. A melhoria do desempenho (Às vezes)

  2. Lesser Código (Sempre)

Tomemos um exemplo: Há um método someMethod() e em uma condição if você quiser verificar se o valor de retorno do método é null. Se não você está indo para usar o valor de retorno novamente.

If(null != someMethod()){
    String s = someMethod();
    ......
    //Use s
}

Ele vai prejudicar o desempenho desde que você está chamando o mesmo método duas vezes. Em vez disso use:

String s;
If(null != (s = someMethod())) {
    ......
    //Use s
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top