programação - operator overloading c++



Comportamento diferente do operador de vírgula em C++ com retorno? (3)

Isto (observe o operador de vírgula ):

#include <iostream>
int main() {
    int x;
    x = 2, 3;
    std::cout << x << "\n";
    return 0;
}

saídas 2 .

No entanto, se você usar return com o operador vírgula, isto:

#include <iostream>
int f() { return 2, 3; }
int main() {
    int x;
    x = f();
    std::cout << x << "\n";
    return 0;
}

saídas 3 .

Por que o operador de vírgula está se comportando de maneira diferente com o return ?


Answer #1

De acordo com a Precedência do operador , o operador de vírgula tem uma precedência menor que o operator= , então x = 2,3; é equivalente a (x = 2),3; . (A precedência do operador determina como o operador será vinculado a seus argumentos, mais rígido ou mais frouxo do que outros operadores, de acordo com suas precedências.)

Observe que a expressão de vírgula é (x = 2),3 aqui, não 2,3 . x = 2 é avaliado no início (e seus efeitos colaterais são concluídos), o resultado é descartado e, em seguida, 3 é avaliado (não faz nada de fato). É por isso que o valor de x é 2 . Observe que 3 é o resultado de toda a expressão de vírgula (ou seja, x = 2,3 ), ela não será usada para atribuir a x . (Altere para x = (2,3); x será atribuído com 3 )

Para return 2,3; , a expressão de vírgula é 2,3 , 2 é avaliada, seu resultado é descartado e, em seguida, 3 é avaliado e retornado como resultado de toda a expressão de vírgula, retornada posteriormente pela instrução de retorno .

Informações adicionais sobre Expressions e Statements

Uma expressão é uma sequência de operadores e seus operandos, que especifica uma computação.

x = 2,3; é a expressão expression , x = 2,3 é a expressão aqui.

Uma expressão seguida por ponto e vírgula é uma declaração.

Sintaxe: attr(optional) expression(optional) ; (1) attr(optional) expression(optional) ; (1)

return 2,3; é declaração de salto ( declaração de retorno ), 2,3 é a expressão aqui.

Sintaxe: attr(optional) return expression(optional) ; (1) attr(optional) return expression(optional) ; (1)


Answer #2

Esta afirmação:

  x = 2,3;

é composto por duas expressões :

> x = 2
> 3

Como a precedência do operador , = tem mais precedência do que vírgula, então x = 2 é avaliado e depois de 3 . Então x será igual a 2 .

No return vez disso:

int f(){ return 2,3; }

A sintaxe do idioma é:

return <expression>

O return nota não faz parte da expressão.

Portanto, nesse caso, as duas expressões serão avaliadas serão:

> 2
> 3

Mas apenas o segundo ( 3 ) será retornado.


Answer #3

Tente aplicar a abordagem simplista apenas destacando a precedência entre parênteses:

( x = 2 ), 3;

return ( 2, 3 );

Agora podemos ver o operador binário "," trabalhando da mesma maneira em ambos, da esquerda para a direita.





comma-operator