Τι είναι το null και πώς να το ζήσετε: σύγκριση με το null στην PHP, λεπτές αποχρώσεις στη μετάδοση τύπων δεδομένων. Η σημασία της λέξης null

Αυτο 18.04.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Όταν μόλις άρχιζα να σπουδάζω προγραμματισμό στη γλώσσα C στα πρώτα μου χρόνια στο πανεπιστήμιο, η λέξη NULL, που κάποτε είδα στον κώδικα που έδωσε ο λέκτορας στον πίνακα, με οδήγησε, αν όχι με δέος, αλλά και πάλι δέος. . Η λέξη φαίνεται να είναι παρόμοια με το "μηδέν", αλλά στην πραγματικότητα, μάλλον δεν είναι μηδέν. Σε τι χρησιμεύει αυτό το προκλητικά απειλητικό «capslock»; Αυτό το NULL έχει κάποια σχέση με το μηδέν; Δεν υπήρχαν απαντήσεις σε αυτά τα ερωτήματα που γεννήθηκαν στο μυαλό μου.

Και πριν από αυτή τη λέξη υπήρχε μια περίεργη διπλή ισότητα. Γιατί ο δάσκαλος έγραψε δύο φορές το σύμβολο «ίσος»; Στην αρχή νόμιζα ότι μάλλον ήταν τυπογραφικό λάθος. Ή μήπως η κιμωλία πήγε στραβά στη μέση; μακριές ουρές. Αλλά στην ίδια κατασκευή που περιείχε NULL και διπλή ισότητα, υπήρχε και μια συνηθισμένη ισότητα, και οι γραμμές σε αυτήν δεν ήταν καθόλου μεγάλες. Και άρχισα να μαντεύω αόριστα ότι το NULL είναι κάποιου είδους ασυνήθιστο μηδέν και δύο σημάδια "ίσα" σημαίνουν κάποιο είδος ασυνήθιστης ισότητας. Τα πάντα σχετικά με αυτή τη νέα και ακατανόητη γλώσσα προγραμματισμού ήταν ασυνήθιστα.

Αυτή τη γραμμή, που με συγκλόνισε πριν από πολλά χρόνια, θα παραθέσω σε αυτό το άρθρο. Τώρα θα προσπαθήσουμε να καταλάβουμε τι είναι το NULL, πώς χρησιμοποιείται και αν μπορεί να αντικατασταθεί με ένα "κανονικό" μηδέν.

Το NULL είναι μια μακροεντολή της οποίας ο ορισμός περιέχεται στη βιβλιοθήκη stdlib.h. Η τιμή του είναι μια διεύθυνση που δεν είναι δυνατή η πρόσβαση. Ένα πρόγραμμα που χρησιμοποιεί τη μακροεντολή NULL δεν τοποθετεί ποτέ δεδομένα σε αυτήν τη διεύθυνση.

Η τιμή NULL μπορεί να εκχωρηθεί σε δείκτη οποιουδήποτε τύπου, συμπεριλαμβανομένων των μη πληκτρολογημένων. Για παράδειγμα, όλες οι παρακάτω εργασίες είναι σωστές:

Χαρακτήρας *p1 = NULL; int *p2 = NULL; void *p3 = NULL;

Καλείται ένας δείκτης που περιέχει μια τιμή NULL μηδέν. Έτσι, οι δείκτες p1, p2 και p3 που περιγράφονται παραπάνω είναι μηδενικοί.

Ας δούμε τώρα περιπτώσεις όπου χρησιμοποιούνται οι δείκτες μακροεντολής NULL και μηδενικοί δείκτες.

    Λειτουργίες δυναμική επιλογήΗ μνήμη συνήθως επιστρέφει τη διεύθυνση της εκχωρημένης περιοχής σε περίπτωση επιτυχίας και επιστρέφει NULL σε περίπτωση αποτυχίας. Έτσι ακριβώς συμπεριφέρεται, για παράδειγμα, η συνάρτηση βιβλιοθήκης malloc(). Χάρη σε αυτό, ο κώδικας που καλεί μια τέτοια συνάρτηση μπορεί να χειριστεί σωστά μια κατάσταση στην οποία δεν ήταν δυνατή η εκχώρηση μνήμης. Ας το επεξηγήσουμε αυτό με το ακόλουθο παράδειγμα:

    Int *p; //Δημιουργία δείκτη if ((p = malloc(100 * sizeof(int))) == NULL) //Προσπαθήστε να εκχωρήσετε δυναμικά τη μνήμη printf("Αποτυχία εκχώρησης μνήμης!"); //Σε περίπτωση αποτυχίας, εμφανίστε ένα μήνυμα, αλλιώς //και σε περίπτωση επιτυχίας για (int i = 0; i< 100; i++) //заполняем выделенную *(p + i) = i; //область памяти

    Η 2η γραμμή σε αυτό το παράδειγμα είναι ακριβώς αυτή που ανέφερα στην αρχή του άρθρου.

    Σε περισσότερα γενική περίπτωση, οι συναρτήσεις που δημιουργούν ορισμένα δεδομένα, εκχωρούν δυναμικά μνήμη για αυτό, τη γεμίζουν με αυτά τα δεδομένα και επιστρέφουν τη διεύθυνση του εκχωρημένου τμήματος, μπορούν επίσης να επιστρέψουν NULL ως ένδειξη ότι τα δεδομένα δεν ήταν δυνατό να δημιουργηθούν, για παράδειγμα, λόγω σφάλματος στο οι παράμετροι μεταβιβάστηκαν στη συνάρτηση.

    Η τιμή NULL συνήθως εκχωρείται σε έναν δείκτη για να τον διακρίνει από έναν δείκτη που περιέχει τη διεύθυνση μιας τοποθεσίας στη μνήμη στην οποία μπορεί να προσπελαστεί για ανάγνωση ή εγγραφή πληροφοριών. Για παράδειγμα, όταν δημιουργείτε έναν δείκτη, μπορείτε να του εκχωρήσετε αμέσως την τιμή NULL . Στο μέλλον, ο κώδικας μπορεί να ελέγξει την τιμή αυτού του δείκτη και να «καταλάβει» αμέσως εάν η διεύθυνση που περιέχεται σε αυτόν είναι προσβάσιμη ή όχι. Ας δούμε ένα απλό παράδειγμα:

    Int *p = NULL; //Δημιουργήστε έναν δείκτη p και αντιστοιχίστε τον NULL... // Κωδικός προγράμματος, στην οποία ο δείκτης p μπορεί... //να (ή μπορεί να μην είναι!) να εκχωρήσει μια διεύθυνση... //σε κάποια μεταβλητή a τύπου int if (p != NULL) //Αν ο δείκτης δεν είναι null, printf("a= %d", *p); //μετά εκτυπώστε την τιμή της μεταβλητής a else //Otherwise printf("p δείχνει το πουθενά!"); //παραγωγή πληροφοριακό μήνυμα

    Ένα άλλο παράδειγμα: στον δείκτη εκχωρήθηκε η διεύθυνση μιας δυναμικά εκχωρημένης θέσης μνήμης. Μετά από κάποιο χρονικό διάστημα, η εκχωρηθείσα μνήμη καταργήθηκε. Τώρα η πρόσβαση στη διεύθυνση που είναι αποθηκευμένη στον δείκτη μπορεί να οδηγήσει σε απρόβλεπτες συνέπειες. Για να αποφευχθεί αυτό, ο δείκτης λαμβάνει την τιμή NULL για να υποδείξει ότι ο δείκτης δεν μπορεί να αποαναφερθεί.

    Παρεμπιπτόντως, η βιβλιοθήκη δωρεάν λειτουργία() , που ασχολείται με την απελευθέρωση δυναμικά εκχωρημένης μνήμης και παίρνει τη διεύθυνση της εκχωρημένης περιοχής ως όρισμα, χειρίζεται σωστά την τιμή NULL. Έτσι, αν περάσετε έναν μηδενικό δείκτη, δεν θα συμβεί τίποτα κακό. Παρεμπιπτόντως, δεν θα γίνει τίποτα απολύτως!

    Σε μια μεμονωμένη συνδεδεμένη λίστα, κάθε κόμβος εκτός από τον τελευταίο συνδέεται με τον επόμενο. Σε μια εφαρμογή λογισμικού μιας λίστας, οι κόμβοι συνήθως αντιπροσωπεύονται από μεταβλητές δομικός τύπος(για απλότητα, θα ονομάσουμε και αυτές τις μεταβλητές κόμβους) και η αναφερόμενη σύνδεση μεταξύ κόμβων υλοποιείται ως εξής. Κάθε κόμβος περιέχει ως πεδίο έναν δείκτη προς τον κόμβο που τον ακολουθεί. Η εξαίρεση είναι ο τελευταίος κόμβος της λίστας, του οποίου ο αντίστοιχος δείκτης δεν έχει τίποτα να δείξει. Φαίνεται απολύτως λογικό να του εκχωρήσετε την τιμή NULL.

    Αυτός ο μηδενικός δείκτης θα υποδεικνύει ότι ο κόμβος που τον περιέχει είναι ο τελευταίος στη λίστα. Αυτή η δυνατότητα είναι πολύ βολική στη χρήση κατά την επανάληψη όλων των κόμβων μιας λίστας σε έναν βρόχο: μετακινούμαστε από κόμβο σε κόμβο μέχρι να «σκοντάψουμε» σε έναν μηδενικό δείκτη. Αυτό κλείνει τον κύκλο.

    Για παράδειγμα, αφήστε τον τύπο κόμβου να περιγράφεται ως εξής:

    Κόμβος δομής (στοιχείο int; //Τα περιεχόμενα του κόμβου είναι ένας ακέραιος κόμβος δομής *next; //Δείκτης στον επόμενο κόμβο);

    Στη συνέχεια, μια συνάρτηση που εκτυπώνει τα περιεχόμενα κάθε κόμβου σε ξεχωριστή γραμμή μπορεί να μοιάζει με αυτό:

    //Συνάρτηση που εκτυπώνει τα περιεχόμενα της λίστας //Παίρνει τη διεύθυνση του πρώτου κόμβου της λίστας ως void print παραμέτρου (struct node *list) ( do printf("%d\n", list->element); ενώ ((λίστα = λίστα-> επόμενο) != NULL);

    Μόλις ο δείκτης στον επόμενο κόμβο είναι NULL, οι επαναλήψεις σταματούν.

Όπως μπορούμε να δούμε, το NULL μπορεί να χρησιμοποιηθεί σε ένα πρόγραμμα όπου μπορούν να χρησιμοποιηθούν διευθύνσεις. Το NULL μπορεί να εκχωρηθεί σε δείκτες, να επιστραφεί από συναρτήσεις και να μεταβιβαστεί σε συναρτήσεις. Ωστόσο, στην τελευταία περίπτωση, πρέπει να είστε βέβαιοι ότι η συνάρτηση «γνωρίζει» πώς να χειρίζεται σωστά το NULL . Για παράδειγμα, η συνάρτηση free() έχει αυτή την ικανότητα και τα παραπάνω λειτουργία εκτύπωσης() - Όχι.

Αλλά αυτό που δεν μπορείτε να κάνετε είναι να αφαιρέσετε αναφορά σε μηδενικούς δείκτες! Η συμπεριφορά του προγράμματος ως αποτέλεσμα αυτής της λειτουργίας είναι απρόβλεπτη. Σε κάθε περίπτωση, τίποτα καλό δεν μπορεί να αναμένεται. Τα πειράματα δείχνουν ότι όταν χρησιμοποιείται ο μεταγλωττιστής MinGW64 σε περιβάλλον Windows 7, το λειτουργικό σύστημα «σκοτώνει» αμέσως τη διαδικασία που προσπάθησε να αποκτήσει πρόσβαση στην «απαγορευμένη» διεύθυνση.

Ας αναρωτηθούμε: είναι δυνατόν να κάνουμε χωρίς τη μακροεντολή NULL καθόλου, χρησιμοποιώντας αντ' αυτού μια σταθερά που είναι η τιμή της; Φυσικά, είναι δυνατό, αλλά μόνο για αυτό πρέπει να το γνωρίζετε. Ένα από τα πιο απλούς τρόπουςγια να μάθετε αυτήν τη σταθερά - εκτυπώστε NULL, για παράδειγμα, ως εξής:

Printf("NULL=%p", NULL);

Εδώ χρησιμοποιήσαμε τον προσδιοριστή μορφής %p, ο οποίος προορίζεται για την εμφάνιση διευθύνσεων. Εάν χρησιμοποιείτε τον μεταγλωττιστή MinGW64, το αποτέλεσμα της εκτέλεσης αυτής της γραμμής θα είναι το εξής:

NULL=00000000

Λοιπόν, αποδείχθηκε ότι, σύμφωνα με τουλάχιστον, στην περίπτωση του MinGW64, το NULL είναι μηδέν!

Ένας άλλος τρόπος για να ορίσετε την τιμή μιας μακροεντολής σε NULL είναι να αναζητήσετε τον ορισμό της στο αρχείο stdlib.h (υποθέτοντας ότι αυτό το αρχείο είναι διαθέσιμο). Ας στραφούμε ξανά στον μεταγλωττιστή MinGW64. Το αρχείο stdlib.h που περιλαμβάνεται σε αυτόν τον μεταγλωττιστή περιέχει τους ακόλουθους ορισμούς μακροεντολών (για ευκολία αναγνωσιμότητας, έχω δημιουργήσει εσοχές στις αρχές των γραμμών· δεν υπάρχουν στο πρωτότυπο):

#ifndef NULL #ifdef __cplusplus #ifndef _WIN64 #define NULL 0 #else #define NULL 0LL #endif /* W64 */ #else #define NULL ((void *)0) #endif #endif

Εφόσον η μακροεντολή __cplusplus δεν ορίζεται κατά τη χρήση της γλώσσας C99, ο ορισμός της μακροεντολής NULL που δίνεται στη γραμμή 9 είναι σχετικός για εμάς. Όπως μπορούμε να δούμε, το NULL ορίζεται ως μηδενικό cast στον τύπο void * .

Είναι λογικό να ρωτήσουμε: γιατί χρειαζόμαστε καθόλου τη μακροεντολή NULL; Δεν είναι πιο απλό να χρησιμοποιείτε το μηδέν παντού και πάντα; Απάντηση: Όλα είναι θέμα φορητότητας κώδικα. Υποθετικά, μπορεί κανείς να υποθέσει την ύπαρξη μεταγλωττιστών στους οποίους το NULL έχει τιμή διαφορετική από το μηδέν (αν και δεν έχω δει τέτοιους μεταγλωττιστές). Η χρήση της μακροεντολής NULL θα επιτρέψει σε διαφορετικούς μεταγλωττιστές, κατά τη μεταγλώττιση του ίδιου κώδικα, να αντικαταστήσουν αυτήν τη μακροεντολή με την τιμή της που αντιστοιχεί σε έναν δεδομένο μεταγλωττιστή. Εάν χρησιμοποιείτε το μηδέν αντί για το NULL, τότε σε εκείνους τους μεταγλωττιστές στους οποίους NULL != 0, ο μεταγλωττισμένος κώδικας μπορεί να μην λειτουργεί και στη χειρότερη περίπτωση, η εκτέλεσή του μπορεί να οδηγήσει σε ζημιά σε δεδομένα που βρίσκονται στη μνήμη που δεν σχετίζονται με το πρόγραμμα που εκτελείται.

Προσωπικά, δεν με ενδιαφέρει καθόλου η φορητότητα του κωδικού μου C99. Η μόνη μου ανησυχία είναι η συμβατότητά του με τον μεταγλωττιστή που χρησιμοποιώ, δηλαδή το MinGW64. Όσο για το NULL, βρίσκω τη χρήση του άβολη. Είναι πολύ πιο ωραίο, για παράδειγμα, να γράφεις "if (p)" παρά "if (p != NULL)". Γι' αυτό δεν χρησιμοποιώ ποτέ το NULL, αρκεστώ στο μηδέν. Επιπλέον, δεν κάνω καν cast zero για να πληκτρολογήσω void * , αφού μια τέτοια μετάδοση πραγματοποιείται αυτόματα από τον μεταγλωττιστή.

Ελπίζω ότι ο αναγνώστης έμαθε κάτι χρήσιμο από αυτό το άρθρο και αποφάσισε αν θα έπρεπε να χρησιμοποιήσει τη μακροεντολή NULL ή όχι.

Το τμήμα είναι πολύ εύκολο στη χρήση. Στο πεδίο που παρέχεται, απλώς εισάγετε η σωστή λέξη, και θα σας δώσουμε μια λίστα με τις τιμές του. Θα ήθελα να σημειώσω ότι ο ιστότοπός μας παρέχει δεδομένα από διαφορετικές πηγές– εγκυκλοπαιδικά, επεξηγηματικά, λεξικά σχηματισμού λέξεων. Εδώ μπορείτε επίσης να δείτε παραδείγματα χρήσης της λέξης που εισαγάγατε.

Εύρημα

Η σημασία της λέξης null

Βικιπαίδεια

NULL (SQL)

ΑΚΥΡΟΣστα Συστήματα Διαχείρισης Βάσεων Δεδομένων, τα οποία μπορούν να γραφτούν σε ένα πεδίο σε έναν πίνακα βάσης δεδομένων. Το NULL αντιστοιχεί στην έννοια του "κενού πεδίου", δηλαδή "ένα πεδίο που δεν περιέχει καμία τιμή". Εισήχθη για τη διάκριση μεταξύ πεδίων βάσης δεδομένων κενές τιμές(για παράδειγμα, μια συμβολοσειρά μηδενικού μήκους) και τιμές που λείπουν.

ΑΚΥΡΟΣσημαίνει απουσία, άγνωστη πληροφορία. Το NULL δεν είναι τιμή in με κάθε έννοιαλέξεις: εξ ορισμού σημαίνει καμία τιμή και δεν ανήκει σε κανένα τύπο δεδομένων. Επομένως το NULL δεν ισούται με κανένα από τα δύο δυαδική τιμήΛΑΘΟΣ, ούτε κενή γραμμή, όχι μηδέν. Όταν συγκρίνετε NULL με οποιαδήποτε τιμή, το αποτέλεσμα θα είναι NULL, όχι FALSE και όχι 0. Επιπλέον, NULL δεν ισούται με NULL!

NULL (C)

ΑΚΥΡΟΣστις γλώσσες προγραμματισμού C και C++, μια μακροεντολή που δηλώνεται στο αρχείο κεφαλίδας stddef.h. Μια σταθερά μηδενικού δείκτη είναι μια ακέραια σταθερά παράσταση με την τιμή 0, ή την ίδια έκφραση μεταφέρεται στο void *. Μια σταθερά μηδενικού δείκτη που μεταδίδεται σε οποιονδήποτε τύπο δείκτη είναι μηδενικός δείκτης. Είναι εγγυημένο ότι ένας μηδενικός δείκτης δεν είναι ίσος με δείκτη σε οποιοδήποτε αντικείμενο ή συνάρτηση. Είναι εγγυημένο ότι δύο μηδενικοί δείκτες είναι ίσοι. Η αποαναφορά ενός μηδενικού δείκτη είναι μια πράξη με απροσδιόριστη συμπεριφορά.

Με άλλα λόγια, η υλοποίηση παρέχει μια ειδική τιμή - μια σταθερά μηδενικού δείκτη που μπορεί να αντιστοιχιστεί σε οποιονδήποτε δείκτη και ένας τέτοιος δείκτης, όταν συγκρίνεται, δεν θα είναι ίσος με κανέναν «σωστό» δείκτη. Δηλαδή, μπορούμε να υποθέσουμε ότι ένας μηδενικός δείκτης δεν περιέχει έγκυρη διεύθυνση μνήμης.

ΑΚΥΡΟΣ

  • ΑΚΥΡΟΣ- έναν μηδενικό δείκτη στις γλώσσες προγραμματισμού C και C++.
  • NULL (SQL)- μια ειδική τιμή που σημαίνει ότι η τιμή του πεδίου δεν έχει οριστεί.

Όταν εργάζεστε με οποιαδήποτε δεδομένα, κάθε τόσο πρέπει να δηλώνετε με κάποιο τρόπο την απουσία τους. Οι αρχάριοι χρησιμοποιούν συχνά την αξία για αυτόν τον σκοπό ψευδής, που στην ουσία δεν είναι η απουσία στοιχείων, αλλά βέβαιοςτύπος τιμής boolean. Για να σημαδέψω με κάποιο τρόπο αβεβαιότηταή έλλειψη δεδομένων, υπάρχει ένα ιδιαίτερο νόημα άκυρος. Για ψευδής, άκυροςκαι ούτω καθεξής, έχουν ήδη ειπωθεί πολλά και είναι εξαιρετικά δύσκολο να προστεθεί κάτι πρωτότυπο. Αλλά μπορεί να είναι πολύ πιο δύσκολο να βρεθεί ένα σφάλμα που προκαλείται από τη μη προφανή συμπεριφορά αυτών των πραγμάτων. Επομένως, εμπνευσμένος από ένα τέτοιο σφάλμα, το πιο κομψό στην ιστορία μου, αποφάσισα να γράψω ένα μικρό cheat sheet για αυτό το θέμα.

Δεν θα υπερφορτώσω την ανάρτηση με ενδιαφέροντα, αλλά μάλλον άχρηστα. Αντίθετα, θα μπω κατευθείαν στο θέμα και θα δώσω ένα απόσπασμα από, αφιερωμένο σε άκυρος:

Ειδική τιμή NULLαντιπροσωπεύει μια μεταβλητή χωρίς τιμή. NULL είναι η μόνη δυνατή μηδενική τιμή. Μια μεταβλητή θεωρείται μηδενική εάν:

  • του εκχωρήθηκε η σταθερά NULL.
  • δεν του έχει αποδοθεί ακόμη κάποιο νόημα.
  • αφαιρέθηκε χρησιμοποιώντας unset().

Μέχρι αυτό το σημείο, όλα φαίνονται απλά, αλλά για να το διατηρήσουμε έτσι, όταν εργάζεστε με άκυροςπρέπει να τηρείτε ορισμένους κανόνες.

Μαθηματικές πράξεις με null

Σε όλα μαθηματικές πράξεις άκυροςσυμπεριφέρεται παρόμοια int(0):

$a = null; $a + 1; // int(1) $a - 1; // int(-1) $a * 1; // int(0) 1 / $a; // bool(false)

Έλεγχος μιας μεταβλητής για null

Για να μάθετε τι ακριβώς περιέχει μια μεταβλητή άκυρος(δηλαδή δεν περιέχει τίποτα), πρέπει να χρησιμοποιήσετε ένα από τα δύο ειδική λειτουργία is_null()ή πανομοιότυπη σύγκριση === και οποιεσδήποτε άλλες μέθοδοι δεν θα λειτουργήσουν:

// Σωστός έλεγχοςμεταβλητή σε null $a = null; is_null($a); // bool(true) $a === null; //bool(true)

Έλεγχος για μηδενικές εκφράσεις if, καθώς και στις συναρτήσεις vala() και isset().

Εδώ είναι οι μεταβλητές με άκυροςσυμπεριφέρονται απολύτως προβλέψιμα, όπως οποιεσδήποτε άλλες ψευδείς τιμές (οι οποίες στο εάν οι δηλώσεις οδηγούν σε ψευδής). Αλλά πρέπει να θυμόμαστε ότι αυτό δεν μας εγγυάται ότι η μεταβλητή περιέχει ακριβώς άκυρος:

// Στις δηλώσεις if, το null μετατρέπεται σε false, όπως όλες οι άλλες ψευδείς τιμές if($a) ( echo "Σίγουρα, το $a δεν είναι null!"; ) else (echo "Mabye $a είναι null.") // Ο έλεγχος για άδεια() θα επιστρέψει true, αλλά δεν εγγυάται ότι η μεταβλητή που ελέγχεται είναι null $a = null; κενό($a); // bool(true) $a = ; κενό($a); // bool(true) $a = ""; κενό($a); // bool(true) $a = 0; κενό($a); // bool(true) $a = false; κενό($a); // bool(true) // Ο έλεγχος isset() θα επιστρέψει false όχι μόνο για null, αλλά για μια απροσδιόριστη μεταβλητή $a = null. isset($a); // bool(false) isset($undefined); //bool(false)

Συγκρίνοντας δύο μηδενικά

Στην PHP, τόσο ευέλικτο όσο και πανομοιότυπο σύγκριση δύο άκυροςπάντα επιστρέφει ψευδής , σε αντίθεση με πολλές άλλες πλατφόρμες, όπου η σύγκριση δύο αγνώστων επιστρέφει το ίδιο άγνωστο (δηλαδή, άκυρος).

// Η PHP είναι βέβαιη ότι δύο άγνωστοι είναι ίσοι, και μάλιστα πανομοιότυπα ίσοι $a = null; $b = null; $a == $b; // bool(true) $a === $b; //bool(true)

Συμπεριφορά μηδενικού σε σύγκριση μη ταυτότητας με τύπο δεδομένων cast

Η PHP επιτρέπει συγκρίσεις άκυρος- όχι μόνο μεταξύ τους, αλλά και με άλλους τύπους δεδομένων. Ταυτόχρονα, μην ξεχνάτε ότι η ευέλικτη σύγκριση στην PHP δεν είναι μεταβατική, δηλαδή, εάν δύο τιμές είναι ίσες με την τρίτη ξεχωριστά, δεν εγγυάται την ισότητά τους μεταξύ τους. Σύμφωνα με , ευέλικτη σύγκριση άκυροςχρησιμοποιώντας τον χειριστή == Με διαφορετικές έννοιεςεπιστρέφει διαφορετικά αποτελέσματα:

// Για όλες τις ψευδείς τιμές, η ευέλικτη σύγκριση με null επιστρέφει true, εκτός από τη συμβολοσειρά "0" $a = ; $a == null; // bool(true) $a = ""; $a == null; // bool(true) $a = 0; $a == null; // bool(true) $a = false; $a == null; // bool(true) // Και όταν συγκρίνουμε το null με τη συμβολοσειρά "0" θα πάρουμε false, αν και null == false και "0" == false $a = "0"; $a == null; // bool(false) // Για όλες τις μη ψευδείς τιμές, μια τέτοια σύγκριση θα επιστρέψει επίσης false $a = 1; $a == null; // bool(false) $a = "1"; $a == null; // bool(false)

Σύγκριση με null χρησιμοποιώντας >, =,

Δεν είναι δικό μου να κρίνω πόσο προφανές είναι αυτό, αλλά Σε σύγκριση με αριθμούς, το null είναι πάντα μικρότερο από αυτούς. Δείτε μόνοι σας:

// Παρά το γεγονός ότι null == 0, αποδεικνύεται ότι είναι μικρότερος από οποιονδήποτε αριθμό null = -1) // bool(true) null >= 0 // bool(true) !(null >= 1) // bool (αληθινό)

Δεν φαίνεται τίποτα το ιδιαίτερο, αλλά συνεπάγεται ότι εάν εμπλέκεται μηδενικό, ένας φαινομενικά ανούσιος έλεγχος μπορεί να περάσει:

// Εξαιτίας αυτής της συμπεριφοράς, κάποτε έπιασα ένα σφάλμα, εξαιτίας του οποίου πίστευα σχεδόν στη μαγεία :) $a = null; if($a = 0) (ηχώ "$a = 0 ταυτόχρονα!";)

Διαφορετική συμπεριφορά του null σε PHP, SQL και JavaScript

Αλλά αυτό, κατά τη γνώμη μου, είναι το χειρότερο πράγμα. Εφαρμογή της λογικής της εργασίας με κελιά βάσης δεδομένων στα οποία επιτρέπεται η τιμή άκυρος, σε διαφορετικά στάδια μεταφοράς δεδομένων από τον διακομιστή στον χρήστη (για παράδειγμα, MySQL -> PHP -> JavaScript) συμπεριφορά άκυροςμπορεί να αλλάξει.

Μελέτη άκυροςσε JavaScript(και μαζί του το μυστηριώδες απροσδιόριστος) αξίζει ξεχωριστό άρθρο. Η κύρια διαφορά είναι ότι, παρά τη χύτευση τύπου, άκυροςστο JavaScript δεν ισούται με τίποτα εκτός από τον εαυτό του άκυροςκαι αυτό απροσδιόριστος, αν και λειτουργεί παρόμοια σε if-expressions ψευδής. Και σε σύγκριση με αριθμούς, παράγει ακόμα πιο αστεία αποτελέσματα από ό,τι στην PHP.

ΑΚΥΡΟΣσε MySQL, για παράδειγμα, είναι πολύ πιο απλό. Είναι απλό για οποιεσδήποτε ενέργειες με άκυρος(ακόμα και όταν συγκρίνουμε δύο άκυρος) επιστρέφει άκυρος. Από την άποψή του, οποιαδήποτε ενέργεια με το άγνωστο θα έχει ως αποτέλεσμα κάποιο άλλο άγνωστο :)

Ένας απλός κανόνας κατά την εργασία με null που βοηθά στην αποφυγή προβλημάτων

Βασικά, δεν έπρεπε να διαβάσω αυτό το post. Λάβετε υπόψη όλες αυτές τις αποχρώσεις που διαφορετικές πλατφόρμεςερμηνεύεται διαφορετικά είναι ένα άχαρο έργο. Προκειμένου να αποφευχθούν προβλήματα με άκυροςΑπλά πρέπει να θυμάστε έναν κανόνα:

Προσπαθήστε να μην το κάνετε αυτό με άκυροςΌχι περιττές ενέργειες: Δεν χρειάζεται να το συγκρίνετε με τίποτα, να το προσθέσετε ή να το ταξινομήσετε. Όπου μια καθαρά θεωρητική μεταβλητή με άκυροςμπορεί να διαρρεύσει σε ορισμένους χειριστές, η καλύτερη λύσηθα το ελέγξει πρώτα με τη συνάρτηση is_null(). 08.04.2014

Το "VKontakte" είναι μακράν το πιο βολικό Πηγή ρωσικής γλώσσας, το οποίο δεν είναι μόνο το πιο δημοφιλές κοινωνικό δίκτυο, αλλά και μια υπηρεσία για ακρόαση ηχογραφήσεων και παρακολούθηση βίντεο. Υπάρχει μια τεράστια βιβλιοθήκη εδώ μουσικές συνθέσεις, ηχητικά βιβλία, κλιπ, ταινίες και άλλα καλά πράγματα. Φυσικά, όλοι οι εγγεγραμμένοι συμμετέχοντες απολαμβάνουν τις ευκαιρίες που τους παρέχονται. Ωστόσο, σε πρόσφαταΤα παράπονα άρχισαν να εμφανίζονται όλο και πιο συχνά για τα «αστεία» που παίζει το σύστημα. Όλα καταλήγουν σε ένα σφάλμα JavaScript "VKontakte" που παρεμβαίνει κανονική λειτουργίασυσκευές αναπαραγωγής βίντεο και ήχου.

Τύποι σφαλμάτων JavaScript: Μια σύντομη επισκόπηση

Αυτή η ατυχία μπορεί να χαλάσει σημαντικά τη διάθεση όσων ανυπομονούσαν να απολαύσουν ευχάριστη μουσική ή να περάσουν την ώρα τους βλέποντας μια βραδινή ταινία. Για να μην συμβεί αυτό, ας δούμε πώς να διορθώσετε μόνοι σας το Σφάλμα JavaScript VKontakte. Υπάρχουν αρκετές πιθανές επιλογέςεπίλυση του προβλήματος.

Αρχικά, ας δούμε τι είδους σφάλματα μπορεί να εμφανιστούν:

  • Το initAddMedia δεν έχει οριστεί.
  • δεν μπορεί να διαβάσει την ιδιότητα "μήκος" του απροσδιόριστου.
  • δεν μπορεί να μετατρέψει το "opts.photos" σε αντικείμενο.
  • δεν μπορεί να διαβάσει την ιδιότητα parentNode.
  • τρέχον ακουστικό ή απλά απροσδιόριστο.

Αυτό δεν είναι σε καμία περίπτωση μια εξαντλητική λίστα πιθανά μηνύματασχετικά με το σφάλμα, αλλά οι πιο συνηθισμένες επιλογές παρατίθενται εδώ. Στη συνέχεια θα εξετάσουμε υπάρχουσες μεθόδουςτις αποφάσεις τους.

Τρόποι αντιμετώπισης σφαλμάτων JavaScript

Εάν, όταν προσπαθείτε να ενεργοποιήσετε τον ήχο ή να ανοίξετε ένα αρχείο βίντεο, δεν λειτουργεί τίποτα και πάνω γωνίαΣτην οθόνη εμφανίζεται ένα μήνυμα μίσους ότι παρουσιάστηκε σφάλμα JavaScript στο VKontakte και, στη συνέχεια, δοκιμάστε πρώτα τα εξής:

  1. Χρησιμοποιήστε διαφορετικό πρόγραμμα περιήγησης. Για παράδειγμα, εάν είναι ενεργοποιημένη αυτή τη στιγμήΕάν εργάζεστε στην Opera, εγκαταστήστε το Google Chrome ή το Mazila. Ίσως το πρόβλημα φύγει.
  2. Πατήστε τη συντόμευση πληκτρολογίου Ctrl+F5. Σε ορισμένες περιπτώσεις, αυτή η ενέργεια διαγράφει το σφάλμα.
  3. Σαρώστε τον υπολογιστή σας χρησιμοποιώντας ένα πρόγραμμα προστασίας από ιούς (Dr.Web ή άλλο). Μην ξεχάσετε να ενημερώσετε πρώτα το πρόγραμμα.
  4. Ανοίξτε το μενού "Οι ρυθμίσεις μου" από τη σελίδα "VKontakte" και επιλέξτε το πλαίσιο δίπλα στο "Πάντα να χρησιμοποιείται" ασφαλής σύνδεσηΊσως βοηθήσει κι αυτό.
  5. Εκκαθαρίστε τις κρυφές μνήμες των προγραμμάτων περιήγησής σας, διαγράψτε την κρυφή μνήμη Java.

Εάν καμία από αυτές τις ενέργειες δεν βοήθησε και το Σφάλμα JavaScript VKontakte εξακολουθεί να σας εμποδίζει να χρησιμοποιήσετε όλες τις λειτουργίες του πόρου, τότε επόμενος τρόποςη λύση στο πρόβλημα πρέπει να λειτουργήσει.

Ανίχνευση και αφαίρεση ιού στο αρχείο κεντρικών υπολογιστών του συστήματος

Πιθανώς, η αιτία ενός τέτοιου δυσάρεστου περιστατικού είναι ιοί που έχουν εισχωρήσει στο σύστημα του υπολογιστή σας. Λειτουργούν πονηρά: κάνουν καταχωρήσεις στο σύστημα, με αποτέλεσμα να αποκλειστεί η πρόσβαση σε ορισμένους ιστότοπους (εξ ου και το Σφάλμα JavaScript "VKontakte" κατά την προσπάθεια χρήσης αυτής της υπηρεσίας). Επομένως, για να ανοίξετε την πρόσβαση, πρέπει να καθαρίσετε το αντίστοιχο αρχείο, δηλαδή τους κεντρικούς υπολογιστές. Αυτό μπορεί να γίνει αυτόματα ή χειροκίνητη λειτουργία. Θα δούμε πώς να το κάνετε μόνοι σας.

Οδηγίες για τον καθαρισμό του αρχείου "host".

  1. Μεταβείτε στο "Ο Υπολογιστής μου" και ανοίξτε φάκελο συστήματος Windows/system32. Περιέχει ένα φάκελο οδηγούς, στο οποίο χρειαζόμαστε το καλούμενο κ.λπ. Ανάμεσα στα αρχεία που είναι αποθηκευμένα σε αυτόν τον τελευταίο φάκελο θα είναι και οι κεντρικοί υπολογιστές που χρειαζόμαστε. Ανοίξτε το χρησιμοποιώντας το Σημειωματάριο ή πρόγραμμα επεξεργασίας κειμένου WordPad.
  2. Θα δείτε τα περιεχόμενα αυτού του αρχείου ως εισαγωγή κειμένου. Σε αυτήν την περίπτωση, σε ένα υγιές (όχι μολυσμένο από ιό) αρχείο, η καταχώριση περιορίζεται στα ακόλουθα δεδομένα: 127.0.0.1.localhost.
  3. Εάν διαπιστώσετε ότι εκτός από το καθορισμένο κείμενο, υπάρχουν και άλλες εγγραφές στο αρχείο, τότε αυτό δεν είναι τίποτα άλλο από σκουπίδια που αφήνει ένας πονηρός ιός. Είναι αυτός που εμποδίζει τα προγράμματα στον ιστότοπο VKontakte να λειτουργούν κανονικά, εμποδίζοντας την πρόσβαση σε αυτά.
  4. Πρέπει να απαλλαγούμε από τα περιττά αρχεία. Εκκαθαρίζουμε πλήρως το έγγραφο (για να καλύτερη ασφάλεια), Α το σωστό μήνυμαεισέρχομαι πάλι. Αποθηκεύστε τις αλλαγές και κλείστε το πρόγραμμα επεξεργασίας.
  5. Τώρα πρέπει να επανεκκινήσετε τον υπολογιστή σας, μετά την οποία το σφάλμα θα εξαφανιστεί. Δοκιμάστε να μεταβείτε στη σελίδα του κοινωνικού σας δικτύου και να ακούσετε αρχεία ήχου, καθώς και να ανοίξετε βίντεο. Το σφάλμα JavaScript "VKontakte" δεν εμφανίζεται πλέον.

Αυτή η μέθοδος είναι η πιο αξιόπιστη, αλλά ταυτόχρονα αρκετά απλή. Συνήθως, βοηθά στην επίλυση ζητημάτων που σχετίζονται με σφάλματα JavaScript. Για να αποφύγετε τέτοια προβλήματα, ελέγξτε τη λειτουργία του antivirus σας. Εάν χρειάζεται, ενημερώστε το ή εγκαταστήστε ένα νέο, γιατί αξιόπιστη προστασίαο υπολογιστής είναι η βάση αδιάκοπη λειτουργία, συμπεριλαμβανομένης της χρήσης τοποθεσιών στον Παγκόσμιο Ιστό.

Άλλοι τύποι σφαλμάτων JavaScript "VKontakte"

Εκτός από προβλήματα με αρχεία ήχου και βίντεο, αυτό κοινωνικό δίκτυομπορεί να "παρακαλώ" μια σειρά από άλλα, ακόμη πιο γελοία Σφάλμα JavaScript "VKontakte". Τι να κάνετε εάν τα παράθυρα διαλόγου δεν ανοίγουν, τα μηνύματα δεν αποστέλλονται και τα σχόλια δεν επισυνάπτονται σε φωτογραφίες - εμφανίζεται ένα σφάλμα addEventListener. ο τοίχος δεν λειτουργεί - ο τοίχος δεν έχει οριστεί. καμία πρόσβαση σε άλλους βασικές λειτουργίες. Αυτή η λίστα είναι μόνο ένα μέρος των προβλημάτων ή αστοχιών του συστήματος, που καθιστούν δύσκολη τη χρήση του δημοφιλούς πόρου.

Επιλογές αντιμετώπισης προβλημάτων JavaScript

Ανεξάρτητα από το συγκεκριμένο σφάλμα JavaScript που αντιμετωπίζετε, τα βήματα για την επίλυσή του είναι τα ίδια. Κατά κανόνα, αρκεί να χρησιμοποιήσετε μία από τις επιλογές που περιγράφονται παραπάνω. Αξίζει ιδιαίτερα να δώσετε προσοχή στην επανεγκατάσταση/αλλαγή του προγράμματος περιήγησης που χρησιμοποιείται και στον καθαρισμό του αρχείου "host".

Μπορείτε επίσης να δοκιμάσετε την επαναφορά ορίσετε παραμέτρουςπρόγραμμα περιήγησης (Ιδιότητες/καρτέλα Για προχωρημένους). Μετά από αυτό θα χρειαστεί να κάνετε επανεκκίνηση του υπολογιστή σας. Σε ορισμένες περιπτώσεις, αυτή η απλή ενέργεια βοηθά να απαλλαγείτε από το αναδυόμενο σφάλμα. Επιπλέον, είναι απαραίτητο να ελέγξετε όλα λειτουργικό σύστημα, ίσως κρύβονται κάπου αλλού. Για να το κάνετε αυτό, πρέπει να έχετε ένα ισχυρό και σωστά λειτουργικό antivirus.

Τελευταία λύση

Εάν όλα είναι καλά με το μηχάνημα και το σύστημά σας, αλλά όταν προσπαθείτε να χρησιμοποιήσετε ορισμένες λειτουργίες ενός δημοφιλούς πόρου, εξακολουθεί να εμφανίζεται ένα Σφάλμα JavaScript "VKontakte", πώς να το διορθώσετε σε αυτήν την περίπτωση; Το πρόβλημα είναι πιθανότατα στην ίδια την υπηρεσία. Η καλύτερη λύση θα ήταν να ζητήσετε βοήθεια από τεχνική υποστήριξηιστοσελίδα "VKontakte" και εξηγήστε την κατάσταση που έχει προκύψει. Μάλλον θα μπορέσουν να λύσουν αυτή την παρεξήγηση.

Η πιο σημαντική συμβουλή είναι να κάνετε ό,τι περνάει από το χέρι σας για να εξασφαλίσετε πλήρη ασφάλειατου σύστημα υπολογιστή. Ενημερώνετε τακτικά το antivirus σας και, εάν είναι δυνατόν, χρησιμοποιήστε το μέγιστο πιο πρόσφατες εκδόσειςπρογράμματα περιήγησης. Τότε τέτοια σφάλματα θα ελαχιστοποιηθούν.



Συνιστούμε να διαβάσετε

Κορυφή