<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Stilfrage: if (ptr) oder if(ptr != NULL)]]></title><description><![CDATA[<p>Welche der beiden Möglichkeiten verwendet ihr zum Abfragen, ob ein Zeiger auf Null zeigt?</p>
<p><strong>1)</strong> Implizite Abfrage</p>
<pre><code class="language-cpp">if (ptr)
if (!ptr)
</code></pre>
<p><strong>2)</strong> Explizite Abfrage (statt <code>NULL</code> auch <code>0</code> oder <code>nullptr</code> -Klasse möglich)</p>
<pre><code class="language-cpp">if (ptr != NULL)
if (ptr == NULL)
</code></pre>
<p>Variante 1) ist kürzer und einheitlich mit den Smart-Pointers aus Boost (aber nicht mit <code>std::auto_ptr</code> ), bei 2) hingegen ist die Intention deutlicher und eine klare Abgrenzung von <code>bool</code> vorhanden. Bisher habe ich eigentlich immer 2) verwendet.</p>
<p>Hintergrund: Ich muss mir eigene Smart-Pointer-Klassen schreiben, und ich überlege mir, ob ich den Konvertierungsoperator</p>
<pre><code class="language-cpp">SmartPtr::operator SafeBool() const;
</code></pre>
<p>mit all seinen Problemen, oder lieber eine explizite Methode</p>
<pre><code class="language-cpp">bool SmartPtr::IsNull() const;
</code></pre>
<p>anbieten soll. Oder sollte ich mir lieber was ganz Anderes wie</p>
<pre><code class="language-cpp">bool IsNull(const SmartPtr&amp;);
</code></pre>
<p>überlegen? Das wäre dann für einfache Zeiger überladbar, allerdings zum Preis, dass an vielen Orten im Code diese Überladung bekannt sein müsste. Ganz elegant kommt mir dieser Ansatz auch nicht vor, auch weil es die bisher einzige freie Funktion fürs <code>SmartPtr</code> -Interface wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269928/stilfrage-if-ptr-oder-if-ptr-null</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 05:35:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269928.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Jul 2010 22:39:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sat, 03 Jul 2010 22:39:20 GMT]]></title><description><![CDATA[<p>Welche der beiden Möglichkeiten verwendet ihr zum Abfragen, ob ein Zeiger auf Null zeigt?</p>
<p><strong>1)</strong> Implizite Abfrage</p>
<pre><code class="language-cpp">if (ptr)
if (!ptr)
</code></pre>
<p><strong>2)</strong> Explizite Abfrage (statt <code>NULL</code> auch <code>0</code> oder <code>nullptr</code> -Klasse möglich)</p>
<pre><code class="language-cpp">if (ptr != NULL)
if (ptr == NULL)
</code></pre>
<p>Variante 1) ist kürzer und einheitlich mit den Smart-Pointers aus Boost (aber nicht mit <code>std::auto_ptr</code> ), bei 2) hingegen ist die Intention deutlicher und eine klare Abgrenzung von <code>bool</code> vorhanden. Bisher habe ich eigentlich immer 2) verwendet.</p>
<p>Hintergrund: Ich muss mir eigene Smart-Pointer-Klassen schreiben, und ich überlege mir, ob ich den Konvertierungsoperator</p>
<pre><code class="language-cpp">SmartPtr::operator SafeBool() const;
</code></pre>
<p>mit all seinen Problemen, oder lieber eine explizite Methode</p>
<pre><code class="language-cpp">bool SmartPtr::IsNull() const;
</code></pre>
<p>anbieten soll. Oder sollte ich mir lieber was ganz Anderes wie</p>
<pre><code class="language-cpp">bool IsNull(const SmartPtr&amp;);
</code></pre>
<p>überlegen? Das wäre dann für einfache Zeiger überladbar, allerdings zum Preis, dass an vielen Orten im Code diese Überladung bekannt sein müsste. Ganz elegant kommt mir dieser Ansatz auch nicht vor, auch weil es die bisher einzige freie Funktion fürs <code>SmartPtr</code> -Interface wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920980</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 03 Jul 2010 22:39:20 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sat, 03 Jul 2010 22:51:52 GMT]]></title><description><![CDATA[<p>Ich benutze 1. Ich find das auch noch ganz intuitiv bei Zeigern.</p>
<p>Ich würds auch da mit der Konvertierung belassen. Alleine aus dem Grun, dass es halt doch sehr etabliert ist. Die anderen Funktionen kannst du ja dennoch anbieten für die, die es lieber anders machen. Stört ja nicht.</p>
<p>Das Problem wenn du die Konvertierung nicht zu lässt ist ja dann halt, dass deine Klasse nicht wirklich generisch als Zeiger verwendet werden kann und ich würde sagen, dass das sehr verwirrend für einen Benutzer sein kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920987</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 03 Jul 2010 22:51:52 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sat, 03 Jul 2010 23:07:33 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Die anderen Funktionen kannst du ja dennoch anbieten für die, die es lieber anders machen. Stört ja nicht.</p>
</blockquote>
<p>Doch, ich hab etwas gegen redundante Funktionen und unnötig grosse Schnittstellen. Und ich möchte lieber innerhalb meiner Bibliothek eine einheitliche Konvention. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>drakon schrieb:</p>
<blockquote>
<p>Das Problem wenn du die Konvertierung nicht zu lässt ist ja dann halt, dass deine Klasse nicht wirklich generisch als Zeiger verwendet werden kann und ich würde sagen, dass das sehr verwirrend für einen Benutzer sein kann.</p>
</blockquote>
<p>Das stimmt natürlich. Wobei ein Smart-Pointer ja auch sonst einige Memberfunktionen enthält, was mit normalen Zeigern auch nicht konsistent ist (halt Dinge wie <code>Reset()</code> , <code>Swap()</code> , <code>Release()</code> ). Man könnte die auch alle global und als <code>friend</code> deklarieren, aber ob es dadurch intuitiver wird...? Allfällige Überladungen für normale Zeiger würde ohnehin niemand nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920992</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 03 Jul 2010 23:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sat, 03 Jul 2010 23:14:51 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Die anderen Funktionen kannst du ja dennoch anbieten für die, die es lieber anders machen. Stört ja nicht.</p>
</blockquote>
<p>Doch, ich hab etwas gegen redundante Funktionen und unnötig grosse Schnittstellen. Und ich möchte lieber innerhalb meiner Bibliothek eine einheitliche Konvention. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Naja. Das ist ja nicht die Welt eine weitere Funktion zu haben. Im Gegenzug machst du aber alle glücklich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Vor allem bei Operatoren finde ich das sowieso durchaus legitim eine benannte Version der Funktion zu haben.</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Das Problem wenn du die Konvertierung nicht zu lässt ist ja dann halt, dass deine Klasse nicht wirklich generisch als Zeiger verwendet werden kann und ich würde sagen, dass das sehr verwirrend für einen Benutzer sein kann.</p>
</blockquote>
<p>Das stimmt natürlich. Wobei ein Smart-Pointer ja auch sonst einige Memberfunktionen enthält, was mit normalen Zeigern auch nicht konsistent ist (halt Dinge wie <code>Reset()</code> , <code>Swap()</code> , <code>Release()</code> ). Man könnte die auch alle global und als <code>friend</code> deklarieren, aber ob es dadurch intuitiver wird...? Allfällige Überladungen für normale Zeiger würde ohnehin niemand nutzen.</p>
</blockquote>
<p>Zusätzlich spielt es ja keine Rolle, wenn es noch mehr hat, aber der boolsche Operator ist halt schon ein recht etablierter Bestandteil eigentlich jeder Smart Pointer Klasse. Auf den Rest kannst du dich ja schon alleine wegen Gross-/Kleinschreibung nicht verlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920995</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 03 Jul 2010 23:14:51 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 00:06:12 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Welche der beiden Möglichkeiten verwendet ihr zum Abfragen, ob ein Zeiger auf Null zeigt? ...</p>
</blockquote>
<p>Ich mache die explizite Variante und dazu auch noch eine verkehrt rum aussehende:</p>
<pre><code class="language-cpp">if (NULL == ptr)
if (NULL != ptr)
</code></pre>
<p>Der Grund für die explizite Variante ist, dass es eine Regel gibt, stammt, glaube ich, aus den MISRA Regeln, dass &quot;if ()&quot; immer eine explizite Bedingung enthalten soll...<br />
Verkehrt rum, weil &quot;sicherer&quot;. Man könnte sich ja vertippen und so was eingeben:</p>
<pre><code class="language-cpp">if (ptr = NULL)
</code></pre>
<p>Ich denke, das ist gewöhnungsbedürftig und &quot;if (ptr == NULL)&quot; ist auch ok (Hauptsache, explizite Bedingung), hat sich bei mir aber halt andersrum eingeprägt...<br />
Ich habe mal neulich bei meinem älteren Code so was gesehen:</p>
<pre><code class="language-cpp">for (i = 0u; MAX &gt; i; ++i)
{
    ...
}
</code></pre>
<p>D.h. es gab mal eine Zeit, wo ich es überall durchgehend im Quellcode &quot;Konstante Vergleichsoperator Variable&quot; eingegeben habe. Aber die Software musste auf einem Mikrocontroller &quot;gedebugt&quot; werden, wo man nur zwei Hardware-Breakpoints setzen konnte (Software-Breakpoints haben nicht funktioniert, weil Programm im Flash, d.h. ROM) - ist natürlich kein Argument für so was - erschien damals irgendwie als nützliche &quot;Strategie&quot;... weil wahrscheinlich Zeitdruck, zu viele Compiler-Ausgaben, keine Zeit und zu müde, zu monoton, um sie alle nach Warnungen durchzusehen usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921017</guid><dc:creator><![CDATA[abc.w]]></dc:creator><pubDate>Sun, 04 Jul 2010 00:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 00:24:44 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Naja. Das ist ja nicht die Welt eine weitere Funktion zu haben. Im Gegenzug machst du aber alle glücklich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Vor allem bei Operatoren finde ich das sowieso durchaus legitim eine benannte Version der Funktion zu haben.</p>
</blockquote>
<p>Das erinnert mich an einen Thread aus dem SFML-Forum, wo tatsächlich vorgeschlagen wurde, für alle möglichen Funktionen Aliase einzuführen, um zusätzlich eine andere Namenskonvention zu haben. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Im Ernst: Alle glücklich machen zu wollen führt längerfristig zu Problemen. Man kann nicht alle Ansichten berücksichtigen, sondern muss Entscheidungen treffen. Und mir gefällt der Gedanke grundsätzlich nicht, zwei Dinge für den exakt gleichen Zweck anzubieten. Als Benutzer ist man tendentiell verunsichert und fragt sich, ob ein Unterschied in der Funktionalität besteht. Ich verstehe heute noch nicht, warum <code>std::string</code>  <code>size()</code> und <code>length()</code> hat.</p>
<p>Wobei es hier natürlich weniger schlimm ist, weil das eine ein Operator ist – da hast du Recht. Die STL verwendet z.B. auch <code>assign()</code> , um Zuweisungen mit mehreren Argumenten durchführen zu können. Ich muss mir wahrscheinlich nochmals in Ruhe durch den Kopf gehen lassen, ob eine zusätzliche benannte Methode wirklich Vorteile brächte. Möglicherweise werde ich sie zuerst weglassen, dann kann ich immer noch schauen...</p>
<p>drakon schrieb:</p>
<blockquote>
<p>aber der boolsche Operator ist halt schon ein recht etablierter Bestandteil eigentlich jeder Smart Pointer Klasse. Auf den Rest kannst du dich ja schon alleine wegen Gross-/Kleinschreibung nicht verlassen.</p>
</blockquote>
<p>Das ist ein guter Punkt. Wenn man Funktionalität allein durch sprachübliche Konventionen ausdrücken kann, ist das sicher ein Vorteil.</p>
<p>Du überzeugst mich langsam... Beim Smart-Pointer scheint immer mehr dafür zu sprechen, einen Konvertierungsoperator bereitzustellen (unabhängig davon, ob <code>IsNull()</code> bleibt).</p>
<p>abc.w schrieb:</p>
<blockquote>
<p>Ich mache die explizite Variante und dazu auch noch eine verkehrt rum aussehende:</p>
<pre><code class="language-cpp">if (NULL == ptr)
if (NULL != ptr)
</code></pre>
</blockquote>
<p>Okay, noch eine Variante. Mir gefällt die Vertauschung jedoch nicht so (<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-269611-and-start-is-10.html" rel="nofollow">Begründung</a>). Übrigens interessante Anekdote mit dem Mikrocontroller! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Danke für die bisherigen Antworten. Weitere Meinungen sind natürlich erwünscht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921019</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 04 Jul 2010 00:24:44 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 09:38:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Welche der beiden Möglichkeiten verwendet ihr zum Abfragen, ob ein Zeiger auf Null zeigt?</p>
</blockquote>
<p>So gefragt 2). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Mit 1) schaue ich, ob der Zeiger gültig oder ungültig ist, ob er auf etwas zeigt oder auf nix. Ob es den pointee gibt oder nicht. Ob der Auftrag noch zu erledigen ist oder schon weg. Und so weiter.</p>
<p>Mit 2) schaue ich, ob der Zeiger auf *NULL zeigt. Also in Bäumen, verketteten Listen und so, wo in der Doku explitzit steht, daß NULL das Ende anzeigt.</p>
<p>Wobei ich aber nie NULL nehme, sondern nur 0 und bald nullptr.</p>
<p>Demnach müßte der SmartPointer für mich 1) anbieten und sonst nichts. Ich würde nie einen Smartpointer mit 0 initialisieren oder ihm eine 0 zuweisen, warum sollte ich dann so ulkig sein, und schauen, ob eine 0 drin ist?</p>
<p>IsNull ist nur eine Verblümung von 2), das müßte IsValid oder so heißen, um zur Verblümung von 1) zu werden.</p>
<p>Ich bin auch gegen Umdrehen wie bei if(0==ptr), weil das zu untersuchende Objekt ganz links beim Lesen hilft, so wie das empfangende Objekt in Zuweisungen ganz links, zum Beispiel if(0&lt;=auszahlung-kontostand) versus if(auszahlung&gt;=kontostand). Den extrem seltenen Zuweisungsfehler da wegzumachen, indem man mit so einem großen Hammer draufhaut und den Lesefluß==Debugfluß signifikant stört, ist nicht mehr gerechtfertigt.</p>
<p>Übrigens ist SafeBool auch eine Operation gegen ein Problem, das ich nicht habe. Ich bräuchte also kein SafeBool, da täte es vielleicht schon auch ein bool oder besser ein void*. Aber Einbasteln schadet erst recht nicht, weil ich von den SafeBool-Problemchen wohl auch nicht erwischt werden würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921056</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 04 Jul 2010 09:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 11:35:44 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Naja. Das ist ja nicht die Welt eine weitere Funktion zu haben. Im Gegenzug machst du aber alle glücklich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Vor allem bei Operatoren finde ich das sowieso durchaus legitim eine benannte Version der Funktion zu haben.</p>
</blockquote>
<p>Das erinnert mich an einen Thread aus dem SFML-Forum, wo tatsächlich vorgeschlagen wurde, für alle möglichen Funktionen Aliase einzuführen, um zusätzlich eine andere Namenskonvention zu haben. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Für x-beliebige Funktionen sicher nicht! Obwohl.. richtig sinnvoll wäre natürlich, wenn man die STL für alle schön macht:</p>
<pre><code class="language-cpp">std::remove_if (..);
std::RemoveIf (..);
</code></pre>
<p>Das wäre doch schon was tolles! :p (Mist.. Ich habe mein Sarkasmus-Schild verlegt..)</p>
<blockquote>
<p>Im Ernst: Alle glücklich machen zu wollen führt längerfristig zu Problemen. Man kann nicht alle Ansichten berücksichtigen, sondern muss Entscheidungen treffen. Und mir gefällt der Gedanke grundsätzlich nicht, zwei Dinge für den exakt gleichen Zweck anzubieten. Als Benutzer ist man tendentiell verunsichert und fragt sich, ob ein Unterschied in der Funktionalität besteht. Ich verstehe heute noch nicht, warum <code>std::string</code>  <code>size()</code> und <code>length()</code> hat.</p>
<p>Wobei es hier natürlich weniger schlimm ist, weil das eine ein Operator ist – da hast du Recht. Die STL verwendet z.B. auch <code>assign()</code> , um Zuweisungen mit mehreren Argumenten durchführen zu können. Ich muss mir wahrscheinlich nochmals in Ruhe durch den Kopf gehen lassen, ob eine zusätzliche benannte Methode wirklich Vorteile brächte. Möglicherweise werde ich sie zuerst weglassen, dann kann ich immer noch schauen...</p>
</blockquote>
<p>Wie gesagt bei Operatoren finde ich das überhaupt nicht verwirrend (ansonsten stimme ich dir zu und finde das ebenfalls komisch). Im Gegenteil bei einem Operator würde ich sogar eine benannte Funktion erwarten. Es kann durchaus Fälle geben, wo das wünschenswert sein kann. Bei einem Smart Pointer eher weniger, aber wie du sagst bei assign oder Sachen, welche ein Argument bekommen macht es durchaus Sinn. (Da finde ich den Weg, den Eiffel geht noch sehr schön. Dort macht man einfach eine Funktion und sagt dann, dass man sie auch mit einem Operator aufrufen kann. Keine Verwirrung, sondern es ist immer klar, dass es das gleiche ist).</p>
<p>Imo ist es bei keiner anderen Klasse, wie einem Smart Pointer so deutlich, dass er mindestens diesen Operator unterstützen muss. Alles andere wäre sehr kontraintuitiv.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921111</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 04 Jul 2010 11:35:44 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 11:37:45 GMT]]></title><description><![CDATA[<p>Nexus du hast dich gerade als Noob geoutet. Es gibt keine if-Schleifen, sondern nur if-Abfragen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921113</guid><dc:creator><![CDATA[noobdetector]]></dc:creator><pubDate>Sun, 04 Jul 2010 11:37:45 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 12:33:49 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<blockquote>
<p>Stilfrage: if (ptr) oder if(ptr != NULL)</p>
</blockquote>
<p>Meine Antwort:<br />
if (ptr) kann ich deutlich einfacher lesen und verstehen als: if(ptr != NULL)</p>
<p>Warum ?<br />
1. Keine Negierung in der Bedingung<br />
2. kein zweiter - wenn auch einfacher - Operand<br />
3. kürzer und deshalb einfacher und schneller zu lesen.</p>
<p>if (!ptr) kann ich etwas einfacher lesen und verstehen als: if(ptr == NULL)<br />
Warum ?<br />
1. Ich muss negieren oder ich muss mit einem zweiten, einfachen Operanden vergleichen, was aufs gleiche heraus kommt.<br />
2. besser finde ich dennoch die erste Variante, weil kürzer und deshalb einfacher und schneller zu lesen.</p>
<p>Naja, ist nur so meine Ansicht.<br />
Letzenendes sollte und MUSS das jeder so für sich halten können wie er will.<br />
Es können gerade an diesen Stellen einfach nur unnötige Fehler enstehen,<br />
wenn die API einem eine Logik aufzwingt, die man nicht gewoht ist.</p>
<p>Deshalb, bitte beide Varianten anbieten.</p>
<p>Danke, Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921141</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 04 Jul 2010 12:33:49 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 12:52:07 GMT]]></title><description><![CDATA[<p>Unglaublich...</p>
<p>Der Thread ist seit über 12 Stunden auf und noch keine Beschwerde,<br />
dass es nicht äquivalent ist, weil der Standard (afaik) ja nicht vorschreibt,<br />
dass NULL auch 0 sein muss. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Cool...<br />
Ich dachte der Thread endet in so einer ewigen Diskussion... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>EDIT: Ich bevorzuge:</p>
<pre><code class="language-cpp">if(ptr)

if(!ptr)
</code></pre>
<p>(Ich werde nie einen Compiler verwenden, wo NULL != 0 ist)</p>
<p>EDIT: Außerdem verwende ich 0 und nicht NULL</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921150</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 04 Jul 2010 12:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 13:07:57 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Unglaublich...</p>
<p>Der Thread ist seit über 12 Stunden auf und noch keine Beschwerde,<br />
dass es nicht äquivalent ist, weil der Standard (afaik) ja nicht vorschreibt,<br />
dass NULL auch 0 sein muss. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Das hast Du falsch verstanden.<br />
Ein Nullzeiger muß zwar intern nicht als 0 repräsentiert werden, aber immer wenn 0 in einem Zeigerkontext verwendet wird, wird die 0 in einen Nullzeiger umgewandelt, der wie gesagt nicht 0 sein muß, aber logischerweise beim Vergleich mit ==0 doch true sagt, weil die rechte 0 vor dem Vergleich erst in einen Nullzeiger umgewandelt wird. Damit ist für Dich das Wissen, daß NULL nicht unbedingt 0 sein muß, gar nicht Teil des beobachtbaren Verhaltens.<br />
Höchstens im Debugger könnte man vor Schreck vom Stuhl fallen, wenn sofort nach ptr=0 in ptr eine 0xdeadbeef steht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921155</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 04 Jul 2010 13:07:57 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 13:24:32 GMT]]></title><description><![CDATA[<p>Danke für die vielen Antworten. Es scheinen doch sehr viele Leute die Variante 1) zu verwenden, das hätte ich zuerst nicht gedacht.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Mit 1) schaue ich, ob der Zeiger gültig oder ungültig ist, ob er auf etwas zeigt oder auf nix. Ob es den pointee gibt oder nicht. Ob der Auftrag noch zu erledigen ist oder schon weg. Und so weiter.</p>
<p>Mit 2) schaue ich, ob der Zeiger auf *NULL zeigt. Also in Bäumen, verketteten Listen und so, wo in der Doku explitzit steht, daß NULL das Ende anzeigt.</p>
</blockquote>
<p>Das scheint mir eine sehr sinnvolle Vorgehensweise zu sein. Sowas kann ich mir ernsthaft für meinem eigenen Code überlegen...</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Wobei ich aber nie NULL nehme, sondern nur 0 und bald nullptr.</p>
</blockquote>
<p>Warum nicht schon jetzt? Ist natürlich nicht so gut wie in C++0x, aber viel besser als <code>NULL</code> und <code>0</code> .</p>
<pre><code class="language-cpp">const class nullptr_t
{
	public:
		// Konvertierbar in Datenzeiger
		template &lt;typename T&gt;
		operator T* () const
		{
			return 0;
		}

		// Konvertierbar in Zeiger auf Member
        template &lt;class C, typename T&gt; 
        operator T C::* () const 
        { 
            return 0; 
        } 

	private:
		// Nicht adressierbar
		void* operator&amp; ();

} nullptr = {};
</code></pre>
<p>Zu gefrickelt? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>volkard schrieb:</p>
<blockquote>
<p>Ich bin auch gegen Umdrehen wie bei if(0==ptr), weil das zu untersuchende Objekt ganz links beim Lesen hilft, so wie das empfangende Objekt in Zuweisungen ganz links, zum Beispiel if(0&lt;=auszahlung-kontostand) versus if(auszahlung&gt;=kontostand). Den extrem seltenen Zuweisungsfehler da wegzumachen, indem man mit so einem großen Hammer draufhaut und den Lesefluß==Debugfluß signifikant stört, ist nicht mehr gerechtfertigt.</p>
</blockquote>
<p>Genau, so ähnlich habe ich im anderen Thread argumentiert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Frank Erdorf schrieb:</p>
<blockquote>
<p>Meine Antwort:<br />
if (ptr) kann ich deutlich einfacher lesen und verstehen als: if(ptr != NULL)</p>
<p>Warum ?<br />
1. Keine Negierung in der Bedingung<br />
2. kein zweiter - wenn auch einfacher - Operand</p>
</blockquote>
<p>Ah, noch mehr Argumente für 1). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
<p>Frank Erdorf schrieb:</p>
<blockquote>
<p>Es können gerade an diesen Stellen einfach nur unnötige Fehler enstehen,<br />
wenn die API einem eine Logik aufzwingt, die man nicht gewoht ist.</p>
<p>Deshalb, bitte beide Varianten anbieten.</p>
</blockquote>
<p>Nun ja, beim Verwenden einer Bibliothek muss man sich eben an dortige Konventionen halten. Das beginnt schon bei der Namenskonvention, geht weiter über die Verwendung diverser Sprachmittel, über Codestil allgemein. Benutzt die Bibliothek Exceptions? Smart-Pointer? Werden Callbacks über Funktionszeiger, implementierte Interfaces oder <code>std::tr1::function</code> realisiert? Implizieren Zeiger in der Schnittstelle, dass <code>NULL</code> erlaubt ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921163</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 04 Jul 2010 13:24:32 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Sun, 04 Jul 2010 14:58:01 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>..., ob ich den Konvertierungsoperator</p>
<pre><code class="language-cpp">SmartPtr::operator SafeBool() const;
</code></pre>
<p>mit all seinen Problemen, ...</p>
</blockquote>
<p>Nicht mehr &quot;lange&quot;, mit dem neuen Standard bekommen wir <code>explicit</code> für die Konvertierungsoperatoren. Ich denke, dass man hier schon etwas zukunftsausgerichtet denken darf.</p>
<p>Ich mache es übrigens meistens so, wie volkard es beschrieben hat. Wenn der Nullzeiger einen Fehlerfall andeutet oder eine Gültigkeit, dann wird er einfach geprüft. In allen anderen Fällen vergleiche ich den Zeiger mit der <code>nullptr</code> Struktur. Und ich bin inzwischen sogar wieder vom <code>nullptr == ptr</code> Tripp abgekommen. Zu viele Leute scheinen damit Probleme beim Lesen zu haben und ich denke daher, dass hier die Wartbarkeit über die Fehlerprävention gewinnt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921184</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 04 Jul 2010 14:58:01 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Mon, 05 Jul 2010 15:43:55 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Nicht mehr &quot;lange&quot;, mit dem neuen Standard bekommen wir <code>explicit</code> für die Konvertierungsoperatoren. Ich denke, dass man hier schon etwas zukunftsausgerichtet denken darf.</p>
</blockquote>
<p>Ich weiss nicht, ob ich in der Bibliothek schon bald C++0x verwende. Wahrscheinlich würde ich die User stark dezimieren...</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Und ich bin inzwischen sogar wieder vom <code>nullptr == ptr</code> Tripp abgekommen.</p>
</blockquote>
<p>In meinen Anfängen verwendete ich <code>NULL</code> , dann <code>0</code> , später <code>nullptr</code> und jetzt für die Bibliothek wieder <code>NULL</code> (sonst <code>nullptr</code> ). Und in Zukunft werde ich wahrscheinlich implizit abfragen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921745</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Jul 2010 15:43:55 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Mon, 05 Jul 2010 16:14:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Nicht mehr &quot;lange&quot;, mit dem neuen Standard bekommen wir <code>explicit</code> für die Konvertierungsoperatoren. Ich denke, dass man hier schon etwas zukunftsausgerichtet denken darf.</p>
</blockquote>
<p>Ich weiss nicht, ob ich in der Bibliothek schon bald C++0x verwende. Wahrscheinlich würde ich die User stark dezimieren...</p>
</blockquote>
<p>Aktuell wird <code>explicit</code> nur vom GCC 4.5 unterstützt. Aber ich meinte auch nicht, dass du bereits <code>explicit</code> einsetzen sollst. Aber man kann aktuell das Safe-Bool-Idiom verwenden und halt im Hinterkopf behalten, dass dies nicht ein Workaround für alle Zeiten ist, sondern nur bis der neue Standard sich etabliert hat. Damit halt der üble Geschmack ein wenig besser wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Und ich bin inzwischen sogar wieder vom <code>nullptr == ptr</code> Tripp abgekommen.</p>
</blockquote>
<p>In meinen Anfängen verwendete ich <code>NULL</code> , dann <code>0</code> , später <code>nullptr</code> und jetzt für die Bibliothek wieder <code>NULL</code> (sonst <code>nullptr</code> ). Und in Zukunft werde ich wahrscheinlich implizit abfragen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Ich meinte wegen dem <code>nullptr == ptr</code> &lt;-&gt; <code>ptr == nullptr</code> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
<code>nullptr</code> verwende ich schon noch weiterhin, wie ich es im meinem vorherigen Beitrag geschrieben hatte.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921763</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 05 Jul 2010 16:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Stilfrage: if (ptr) oder if(ptr != NULL) on Mon, 05 Jul 2010 16:30:29 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Nicht mehr &quot;lange&quot;, mit dem neuen Standard bekommen wir <code>explicit</code> für die Konvertierungsoperatoren. Ich denke, dass man hier schon etwas zukunftsausgerichtet denken darf.</p>
</blockquote>
<p>Ich weiss nicht, ob ich in der Bibliothek schon bald C++0x verwende. Wahrscheinlich würde ich die User stark dezimieren...</p>
</blockquote>
<p>OpenSource <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921778</guid><dc:creator><![CDATA[Yummy OpenSource]]></dc:creator><pubDate>Mon, 05 Jul 2010 16:30:29 GMT</pubDate></item></channel></rss>