Tak, napisałem jakiś kod i otrzymałem nieoczekiwane dane wyjściowe w jednej części mojego programu, które zakłóciły cały system.Wyrażenia logiczne w nieporozumieniu C
Udało mi się wydobyć i uprościć problem do podstawowego wyrażenia logicznego. Powiedzmy:
int i = 1, j = 1, k = 0;
printf("%d\n", ++i || ++j && k);
printf("%d, %d, %d\n", i, j, k);
return 0;
Wyjście dla tego programu jest:
1
2
1
0
myślę, że wartość j
nie był zwiększany do 2
ze względu na krótki charakter obwodu operatora ||
. Jednak jestem zdezorientowany, jak wartość pierwszego "%d"
jest 1
. Czy wartość k
nie powinna być równa zero dla oświadczenia &&
, aby zwrócić 1
? Czy też to polecenie nie jest w ogóle wykonywane, ponieważ ++i || ++j
nie jest 0
i dlatego zwraca wartość 1
?
- wiem, że
&&
jest logicznym i i wyr1 & & wyr2 ma wartość 1, jeśli wartości wyr1 & & wyr2 są zarówno niezerową.
Zostanie docenione wszelkie wyjaśnienia i proszę wybaczyć podstawową naturę tego pytania.
Niestety używam VS2015. Wkrótce będę chciał zacząć używać 'gcc'. Zakładam, że sugerowałbyś to zrobić? Zawsze używałem VS, ponieważ jest zalecane dla studentów ... (tak mi się wydawało) –
@Rizzo Myślę, że gcc jest zdecydowanie świetnym kompilatorem, zarówno pod względem wygody programistów, jak i szybkości generowanego kodu, ale używaj tego, co lubisz. ;) – PSkocik