#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;
}
Dane wyjściowe powyższego programu skompilowane przy użyciu gcc
to
0
1
1
Z opcją -Wall
lub wydaje ostrzeżenie:-Waddress
gcc
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
Jak c
ocenia się powyższy program?
c++
c
operators
compiler-optimization
gcc-warning
manav mn
źródło
źródło
i && (&i)
? Ciekawe, że nie mogę znaleźć duplikatu postu na SO.while (i &&& i <-- j) {}
.Odpowiedzi:
Jest tak
c = i && (&i);
, ponieważ druga część jest zbędna, ponieważ&i
nigdy tego nie ocenifalse
.W przypadku typu zdefiniowanego przez użytkownika, w którym można faktycznie przeciążać jednoargumentowy
operator &
, może być inny, ale nadal jest to bardzo zły pomysł .Jeśli włączysz ostrzeżenia , otrzymasz coś takiego:
źródło
c = i & (&&i);
:; Gdziei
jest jakaś etykieta?i
jest zdefiniowane jakoint
i w pytaniu nie ma etykiet. Również maksymalny munch ...&&
operator, który ma wziąć adres etykiety, jest zresztą niestandardowym rozszerzeniem gcc. Ale nawet gdyby był to standard, reguła maksymalnego chrupnięcia uniemożliwiłaby jego analizę w ten sposób (chyba że wstawisz spację).&i
może ocenićfalse
. Jest czasem używany jako domyślny. Przykład:void fn(type& x = *reinterpret_cast<type*>(NULL));
Jaka jest wartość&x
in,fn
jeślifn
wywoływana jest bez parametrów? To 0 aka false. Jednak używając go w sposób opisany, zawsze będzie to prawdą, chyba żei == 0
, i jeśli ktoś używałby go tak, jak opisałem, byłoby to możliwec = &i && i
.W
&&&
C. nie ma operatora ani tokena, ale operatory&&
(logiczne i „) oraz&
(jednoargumentowy lub bitowy” i „) istnieją.Zgodnie z zasadą maksymalnego chrupania to:
jest równoważne z tym:
Określa ona
c
do 1 jeżeli obai
i&i
są prawdziwe, a na 0, jeśli któreś z nich jest fałszywa.W przypadku int każda niezerowa wartość jest prawdą. W przypadku wskaźnika każda wartość inna niż null jest prawdziwa (a adres obiektu jest zawsze różny od null). Więc:
Ustawia się
c
na 1, jeślii
jest niezerowe lub na0
ifi
jest równe zero.Co oznacza,
&&&
że używa się go tutaj tylko do celowego zaciemniania. Przydziałem może być również dowolna z następujących czynności:źródło