#include <stdio.h>
volatile int i;
int main()
{
int c;
for (i = 0; i < 3; i++)
{
c = i &&& i;
printf("%d\n", c);
}
return 0;
}
A saída do programa acima compilado usando gcc
é
0
1
1
Com a opção -Wall
ou -Waddress
, gcc
emite um aviso:
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
Como está c
sendo avaliado no programa acima?
c++
c
operators
compiler-optimization
gcc-warning
manav mn
fonte
fonte
i && (&i)
? Interessante não encontrar uma postagem duplicada no SO.while (i &&& i <-- j) {}
.Respostas:
É
c = i && (&i);
, com a segunda parte sendo redundante, pois&i
nunca será avaliadafalse
.Para um tipo definido pelo usuário, onde você pode sobrecarregar unário
operator &
, pode ser diferente, mas ainda é uma péssima idéia .Se você ativar os avisos , receberá algo como:
fonte
c = i & (&&i);
:; Ondei
está algum rótulo?i
é definido comoint
e não há rótulos na pergunta. Além disso, máxima mastigação ...&&
operador para pegar o endereço de uma etiqueta é uma extensão gcc não-padrão de qualquer maneira. Mas, mesmo que fosse padrão, a regra munch máxima impediria que ela fosse analisada dessa maneira (a menos que você insira um espaço).&i
pode avaliar afalse
. Às vezes é usado para padrões. Exemplo:void fn(type& x = *reinterpret_cast<type*>(NULL));
Qual é o valor de&x
infn
sefn
é chamado sem parâmetros? É 0, também conhecido como falso. No entanto, usá-lo da maneira descrita, sempre será verdadei == 0
, a menos que , e se alguém o estivesse usando como eu descrevi, seriac = &i && i
.Não há
&&&
operador ou token em C. Mas os operadores&&
(lógico "e") e&
(endereço unário ou bit a bit "e") existem.Pela regra munch máxima , isto:
é equivalente a isso:
Ele define
c
1 se ambosi
e&i
forem verdadeiros e 0 se um deles for falso.Para um int, qualquer valor diferente de zero é verdadeiro. Para um ponteiro, qualquer valor não nulo é verdadeiro (e o endereço de um objeto é sempre não nulo). Assim:
Ele define
c
como 1 sei
for diferente de zero ou0
sei
for igual a zero.O que implica que o item
&&&
está sendo usado aqui apenas para ofuscação deliberada. A atribuição também pode ser uma das seguintes:fonte