Negacja w warunku

0

Mam pewien problem ze zrozumieniem warunku gdy występuje negacja. od razu powiem że wiem jak działa negacja. I w tym poscie nie chodzi mi o sama negacje tylko w połączeniu z warunkiem. Najpierw pokaże część kodu.

Employee[] a = new Employee[100];
Class cl = a.getClass();
if (!cl.isArray()) return null;

Widać że w tym przypadku obiekt "a" jest tablicą i tak ma być w tym programie, ale zalecenie jest takie aby sprawdzić to czy na pewno jest tablicą.

1.Weźmy pierwszy przypadek: obiekt "a" jest tablicą.

Metoda isArray daje wynik TRUE, negacja to neguje i wartość całego wyrażenia jest FALSE.

i całość linijki mówi: Jeśli FALSE zwróć null.

  1. Weźmy drugi przypadek kiedy obiekt "a" nie byłby tablicą.

Metoda isArray daje wynik FALSE, negacja to neguje i wartość całego wyrażenia jest TRUE.

i całość linijki mówi: Jeśli TRUE zwróć null

==============================

W obydwu przypadkach wychodzi mi że warunek jest spełniony i za każdym razem powinno zwracać null.
Nie rozumiem tego, ponieważ program ma działać dalej jeśli obiekt "a" jest tablicą a zwracać null kiedy nie jest tablicą.
Więc musi nastapić najpierw sprawdzenie obiektu.
Wiem że to jest dobrze napisany ten kod bo to kod z książki, tylko ja nie rozumiem tego warunku jak go czytać/interpretować.

Może ktoś mi to rozjaśni interpretacje tego.

0

Zaryzykuję. Linijka

if (!cl.isArray()) return null;

mówi: jeśli true, to zwróć null, i nic więcej w tym kodzie nie ma. W konsekwencji null zostanie zwrócony gdy a nie jest tablicą. Z kodu nie wynika co się stanie gdy a jest tablicą.

0

Co sie stanie gdy "a" jest tablicą nie jest ważne ale jeśli ci to pomoże masz cały kod:

package arrays;

import java.lang.reflect.*;
import java.util.*;

/**
* Ten program demonstruje zastosowanie refleksji do manipulacji tablicami.
* @version 1.2 2012-05-04
* @author Cay Horstmann
*/
public class CopyOfTest
{
   public static void main(String[] args)
   {
      int[] a = { 1, 2, 3 };
      a = (int[]) goodCopyOf(a, 10);
      System.out.println(Arrays.toString(a));

      String[] b = { "Tom", "Dick", "Harry" };
      b = (String[]) goodCopyOf(b, 10);
      System.out.println(Arrays.toString(b));

      System.out.println("The following call will generate an exception.");
      b = (String[]) badCopyOf(b, 10);
   }

/**
* Ta metoda próbuje powiększyć tablicę, tworząc nową tablicę i kopiując wszystkie elementy.
* @param a tablica, która ma być powiększona.
* @param newLength nowa długość tablicy
* @return większa tablica zawierająca wszystkie elementy tablicy a. Zwrócona tablica jest
* typu Object[], a nie takiego samego jak a.
*/
   public static Object[] badCopyOf(Object[] a, int newLength) // not useful
   {
      Object[] newArray = new Object[newLength];
      System.arraycopy(a, 0, newArray, 0, Math.min(a.length, newLength));
      return newArray;
   }

/**
* Ta metoda powiększa tablicę, tworząc nową tablicę tego samego typu
* i kopiując wszystkie elementy.
* @param a tablica, która ma być powiększona. Może to być tablica obiektów lub
* elementów typu podstawowego.
* @return większa tablica zawierająca wszystkie elementy tablicy a.
*/
   public static Object goodCopyOf(Object a, int newLength) 
   {
      Class cl = a.getClass();
      if (!cl.isArray()) return null;
      Class componentType = cl.getComponentType();
      int length = Array.getLength(a);
      Object newArray = Array.newInstance(componentType, newLength);
      System.arraycopy(a, 0, newArray, 0, Math.min(length, newLength));
      return newArray;
   }
}

mówi: jeśli true, to zwróć null, i nic więcej w tym kodzie nie ma. W konsekwencji null zostanie zwrócony gdy a nie jest tablicą.

Wg mnie null zostanie ort! za każdym razem.

A)
Metoda isArray zbadała obiekt, który był tablicą i wynik metody jest TRUE,
negujemy to i mamy wynik całkowicy wynik wyrażenia FALSE.

if (FALSE) return null;

Czyli: jeśli FALSE ort! null.

B)
Metoda isArray zbadała obiekt, który nie był tablicą i wynik metody jest FALSE,
negujemy to i mamy wynik całkowicy wynik wyrażenia TRUE.

if (TRUE) return null;

Czyli: jeśli TRUE ort! null.

=============================

Gdzie w tym kodzie widać żę jeśli całkowity wynik warunku jest TRUE to żeby
zwracało null?

0

Powtórz sobie jak działa if bo chyba za bardzo nie ogarniasz.

Dla ifa całe wyrażenie !cl.isArray() jest argumentem, tzn, że if wykona się tylko jeśli całe to wyrażenie zwróci True.

Metoda isArray zbadała obiekt, który był tablicą i wynik metody jest TRUE,
negujemy to i mamy wynik całkowicy wynik wyrażenia FALSE.
if (FALSE) return null;

Czyli: jeśli FALSE ort! null.

To jest nieprawda.

0

Dzięki kolego Endrew za tą informacje. I powiem Ci że szybko po twojej odpowiedzi ort! do książki na temat warunku IF i tam były różne przykłady pokazane ale nie napisali ważnego zdania, że jeśli wynik jakiegoś wyrażenia jest wartością boolean to warunek IF wykonuje się tylko przy wartości TRUE.

Teraz to mi wszystko gra. Taka pierdołka i takie zamieszanie. Dzięki jeszcze raz. Temat uważam za zamkniety.

4

ale nie napisali ważnego zdania, że jeśli wynik jakiegoś wyrażenia jest wartością boolean to warunek IF wykonuje się tylko przy wartości TRUE.

Nie napisali, bo jest oczywiste dla wszystkich ludzi na świecie poza Tobą.

0

Wiesz ja sie ucze tego co tam pisze i jakie podają przykłady. I to co napisali to sie nauczyłem, ale tego nie wiedziałem. A powinni to napisać bo to jest książka od podstaw.

0

Jak działa if było na 100% napisane i powinieneś to wiedzieć po pierwszym dniu czytania książki.

Zamiast się normalnie nauczyć podstaw to skupiasz się na rzeczach kompletnie nieistotnych z punktu widzenia początkującego.
Ostatnio wklejałeś jakiś kod z książki gdzie była refleksja(nie przyda ci się to przez najbliższe 3 lata), a jestem pewien, że nie wiesz czym różnią się najprostsze kolekcje ArrayList,LinkedList,HashSet z których korzysta się na co dzień.

1 użytkowników online, w tym zalogowanych: 0, gości: 1