<?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[[if - else if - else] oder [switch - case - default] ?]]></title><description><![CDATA[<p>Welcher Ausdruck ist logischer, besserer Stil, effizienter, ...?</p>
<pre><code class="language-cpp">switch (a) {
case 0:
  // do something
  break;
case 1:
  // do something
  break;
default:
  // so something
  break;
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">if (a == 0) {
  // do something
} else if (a == 1) {
  // do something
} else {
  // do something
}
</code></pre>
<p>Es geht hierbei um genau die Situation mit *2* Spezialfällen und einem Defaultfall!</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284434/if-else-if-else-oder-switch-case-default</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Apr 2026 18:17:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284434.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Apr 2011 12:28:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 12:28:12 GMT]]></title><description><![CDATA[<p>Welcher Ausdruck ist logischer, besserer Stil, effizienter, ...?</p>
<pre><code class="language-cpp">switch (a) {
case 0:
  // do something
  break;
case 1:
  // do something
  break;
default:
  // so something
  break;
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">if (a == 0) {
  // do something
} else if (a == 1) {
  // do something
} else {
  // do something
}
</code></pre>
<p>Es geht hierbei um genau die Situation mit *2* Spezialfällen und einem Defaultfall!</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043200</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Fri, 01 Apr 2011 12:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 12:30:23 GMT]]></title><description><![CDATA[<p>Das was dir besser gefällt. Ich tendiere zum switch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043201</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Fri, 01 Apr 2011 12:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 12:37:03 GMT]]></title><description><![CDATA[<p>Tomahawk schrieb:</p>
<blockquote>
<p>Welcher Ausdruck ist logischer, besserer Stil, effizienter, ...?</p>
</blockquote>
<p>Alle drei Punkte verbucht das if für sich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043203</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 Apr 2011 12:37:03 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 12:43:57 GMT]]></title><description><![CDATA[<p>Zwei Antworten - Zwei Meinungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043206</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Fri, 01 Apr 2011 12:43:57 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 12:45:05 GMT]]></title><description><![CDATA[<p>Naja bei der Effizienz würde ich von modernen Compilern schon erwarten, dass sie das if auch mit einer Symboltabelle wie beim switch umsetzen (wer mags nachprüfen?).<br />
Mir persönlich gefällt bei nur 3 Fällen if besser, ich finde ein switch &quot;lohnt&quot; sich erst bei mehr Werten.</p>
<p>Am Ende ist es wirklich eine Sache des Geschmacks.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043207</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 01 Apr 2011 12:45:05 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 12:44:53 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Tomahawk schrieb:</p>
<blockquote>
<p>Welcher Ausdruck ist logischer, besserer Stil, effizienter, ...?</p>
</blockquote>
<p>Alle drei Punkte verbucht das if für sich.</p>
</blockquote>
<p>Da muss ich dir leider widersprechen. Bei mir erzeugen beide Konstrukte den selben Code. Somit ist keiner von beiden effizienter. Logischer und besserer Stil sind einfach Geschmacksfragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043208</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Fri, 01 Apr 2011 12:44:53 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 12:48:36 GMT]]></title><description><![CDATA[<p>Tomahawk schrieb:</p>
<blockquote>
<p>Welcher Ausdruck ist logischer</p>
</blockquote>
<p>Das hängt vom Kontext und mehr noch von Deinem Geschmack ab.</p>
<p>Tomahawk schrieb:</p>
<blockquote>
<p>[...] besserer Stil[...]</p>
</blockquote>
<p>Das hängt vom Kontext und mehr noch von Deinem Geschmack ab.</p>
<p>Tomahawk schrieb:</p>
<blockquote>
<p>[...]effizienter, ...?</p>
</blockquote>
<p>Das hängt vom Compiler ab, wobei ich schätze, dass mehr Optimierungspotential beim Switch-Case besteht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043211</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 01 Apr 2011 12:48:36 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 13:00:04 GMT]]></title><description><![CDATA[<p>HighLigerBiMBam schrieb:</p>
<blockquote>
<p>Da muss ich dir leider widersprechen. Bei mir erzeugen beide Konstrukte den selben Code.</p>
</blockquote>
<p>Bei mir nicht. Aber bei 2 Spezialfällen sehe ich auch keinen Performance-Unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043214</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 Apr 2011 13:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 13:13:18 GMT]]></title><description><![CDATA[<p>Als kurzen Einwand noch: Stilmäßig finde ich switch immer dann besser wenn es um enums geht. Da kann der Compiler auch hübsch bei vergessenen Konstanten warnen.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043225</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Fri, 01 Apr 2011 13:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 13:15:00 GMT]]></title><description><![CDATA[<p>Bei nur zwei Fällen tendiere ich auch eher zu if...else if...., allerdings hat er ja auch nur bei werten die als integer dargestellt werden können die Wahl. Denn bei std::string zum Beispiel kann er ohne Umwege switch gar nicht nutzen.</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043226</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Fri, 01 Apr 2011 13:15:00 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 13:17:34 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>HighLigerBiMBam schrieb:</p>
<blockquote>
<p>Da muss ich dir leider widersprechen. Bei mir erzeugen beide Konstrukte den selben Code.</p>
</blockquote>
<p>Bei mir nicht. Aber bei 2 Spezialfällen sehe ich auch keinen Performance-Unterschied.</p>
</blockquote>
<p>Das finde ich aber dann ziemlich dämlich von den Compilerbauern. Dieser müsste in genau diesem speziellen Fall doch sehen, dass es wie ein if else gebraucht wird. Nun gut ich würde gerne den Fall sehen, wo dies bei dir nicht gleichen Code bei identischer Logik bringt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043229</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Fri, 01 Apr 2011 13:17:34 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 13:34:49 GMT]]></title><description><![CDATA[<p>HighLigerBiMBam schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>HighLigerBiMBam schrieb:</p>
<blockquote>
<p>Da muss ich dir leider widersprechen. Bei mir erzeugen beide Konstrukte den selben Code.</p>
</blockquote>
<p>Bei mir nicht. Aber bei 2 Spezialfällen sehe ich auch keinen Performance-Unterschied.</p>
</blockquote>
<p>Das finde ich aber dann ziemlich dämlich von den Compilerbauern. Dieser müsste in genau diesem speziellen Fall doch sehen, dass es wie ein if else gebraucht wird. Nun gut ich würde gerne den Fall sehen, wo dies bei dir nicht gleichen Code bei identischer Logik bringt.</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main(){
int a;
cin&gt;&gt;a;
#if 0
switch (a) {
case 0:
  cout&lt;&lt;&quot;hallo\n&quot;;
  break;
case 1:
  cout&lt;&lt;&quot;welt\n&quot;;
  break;
default:
  cout&lt;&lt;&quot;nix\n&quot;;
  break;
} 
#else
if(a==0)
  cout&lt;&lt;&quot;hallo\n&quot;;
else if(a==1)
  cout&lt;&lt;&quot;welt\n&quot;;
else
  cout&lt;&lt;&quot;nix\n&quot;;
#endif
}
</code></pre>
<pre><code>g++ -march=native -DNDEBUG --save-temps -O3 main.cpp
</code></pre>
<pre><code>movl	12(%rsp), %eax
	testl	%eax, %eax
	jne	.L8
	movl	$6, %edx
	movl	$.LC0, %esi
	movl	$_ZSt4cout, %edi
	call	_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
	xorl	%eax, %eax
	addq	$24, %rsp
	.cfi_remember_state
	.cfi_def_cfa_offset 8
	ret
	.p2align 4,,7
	.p2align 3
.L8:
	.cfi_restore_state
	decl	%eax
	je	.L9
	movl	$4, %edx
	movl	$.LC2, %esi
	movl	$_ZSt4cout, %edi
	call	_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
	xorl	%eax, %eax
	addq	$24, %rsp
	.cfi_remember_state
	.cfi_def_cfa_offset 8
	ret
	.p2align 4,,7
	.p2align 3
.L9:
	.cfi_restore_state
	movl	$5, %edx
	movl	$.LC1, %esi
	movl	$_ZSt4cout, %edi
	call	_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
	xorl	%eax, %eax
	addq	$24, %rsp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
</code></pre>
<pre><code>movl	12(%rsp), %eax
	testl	%eax, %eax
	je	.L6
	decl	%eax
	je	.L7
	movl	$4, %edx
	movl	$.LC2, %esi
	movl	$_ZSt4cout, %edi
	call	_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
	xorl	%eax, %eax
	addq	$24, %rsp
	.cfi_remember_state
	.cfi_def_cfa_offset 8
	ret
	.p2align 4,,7
	.p2align 3
.L6:
	.cfi_restore_state
	movl	$6, %edx
	movl	$.LC0, %esi
	movl	$_ZSt4cout, %edi
	call	_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
	xorl	%eax, %eax
	addq	$24, %rsp
	.cfi_remember_state
	.cfi_def_cfa_offset 8
	ret
	.p2align 4,,7
	.p2align 3
.L7:
	.cfi_restore_state
	movl	$5, %edx
	movl	$.LC1, %esi
	movl	$_ZSt4cout, %edi
	call	_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
	xorl	%eax, %eax
	addq	$24, %rsp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
</code></pre>
<p>Wie gesagt, ich sehe keinen Performance-Unterschied. Aber die if-Version verteilt den Verzweigungscode weniger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043244</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 Apr 2011 13:34:49 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 14:20:16 GMT]]></title><description><![CDATA[<p>Mit switch kann man auch Sachen machen die mit if/else nur schwer (unübersichtlich) möglich sind.<br />
zb. das hier</p>
<pre><code class="language-cpp">switch(int)
{
case 0:
case 1:
case 2:
case 3:
  machwas_zuerst();
case 4:
  kurz_das_noch();
case 5:
case 6:
  so_jetzt_passt_es;
  break;

default:
  break;
}
</code></pre>
<p>Wieso sollte ich also im Code zwei verschiedene Stil haben?<br />
switch/case ist auch fehlerfreier weil hier sicher ist das immer mit == verglichen wird.</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043273</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:20:16 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 14:27:56 GMT]]></title><description><![CDATA[<p>Optimiert der Compiler das zu den if-Abfragen? Wenn der hier für jedes case ein == macht, wäre das nämlich ziemlich doof.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043282</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 14:30:45 GMT]]></title><description><![CDATA[<p>Der Compiler wird daraus eine Sprungtabelle machen, denke ich. Was Lichtlein sagen wollte war das man z.B. nicht ausversehen <code>if (x = a)</code> schreiben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043284</guid><dc:creator><![CDATA[klöklö]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:30:45 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 14:33:42 GMT]]></title><description><![CDATA[<p>Lichtlein schrieb:</p>
<blockquote>
<pre><code class="language-cpp">switch(int)
{
case 0:
case 1:
case 2:
case 3:
  machwas_zuerst();
case 4:
  kurz_das_noch();
case 5:
case 6:
  so_jetzt_passt_es;
  break;

default:
  break;
}
</code></pre>
</blockquote>
<p>Schön wären natürlich reale Beispiele: man kann auch 13 Schleifen verschachteln, und dann von Schleife 9 bei einer bestimmten Bedingung in Schleife 2 springen und das als Argument für goto nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043287</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:33:42 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 14:34:51 GMT]]></title><description><![CDATA[<p>Lichtlein schrieb:</p>
<blockquote>
<p>Wieso sollte ich also im Code zwei verschiedene Stil haben?</p>
</blockquote>
<p>Das wäre aber ein Grund, switch nicht mehr zu nehmen und nur noch if. Denn das geht auch mit strings.</p>
<p>Lichtlein schrieb:</p>
<blockquote>
<p>switch/case ist auch fehlerfreier weil hier sicher ist das immer mit == verglichen wird.</p>
</blockquote>
<p>Kein Argument. Die Compilerwearnungen sollten schon an sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043290</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:34:51 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 14:37:14 GMT]]></title><description><![CDATA[<p>Volkard schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Danke. Den kleinen Unterschied habe ich beim Überfliegen übersehen. In dem Fall hat switch sogar ein &quot;.cfi_restore_state&quot; mehr wenn der else/default-Zweig getroffen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043291</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 14:37:23 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Schön wären natürlich reale Beispiele</p>
</blockquote>
<p>Dann wird's bei drei Fällen bleiben, vermute ich:<br />
- Menüschleife in Konsolenanwendung,<br />
- switch über enum,<br />
- Duffs Device.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043292</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:37:23 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 14:54:03 GMT]]></title><description><![CDATA[<p>klöklö schrieb:</p>
<blockquote>
<p>Der Compiler wird daraus eine Sprungtabelle machen, denke ich. Was Lichtlein sagen wollte war das man z.B. nicht ausversehen <code>if (x = a)</code> schreiben kann.</p>
</blockquote>
<p>Ach komm, ich bin der Meister der Flüchtigkeitsfehler, aber das ist mir die letzten 5 Jahre nicht passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043305</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 15:32:42 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>ipsec schrieb:</p>
<blockquote>
<p>Schön wären natürlich reale Beispiele</p>
</blockquote>
<p>Dann wird's bei drei Fällen bleiben, vermute ich:<br />
- Menüschleife in Konsolenanwendung,<br />
- switch über enum,<br />
- Duffs Device.</p>
</blockquote>
<p>Weil ich das grad interessant finde, hab ich beschlossen mal schnell über den Code den ich in den letzten paar Monaten geschrieben habe zu greppen.</p>
<p>Insgesamt hab' ich da drinnen 65x switch gefunden, davon geht der überwiegende Grossteil auf enum Typen.</p>
<p>Zwei mal gibt's ein switch(charset), wobei charset ein int ist, aber hier auch &quot;enum-artig&quot; verwendet wird.</p>
<p>Dann gibt's 1x das hier (in einer Schleife die einen 3x4 Nummernblock bastelt):</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; 12; i++)
{
	// ...

	int const row = i / 3;
	int const column = i % 3;

	if (row == 3)
	{
		switch (column)
		{
		case 0:
			key-&gt;SetKeyType(KeyType_Clear);
			break;
		case 1:
			key-&gt;SetKeyType(KeyType_Digit);
			key-&gt;SetValue(0);
			break;
		case 2:
			key-&gt;SetKeyType(KeyType_Backspace);
			break;
		}
	}
	else
	{
		key-&gt;SetKeyType(KeyType_Digit);
		key-&gt;SetValue(i + 1);
	}
</code></pre>
<p>Hier könnte man noch behaupten dass das auch &quot;enum artig&quot; ist - ist aber schon grenzwertig.</p>
<p>Und in einer &quot;BoxMinify&quot; Funktion findet sich folgendes:</p>
<pre><code class="language-cpp">switch (xFactor)
	{
	case 1:
		for (int x = 0; x &lt; destSize.x; x++)
			tmp[x] += s[x];
		break;

	case 2:
		for (int x = 0; x &lt; destSize.x; x++)
			tmp[x] += s[2 * x] + s[2 * x + 1];
		break;

	case 3:
		for (int x = 0; x &lt; destSize.x; x++)
			tmp[x] += s[3 * x] + s[3 * x + 1] + s[3 * x + 2];
		break;

	case 4:
		for (int x = 0; x &lt; destSize.x; x++)
			tmp[x] += s[4 * x] + s[4 * x + 1] + s[4 * x + 2] + s[4 * x + 3];
		break;

	default:
		for (int x = 0; x &lt; destSize.x; x++)
		{
			// accumulate pixels in &quot;accu&quot;
			UINT accu = 0;
			for (int j = 0; j &lt; xFactor; j++)
				accu += s[j];

			tmp[x] += accu;
			s += xFactor;
		}
		break;
	}
</code></pre>
<p>Das ist für mich jetzt ganz klar nicht mehr &quot;enum artig&quot;, da sämtliche integralen Skalierungsfaktoren &gt; 0 unterstützt werden.</p>
<p>Also je nachdem was man noch gelten lässt 1 bis max. 4 aus 65.</p>
<p>BTW... andere Konstrukte befinden sich mit folgender Häufigkeit in dem Code:</p>
<p>30000 lines of code<br />
1300 if (+ 120 else-if)<br />
170 throw<br />
71 for<br />
68 catch<br />
65 switch<br />
24 while<br />
3 do-while (davon 2 do{ ... }while(false) in Makros)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043316</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 01 Apr 2011 15:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 22:31:53 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>30000 lines of code<br />
1300 if (+ 120 else-if)<br />
170 throw<br />
71 for<br />
68 catch<br />
65 switch<br />
24 while<br />
3 do-while (davon 2 do{ ... }while(false) in Makros)</p>
</blockquote>
<p>Nur mal aus Interesse:<br />
Wieviele verschiedene Exception-Typen schmeisst du denn?<br />
Oder welches Exception-Klassen/Klassen-Verhältnis hast du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043536</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Fri, 01 Apr 2011 22:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Fri, 01 Apr 2011 22:49:23 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Dann gibt's 1x das hier (in einer Schleife die einen 3x4 Nummernblock bastelt):</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; 12; i++)
{
	// ...

	int const row = i / 3;
	int const column = i % 3;

	if (row == 3)
	{
		switch (column)
		{
		case 0:
			key-&gt;SetKeyType(KeyType_Clear);
			break;
		case 1:
			key-&gt;SetKeyType(KeyType_Digit);
			key-&gt;SetValue(0);
			break;
		case 2:
			key-&gt;SetKeyType(KeyType_Backspace);
			break;
		}
	}
	else
	{
		key-&gt;SetKeyType(KeyType_Digit);
		key-&gt;SetValue(i + 1);
	}
</code></pre>
</blockquote>
<p>Hmm. Das Keypad ist 4 hoch und 3 breit. Nur wenn die row 3 ist, also nur die letze, macht: Nacheinander case0, case1, case2. Dann könnte ich das Nacheinander auch Am Ende nachschicken und den Code verkürzen zu:</p>
<pre><code class="language-cpp">for(int row=0; row!=3; ++row) {
		for(int column=0; column!=3; ++column) {
			// ...
			key-&gt;SetKeyType(KeyType_Digit);
			key-&gt;SetValue(row*3+column + 1);
		}
	}
	key-&gt;SetKeyType(KeyType_Clear);
	key-&gt;SetKeyType(KeyType_Digit);
	key-&gt;SetValue(0);
	key-&gt;SetKeyType(KeyType_Backspace);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2043539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043539</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 Apr 2011 22:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Sat, 02 Apr 2011 00:10:42 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Und in einer &quot;BoxMinify&quot; Funktion findet sich folgendes:</p>
<pre><code class="language-cpp">switch (xFactor)
	{
	case 1:
		for (int x = 0; x &lt; destSize.x; x++)
			tmp[x] += s[x];
		break;

	case 2:
		for (int x = 0; x &lt; destSize.x; x++)
			tmp[x] += s[2 * x] + s[2 * x + 1];
		break;

	case 3:
		for (int x = 0; x &lt; destSize.x; x++)
			tmp[x] += s[3 * x] + s[3 * x + 1] + s[3 * x + 2];
		break;

	case 4:
		for (int x = 0; x &lt; destSize.x; x++)
			tmp[x] += s[4 * x] + s[4 * x + 1] + s[4 * x + 2] + s[4 * x + 3];
		break;

	default:
		for (int x = 0; x &lt; destSize.x; x++)
		{
			// accumulate pixels in &quot;accu&quot;
			UINT accu = 0;
			for (int j = 0; j &lt; xFactor; j++)
				accu += s[j];

			tmp[x] += accu;
			s += xFactor;
		}
		break;
	}
</code></pre>
</blockquote>
<p>Ja, den Fall habe ich klar vergessen. Eine Variable compilezeitkonstant machen, damit sie als Template-Argument geht oder dem Optimierer zugänglich wird.</p>
<p>Ich hab da mal ein wenig experimentiert...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Size {
    int x;
};

typedef unsigned int UINT;

void helper(UINT* tmp,UINT* s,int xFactor,Size&amp; destSize){
    for (int x = 0; x &lt; destSize.x; x++) {
        // accumulate pixels in &quot;accu&quot;
        UINT accu = 0;
        for (int j = 0; j &lt; xFactor; j++)
            accu += s[j];

        tmp[x] += accu;
        s += xFactor;
    }
}

void boxMinifyTest(UINT* tmp,UINT* s,int xFactor,Size&amp; destSize) {
	switch (xFactor) {
	case 1:
        helper(tmp,s,1,destSize);
		break;

	case 2:
        helper(tmp,s,2,destSize);
		break;

	case 3:
        helper(tmp,s,3,destSize);
		break;

	case 4:
        helper(tmp,s,4,destSize);
		break;

	default:
        helper(tmp,s,xFactor,destSize);
		break;
	}
}

int main() {
    UINT tmp[100];
    UINT s[100];
    Size size;
    std::cin&gt;&gt;size.x;
    int xFactor;
    std::cin&gt;&gt;xFactor;
    boxMinifyTest(tmp,s,xFactor,size);
	return 0;
}
</code></pre>
<p>Und der entstehende Code ist faszinierend.</p>
<pre><code>.LFE1237:
	.size	_Z6helperPjS_iR4Size, .-_Z6helperPjS_iR4Size
	.p2align 4,,15
.globl _Z13boxMinifyTestPjS_iR4Size
	.type	_Z13boxMinifyTestPjS_iR4Size, @function
_Z13boxMinifyTestPjS_iR4Size:
.LFB1238:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	cmpl	$2, %edx        #switch gebaut, vergleich mit 2
	pushq	%rbx
	.cfi_def_cfa_offset 24
	je	.L17            #wenn gleich 2, dann dahin
	.cfi_offset 3, -24
	.cfi_offset 6, -16
	jle	.L49            #wenn kleiner 2 dann dahin
	cmpl	$3, %edx
	je	.L18            #wenn gleich 3 dann dahin
	cmpl	$4, %edx
	.p2align 4,,5
	jne	.L15            #wenn ungleich gleich 4 dann dahin
	movl	(%rcx), %r10d   
	xorb	%dl, %dl
	testl	%r10d, %r10d
	jle	.L14            #wenn size==0, return
	.p2align 4,,7
	.p2align 3
.L40:                           #kopierschleife mit viererschleife geunrolled
	movl	(%rsi), %eax
	addl	(%rdi), %eax
	incl	%edx
	addl	4(%rsi), %eax
	addl	8(%rsi), %eax
	addl	12(%rsi), %eax
	addq	$16, %rsi
	movl	%eax, (%rdi)
	addq	$4, %rdi
	cmpl	(%rcx), %edx
	jl	.L40
	.p2align 4,,7
	.p2align 3
.L14:                          #return
	popq	%rbx
	.cfi_remember_state
	.cfi_def_cfa_offset 16
	popq	%rbp
	.cfi_def_cfa_offset 8
	ret
	.p2align 4,,7
	.p2align 3
.L49:
	.cfi_restore_state
	cmpl	$1, %edx           #noch switch: wenn 1 dann
	je	.L50               #dahin
.L15:
	movl	(%rcx), %ebx       #ah, es war die 0 oder ungleich 4
	testl	%ebx, %ebx         #es folgt schleife ohne unrolling mit viel mmx
	.p2align 4,,3
	jle	.L14
	movl	%edx, %r10d
	movslq	%edx, %rbp
	xorl	%r11d, %r11d
	shrl	$2, %r10d
	salq	$2, %rbp
	leal	0(,%r10,4), %ebx
	.p2align 4,,7
	.p2align 3
.L26:
	xorl	%r9d, %r9d
	testl	%edx, %edx
	jle	.L34
	cmpl	$7, %edx
	jbe	.L37
	testl	%ebx, %ebx
	je	.L37
	pxor	%xmm0, %xmm0
	movq	%rsi, %r8
	xorl	%eax, %eax
	.p2align 4,,7
	.p2align 3
.L31:
	movdqu	(%r8), %xmm1
	incl	%eax
	addq	$16, %r8
	cmpl	%r10d, %eax
	paddd	%xmm1, %xmm0
	jb	.L31
	movdqa	%xmm0, %xmm1
	cmpl	%edx, %ebx
	movl	%ebx, %eax
	psrldq	$8, %xmm1
	paddd	%xmm1, %xmm0
	movdqa	%xmm0, %xmm1
	psrldq	$4, %xmm1
	paddd	%xmm1, %xmm0
	movd	%xmm0, -4(%rsp)
	movl	-4(%rsp), %r9d
	je	.L34
.L35:
	movslq	%eax, %r8
	leaq	(%rsi,%r8,4), %r8
	.p2align 4,,7
	.p2align 3
.L33:
	incl	%eax
	addl	(%r8), %r9d
	addq	$4, %r8
	cmpl	%eax, %edx
	jg	.L33
.L34:
	addl	%r9d, (%rdi)
	incl	%r11d
	addq	$4, %rdi
	cmpl	(%rcx), %r11d
	jge	.L14
	addq	%rbp, %rsi
	jmp	.L26
.L50:                           #Fall 1
	movl	(%rcx), %ebp
	xorl	%eax, %eax
	xorl	%edx, %edx
	testl	%ebp, %ebp
	jle	.L14            #wenn size==0, dann return
	.p2align 4,,7
	.p2align 3
.L41:
	movl	(%rsi,%rax), %ebx  #kopierschleife, innere schleife geunrolled, 
	addl	%ebx, (%rdi,%rax)  #äußeren schleifenkörper länger gemacht, dafür zwei ausstiege
	incl	%edx
	addq	$4, %rax
	cmpl	(%rcx), %edx
	jge	.L14
	movl	(%rsi,%rax), %ebx
	addl	%ebx, (%rdi,%rax)
	incl	%edx
	addq	$4, %rax
	cmpl	(%rcx), %edx
	jl	.L41
	jmp	.L14
.L18:                          # gleich 3
	movl	(%rcx), %r9d   # wenn size==0, dann return
	xorl	%edx, %edx
	testl	%r9d, %r9d
	jle	.L14
	.p2align 4,,7
	.p2align 3
.L39:                          #kopierschliefe, die innere dreierschleife geunrolled
	movl	(%rsi), %eax
	addl	(%rdi), %eax
	incl	%edx
	addl	4(%rsi), %eax
	addl	8(%rsi), %eax
	addq	$12, %rsi
	movl	%eax, (%rdi)
	addq	$4, %rdi
	cmpl	(%rcx), %edx
	jl	.L39
	jmp	.L14          #return
	.p2align 4,,7
	.p2align 3
.L17:                            #Fall 2
	movl	(%rcx), %r8d     # wenn size==0, dann return
	xorl	%edx, %edx
	testl	%r8d, %r8d
	jle	.L14
	.p2align 4,,7
	.p2align 3
.L38:                            #kopierschliefe, die innere zweierschleife geunrolled
	movl	(%rsi), %eax
	addl	(%rdi), %eax
	incl	%edx
	addl	4(%rsi), %eax
	addq	$8, %rsi
	movl	%eax, (%rdi)
	addq	$4, %rdi
	cmpl	(%rcx), %edx
	jl	.L38
	jmp	.L14            #return
.L37:
	xorl	%r9d, %r9d
	xorl	%eax, %eax
	jmp	.L35
	.cfi_endproc
</code></pre>
<p>Mal sehen, wieviel sich der Compiler bieten läßt...</p>
<pre><code class="language-cpp">switch (xFactor) {
	case  1: helper(tmp,s, 1,destSize); break;
	case  2: helper(tmp,s, 2,destSize); break;
	case  3: helper(tmp,s, 3,destSize); break;
	case  4: helper(tmp,s, 4,destSize); break;
	case  5: helper(tmp,s, 5,destSize); break;
	case  6: helper(tmp,s, 6,destSize); break;
	case  7: helper(tmp,s, 7,destSize); break;
	case  8: helper(tmp,s, 8,destSize); break;
	case  9: helper(tmp,s, 9,destSize); break;
	case 10: helper(tmp,s,10,destSize); break;
	case 11: helper(tmp,s,11,destSize); break;
	case 12: helper(tmp,s,12,destSize); break;
	case 13: helper(tmp,s,13,destSize); break;
	case 14: helper(tmp,s,14,destSize); break;
	case 15: helper(tmp,s,15,destSize); break;
	case 16: helper(tmp,s,16,destSize); break;
	case 17: helper(tmp,s,17,destSize); break;
	case 18: helper(tmp,s,18,destSize); break;
	case 19: helper(tmp,s,19,destSize); break;
	case 20: helper(tmp,s,20,destSize); break;

	default: helper(tmp,s,xFactor,destSize); break;
	}
</code></pre>
<p>Jetzt ist das switch zu einer Sprungtabelle geworden und alle 20 sind innen geunrolled.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043547</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 02 Apr 2011 00:10:42 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Mon, 04 Apr 2011 12:35:17 GMT]]></title><description><![CDATA[<p>Ich habe noch mal überlegt weil mir if/else so gar nicht gefallen wollte.<br />
Und es gibt Unterschiede.</p>
<p>Ratespiel: Verhält sich der Code immer gleich?</p>
<pre><code class="language-cpp">switch(*ptr)
{
case 0x11: mach_was_zu11(); break;
case 0x64: mach_was_zu64(); break;
default:   mach_default_was(); break;
}

if(*ptr == 0x11) mach_was_zu11(); 
else if(*ptr == 0x64) mach_was_zu64;
else mach_default_was();
</code></pre>
<p>Nein, wenn die variable 'ptr' auf ein volatile Type zeigt.<br />
<strong>Dann ist das Verhalten ganz Unterschiedlich</strong>.</p>
<p>Beispiel währe hier in einer Multithread Anwendung oder wenn man Hardware Register ausliest.</p>
<p>Lichtlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044514</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Mon, 04 Apr 2011 12:35:17 GMT</pubDate></item><item><title><![CDATA[Reply to [if - else if - else] oder [switch - case - default] ? on Mon, 04 Apr 2011 13:21:19 GMT]]></title><description><![CDATA[<p>Lichtlein schrieb:</p>
<blockquote>
<p><strong>Dann ist das Verhalten ganz Unterschiedlich</strong>.</p>
</blockquote>
<p>Dann erläuter doch mal den Unterschied <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Ich sehe nur, dass er im if strenggenommen 2mal den Wert in das Register<br />
laden muss. Ehrlich gesagt glaube ich aber nicht, dass er es macht...<br />
Der Unterschied wäre ja eh nicht kontrollierbar (Thread-Synchronisierung) für den Benutzer innerhalb des Konstruktes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044530</guid><dc:creator><![CDATA[MaPoX]]></dc:creator><pubDate>Mon, 04 Apr 2011 13:21:19 GMT</pubDate></item></channel></rss>