Operador de expressão condicional
C tem um operador ternário: o operador de expressão condicional (? :
).
conditional-expression
:
logical-OR-expression
logical-OR-expression
?
expression
:
conditional-expression
A logical-OR-expression
deve ter um tipo integral, de flutuação ou ponteiro. Ele é avaliado em termos de equivalência a 0. Um ponto de sequência vem após a logical-OR-expression
. A avaliação dos operandos acontece da seguinte maneira:
Se
logical-OR-expression
não for igual a 0,expression
será avaliado. O resultado da avaliação da expressão é determinado pelaexpression
não terminal. (Significa queexpression
será avaliado somente selogical-OR-expression
for true).Se
logical-OR-expression
for igual a 0,conditional-expression
será avaliado. O resultado da expressão será o valor daconditional-expression
. (Significa queconditional-expression
será avaliado somente selogical-OR-expression
for false).
O efeito é que expression
ou conditional-expression
é avaliado, mas não ambos.
O tipo de resultado de uma operação condicional depende do tipo do operando da expression
ou conditional-expression
, da seguinte maneira:
Se a
expression
ouconditional-expression
tiver o tipo integral ou flutuante (seus tipos podem ser diferentes), o operador executa conversões aritméticas comuns. O tipo do resultado é o tipo dos operandos após conversão.Se a
expression
e aconditional-expression
tiverem a mesma estrutura, união ou tipo de ponteiro, o tipo de resultado é a mesma estrutura, união ou tipo de ponteiro.Se ambos os operandos tiverem o tipo
void
, o resultado tem o tipovoid
.Se qualquer operando for um ponteiro para um objeto de qualquer tipo e o outro operando for um ponteiro para
void
, o ponteiro para o objeto será convertido em um ponteiro paravoid
e o resultado será um ponteiro paravoid
.Se a
expression
ouconditional-expression
for um ponteiro e o outro operando for uma expressão constante com o valor 0, o tipo de resultado será o tipo de ponteiro.
Na comparação do tipo para ponteiros, qualquer qualificador de tipo (const
ou volatile
) no tipo para o qual o ponteiro aponta é insignificante, mas o tipo de resultado herda os qualificadores de ambos os componentes da condicional.
Os exemplos a seguir mostram o uso do operador condicional:
j = ( i < 0 ) ? ( -i ) : ( i );
Este exemplo atribui o valor absoluto de i
a j
. Se i
for menor que 0, -i
é atribuído a j
. Se i
for maior ou igual a 0, i
é atribuído a j
.
void f1( void );
void f2( void );
int x;
int y;
.
.
.
( x == y ) ? ( f1() ) : ( f2() );
Neste exemplo, duas funções, f1
e f2
, e duas variáveis, x
e y
, são declaradas. Posteriormente no programa, se as duas variáveis tiverem o mesmo valor, a função f1
será chamada. Caso contrário, f2
é chamada.