Eu estive pensando em alguns erros para iniciantes e acabei com o que estava na if
declaração. Expandi um pouco o código para isso:
int i = 0;
if (i = 1 && i == 0) {
std::cout << i;
}
Eu vi que a if
afirmação retorna verdadeira, e cout
é i
como 1
. If i
é atribuído 1
na instrução if, por que i == 0
retornou true
?
c++
if-statement
TehMattGR
fonte
fonte
i
está definida como1
.1 && i == 0
?Respostas:
Isso tem a ver com precedência do operador .
não é
porque ambos
&&
e==
têm uma precedência maior que=
. O que realmente funciona éque atribui o resultado de
1 && (i == 0)
ai
. Portanto, sei
começa em0
então ,i == 0
étrue
, também1 && true
étrue
(ou1
) ei
é definido como1
. Então, como1
é verdade, você insere o bloco if e imprime o valor atribuídoi
.fonte
i = !i; if (i)
escrito corretamenteAssumindo que seu código realmente se parece com isso:
Então isso:
avalia como
e assim
i
está definido como1
.fonte
using namespace std
!=
veio antes&&
possa ver o problema. Além disso, sim, a expansão é estranha, mas não acho que isso importe muito. Não acredito que essas pequenas diferenças levem as pessoas a votar 151 a -4.Tem a ver com a análise de regras da direita para a esquerda. Por exemplo, y = x + 5.
Todas as subexpressões são ponderadas em importância. Duas expressões de igual importância são avaliadas da direita para a esquerda,. O lado da expressão && é feito primeiro, seguido pelo LHS.
Faz sentido para mim.
fonte
A resposta real é:
Como prova, basta olhar para a saída asm do seu compilador para o código digitado (todos os comentários são meus):
A saída asm acima era do CLANG, mas todos os outros compiladores que eu analisei deram saída semelhante. Isso é verdadeiro para todos os compiladores nesse site, sejam eles compiladores C ou C ++ puros, todos sem pragmas para alterar o modo do compilador (que por padrão é C ++ para os compiladores C ++)
Observe que seu compilador não definiu i = 1, mas i = TRUE (que significa qualquer valor inteiro de 32 bits e não zero). Isso ocorre porque o operador && avalia apenas se uma instrução é VERDADEIRA ou FALSA e, em seguida, define os resultados de acordo com esse resultado. Como prova, tente alterar i = 1 para i = 2 e observe por si mesmo que nada mudará. Veja você mesmo usando qualquer compilador online no Compiler Explorer
fonte
i = 1
é um operador de atribuição [não uma equivalência]; 2b) Posso garantir que vocêif (i = 0)
avaliará a condição falsa em C e C ++, portanto, se é avaliado como verdadeiro "nunca falha", é um pouco enganador.and cl, 1 ; = operator always TRUE
<< corrija-me se estiver errado, mas não vejo nenhuma atribuição aqui. Representa a1 &&
parte da expressão. Portanto, essa resposta é basicamente avaliada comofalse
.if ( i = 0 ) { print something }
. Também a sua resposta se contradiz; no início, você diz quei=1
é avaliado antes da&&
aplicação e, no final, diz quei
está definido como o resultado do&&
operador.