Wikibooks
dewikibooks
https://de.wikibooks.org/wiki/Hauptseite
MediaWiki 1.47.0-wmf.19
first-letter
Medium
Spezial
Diskussion
Benutzer
Benutzer Diskussion
Wikibooks
Wikibooks Diskussion
Datei
Datei Diskussion
MediaWiki
MediaWiki Diskussion
Vorlage
Vorlage Diskussion
Hilfe
Hilfe Diskussion
Kategorie
Kategorie Diskussion
Regal
Regal Diskussion
TimedText
TimedText talk
Modul
Modul Diskussion
Veranstaltung
Veranstaltung Diskussion
Traktorenlexikon: Porsche-Diesel Junior 4
0
67945
1090660
901708
2026-09-10T12:01:57Z
~2026-48865-68
116867
1090660
wikitext
text/x-wiki
{| cellpadding="2" style="float: right; width: 307px; background: #cceeee; margin-left: 1em; border-spacing: 1px;"
! Logo Hersteller
! Foto
|- style="background: #ffffff; text-align: center;"
| style="width: 145px;" | [[Bild:Wappen_fehlt.jpg|140px|Logo fehlt]]<!-- Optional: link auf Stadt-Wappenseite im Internet oder ähnliches anhängen. Wappen nur mit Genehmigung der Gemeinde einfügen, siehe Hinweise unter dem Link "Wikipedia:Wappen"! -->
| style="width: 145px;" | [[Bild:Porsche Diesel Junior 4.jpg|140px|Porsche Diesel Junior 4]]
|-
! colspan="2" | Basisdaten
|- style="background: #ffffff;"
| Hersteller: || Porsche
|- style="background: #ffffff;"
| Modellreihe: || Junior
|- style="background: #ffffff;"
| Modell: || 4
|-
! colspan="2" | Motor
|- style="background: #ffffff;"
| Hubraum: || 822 cm³
|- style="background: #ffffff;"
| Anzahl Zylinder: || 1
|- style="background: #ffffff;"
| Leistung: || 10,2 kW / 14 PS
|- style="background: #ffffff;"
| Drehmomentanstieg: || XX %
|-
! colspan="2" | Maße und Abmessungen
|- style="background: #ffffff;"
| Länge: || 2560 mm
|- style="background: #ffffff;"
| Breite: || 1460 mm
|- style="background: #ffffff;"
| Höhe: || 1460 mm
|- style="background: #ffffff;"
| Radstand: || 1557 mm
|- style="background: #ffffff;"
| Spurweite: || 1460/1810 mm
|- style="background: #ffffff;"
| Wenderadius (mit/ohne Lenkbremse): || 2750 mm
|- style="background: #ffffff;"
| Eigengewicht: || 845 kg
|-
! colspan="2" | Bauzeit und Stückzahl
|- style="background: #ffffff;"
| Bauzeit: || 1958
|- style="background: #ffffff;"
| Gesamtstückzahl: || 150 Stück
|-
! colspan="2" | Sonstiges
|- style="background: #ffffff;"
| Höchstgeschwindigkeit: || 16,5 km/h
|- style="background: #ffffff;"
| Standardbereifung (vorn / hinten): || 4.50-16 / 8-24
|}
Der Junior 4 war weitestgehend baugleich mit dem Junior K, hatte aber vom Vorgängermodell P111 die Vorderachse und das Getriebe. Auch bei diesem Modell gab es wieder eine kurze und eine lange Ausführung. Der Unterschied in den Abmessungen betrug 15 Zentimeter bei der Länge und beim Radstand. Das Modell Junior 108/4 wurde von Porsche-Diesel als einmalige Kleinserie mit 150 Stück produziert. Danach erwarb die österreicher Firma Hofherr-Schrantz die Lizenz für den Junior 108/4 und baute ihn mit reduzierter Drehzahl als Austro-Junior weiter.
==Bauart==
rahmenlose Blockbauweise
==Motor==
* Porsche-Diesel, Typ: F 108, stehender-luftgekühlter 1-Zylinder-/4-Takt-Wirbelkammer-Diesel mit Druckumlaufschmierung, hängende Ventile, untenliegende-zahnradgetriebene Nockenwelle, Ölbadluftfilter, zweifach-gelagerte Kurbelwelle, Bosch-Einspritzsystem, Fernthermometer und Radial-Kühlgebläse.
* Bohrung = 95 mm, Hub = 116 mm
* Kompressionsdruck = 18 atü
* Verdichtung = 19:1
* Mittlere Kolbengeschwindigkeit = 8,7 m/sec. bei Nenndrehzahl
* Drehmoment = 4,45 mkp bei Nenndrehzahl ( Max. Drehmoment = 4,8 mkp )
* Bosch-Einspritzpumpe, Typ: PF 1 A 60 BS 419/2
* Bosch-Einspritzdüsen, Typ: DN 30 SD 158
* Drehzahl der Ölpumpe = 2500 U/min. bei Nenndrehzahl
* Fördermenge der Ölpumpe = 14,0 l/min. bei Nenndrehzahl
* Drehzahl des Kühlgebläse = 5550 U/min. bei Nenndrehzahl
* Luftfördermenge = 172 l/sec. bei Nenndrehzahl
==Kupplung==
* Einscheiben-Trockenkupplung von Fichtel & Sachs, Typ: K 10 ( K 180 )
==Getriebe==
* Getrag-Zahnrad-Wechselgetriebe
* 4 Vorwärts-, 4 Rückwärtsgänge
==Geschwindigkeiten vor- und rückwärts==
Mit Bereifung 8-24 AS
* Vorwärts: 1.Gang = 3,5 km/h; 2.Gang = 5,5 km/h; 3.Gang = 8,7 km/h; 4.Gang = 16,5 km/h.
* Rückwärts: 1.Gang = 1,7 km/h; 2.Gang = 2,8 km/h; 3.Gang = 4,3 km/h; 4.Gang = 8,2 km/h.
Mit Bereifung 7-30 AS
* Vorwärts: 1.Gang = 3,8 km/h; 2.Gang = 6,1 km/h; 3.Gang = 9,7 km/h; 4.Gang = 18,2 km/h.
* Rückwärts: 1.Gang = 1,9 km/h; 2.Gang = 3,1 km/h; 3.Gang = 4,8 km/h; 4.Gang = 9,1 km/h.
==Antrieb==
Hinterrad
==Zapfwelle==
* Getriebezapfwelle und Wegzapfwelle mit Normprofil, umschaltbar
* 540 U/min. bei 1989 U/min.- Motordrehzahl oder 666 U/min. bei Nenndrehzahl ( Leistung = 12,4 PS )
* Mähantrieb direkt vom Motor = 1038 U/min. bei Nenndrehzahl
* Optional mit aufsteckbarer Riemenscheibe, 180 mm Durchmesser und 100 mm Breite
* Drehzahl = 1827 U/min. bei Nenndrehzahl / Riemengeschwindigkeit = 17,3 m/sec.
==Bremsen==
* Fußbetätigte Innenbackenbremse als Lenkbremse zu verwenden
* Mechanische Getriebe-Handbremse
==Achsen==
* Vorderachse als ausziehbare und in der Spur verstellbare Pendelachse
* Starre Hinterachse als Portalachse
* Achslast vorne = 375 kg, hinten = 470 kg
==Lenkung==
* ZF-Zahnsegmentlenkung
==Hydrauliksystem und Kraftheber==
* Optional mit einfach wirkendem hydraulischem Kraftheber, Typ: Gotec-390 mit Dreipunkt-oder Vierpunktaufhängung
* Zylinder mit 75,5 mm Kolbendurchmesser
* Gotec-Förderpumpe, Typ: ZP 36/2 mit 10 l/min. bei 125 bar und 2870 U/min.
* Max. Hubkraft = 580 kg
* Optional mit Geräterahmen
==Steuergeräte==
==Elektrische Ausrüstung==
* Komplette Bosch-Lichtanlage nach STVZO
* Bosch-Lichtmaschine 12V-75 W; Bosch-Anlasser 12V-1,0 PS; Batterie 12V-56 Ah
==Maße und Abmessungen ==
Länge ..................2600 oder 2750 mm
Breite: ................1460-1810 mm
Höhe: ..................1535-1600 mm
Spurweite: .............1460-1810 mm
Radstand: ..............1550 oder 1700 mm
Bodenfreiheit: ......... ca.365 mm
Kleinster Wenderadius:
mit Lenkbremse ..2750 mm
ohne Lenkbremse . mm
==Eigengewicht==
* Leergewicht = 845 kg
* Zul. Gesamtgewicht = 1580 kg
==Bereifung==
* Serienbereifung vorne = 4,50-15 ASF, hinten = 8-24 AS
* Optional hinten = 7-30 AS
==Füllmengen==
* Tankinhalt = 30 l
* Getriebeöl = 5,0 l
* Motoröl = 4,5 l
* Lenkung = 1,9 l
* Kraftheber = 3,0 l
* Portalachse je Seite = 1,6 l
==Verbrauch==
* Spez. Kraftstoffverbrauch = 185 g/PSh bei Nenndrehzahl
* Spez. Ölverbrauch = 1,5-2,0 g/PSh bei Nenndrehzahl
==Kabine==
* Fahrerplattform mit gefederter Sitzschale und linkem Kotflügelsitz
* Optional mit Fritzmeier-Verdeck, Rückscheinwerfer und rechtem Kotflügelsitz
==Sonstiges==
* Kaufpreis = 4950 DM
==Sonderausrüstung==
* Riemenscheibe, Radzusatzgewichte, zweiter Kotflügelsitz, Verdeck, Rückscheinwerfer, Kraftheber, Mähwerk, Geräterahmen
==Literatur==
==Weblinks==
'''''zurück zur [[Traktorenlexikon:_Porsche-Diesel|Typenübersicht]]'''''
'''''zurück zum [[Traktorenlexikon|Inhaltsverzeichnis]]'''''
lef0v7a1dg58t15wyrljc9x60mxpdj8
Gitarre: Lerne CAGED-Stammtöne
0
117512
1090686
1090643
2026-09-11T08:35:28Z
Mjchael
2222
/* Halbtaktige Sequenzen (2) */
1090686
wikitext
text/x-wiki
{{:Gitarre/ Navi|Sologitarre|
{{:Gitarre: Sologitarre/ Navi Improvisation in Dur und Moll}}|
img=Guitar 1.svg |bg=#F8f8f8|border=darkorange|color=dark|px=80|navi=Einführung in die Sologitarre}}
= Wiederholung der Fingersätze =
; mit Schwerpunkt auf den Stammtönen
Diese Wiederholung ist zum einen dafür gedacht, die vorhergehenden Übungen auf jeder Saitenlage zu machen, und auch in jeder Bundlage, gleichgültig ob die Finger eng beieinander oder weit auseinander stehen. Zum andern sind diese als Vorbereitung in die Sologitarre gedacht. Beispielsweise als Auflockerungsübung zwischen den Barré-Akkorden. Besonderen Augenmerk wollen wir hier auf die Notennamen legen. Diese können hier mitgelernt werden.
Solltest du meinen, das sei noch nicht für dich dran und kann warten, dann springe zur ersten CAGED-Skala. Du kannst beim Kapitel Longform nochmal hierrauf zurückkommen.
* [[Gitarre: CAGED-Skala D-Dur-Form|CAGED-Skala D-Dur-Form]]
Lassen wir die [[Gitarre: Aufbau der CAGED-Skalenformen|erste Lektion]] (insbesondere für die Quereinsteiger) noch einmal Revue passieren.
Die folgenden Übungen enthalten oft eine Folge von ein- oder zweitaktigen Sequenzen. Eine Sequenz ist ein Motiv, dass sich auf verschiedenen Tonhöhen wiederholt.
Auch ohne Notenkenntnisse kannst du den Verlauf und die Wiederholungen der Sequenzen einfacher im Notenbild verfolgen, als in der Tabulatur; insbesondere wenn du dir gleichzeitig die Übung anhörst. Es kommen auch Ausschnitte aus klassischen Stücken, Folksongs, Kinderlieder o.ä. vor. Die einfache Struktur oder der Bekanntheitsgrad der Melodien sollen dir das Üben erleichtern. Die Finger finden so leichter ihre Position, als wenn du erstmal jede einzelne Note aus der Tabulatur entschlüsseln musst.
Jede Übung wird auf allen Saitenlagen geübt. Vorher blieben wir in den mittleren Lagen. Jetzt gehen wir auch in die ersten Bünde, wo man die Finger etwas mehr spreizen muss, und in die höheren Lagen, wo es ein wenig eng wird. Die Stücke wiederholen sich in dieser Lektion in der selben Tonart, doch auf verschiedenen Bünden. Du spielst immer die selbe Tonfolge, nur auf verschiedenen Tonhöhen bzw. auf verschiedenen Saitenlagen. Lediglich zwischen der G- und H-Saite musst du dir jedesmal überlegen, wie sich der Lagewechsel auf den Fingersatz auswirkt. Doch der Fingersatz in den anderen höheren Lagen bleibt immer gleich. Wie die Tonfolgen mit dem CAGED-System zusammenhängen, das muss dich nur am Rande interessieren. Es wird in den folgenden Lektionen näher und ausführlicher erleutert.
:[[Datei:Scala Griffbrett.svg]]
Wir hatten uns bei den vorhergehenden Übungen weitestgehend an den Intervallen (1-j7) und an der Tabulatur orientiert. Diese sind in allen Tonarten gleich.
Suche zuerst das Karré!
Daran orientierst du dich.
:[[Image:Scala Carree.svg]]
{{Tipp|Lerne bei der C-Dur-Tonleiter nicht nur die Intervalle <br>
2 - 3 4 - 5<br>
6 - j7 1 - 2<br>
sondern benenne auch jede einzelne Note. <br>
D - E F - G<br>
A - H C - D<br>
So bekommst du einen recht einfachen Überblick über das Griffbrett.}}
== Töne der C-Dur Tonleiter auf dem Griffbrett ==
Wir wollen uns in dieser Lektion auf die Töne bzw. die Notennamen konzentrieren. Allerdings sparen wir uns vorerst alle Töne mit Vorzeichen aus. Die [[Gitarre: Aufbau der CAGED-Skalenformen|ersten Übungen zum 1. und 2. Fingersatz]] werden auf die Tonart C-Dur bzw. A-Moll übertragen und wir spiele sie in den hier gezeigten Positionen.
Wir fangen mit dem zweiten Fingersatz an, wo wir entweder den Ton C oder den Ton A der C-Dur- bzw. Am-Tonleiter als Orientierung nutzen.
Wir bevorzugen die englischen Notennamen, da diese in der Molltonleiter den Alphabet folgen.
;A BC • D EF
:[[Datei:C-Major-Scale_on_the_fretboard_second_fingering.svg]]
Du hast vermutlich allerlei Akkordformen des CAGED-System gesehen.
<div class="noprint">
;Animation
[[Image:Crd Grundtonschema ani.gif]]
</div>
<score>
<<
\new ChordNames { \chordmode {
c1 c c c c c
}}
\new FretBoards {
% \override FretBoards.FretBoard.size = #'1.5
\override FretBoard.fret-diagram-details.finger-code = #'in-dot
% \override FretBoard.fret-diagram-details.dot-color = #'white
\override FretBoard.fret-diagram-details.orientation =
#'landscape
< c-3 e-2 g c'-1 e' >
< c-1\5 g-3\4 c'-3\3 e'-4\2 g'-1 >
\once \override FretBoard.fret-diagram-details.dot-color = #'white
< c-3\6 e-2\5 g-1\4 c'-1\3 e'-1\2 c''-4\1>
< c-1\6 g-2\5 c'-3\4 e'-4\3 g'-1\2 c''-1\1>
\once \override FretBoard.fret-diagram-details.dot-color = #'white
< c'-1\4 g'-2\3 c''-4\2 e''-3\1 >
< c'-4\5 e'-3\4 g'-1\3 c''-2\2 e''-1\1 >
}
>>
</score>
Wenn du schon Fingerstyle oder Jazz spielst, mögen dir viele der Formen bekannt vorkommen. Doch selbst wenn du bis jetzt nur das [[Gitarre: Rockdiplom|Rockdiplom]] gemacht hast und mit den dort vorkommenden Barré-Akkorden vertraut bist, wirst du sehen, dass die einfachen Barré-Akkorde ausreichen, um sich auf dem Griffbrett zu zurechtzufinden.
Die [[Gitarre: C-Dur-Tonleiter Workshop|C-Dur-Tonleiter in den ersten drei Bünden]] setze ich als bekannt voraus und es sollte dir nicht allzu schwer fallen, diese in den 12. Bund zu übertragen.
:[[Datei:Scala C-Am.svg|150px]][[Datei:C-Dur_Majorpattern_III.jpg|150px]]
C-Dur als Barré im 3. Bund kennst du vom Rockdiplom, und C-Dur im 8. Bund ist auch kein Hexenwerk. Dazwischen liegt nach dem CAGED-System die G-Form, die dir vermutlich noch nicht untergekommen ist (hier mit weißem Fingersatz). Statt uns die Töne von der G-Form abzuleiten, machen wir es uns einfacher und leiten uns die Töne zur Orientierung vom Am im 5. Bund ab. Du erinnerst dich noch an die Dur- und Mollparallelen? (C- \ Am-Tonleiter bzw. G- \ Em-Form). Oder du nutzt die Grundtöne des C-Barré im 8. Bund.
<score>
<<
\new ChordNames { \chordmode {
c1 c c a:m c c
}}
\new FretBoards {
% \override FretBoards.FretBoard.size = #'1.5
\override FretBoard.fret-diagram-details.finger-code = #'in-dot
% \override FretBoard.fret-diagram-details.dot-color = #'white
\override FretBoard.fret-diagram-details.orientation =
#'landscape
< c-3 e-2 g c'-1 e' >
< c-1\5 g-3\4 c'-3\3 e'-4\2 g'-1 >
\once \override FretBoard.fret-diagram-details.dot-color = #'white
< c-3\6 e-2\5 g-1\4 c'-1\3 e'-1\2 c''-4\1>
< a,-1\6 e-3\5 a-4\4 c'-1\3 e'-1\2 a'-1\1 >
< c-1\6 g-2\5 c'-3\4 e'-4\3 g'-1\2 c''-1\1>
< c'-4\5 e'-3\4 g'-1\3 c''-2\2 e''-1\1 >
}
>>
</score>
Leite dir also die Grundtöne C und A von den dir bekannten Barré-Akkorden ab und spare dir die ungewöhnlicheren Akkordformen auf, bis sie dir später beim Fingerstyle oder Jazz begegnen. Es macht dabei garnichts aus, wenn du zum Auffinden der Grundtöne und zum Finden des Starttons ein paar Sekunden brauchst. Du wirst sehen, dass die Wiederholungen der bekannten Übungen auf den verschiedenen Bünden und in verschiedenen Oktavebereichen leicht von der Hand gehen. Lediglich beim Lagewechsel zwischen der G- und H-Saite musst du etwas überlegen.
<score>
<<
\new ChordNames { \chordmode {
c1 c c a c c
}}
\new FretBoards {
% \override FretBoards.FretBoard.size = #'1.5
\override FretBoard.fret-diagram-details.finger-code = #'in-dot
% \override FretBoard.fret-diagram-details.dot-color = #'white
\override FretBoard.fret-diagram-details.orientation =
#'landscape
< c-3 c'-1 >
< c-1\5 c'-3\3 >
\once \override FretBoard.fret-diagram-details.dot-color = #'white
< c-3\6 c'-1\3 c''-4\1>
< a,-1\6 a-4\4 a'-1\1 >
< c-1\6 c'-3\4 c''-1\1>
< c'-4\5 c''-2\2 >
}
>>
</score>
Diese wenigen"Eckpunkte" reichen aus, um dich grob auf dem Griffbrett zurechtzufinden. Suche sie noch einmal in der Skala und natürlich auch auf deinem Griffbrett.
:[[Datei:C-Major-Scale on the fretboard.svg]]
== Zweiter Fingersatz ==
:[[Datei:Scala 6_71-2_34.svg]]
Zuerst suchen wir uns in der C-Dur-Tonleiter überall den zweiten Fingersatz heraus.
:[[Datei:C-Major-Scale_on_the_fretboard_second_fingering.svg]]
Zur leichteren Orientierung wird die Grafik bei jeder neuen Melodie wiederholt.
=== Rondeau (Auszug) ===
Die eintaktige Sequenzen wurde aus einem Rondeau von J.S. Bach entnommen, dass beliebig wiederholt werden kann. Der Grundton C, welcher im letzten Takt rot eingefärbt wurde, wird mit dem kleinen Finger gegriffen.
Du kannst tatsächlich die Noten nutzen (sofern du es schon kannst) oder aber du orientierst dich an den Notennamen.
Am Anfang des Griffbrettes brauchen wir den zweiten Fingersatz nicht vollständig.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (C-Form) in C-Dur"
subtitle="Rondeau (Auszug)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
% \set TabStaff.minimumFret = #5
% \set TabStaff.restrainOpenStrings = ##t
\key c \major
\repeat volta 2 {
e8 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
}
\once \override NoteHead #'color = #red c1^\markup { \bold {(C)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
In der A-(Bb-)Form müssen wir den Lagewechsel zwischen der G- und H-Saite beachten. Übrigens werden hier die Töne in der englischen Form angegeben. (Bb-Form und der Ton B statt des deutschen H.) Nur der erste Bund wird bis zur letzten Note in der dritten Lage gespielt. Der Rest bis zur letzten Note in der zweiten Lage.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (A-, Bb-Form) in C-Dur"
subtitle="Rondeau (Auszug)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\key c \major
\repeat volta 2 {
e8-2 d e f e d c e-4
d-2 c d e d c b d
c b c d c b a c
b a b c d b c d-1
}
\once \override NoteHead #'color = #red c1^\markup { \bold {(C)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Statt in der G-Form das C zu suchen, suche lieber das A im 5. Bund (hier grün hervorgehoben). Oder du leitest dir das C vom Barré im 8. Bund ab. Der Startton E ist auf der A Saite im 7. Bund unter dem Ringfinger. Ansonsten stellt der Fingersatz keine Herausforderung mehr dar.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (G-Form) in C-Dur"
subtitle="Rondeau (Auszug)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #5
\set TabStaff.restrainOpenStrings = ##t
\key c \major
\repeat volta 2 {
e8-2 d e f e d c e
d c d e d c b d
c b c d c b \once \override NoteHead #'color = #green a c
b a b c d b c d
}
\once \override NoteHead #'color = #red c1^\markup { \bold {(C)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Der kleine Finger des C-Barré im 8. Bund in der E- bzw. F-Form gibt gleichzeitig das C des zweiten Fingersatz an. Du siehst, dass ab jetzt alles leichter geworden ist, weil sich ansonsten nichts mehr am Fingersatz ändert.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (E- F-Form) in C-Dur"
subtitle="Rondeau (Auszug)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key c \major
\repeat volta 2 {
e8-2 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
}
\once \override NoteHead #'color = #red c1^\markup { \bold {(C)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8-2 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Für den Grundton C müssen wir uns die D-Form gar nicht so genau ins Gedächtnis rufen, wenn uns die C-Form viel vertrauter ist.
Diese hohe Lage ist für E-Gitarristen oder Gitarren mit Cutaway gedacht. Auf der Konzertgitarre ist die sehr hohe Lage schlecht zu spielen. Gehe ggf. einen Kompromiss ein, und spiele diese hohe Saitenlage ein paar Bünde tiefer als Übung nur für den Fingersatz aber nicht für die Notennamen.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (D-Form) in C-Dur"
subtitle="Rondeau (Auszug)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key c \major
\repeat volta 2 {
e8-2 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
}
\once \override NoteHead #'color = #red c1^\markup { \bold {(C)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Noten über dem hohen C (der mit zwei Hilfslinien) wird dir seltener begegnen, da in dem Fall bevorzugt die Noten nach unten oktaviert werden. (Beachte die 8 im Notensystem.) Bei den weiteren Übungen werden jedoch die Versionen mit den vielen Hilfslinien angezeigt.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (D-Form) in C-Dur"
subtitle="Rondeau (Auszug)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key c \major
\repeat volta 2 {
\ottava #1 e8-2 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
}
\once \override NoteHead #'color = #red c1^\markup { \bold {(C)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Mit der C-Form in den ersten drei Bünden im Hinterkopf ist der 12. Bund leicht zu bewältigen. Wieder eine Übung, die weniger für Konzertgitarren geeignet ist.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (C-Form) in C-Dur"
subtitle="Rondeau (Auszug)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key c \major
\repeat volta 2 {
e8-2 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
}
\once \override NoteHead #'color = #red c1^\markup { \bold {(C)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 d e f e d c e
d c d e d c b d
c b c d c b a c
b a b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
=== "Das häßliche Entlein" oder "Alle meine Entchen"<ref>Anspielung auf ein Märchen der Gebrüder Grimm nebst einem bekannten deutschen Kinderlied.</ref> in A-Moll ===
Die vorherige Übung war in Dur, und hier verwenden wir ein und den selben Fingersatz in Moll. Wie du siehst und hörst, lässt sich ein Fingersatz oder ein Pattern nicht eindeutig einer einzigen Tonart zuordnen. Der Schlusston oder der Schlussakkord (hier der Ton A bzw. der Akkord Am) bestimmt die Tonart. Der Grundton A ist hier die Sexte (6) des zugrunde liegenden C-Major-Pattern. Es bleibt dir überlassen, ob du zur Orientierung lieber den Grundton A (grün) bestimmst, oder das C aus dem Karré (rot).
Wenn in einer Tabulatur über einer Ziffer zwei Notenhälse stehen, so ist das ein Zeichen für eine halbe Note, die zwei Schläge dauert. Da dieses für viele Gitarristen sehr ungewöhnlich aussieht, verzichtet man oft auf Taktstriche in der Tabulatur. In dem Fall lässt sich die Tondauer allein an den Notenwerten ablesen.
:[[Datei:C-Major-Scale_on_the_fretboard_second_fingering.svg]]
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (C-/Am-Form) in Am"
subtitle="Das häßliche Entlein"
subsubtitle="oder: Alle meine Entchen in Moll"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
% \set TabStaff.minimumFret = #5
% \set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4 b
\once \override NoteHead #'color = #red
c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Der Lagewechsel zwischen der G- und H-Saite ist hier leicht zu bewältigen.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (Gm-/Bb-Form) in Am"
subtitle="Das häßliche Entlein"
subsubtitle="oder: Alle meine Entchen in Moll"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4-1 b
\once \override NoteHead #'color = #red
c d-1 e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2-4 c
b4 b b b a1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Auch hier ist es wieder einfacher das A (grün) zu suchen.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (Em-/G-Form) in Am"
subtitle="Das häßliche Entlein"
subsubtitle="oder: Alle meine Entchen in Moll"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #5
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4-1 b
\once \override NoteHead #'color = #red
c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (E- / F-Form) in Am"
subtitle="Das häßliche Entlein"
subsubtitle="oder: Alle meine Entchen in Moll"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4-1 b
\once \override NoteHead #'color = #red
c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Statt lange nach dem Grundton der D-Form zu suchen, erinneren wir uns kurz, wo der Grundton C auf der H- (B-)Saite sein muß (13. Bund).
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (D-Form) in Am"
subtitle="Das häßliche Entlein"
subsubtitle="oder: Alle meine Entchen in Moll"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4-1 b
\once \override NoteHead #'color = #red
c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (C-Form) in Am"
subtitle="Das häßliche Entlein"
subsubtitle="oder: Alle meine Entchen in Moll"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4-1 b
\once \override NoteHead #'color = #red
c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b c d e2 e f4 f f f e1
f4 f f f e1 d4 d d d c2 c
b4 b b b a1
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
=== Die Moldau (Hauptmotiv) ===
Die Abfolge der Töne der folgenden Übung unterscheidet sich kaum von der vorhergehenden. Doch mit dem anderen Rhythmus haben wir das Hauptmotiv von der Komposition {{Youtube-Suche|Smetana+Die+Moldau|"Die Moldau" von Bedrich Smetana}} (ohne Auftakt und rhythmisch vereinfacht).
Auch wenn es hier (wie in der 7. Übung) nur die Molltonleiter rauf und runter geht, merkst du hoffentlich, wieviel der Takt und Rhythmus an der Wirkung ausmacht. Wenn du später mal meinst, deine Improvisationen hören sich langweilig an, dann solltest du dich mehr mit Rhythmus beschäftigen. Dazu kannst du dich auch ein wenig mit Schlagmustern beschäftigen.
:[[Datei:C-Major-Scale_on_the_fretboard_second_fingering.svg]]
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (Am-Form) in Am"
subtitle="Die Moldau (Hauptmotiv)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
% \set TabStaff.minimumFret = #2
% \set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4 b8
\once \override NoteHead #'color = #red
c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 6/8
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b8 c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Warum die Form hier Gm-Form genannt wird, das wird dir in den nachfolgenden Lektionen klarer werden. Auf Fingersatzangaben können wir hier verzichten, wenn du vorher "Alle meine Entchen in Am" gespielt hast.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (Bb- /Gm-Form) in Am"
subtitle="Die Moldau (Hauptmotiv)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4 b8
\once \override NoteHead #'color = #red
c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 6/8
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b8 c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Hier bietet sich besonders an, den Am-Barré zur Orientierung zu verwenden.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (Em-Form) in Am"
subtitle="Die Moldau (Hauptmotiv)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #5
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4 b8
\once \override NoteHead #'color = #red
c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 6/8
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b8 c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Auch hier gibt dir der kleine Finger des Am-Barrés den Grundton an. Du kannst dir die Dm-Form aber auch über die F-Form (C im 8. Bund) ableiten.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (F- /Dm-Form) in Am"
subtitle="Die Moldau (Hauptmotiv)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4 b8
\once \override NoteHead #'color = #red
c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 6/8
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b8 c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Zähle vom C (H-Saite, 13. Bund) rückwärts zum A.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (D- /Bm7-Form) in Am"
subtitle="Die Moldau (Hauptmotiv)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4 b8
\once \override NoteHead #'color = #red
c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 6/8
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b8 c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Hier wird die erste Übung in den 12. Bund verschoben.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="2. Fingersatz (C- /Am-Form) in Am"
subtitle="Die Moldau (Hauptmotiv)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key a \minor
\once \override NoteHead #'color = #green
a4 b8
\once \override NoteHead #'color = #red
c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 6/8
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
a4 b8 c4 d8 e4. e4. f4. f4. e2.
d4. d4. c4 d8 c4. b4. b4. a2.
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
==1. Fingersatz==
Dir wird wohl aufgefallen sein, dass beim zweiten Fingersatz der Ton G fehlt. Den üben wir mit dem ersten Fingersatz.
:[[Datei:Scala 71_2-34_5.svg]]
Beachte, dass der Grundton (1) unter dem Ringfinger (also im zweiten Bund dieses Fingersatzes) ist, und dass du deine freie Improvisationsübung in Dur günstigerweise mit der (1) beginnen oder zumindest enden sollte.
Diesen Fingersatz suchen wir in der C-Dur-Tonleiter auf dem Griffbrett.
:[[Datei:C-Major-Scale_on_the_fretboard_first_fingering.svg]]
=== Eintaktige Sequenzen ===
Du wirst feststellen, dass sich die Sequenzen recht schnell lernen lassen.
==== 1. Fingersatz • C-Form (open) ====
Die erste Lage mit leeren Saiten stellt noch keine Herausforderung dar.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Eintaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
% \set TabStaff.minimumFret = #2
% \set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
\once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
==== 1. Fingersatz • A- (Bb-)Form ====
Du musst noch nicht einmal den C-Barré im 3. Bund bemühen, um den Grundton zu finden. Die C-Dur-Tonleiter in den ersten drei Bünden reicht. Natürlich kannst du auch den Startton G suchen. Die Tabulatur sagt dir "D-Saite 5. Bund". Erinnere dich daran, dass dies der Stimmton der D-Saite ist (beim Stimmen nach Bünden). Auch hier ist der Fingersatz leicht.
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • A- (Bb-)Form
<score raw="1">
\version "2.14.2"
\markup {
\override #'(size . 3.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 4 2 3 darkgrey )
(place-fret 4 3 4 yellow3 )
(place-fret 4 5 5 darkgrey )
(place-fret 5 2 "j7" yellow3 )
(place-fret 5 3 1 black )
(place-fret 5 5 2 darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (A- (Bb)-Form) in C-Dur"
subtitle="Eintaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8-4 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
\once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
==== 1. Fingersatz • G-Form ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • G-Form
<score raw="1">
\version "2.14.2"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 2 5 3 darkgrey )
(place-fret 2 6 4 yellow3 )
(place-fret 2 8 5 darkgrey )
(place-fret 3 4 "j7" yellow3 )
(place-fret 3 5 1 black )
(place-fret 3 7 2 darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
Bei der G-Form kommt es zwischen der G- und H-Saite zu einem Lagewechsel. Du musst dir jedesmal eine Strategie zurechtlegen, wann und wie du am besten den Lagewechsel durchführst.
Wenn du Glück hast, findest du im Notenbild einen Hinweis, wie man günstig die Lage wechseln kann. Ich empfehle dir dort wo die 2 über den Noten steht, den Mittelfinger zu nehmen.
*(1 = Z, 2 = M, 3 = R, 4 = K, 0 = leere Saite)
Betrachte solche Hinweis nur als Vorschlag, denn es gibt keine verbindliche Regel, wie der Lagewechsel zu erfolgen hat. Übst du die gleiche Sequenzen ein paar Saiten höher oder tiefer, geht es leichter von der Hand.
Beachte den Lagewechsel zwischen der G- und H-Saite. Den Grundton C kannst du dir auch vom Ringfinger auf der G-Saite des C-Barrés ableiten.
Du musst dir hier eine Strategie zurechtlegen, wann du den Lagewechsel durchführen möchtest. Ich empfehle hier, den Lagewechsel so früh wie möglich zu machen, damit du den Zeigefinger frei hast, um gleich hintereinander zwei Töne in einem Bund zu spielen. Betrachte die Angaben zum Fingersatz nur als Vorschlag.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (G-Form) in C-Dur"
subtitle="Eintaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #4
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8-4 f e f g e f g
f e d-4 e-2 f-3 d e f
e d c d e c-1 d-4 e-2
d c b c d b c d
\once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
Hier eine alternative Lösung. Du kannst einen kleinen Barré über die Noten C und E legen, und den Lagewechsel später ausführen. Das V unter dem C zeigt hier den 5. Bund an, und nicht etwa Abschläge. Der Lagewechsel erfolgt hier im letzten Takt.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (G-Form) in C-Dur"
subtitle="Eintaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #4
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8-4 f e f g e f g
f e d e f d e f
e d-2
\textSpannerDown
\override TextSpanner.bound-details.left.text = "V"
c-1\startTextSpan
d e-1 c-1 d e-1\stopTextSpan
d-4 c b c d b c d
\once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 1. Fingersatz • E- (F-)Form ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • E- (F-)Form
<score raw="1">
\version "2.24.4"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 5 7 3 darkgrey )
(place-fret 5 8 4 yellow3 )
(place-fret 5 10 5 darkgrey )
(place-fret 6 7 "j7" yellow3 )
(place-fret 6 8 1 black )
(place-fret 6 10 2 darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
Den Grundton C auf der E-Saite kannst du dir vom C-Barré der E-Form (wie ein F- Barré) im 8. Bund ableiten. Der Fingersatz ist wieder einfach.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (E-(F)-Form) in C-Dur"
subtitle="Eintaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
\once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 1. Fingersatz • D-Form ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • D-Form
<score raw="1">
\version "2.14.2"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 3 9 3 darkgrey )
(place-fret 3 10 4 yellow3 )
(place-fret 3 12 5 darkgrey )
(place-fret 4 9 "j7" yellow3 )
(place-fret 4 10 1 black )
(place-fret 4 12 2 darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>Die Tonhöhe ist die selbe, wie in der G-Form, wo wir uns komplizierte Strategien für den Fingersatz zurechtlegen mussten. In dieser Lage ist alles einfacher. Wenn du später mal einen herausfordernden Lick zwischen der G- und H-Saite hast, wäre eine weitere gangbare Strategie den Lick in eine fingertechnisch günstigere Lage zu verlegen.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (D-Form) in C-Dur"
subtitle="Eintaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
\once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
==== 1. Fingersatz • C-Form ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • C-Form
<score raw="1">
\version "2.24.4"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 1 12 3 darkgrey )
(place-fret 1 13 4 yellow3 )
(place-fret 1 15 5 darkgrey )
(place-fret 2 12 "j7" yellow3 )
(place-fret 2 13 1 black )
(place-fret 2 15 2 darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div> Hier wurde die C-Durtonleiter in den 12. Bund verlegt. Der Grundton ist auf der H-Saite im 13. Bund. (Eine Oktave höher als bei der C-Dur Tonleiter in den ersten drei Bünden.) Wer keine E-Gitarre hat oder wer keine Akkustik mit Cutaway hat, der kann die C-Form auch in einem niedrigeren Bund üben.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Eintaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c''' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
\once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 f e f g e f g
f e d e f d e f
e d c d e c d e
d c b c d b c d
c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
=== Halbtaktige Sequenzen ===
Diesmal hast du halbtaktige Sequenzen, die einmal wiederholt werden.
:[[Datei:C-Major-Scale_on_the_fretboard_first_fingering.svg]]
==== C-Form (open) • 1. Fingersatz ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
% \set TabStaff.minimumFret = #2
% \set TabStaff.restrainOpenStrings = ##t
\key c \major
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b \once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
==== A- (Bb-)Form • 1. Fingersatz ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • A- (Bb-)Form
<score raw="1">
\version "2.14.2"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 4 2 "E" darkgrey )
(place-fret 4 3 "F" yellow3 )
(place-fret 4 5 "G" darkgrey )
(place-fret 5 2 "B" yellow3 )
(place-fret 5 3 "C" black )
(place-fret 5 5 "D" darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
Leite dir den Grundton vom C-Dur-Akkord, oder vom C-Barré im 3. Bund ab. Lerne nicht nur die Intervlle, sondern auch die Notennamen. (Zumindest bei den einfachen Tonarten F-, G- und C-Dur). Andere Tonarten kommen später dran.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (A- / Bb-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b \once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== G-Form • 1. Fingersatz ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • G-Form
<score raw="1">
\version "2.14.2"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 2 5 "E" darkgrey )
(place-fret 2 6 "F" yellow3 )
(place-fret 2 8 "G" darkgrey )
(place-fret 3 4 "B" yellow3 )
(place-fret 3 5 "C" black )
(place-fret 3 7 "D" darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>Du kannst die beiden hintereinander folgenden Noten im 5. Bund mit einem Mini-Barré ausführen, und die Lagewechsel mittels Slide (= Glissando) durchführen, oder wie in der Wiederholung ohne Slide durchführen.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (G-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #4
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8-1 g' f e d f e d
c-1 e-1 d c-1(\glissando b-1) d c b-1(\glissando c1-1)
c8-2 g' f e d f e d
c-1 e-2 d-4 c b d c b \once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== E- (F-)Form • 1. Fingersatz ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • E- (F-)Form
<score raw="1">
\version "2.24.4"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 5 7 "E" darkgrey )
(place-fret 5 8 "F" yellow3 )
(place-fret 5 10 "G" darkgrey )
(place-fret 6 7 "B" yellow3 )
(place-fret 6 8 "C" black )
(place-fret 6 10 "D" darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
Fingersatztechnisch wieder problemlos.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (E- (F-)Form) in C-Dur"
subtitle="Halbtaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b \once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== D-Form • 1. Fingersatz ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • D-Form
<score raw="1">
\version "2.14.2"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 3 9 "E" darkgrey )
(place-fret 3 10 "F" yellow3 )
(place-fret 3 12 "G" darkgrey )
(place-fret 4 9 "B" yellow3 )
(place-fret 4 10 "C" black )
(place-fret 4 12 "D" darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
Wieder klingt diese Lage genau so, wie die G-Form, ist aber vom Fingersatz her einfacher.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (D-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b \once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== C-Form • 1. Fingersatz ====
<div style="float:left; padding:5px;margin:5px; border:black solid 1px; ">
;1. Fingersatz • C-Form
<score raw="1">
\version "2.24.4"
\markup {
\override #'(size . 4.0) {
\override #'(fret-diagram-details . (
(orientation . landscape )
(finger-code . in-dot )
(dot-color . #'black)
(dot-radius . 0.4)
(dot-position . 0.5)
(top-fret-thickness . 6)
(fret-count . 3)
(number-type . roman-upper)
))
\fret-diagram-verbose #'(
(place-fret 1 12 "E" darkgrey )
(place-fret 1 13 "F" yellow3 )
(place-fret 1 15 "G" darkgrey )
(place-fret 2 12 "B" yellow3 )
(place-fret 2 13 "C" black )
(place-fret 2 15 "D" darkgreen )
)
}}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div> Die H-Saite heißt auch im 12. Bund H, also ist im 13. Bund das C. Wer keine E-Gitarre hat oder wer keine Akkustik mit Cutaway hat, der kann die C-Form auch in einem niedrigeren Bund üben.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b \once \override NoteHead #'color = #red c1
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 g' f e d f e d
c e d c b d c b c1
c8 g' f e d f e d
c e d c b d c b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
=== Ein Vogel wollte Hochzeit machen ===
Hier habe ich ein relativ bekanntes Kinderlied gefunden, dass perfekt zum 1. Fingersatz passt. Die Tondauern sind für Ungeübte in Sachen Noten schwer herauszulesen. Kennst du aber das Stück, oder hörst du es dir mehrmals an, so ist es keine unüberwindbare Schwierigkeit.
:[[Datei:C-Major-Scale_on_the_fretboard_first_fingering.svg]]
==== C-Form (open) • Ein Vogel ====
Folgt das G nach dem D, greifst du den besser mit dem kleinen Finger.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Ein Vogel wollte Hochzeit machen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
% \set TabStaff.minimumFret = #2
% \set TabStaff.restrainOpenStrings = ##t
\key c \major
r2. r8 e8 |
g8 e g e f d f d |
e c g' e d-3( g-4) g g16 e |
c8 8 8 g'16 e d8 d d-3 g16-4 f |
e8 c d b \once \override NoteHead #'color = #red c4 r4
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 |
g8 e g e f d f d |
e c g' e d_g g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== A- (Bb-)Form • Ein Vogel ====
Hier kannst du auch versuchen, den kleinen Finger umzulegen, wenn du nach dem D den G greifen willst.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (A- (Bb-)Form) in C-Dur"
subtitle="Ein Vogel wollte Hochzeit machen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\key c \major
r2. r8 e8 |
g8 e g e f d f d |
e c g' e d-3( g-4) g g16 e |
c8 8 8 g'16 e d8-3 d d g16-4 f |
e8 c d b \once \override NoteHead #'color = #red c4 r4
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 |
g8 e g e f d f d |
e c g' e d_g g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== G-Form • Ein Vogel ====
Wenn zwei Töne im selben Bund sind, kann man entweder einen Minibarré spielen, oder ein Finger muss vorübergehend seine bevorzuge Position verlassen.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (G-Form) in C-Dur"
subtitle="Ein Vogel wollte Hochzeit machen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #4
\set TabStaff.restrainOpenStrings = ##t
\key c \major
r2. r8 e8 |
g8 e g e f d f d |
e-2 c-1 g' e d( g) g g16 e-2 |
c8-1 8 8 g'16 e d8 d d g16 f |
e8-2 c-1 d b \once \override NoteHead #'color = #red c4 r4
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 |
g8 e g e f d f d |
e c g' e d_g g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== E- (F-)Form • Ein Vogel ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (E- (F-)Form) in C-Dur"
subtitle="Ein Vogel wollte Hochzeit machen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key c \major
r2. r8 e8 |
g8 e g e f d f d |
e c g' e d( g) g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b \once \override NoteHead #'color = #red c4 r4
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 |
g8 e g e f d f d |
e c g' e d_g g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== D-Form • Ein Vogel ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (D-Form) in C-Dur"
subtitle="Ein Vogel wollte Hochzeit machen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key c \major
r2. r8 e8 |
g8 e g e f d f d |
e c g' e d( g) g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b \once \override NoteHead #'color = #red c4 r4
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 |
g8 e g e f d f d |
e c g' e d_g g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== C-Form • Ein Vogel ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Ein Vogel wollte Hochzeit machen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key c \major
r2. r8 e8 |
g8 e g e f d f d |
e c g' e d( g) g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b \once \override NoteHead #'color = #red c4 r4
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
e8 |
g8 e g e f d f d |
e c g' e d_g g g16 e |
c8 8 8 g'16 e d8 d d g16 f |
e8 c d b c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
=== Halbtaktige Sequenzen (2) ===
:[[Datei:C-Major-Scale_on_the_fretboard_first_fingering.svg]]
==== 1. Fingersatz - C-Form (offen) ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen (2)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
% \set TabStaff.minimumFret = #2
% \set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 e f g f d e f
e c d e d b c d \once \override NoteHead #'color = #red c1
g'8 e f g f d e f
e c d e d b c d \once \override NoteHead #'color = #red c1^\markup { \bold {(C5)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 e f g f d e f
e c-2 d e d b c d c
g'8 e f g f d e f
e c-2 d e d b c d c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 1. Fingersatz - A- (Bb-)Form ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (A- (Bb-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen (2)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 e f g f d e f
e c d e d b c d \once \override NoteHead #'color = #red c1
g'8 e f g f d e f
e c d e d b c d \once \override NoteHead #'color = #red c1^\markup { \bold {(C5)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 e f g f d e f
e c-2 d e d b c d c
g'8 e f g f d e f
e c-2 d e d b c d c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 1. Fingersatz - G-Form ====
Bei der G-Form kommt es zwischen der G- und H-Saite zu einem Lagewechsel. Du musst dir jedesmal eine Strategie zurechtlegen, wann und wie du am besten den Lagewechsel durchführst.
Wenn du Glück hast, findest du im Notenbild einen Hinweis, wie man günstig die Lage wechseln kann. Ich empfehle dir dort wo die 2 über den Noten steht, den Mittelfinger zu nehmen.
*(1 = Z, 2 = M, 3 = R, 4 = K, 0 = leere Saite)
Betrachte solche Hinweis nur als Vorschlag, denn es gibt keine verbindliche Regel, wie der Lagewechsel zu erfolgen hat. Übst du die gleiche Sequenzen ein paar Saiten höher oder tiefer, geht es leichter von der Hand.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (G-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen (2)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #4
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 e f g f d e f
e c-2 d e d b c d \once \override NoteHead #'color = #red c1
g'8 e f g f d e f
e c-2 d e d b c d \once \override NoteHead #'color = #red c1^\markup { \bold {(C5)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 e f g f d e f
e c-2 d e d b c d c
g'8 e f g f d e f
e c-2 d e d b c d c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 1. Fingersatz - E- (F-)Form ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (E- (F-)Form) in C-Dur"
subtitle="Halbtaktige Sequenzen (2)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 e f g f d e f
e c-2 d e d b c d \once \override NoteHead #'color = #red c1
g'8 e f g f d e f
e c-2 d e d b c d \once \override NoteHead #'color = #red c1^\markup { \bold {(C5)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 e f g f d e f
e c-2 d e d b c d c
g'8 e f g f d e f
e c-2 d e d b c d c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 1. Fingersatz - D-Form ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (D-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen (2)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 e f g f d e f
e c-2 d e d b c d \once \override NoteHead #'color = #red c1
g'8 e f g f d e f
e c-2 d e d b c d \once \override NoteHead #'color = #red c1^\markup { \bold {(C5)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 e f g f d e f
e c-2 d e d b c d c
g'8 e f g f d e f
e c-2 d e d b c d c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 1. Fingersatz - C-Form ====
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Halbtaktige Sequenzen (2)"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c''' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key c \major
g8 e f g f d e f
e c-2 d e d b c d \once \override NoteHead #'color = #red c1
g'8 e f g f d e f
e c-2 d e d b c d \once \override NoteHead #'color = #red c1^\markup { \bold {(C5)} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
g8 e f g f d e f
e c-2 d e d b c d c
g'8 e f g f d e f
e c-2 d e d b c d c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
=== Einsingen ===
Diese beiden Motive kennen viele, die schon einmal in einem Chor gesungen haben. Leider entsprechen viele Lieder in ihrem Tonumfang nicht genau einem der vollständigen drei Fingersätze oder der später folgenden Skalen. Zumeist werden nur Ausschnitte aus den Patterns gebraucht. Im ersten Motiv fehlt beispielsweise die große Septime (j7) vor dem Grundton.
Dafür enthält das zweite Motiv die große Septime (j7). Das zweite Motiv eicht den Chor auf die gerade geforderte Tonart. Hier werden nur Akkordtöne in einer auf oder absteigenden Tonfolge gespielt (auch Arpeggios genannt). Der A7-Akkord enthält sowohl den Leitton (j7) der zum Grundton (1) hin leitet, als auch den Strebeton (4) die zur Durterz (3) hin strebt. Mit den zwei spannungsreichen Tönen, die sich zum Grundakkord auflösen wollen, wird der Chor auf die Durtonart eingenordet. Hier brauche ich dir nicht zu erklären, wo der Grundton D ist.
:[[Datei:C-Major-Scale_on_the_fretboard_first_fingering.svg]]
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Einsingen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
% \set TabStaff.minimumFret = #2
% \set TabStaff.restrainOpenStrings = ##t
\key c \major
c8^\markup { \bold {C} } d e f g f e d | c1
c8 d e f g f e d | \once \override NoteHead #'color = #red c1
\break
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b | c1^\markup { \bold {C} }
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b |
\set TabStaff.minimumFret = #0
\once \override NoteHead #'color = #red c1^\markup { \bold {C} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 d e f g f e d | c1
c8 d e f g f e d c1
\break
c4 e8 g | f4 d8 b | c1
c4 e8 g | f4 d8 b | c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (A-(Bb-)Form) in C-Dur"
subtitle="Einsingen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8^\markup { \bold {C} } d e f g f e d | c1
c8 d e f g f e d | \once \override NoteHead #'color = #red c1
\break
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b | c1^\markup { \bold {C} }
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b |
\set TabStaff.minimumFret = #0
\once \override NoteHead #'color = #red c1^\markup { \bold {C} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 d e f g f e d | c1
c8 d e f g f e d c1
\break
c4 e8 g | f4 d8 b | c1
c4 e8 g | f4 d8 b | c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (G-Form) in C-Dur"
subtitle="Einsingen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #4
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8^\markup { \bold {C} } d e f g f e d | c1
c8 d e f g f e d | \once \override NoteHead #'color = #red c1
\break
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b | c1^\markup { \bold {C} }
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b |
\set TabStaff.minimumFret = #0
\once \override NoteHead #'color = #red c1^\markup { \bold {C} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 d e f g f e d | c1
c8 d e f g f e d c1
\break
c4 e8 g | f4 d8 b | c1
c4 e8 g | f4 d8 b | c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (E-(F-)Form) in C-Dur"
subtitle="Einsingen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8^\markup { \bold {C} } d e f g f e d | c1
c8 d e f g f e d | \once \override NoteHead #'color = #red c1
\break
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b | c1^\markup { \bold {C} }
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b |
\set TabStaff.minimumFret = #0
\once \override NoteHead #'color = #red c1^\markup { \bold {C} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 d e f g f e d | c1
c8 d e f g f e d c1
\break
c4 e8 g | f4 d8 b | c1
c4 e8 g | f4 d8 b | c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (D-Form) in C-Dur"
subtitle="Einsingen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8^\markup { \bold {C} } d e f g f e d | c1
c8 d e f g f e d | \once \override NoteHead #'color = #red c1
\break
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b | c1^\markup { \bold {C} }
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b |
\set TabStaff.minimumFret = #0
\once \override NoteHead #'color = #red c1^\markup { \bold {C} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 d e f g f e d | c1
c8 d e f g f e d c1
\break
c4 e8 g | f4 d8 b | c1
c4 e8 g | f4 d8 b | c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="1. Fingersatz (C-Form) in C-Dur"
subtitle="Einsingen"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key c \major
c8^\markup { \bold {C} } d e f g f e d | c1
c8 d e f g f e d | \once \override NoteHead #'color = #red c1
\break
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b | c1^\markup { \bold {C} }
c4^\markup { \bold {C} } e8 g | f4^\markup { \bold {G7} } d8 b |
\set TabStaff.minimumFret = #0
\once \override NoteHead #'color = #red c1^\markup { \bold {C} }
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant \addlyrics {
c8 d e f g f e d | c1
c8 d e f g f e d c1
\break
c4 e8 g | f4 d8 b | c1
c4 e8 g | f4 d8 b | c
}
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
<br>
==Erste über den zweiten Fingersatz==
Wie du siehst, kommt hier jedesmal zuerst der erste Fingersatz mit dem "Karree" rechts, und dannach kommt der Fingersatz mit dem "Karree" links. Sie sind immer untereinander. Nur zwischen der G- und B-Saite verschiebt sich alles um einen Bund.
<div style="float:left; padding:5px; border:black solid 1px; ">
;F-Form
<score raw="1">
\version "2.14.2"
\paper{
indent=0\mm
line-width=120\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
%% s:3 = 3x so groß
%% f:1 zeigt Finger als Kreise
%% f:2 zeigt Finger neben den Saiten
%% 6-3-2 Saite-Bund-Finger
%% 4-o zeigt 4. Saite offen
\fret-diagram #"s:2;f:1;
3-3-2;3-5-3;3-6-4;
4-3-6;4-5-7;4-6-1;
5-3-3;5-4-4;5-6-5;
6-3-7;6-4-1;6-6-2;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; border:black solid 1px; ">
;Bb-Form
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:2;f:1;
2-4-2;2-6-3;2-7-4;
3-3-6;3-5-7;3-6-1;
4-3-3;4-4-4;4-6-5;
5-3-7;5-4-1;5-6-2;
"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; border:black solid 1px; ">
;D-Form
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:2;f:1;
1-4-2;1-6-3;1-7-4;
2-4-6;2-6-2;2-7-1;
3-3-3;3-4-4;3-6-5;
4-3-7;4-4-1;4-6-2;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
{{clear}}
=== Jamaica Farewell ===
Die Melodie von [[Liederbuch/ Jamaica Farwell|Jamaica Farwell]] wurde erheblich vereinfacht, damit du dir nicht zu viele Gedanken um den Rhythmus machen musst. Wenn du dich am Quintillo (dem Rhythmus vom Lagerfeuerschlag} orientierst, solltest du wenige Probleme haben. Es gibt recht viele Wiederholung. Die Strophe wurde bei der Wiederholung in die Oktave verschoben, damit das Stück exakt in den Skalenausschnitt passt. Du musst dir für die Fingersätze ggf. Strategien zurechtlegen, damit du die Finger bequem sortiert bekommst.
Das Stück beginnt mit dem Ton G. Der (5) in 1. Fingersatz.
;Bb-Form
Greife den C wie ein Bb-Barré im 3. Bund. Leite dir von diesem Akkord den Grundton (1) ab, und wandere beim 1. Fingersatz rauf zum Startton G (5).
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:1.5;f:1;
2-4-2;2-6-3;2-7-4;
3-3-6;3-5-7;3-6-1;
4-3-3;4-4-4;4-6-5;
5-3-7;5-4-1;5-6-2;
"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
{{clear}}
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="Jamaica Farewell (vereinfacht)"
subtitle="1. und 2. Fingersatz (A-, Bb-Form) in C-Dur"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\key c \major
\repeat volta 2 {
g8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8~ 2 }
}
\repeat volta 2 {
c8 4 e4. 4 | d8 e4 f8~2 | }
\alternative {
{ b,8 4 d4. 4 | c8 d4 e8~2 | }
{ e8 4. d4 e8 d | d c4 8~ 2 }
}
\repeat volta 2 {
g'8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8-1~ 2 }
}
\repeat volta 2 {
c'8-3 4 e4.-4 4 | d8-1 e4 f8~2 | }
\alternative {
{ b,8 4 d4. 4 | c8 d4 e8~2 | }
{ e8 4. d4 e8 d | d c4 8~ 2 }
}
\repeat volta 2 {
g8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8~ 2 }
}
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant
}
\new TabStaff {
\set TabStaff.minimumFret = #2
\set TabStaff.restrainOpenStrings = ##t
\tabFullNotation \Diskant
}
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
; F-Form
Greife den C wie ein F-Barré im 8. Bund. Leite dir von diesem Akkord den Grundton (1) ab, und wandere beim 1. Fingersatz rauf zum Startton G (5).
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:1.5;f:1;
3-7-2;3-9-3;3-10-4;
4-7-6;4-9-7;4-10-1;
5-7-3;5-8-4;5-10-5;
6-7-7;6-8-1;6-10-2;
"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
{{clear}}
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="Jamaica Farewell (vereinfacht)"
subtitle="1. und 2. Fingersatz (E-, F-Form) in C-Dur"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\key c \major
\repeat volta 2 {
g8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8~ 2 }
}
\repeat volta 2 {
c8 4 e4. 4 | d8 e4 f8~2 | }
\alternative {
{ b,8 4 d4. 4 | c8 d4 e8~2 | }
{ e8 4. d4 e8 d | d c4 8~ 2 }
}
\repeat volta 2 {
g'8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8-1~ 2 }
}
\repeat volta 2 {
c'8-3 4 e4.-4 4 | d8-1 e4 f8~2 | }
\alternative {
{ b,8 4 d4. 4 | c8 d4 e8~2 | }
{ e8 4. d4 e8 d | d c4 8~ 2 }
}
\repeat volta 2 {
g8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8~ 2 }
}
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant
}
\new TabStaff {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\tabFullNotation \Diskant
}
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
;D-Form
Schiebe den D-Dur-Akkord in den 12. Bund. Ein D im 12. Bund verschoben ergibt ein C. Leite dir von diesem Akkord den Grundton (1) ab. Orientiere dich kurz im 2. Fingersatz und wandere zurück zum ersten Fingersatz zum Ton G (5).
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:1.5;f:1;
1-10-2;1-12-3;1-13-4;
2-10-6;2-12-7;2-13-1;
3-9-3;3-10-4;3-12-5;
4-9-7;4-10-1;4-12-2;
"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
{{clear}}
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="Jamaica Farewell (vereinfacht)"
subtitle="1. und 2. Fingersatz (D-Form) in C-Dur"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c'' {
\key c \major
\repeat volta 2 {
g8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8~ 2 }
}
\repeat volta 2 {
c8 4 e4. 4 | d8 e4 f8~2 | }
\alternative {
{ b,8 4 d4. 4 | c8 d4 e8~2 | }
{ e8 4. d4 e8 d | d c4 8~ 2 }
}
\repeat volta 2 {
g'8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8-1~ 2 }
}
\repeat volta 2 {
c'8-3 4 e4.-4 4 | d8-1 e4 f8~2 | }
\alternative {
{ b,8 4 d4. 4 | c8 d4 e8~2 | }
{ e8 4. d4 e8 d | d c4 8~ 2 }
}
\repeat volta 2 {
g8 4 4 8 4 | a8 b4 c c8 b a |
g8 g4 f4 e8 d4 | }
\alternative {
{ e8 f4 g8~ 2 }
{ e8 d4 c8~ 2 }
}
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant
}
\new TabStaff {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\tabFullNotation \Diskant
}
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==3. Fingersatz==
Es fällt auf, dass der 3. Fingersatz kein "Karré" hat.
{|
!Fingersatz
!width="30px"|
!Intervalle
|-
|[[Image:Scala Z RK-Z K-ZM K.svg]]
!width="30px"|
|[[Image:Scala 2 34-5 6-71 2.svg]]
|}
Der 3. Fingersatz ist gar kein eigenständiger Fingersatz. Der obere Teil des 3. Fingersatzes ist eigentlich schon der untere Teil des 2. Fingersatzes. Ebenso ist der untere Teil des 3. Fingersatzes gleichzeitig der Anfang des 1. Fingersatzes.
Du musst dir Strategien zurechtlegen, wie du den Übergang vom Ende des 2. Fingersatzes über die 5 und die 6 hin zum 1. Fingersatz gestaltest. Es kommt beim 3. Fingersatz zu einem Lagewechsel nach links.
Übe den 3. Fingersatz zuerst in den obersten Saitenlagen (E A D G x x)
=== Eine II-V-I-Verbindung ===
Wir spielen eine einfache Tonfolge über einer 2-5-1-Verbindung. Die Akkordtöne liegen zumeist auf den schweren Zählzeiten.
* D, F, A, C gehören zum Dm7
* G, B, D, F gehören zum G7
* C, E, G gehören zum C-Dur-Akkord.
Wir nutzen das CAGED-System, um uns grob auf dem Griffbrett zurechtzufinden.
==== Exkurs: Skalenformen ====
Die Namen der Skalen leiten sich übrigens von folgenden einfachen Tonleitern in den ersten Bünden ab:
[[Image:Scala C-Am.svg|100px]] [[Image:Scala Bb-Gm.svg|100px]] [[Image:Scala G-Em.svg|100px]] [[Image:Scala F-Dm.svg|100px]] [[Image:Scala D-Hm.svg|100px]]
Alle Akkorde die man aus diesen einfachen Tonarten kennt, Bassläufe und ähnliches lassen sich zum großen Teil auf die entsprechenden 5 CAGED-Skalen übertragen, fast so als habe man die Tonleiter mittels Kapodaster in eine höhere Lage verschoben.
Wie du siehst, nennen wir die Skalen entgegen des reinen CAGED-System nicht E-Dur-Form (Shape) und nicht die A-Dur-Form (Shape), sondern F- und Bb-Dur-Form.
<div style="float:left; padding:5px; border:black solid 1px; ">
;E-Dur-Tonleiter
<br>
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
%% s:3 = 3x so groß
%% f:1 zeigt Finger als Kreise
%% f:2 zeigt Finger neben den Saiten
%% 6-3-2 Saite-Bund-Finger
%% oder
%% 6-3-2 Saite-Bund-Intervall
%% 4-o zeigt 4. Saite offen
\fret-diagram #"s:3;f:1;
1-0-1;1-2-2;1-4-3;
2-0-5;2-2-6;2-4-7;
3-1-3;3-2-4;3-4-5;
4-1-7;4-2-1;4-4-2;
5-0-4;5-2-5;5-4-6;
6-0-1;6-2-2;6-4-3;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; border:black solid 1px; ">
;F-Dur-Tonleiter
<br>
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
%% s:3 = 3x so groß
%% f:1 zeigt Finger als Kreise
%% f:2 zeigt Finger neben den Saiten
%% 6-3-2 Saite-Bund-Finger
%% oder
%% 6-3-2 Saite-Bund-Intervall
%% 4-o zeigt 4. Saite offen
\fret-diagram #"s:3;f:1;
1-0-3; 1-1-1; 1-3-2;
2-1-5; 2-3-6;
3-0-2; 3-2-3; 3-3-4;
4-0-6; 4-2-7; 4-3-1;
5-0-3; 5-1-4; 5-3-5;
6-0-7; 6-1-1; 6-3-2; "
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; border:black solid 1px; ">
;G-Dur-Tonleiter
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
%% s:3 = 3x so groß
%% f:1 zeigt Finger als Kreise
%% f:2 zeigt Finger neben den Saiten
%% 6-3-2 Saite-Bund-Finger
%% oder
%% 6-3-2 Saite-Bund-Intervall
%% 4-o zeigt 4. Saite offen
\fret-diagram #"s:3;f:1;
1-3-3; 1-4-1; 1-6-2;
2-4-5; 2-6-6;
3-3-2; 3-5-3; 3-6-4;
4-3-6; 4-5-7; 4-6-1;
5-3-3; 5-4-4; 5-6-5;
6-3-7; 6-4-1; 6-6-2; "
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
{{clear}}
Du siehst selbst, dass die G-Dur-Tonleiter von der Form her eher wie die F-Dur-Tonleiter als wie die E-Dur-Tonleiter aussieht.
<div style="float:left; padding:5px; border:black solid 1px; ">
;A-Dur-Tonleiter
<br>
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
%% s:3 = 3x so groß
%% f:1 zeigt Finger als Kreise
%% f:2 zeigt Finger neben den Saiten
%% 6-3-2 Saite-Bund-Finger
%% oder
%% 6-3-2 Saite-Bund-Intervall
%% 4-o zeigt 4. Saite offen
\fret-diagram #"s:3;f:1;
1-0-5;1-2-6;1-4-7;
2-0-2;2-2-3;2-3-4;
3-1-7;3-2-1;3-4-2;
4-0-4;4-2-5;4-4-6;
5-0-1;5-2-2;5-4-3;
6-0-5;6-2-6;6-4-7;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; border:black solid 1px; ">
;Bb-Dur-Tonleiter
<br>
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
%% s:3 = 3x so groß
%% f:1 zeigt Finger als Kreise
%% f:2 zeigt Finger neben den Saiten
%% 6-3-2 Saite-Bund-Finger
%% oder
%% 6-3-2 Saite-Bund-Intervall
%% 4-o zeigt 4. Saite offen
\fret-diagram #"s:3;f:1;
1-1-5; 1-3-6;
2-1-2; 2-3-3; 2-4-4;
3-0-6; 3-2-7; 3-3-1;
4-0-3; 4-1-4; 4-3-5;
5-0-7; 5-1-1; 5-3-2;
6-1-5; 6-3-6;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; border:black solid 1px; ">
;C-Dur-Tonleiter
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
%% s:3 = 3x so groß
%% f:1 zeigt Finger als Kreise
%% f:2 zeigt Finger neben den Saiten
%% 6-3-2 Saite-Bund-Finger
%% oder
%% 6-3-2 Saite-Bund-Intervall
%% 4-o zeigt 4. Saite offen
\fret-diagram #"s:3;f:1;
1-3-5; 1-5-6;
2-3-2; 2-5-3; 2-6-4;
3-2-6; 3-4-7; 3-5-1;
4-2-3; 4-3-4; 4-5-5;
5-2-7; 5-3-1; 5-5-2;
6-3-5; 6-5-6;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
{{clear}}
Du siehst selbst, dass die C-Dur-Tonleiter von der Form her eher wie die Bb-Dur-Tonleiter als wie die A-Dur-Tonleiter aussieht.
==== 3. Fingersatz II-V-I-Verbindung D-Form ====
<div style="float:left; padding:5px; margin:5px; border:black solid 1px; ">
;D-Form
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:3;f:1;
4-9-7;4-10-1;4-12-2;
5-10-5;5-12-6;
6-10-2;6-12-3;6-13-4;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
{{clear}}
Wir beginnen oben bei der D-Form, wo sich der Lagewechsel des 3. Fingersatz noch nicht mit dem Lagewechsel zwischen der G und H-Saite (engl. B-Saite) aufhebt.
Würde ich ein Capo in den 10. Bund setzen, dann würde ich die Melodie vom Fingersatz her wie D-Dur spielen. In D-Dur spiele ich diese II-V-I-Verbindung Em7 A7 D. Nehme ich das Capo weg, dann greife ich den Dm(7) als einen Barré der Em-Form im 10. Bund. Von diesem kann ich mir das D als Grundton ableiten.
Alternativ siehst du in den Noten, dass die Übung mit dem Ton D anfängt. Dass die oberste Tiefe E-Saite im 12. Bund ebenfalls ein E ergibt, setze ich als bekannt voraus. Falls nicht, beschäftige dich noch einmal mit dem [[Gitarre: Lagerfeueranhang 2c|Stimmen der Gitarre]]. Ein Ganztonschritt bzw. zwei Bünde vor dem E ist der Ton D.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="3. Fingersatz (D-Form) in C-Dur"
subtitle="Eine II-V-I-Verbindung"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #9
\set TabStaff.restrainOpenStrings = ##t
\key c \major
d8^\markup { \bold {Dm7} } e f g-1 a-4 b-1 c4 |
b8^\markup { \bold {G7} } a-4 g4-1 f8 e d4 |
e8^\markup { \bold {C} } f g4-1 a8-4 b-1 c d | c b c2. |
d,8^\markup { \bold {Dm7} } e f g a b c4 |
b8^\markup { \bold {G7} } a g4 f8 e d4 |
e8^\markup { \bold {C} } f g4 a8 b c d | c b c2. |
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 3. Fingersatz II-V-I-Verbindung G-Form ====
<div style="float:left; padding:5px; margin:5px; border:black solid 1px; ">
;G-Form
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:1.5;f:1;
3-4-7;3-5-1;3-7-2;
4-5-5;4-7-6;
5-5-2;5-7-3;5-8-4;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; margin:5px; <!-- border:black solid 1px; --> ">
Würde man ein Capo in den 5. Bund setzen, dann würde man die Melodie vom Fingersatz her wie G-Dur spielen. In G-Dur spielt man diese II-V-I-Verbindung Am7 D7 G. Nimmt man das Capo weg, dann greift man den Dm(7) als einen Barré der Am-Form. Von diesem kannst du dir den D als Grundton ableiten.
Einfacher geht es natürlich, wenn du weißt, dass der D im 5. Bund der A-Saite der Stimmton der D-Saite ist.
</div>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="3. Fingersatz (G-Form) in C-Dur"
subtitle="Eine II-V-I-Verbindung"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
\set TabStaff.minimumFret = #4
\set TabStaff.restrainOpenStrings = ##t
\key c \major
d8^\markup { \bold {Dm7} } e f g-1 a-4 b-1 c4 |
b8^\markup { \bold {G7} } a-4 g4-1 f8 e d4 |
e8^\markup { \bold {C} } f g4-1 a8-4 b-1 c d | c b c2. | \break
d,8^\markup { \bold {Dm7} } e f g a b c4 |
b8^\markup { \bold {G7} } a g4 f8 e d4 |
e8^\markup { \bold {C} } f g4 a8 b c d | c b c2. |
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 3. Fingersatz II-V-I-Verbindung C-Form ====
<div style="float:left; padding:5px; margin:5px; border:black solid 1px; ">
;C-Form
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:1.5;f:1;
2-0-7;2-1-1;2-3-2;
3-0-5;3-2-6;
4-0-2;4-2-3;4-3-4;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; margin:5px; <!-- border:black solid 1px; --> ">
Die C-Dur-Form der C-Dur Tonleiter sieht schlicht und ergreifend wie die C-Durtonleiter aus.
</div>
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="3. Fingersatz (C-Form) in C-Dur"
subtitle="Eine II-V-I-Verbindung"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c {
% \set TabStaff.minimumFret = #4
% \set TabStaff.restrainOpenStrings = ##t
\key c \major
d8^\markup { \bold {Dm7} } e f g a b c4 |
b8^\markup { \bold {G7} } a g4 f8 e d4 |
e8^\markup { \bold {C} } f g4 a8 b c d | c b c2. | \break
d,8^\markup { \bold {Dm7} } e f g a b c4 |
b8^\markup { \bold {G7} } a g4 f8 e d4 |
e8^\markup { \bold {C} } f g4 a8 b c d | c b c2. |
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
==== 3. Fingersatz II-V-I-Verbindung C-Form 12. Bund ====
<div style="float:left; padding:5px; margin:5px; border:black solid 1px; ">
;C-Form
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:1.5;f:1;
2-12-7;2-13-1;2-15-2;
3-12-5;3-14-6;
4-12-2;4-14-3;4-15-4;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; margin:5px; <!-- border:black solid 1px; --> ">
Würde man ein Capo in den 12. Bund setzen, dann würde man die Melodie vom Fingersatz her wie C-Dur spielen. In C-Dur spielt man diese II-V-I-Verbindung Dm7 G7 C.
Der Startton ist schlicht die D-Saite im 12. Bund.
</div>
{{clear}}
Gerade noch hatten wir einen Lagewechsel nach links. Jetzt aber hebt sich der Lagewechsel nach links vom 3. Fingersatz mit dem Lagewechsel zwischen der G- und H-Saite auf.
Es hört sich beim ersten Durchlesen kompliziert an, aber du hast nur 4 Lektionen zu lernen.
Den 1. bis 3. Fingersatz und den Lagewechsel zwischen der G- und H-Saite.
Das Auffinden der Töne und welche Akkorde zu welcher Tonart gehört, und wie man einen Capo benutzt, sollte eigentlich nichts neues für dich sein.
Rein technisch gesehen vereinfacht sich der Fingersatz. Doch es kostet ein wenig Überlegung, wie sich die beiden Lagewechsel auf den 3. Fingersatz auswirken.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="3. Fingersatz (C-Form) in C-Dur"
subtitle="Eine II-V-I-Verbindung"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #12
\set TabStaff.restrainOpenStrings = ##t
\key c \major
d8^\markup { \bold {Dm7} } e f g a b c4 |
b8^\markup { \bold {G7} } a g4 f8 e d4 |
e8^\markup { \bold {C} } f g4 a8 b c d | c b c2. |
d,8^\markup { \bold {Dm7} } e f g a b c4 |
b8^\markup { \bold {G7} } a g4 f8 e d4 |
e8^\markup { \bold {C} } f g4 a8 b c d | c b c2. |
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
Sollte es im 12 Bund unbequem zu spielen sein, weil du kein Cutaway hast (Aussparung für die hohen Bünde), übe die C-Form ein paar Bünde zurück in einer anderen Tonart.
==== 3. Fingersatz II-V-I-Verbindung F-Form ====
<div style="float:left; padding:5px; margin:5px; border:black solid 1px; ">
;F-Form
<score raw="1">
\version "2.14.2"
\markup
\override #'(fret-diagram-details . ( (number-type . roman-upper)
(finger-code . in-dot) (orientation . landscape))) {
\fret-diagram #"s:1.5;f:1;
1-7-7; 1-8-1;1-10-2;
2-8-5; 2-10-6;
3-7-2; 3-9-3; 3-10-4;"
}
\paper{
indent=0\mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
bookTitleMarkup = ##f
scoreTitleMarkup = ##f}
</score>
</div>
<div style="float:left; padding:5px; margin:5px; <!-- border:black solid 1px; --> ">
Würde man ein Capo in den 6. Bund setzen, dann würde man die Melodie vom Fingersatz her wie F-Dur spielen. In C-Dur spielt man diese II-V-I-Verbindung Gm7 C7 F.
Wenn du den C wie ein F-Barré im 8. Bund greifst, dindest du den Grundton (1) auf der hohen E-Saite. Von dem wanderst du runter zum Startton (2).
</div>
{{clear}}
Auch hier hebt sich der Lagewechsel zwischen der G- und H-Saite mit dem Lagewechsel des 3. Fingersatz gegeneinander auf, was den Fingersatz grifftechnisch wieder vereinfacht.
<score sound="1" raw="1">
\version "2.20.0"
\header {
title="3. Fingersatz (F-Form) in C-Dur"
subtitle="Eine II-V-I-Verbindung"
}
%% Diskant- bzw. Melodiesaiten
Diskant = \relative c' {
\set TabStaff.minimumFret = #7
\set TabStaff.restrainOpenStrings = ##t
\key c \major
d8^\markup { \bold {Dm7} } e f g a b c4 |
b8^\markup { \bold {G7} } a g4 f8 e d4 |
e8^\markup { \bold {C} } f g4 a8 b c d | c b c2. |
d,8^\markup { \bold {Dm7} } e f g a b c4 |
b8^\markup { \bold {G7} } a g4 f8 e d4 |
e8^\markup { \bold {C} } f g4 a8 b c d | c b c2. |
\bar "|."
}
%% Layout- bzw. Bildausgabe
\score {
<<
\new Voice {
\clef "treble_8"
\time 4/4
\tempo 4 = 120
\set Score.tempoHideNote = ##t
\Diskant
}
\new TabStaff { \tabFullNotation \Diskant }
>>
\layout {}
}
%% Midiausgabe mit Wiederholungen, ohne Akkorde
\score {
<<
\unfoldRepeats {
\new Staff <<
\tempo 4 = 120
\time 4/4
\set Staff.midiInstrument = #"acoustic guitar (nylon)"
\clef "G_8"
\Diskant
>>
}
>>
\midi {}
}
%% unterdrückt im raw="!"-Modus das DinA4-Format.
\paper {
indent=0\mm
%% DinA4 = 210mm - 10mm Rand - 20mm Lochrand = 180mm
line-width=180\mm
oddFooterMarkup=##f
oddHeaderMarkup=##f
% bookTitleMarkup=##f
scoreTitleMarkup=##f
}
</score>
== Wie geht es weiter? ==
Solltest du als Quereinsteiger in diese Lektion gestolpert sein, dann schaue dir die erste Lektion zum [[Gitarre: Aufbau der CAGED-Skalenformen|Aufbau der CAGED-Skalenformen]] an. Insbesondere die Abschnitte, die hier übergangen wurden. Dannach kannst du mit der ersten CAGED-Skala in der D-Dur-Form weitermachen.
<noinclude>
{{Navigation zurückhochvor
|zurücklink=Gitarre: CAGED-Skala G-Dur-Form
|zurücktext=CAGED-Skala G-Dur-Form
|hochlink=Gitarre: Die Major-Patterns
|hochtext=Einführung: Major-Patterns
|vorlink=Gitarre: CAGED-Skala D-Dur-Form
|vortext=CAGED-Skala D-Dur-Form
}}
</noinclude>
eqxsnszm8z3kqkvaa9whvds99fi3w5i
Gödel
0
117878
1090672
1090606
2026-09-10T20:54:21Z
Santiago
19191
/* Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘ */ ::notwendig:: statt ,ganz sicher'
1090672
wikitext
text/x-wiki
[[Kategorie: Buch]]
{{Regal|ort=Philosophie}}
{{Vorlage:StatusBuch|9}}
==<div class="center"><span style="color:#660066">'''Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘'''</span></div>==
<span style="font-family: Times;"><big><div class="center">לַמְנַצֵּ֗חַ לְדָ֫וִ֥ד אָ֘מַ֤ר נָבָ֣ל בְּ֭לִבּוֹ אֵ֣ין אֱלֹהִ֑ים הִֽשְׁחִ֗יתוּ הִֽתְעִ֥יבוּ עֲלִילָ֗ה אֵ֣ין עֹֽשֵׂה־טֽוֹב׃
(Psalm 14,1)</div></big></span>
----
===<div class="center"><span style="color:#660066">Vorwort</span></div>===
Zur Orientierung ''':''' Die Diskussion um GOTT läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser ANSELM gesagt ''':''' <span style="color:#FF6000">»''Ich glaube an GOTT'' … <span style="color:#00B000">[ sonst wäre er sicher
nicht Erzbischof von Canterbury geworden ]</span> … ''aber ich möchte auch wissen und verstehen, ob das stimmt und sinnvoll ist, was ich da glaube '''!''''' «</span> Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Professor und Philosoph aus Königsberg, Immanuel KANT, hat das, was ANSELM da aufgeschrieben hat, gelesen, <span style="color:#00B000">(vermittelt durch CARTESIUS)</span>, und das dann den <span style="color:#FF6000">„ontologischen Gottesbeweis“</span> genannt, <span style="color:#00B000">(obwohl es in Wirklichkeit gar kein Gottesbeweis ist; genauer ''':''' es ist kein Beweis für die Existenz GOTTES)</span>, und dieser große KANT hat dann großartig bewiesen, das, was ANSELM da aufgeschrieben hat, sei falsch. Es sei <span style="color:#FF6000">„ja gar kein“</span> Gottesbeweis '''!''' <span style="color:#00B000">( Naja, was denn sonst '''?''' )</span> Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichbaren GOTT mit hundert Talern in seinem Vermögenszustande verglichen hat. <span style="color:#00B000">(Das ist aber eine andere Geschichte.)</span> Hundert Taler und GOTT haben ,an sich‘ nichts gemeinsam, außer, wenn KANT ,wirklich‘ hundert Taler hat, und GOTT auch ,wirklich‘ existiert, <span style="color:#00B000">(wie ANSELM und gläubige Menschen glauben)</span>, dann gibt es GOTT und die Taler eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit KANT läuft die ganze Diskussion um GOTT immer nur als Diskussion um den <span style="color:#00B000">(von KANT)</span> so genannten <span style="color:#FF6000">„ontologischen, <span style="color:#00B000">[ kosmologischen, teleologischen etc. ]</span> Gottesbeweis“</span> —, obwohl es niemals einen Beweis für die Existenz GOTTES geben kann und niemals geben wird. <span style="color:#00B000">(Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich versucht zu sagen, weil keiner dieser sog. Beweise für die Existenz eines GOTTES stringent ist.)</span> Beweisen kann man die Existenz von Naturgesetzen. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie dann mit Mehrheitenbeschlüsse verändern. Wenn GOTT ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz GOTTES wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. GOTT ist <span style="color:#FF6000">„Person“</span>, — für Christgläubige ''':''' <span style="color:#FF6000">„ein GOTT in drei Personen“</span>. Und GOTT ist <span style="color:#FF6000">„Geist“</span>. Das besagt, dass GOTT nicht mit materiellen Dingen aus unserer Welt verglichen werden darf; <span style="color:#00B000">(was sowohl THOMAS von Aquin als auch Immanuel KANT doch getan haben)</span>. Und ganz wesentlich ''':''' der Zugang zu GOTT läuft nicht über den Beweis, sondern immer nur über den Glauben. Wer an GOTT glauben will, dem antwortet GOTT auf seine Weise — nämlich <span style="color:#FF6000">„geistig“</span> bzw. <span style="color:#FF6000">„geistlich“</span>. Wer nicht an GOTT glauben will, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Glaube ist immer eine freie Entscheidung des Menschen für GOTT. Niemand darf gezwungen werden. Wenn es einen Beweis für GOTT gäbe, wäre jeder vernünftige Mensch gezwungen, an GOTT zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Existenzbeweis für GOTT '''!!!''' ... Daher darf man das Kalkül des Logiker GÖDEL, <span style="color:#00B000">(und damit auch das Theorem ANSELMS)</span>, nicht als einen Existenzbeweis für GOTT lesen. Sowohl ANSELM als auch GÖDEL setzen die Existenz GOTTES notwendig als gegeben schon voraus. Das GÖDEL-System, und auch das Theorem ANSELMS, sind bloß die logische Bestätigung der Widerspruchsfreiheit der Glaubensüberzeugung eines Menschen, der sich schon entschieden hat, an GOTT zu glauben; und nicht der Grund für seine Entscheidung. Alle sogenannten ,Gottesbeweise‘, sind in Wirklichkeit nichts anderes, als nachträgliche Evaluierungen eines GOTT-Glaubens, bzw. ,Wege‘, <span style="color:#00B000">(bei THOMAS von Aquin)</span>, die aufzeigen, dass der GOTT-Glaube widerspruchsfrei, sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL sagt. GOTT hat es nicht nötig, ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> zu werden.
===<div class="center"><span style="color:#660066">Einleitung</span></div>===
Eine Studie zum GÖDEL-Kalkül. Der Logiker Kurt GÖDEL <span style="color:#00B000">(1906-1978)</span> hat mit diesem Kalkül eine moderne Rekonstruktion des, <span style="color:#00B000">(von KANT)</span>, so genannten ‚ontologischen Gottesbeweises‘ nach ANSELM von Canterbury auf modal-logischer Basis vorgelegt. Damit hat er die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt, d.h. sie soll für jeden Menschen nachvollziehbar sein, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie er sagt. GÖDEL ,nimmt‘ als Logiker, angeregt durch den Philosophen und Mathematiker Gottfried Wilhelm LEIBNIZ, rein theoretisch, fürs Erste, einmal ‚an‘, <span style="color:#00B000">(als Prämisse, d.i. der Term :01: im 3. Beweisgang zum Theorem ANSELMS im Anhang)</span>, dass es GOTT gibt ''':''' d.i. ein sog. ,methodologischer GOTT-Glaube‘, und untersucht die logischen Konsequenzen. Dabei zeigt sich, beim genaueren Hinsehen, dass der ‚Nicht-GOTT-Glaube‘, der ‚dezidierte‘ Atheismus, <span style="color:#00B000">(im Beweisgang ,Widerlegung‘ im Anhang)</span>, überraschender Weise, zu einem Widerspruch führt, und damit logisch ,falsch‘ ist. Jedoch, GÖDEL kann und will mit seinem Kalkül keinen ,GOTT-Glauben‘ ,erzeugen‘, d.h. das GÖDEL-Kalkül ist kein <span style="color:#FF6000">„Existenz-Beweis"</span> für den GOTT der Bibel, sondern, es setzt die Existenz eines GOTTES, einfach als gegeben, schon voraus. GÖDEL beweist dann mit seinem System, dass der traditionelle abendländische ,GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, <span style="color:#00B000">(d.i. die Kalkül-Prämisse, und das, daraus ,regulär‘ (├ ) abgeleitete, Theorem ANSELMS)</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> <span style="color:#00B000">(d.h. logisch ,richtig‘)</span> ist, im Gegensatz zum ,Nicht-GOTT-Glauben‘, der davon ausgeht, dass es keinen GOTT gibt. GÖDEL beweist mit seinem System ''':''' der traditionelle GOTT-Glaube ist, — mit mathematisch-logischer Evidenz —, widerspruchfrei und wahr. <span style="color:#00B000">(Der Beweis aus dem Widerspruch des Gegenteils ist ein ,indirekter Beweis‘ und kein ,Zirkelbeweis‘ '''!''' )</span> GÖDEL blieb bis zu seinem Tod ohne ein dezidiertes religiöses Bekenntnis. <span style="color:#00B000">(Das Leben ist nicht immer ,logisch‘.)</span>
Entsprechend der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> ist GOTT der Größte, <span style="color:#FF6000">»''über dem nichts Größeres mehr gedacht werden kann''«</span>, <span style="color:#00B000">(ANSELM)</span>; bzw. <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>, und der für uns immer schon ,da‘ ist. Das ist die methodologische Prämisse des GÖDEL-Kalküls. Davon ausgehend, zeigen seine Axiome und Definitionen, dass es zu einem Widerspruch führt, falls man ,annimmt‘, es sei nicht möglich, dass es <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> gibt. Aus dem Widerspruch des Gegenteils wird von GÖDEL, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, dann ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> ''':''' es ist doch möglich, dass es <span style="color:#FF6000">„GOTT“</span> wirklich gibt. Somit ist der Glaube an <span style="color:#FF6000">„GOTT“</span>, — weil widerspruchsfrei —, mit den Worten GÖDELS ''':''' <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span>.
Immanuel KANT <span style="color:#00B000">(1724-1804)</span> scheint diesen Fall vorausgesehen zu haben, dass versucht werden könnte, die ,Möglichkeit‘ GOTTES aus einem Widerspruch zu ,beweisen‘ ''':'''
::<span style="color:#FF6000">»</span> <span style="color:#00B000">[ Angenommen, es gibt ]</span> ''doch einen und zwar nur diesen '''Einen''' Begriff'' <span style="color:#00B000">[ ,GOTT‘, so dass ]</span> ''das Nichtsein oder das Aufheben seines Gegenstandes'' <span style="color:#00B000">[ GOTT ]</span>, ''in ,sich selbst‘ widersprechend sei; und dieses ist der Begriff des allerrealsten Wesens. Es hat, sagt ihr, alle Realität'', <span style="color:#00B000">[ bzw. alle Vollkommenheit ]</span>, ''und ihr seid berechtigt, ein solches Wesen als ,möglich‘ anzunehmen'' ... <span style="color:#00B000">[ denn das GÖDEL-Kalkül ,beweist‘ ( ╞ ) in der ,Widerlegung‘ im Anhang, wie auch im 1. Beweisgang, aus einem Widerspruch, dass die Existenz GOTTES definitiv logisch ,möglich‘ ist. ]</span> … ''obgleich der sich nicht widersprechende'', <span style="color:#00B000">[ ,mögliche‘ ]</span>, ''Begriff'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''noch lange nicht die'' <span style="color:#00B000">[ reale ]</span> ''Möglichkeit des Gegenstandes'', <span style="color:#00B000">[ GOTT ]</span>, ''beweiset. … Das ist eine Warnung, von der Möglichkeit der Begriffe (logische)'', <span style="color:#4C58FF">— '''◇''' —</span>, ''nicht sofort auf die Möglichkeit der Dinge (reale)'', <span style="color:#4C58FF">— '''□''' —</span>, ''zu schließen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 399; https://www.korpora.org/kant/aa03/399.html</ref>. <span style="color:#00B000">[ Trotz dieser Warnung, wird dieser Schluss dennoch im Theorem ANSELMS vollzogen, bzw. mit GÖDEL im 3. Beweisgang ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> '''!''' ]</span>. <span style="color:#FF6000">«</span>
Warum das <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist, und inwieweit KANT sich irrt, wird in dieser Studie gezeigt.
===<div class="center"><span style="color:#660066">Der Schlüsselbegriff im Kalkül</span></div>===
Der ‚Schlüsselbegriff‘ in diesem Kalkül ist <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Perfektion“, „Vollkommenheit“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Für diesen wichtigen Begriff gibt es aber im Kalkül selbst keine explizite Definition, sondern er wird nur durch seine Verwendung innerhalb des Kalküls indirekt ‚definiert‘. <span style="color:#00B000">(Das heißt ''':''' <span style="color:#4C58FF"> — ‚'''P'''‘ — </span> bezeichnet ein System von ,Eigenschaften‘, die ,positiv‘, bzw. ,vollkommen‘ | ,perfekt‘ | genannt werden, von denen im Kalkül wohl beweisbar ist, dass sie sich gegenseitig ,nicht widersprechen‘, weil sie im System als solche ,gleichwertig‘, bzw. gleich ,wahr‘ sind, jedoch ohne sie erschöpfend aufzählen zu können, oder auch nur sagen zu können, was sie alle im einzelnen bedeuten, außer, dass sie kompatibel sind.)</span> Mit der Wahl dieses Schlüsselbegriffes hat GÖDEL eine wesentliche Vorentscheidung für die Ergebnisse des Kalküls getroffen '''!''' In seinen Notizen zum ‚ontologischen Beweis‘ vom 10. Februar 1970 gibt GÖDEL, — für die nachträgliche Interpretation dieses Begriffes <span style="color:#00B000">(und auch für das Kalkül selbst)</span> —, die richtungsweisende Erklärung ''':'''
::<span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne...''«</span>
::Und er fügt in Klammer hinzu ''':'''
::<span style="color:#FF6000">»...''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span><ref>GÖDEL, Kurt, ''<span style="font-family: Times;"><big>‚Ontological proof‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Collected Works‘</big></span>'', vol. III, ed. S.FEFERMAN et al., Oxford (U.P.), 1995; 403–404.</ref>
GÖDEL-Axiom-1 ''':''' <span style="color:#4C58FF">— ‚('''PX <small><math>{ \color{Blue} \dot\lor}</math></small> P¬X''')‘ ↔<span style="color:#00B000"> ‚('''¬PX ↔ P¬X''')‘</span> — </span> ''':''' <span style="color:#FF6000"> »''Entweder die Eigenschaft'' <span style="color:#4C58FF">‚'''X'''‘</span> ''oder ihre Negation'' <span style="color:#4C58FF">‚'''¬X'''‘</span> ''ist positiv''«</span>. Hier ist der Hauptkritikpunkt, dass es Eigenschaften gibt, die ,an sich‘ weder positiv noch negativ sind. Beispiele wären ''':''' ‚rothaarig‘ oder ‚schwerwiegend‘; solche Eigenschaften können aber ,für mich‘ entweder positiv oder negativ sein, abhängig von meiner Betrachtungsweise und subjektiven Vorlieben. Diese Eigenschaften, wie ‚rothaarig‘ an sich, oder meine positiv-negativen ‚Betrachtungsweisen‘, sind jedoch der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> entnommen und treffen nicht den <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Er orientierte sich an LEIBNIZ, welcher im Bezug zum ‚ontologischen Beweis‘ definiert ''':'''
::<span style="color:#FF6000">»''Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''nenne ich jede einfache Eigenschaft, die sowohl positiv als auch absolut ist, oder dasjenige, was sie ausdrückt, ohne jede Begrenzung ausdrückt''.«</span><ref>Zitiert nach Thomas GAWLICK, in ''<span style="font-family: Times;"><big>‚Was sind und was sollen mathematische Gottesbeweise ?‘</big></span>'', Predigt vom 8.1.2012 in der Kreuzkirche zu Hannover. https://web.archive.org/web/20130524164359/http://www.idmp.uni-hannover.de/fileadmin/institut/IDMP-Studium-Mathematik/downloads/Gawlick/Predigt_Gawlick_Gottesbeweise.pdf</ref>
Die Seins-Eigentümlichkeiten <span style="color:#00B000">(Daseinsmodi, Perfektionen)</span> wie ‚wahr‘, ‚gut‘, ‚edel‘ usw. entsprechen dem <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Das sind Beispiele für ‚absolut‘ positive Begriffe aus der Lehre der Seinsanalogie ''':''' <span style="font-family: Times;"><big>‚verissimum‘, ‚optimum‘, ‚nobilissimum‘</big></span>, usw., die, an sich, <span style="color:#FF6000">»''ohne jede Begrenzung gelten''«</span>; zu finden in der <span style="font-family: Times;"><big>‚Via quarta‘</big></span>, bei THOMAS von Aquin, über die <span style="color:#FF6000">„analoge"</span> Abstufung im ‚Sein‘ der Dinge. Diese <span style="color:#FF6000">„analoge"</span> ‚Abstufung‘ ist dann die faktische Begrenztheit <span style="color:#00B000">(d.h. Unvollkommenheit)</span> im <span style="color:#FF6000">»''zufälligen''«</span> ‚Sein‘ der Dinge —. Die <span style="color:#FF6000">„positiven Eigenschaften“</span> GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, wie Wahrheit, Einheit, Gutheit, <span style="color:#00B000">(von ,Güte‘)</span>, Schönheit, Adel, <span style="color:#00B000">(von ,edel‘)</span>, Gleichheit, Andersheit, Wirklichkeit, ,Sein‘ im Sinne von Etwas-sein, etc. werden <span style="color:#FF6000">„Perfektionen“</span>, oder auch <span style="color:#FF6000">„Transzendentalia“</span> genannt, <span style="color:#00B000">(von lateinisch ''':''' <span style="font-family: Times;"><big>transcendere</big></span>, <span style="color:#FF6000">„übersteigen“</span>)</span>. In der mittelalterlichen Scholastik sind Transzendentalien die Grundbegriffe, die allem Seienden als <span style="color:#FF6000">„Modus“</span>, <span style="color:#00B000">(d.h. ,Eigentümlichkeit‘, als allgemeine Seinsweisen)</span>, zukommen. Wegen ihrer Allgemeinheit ,übersteigen‘ sie die besonderen Seinsweisen, welche ARISTOTELES die ,Kategorien‘ nannte. Ontologisch betrachtet, werden die Transzendentalien als das allem Seienden Gemeinsame aufgefasst, da sie von allem ausgesagt werden können. Von der KI werden sie, nicht unpassend, als <span style="color:#FF6000">„ultimative Eigenschaften des Seins“</span> bezeichnet, die <span style="color:#FF6000">„jenseits der materiellen Welt existieren“</span>, <span style="color:#00B000">(da sie ,ultimativ‘ nur von GOTT, als den unbegrenzt Vollkommenen, ausgesagt werden können, die jedoch, auch von allen übrigen Seienden, wegen deren seinsmäßigen Unvollkommenheit und Begrenztheit, abgestuft, d.h. <span style="color:#FF6000">„analog"</span>, ausgesagt werden)</span>. Diese Transzendentalien sind ,inakzident‘, das heißt, sie entstehen nicht aus anderen Begriffen, sondern sind erste, unteilbare Bestimmungen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> des Denkens und des Seins, die allen Seienden ''':''' <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span>, unabhängig von ihren speziellen Eigenschaften, als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(bzw. Unvollkommenheiten)</span>, mit ,modaler‘ Notwendigkeit, <span style="color:#4C58FF">— ‚□‘ —</span>, <span style="color:#FF6000">„analogisch"</span> zukommen, d.h. sie sind in allen Seienden, seinsmäßig abgestuft und abgegrenzt, ,relativ‘ zum unbegrenzt Unendlichen ihrer selbst, und <span style="color:#FF6000">»''dasjenige, was sie ausdrücken, drücken sie ohne jede Begrenzung aus''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>; und damit stehen sie ontologisch in einer <span style="color:#FF6000">„analogen"</span> ,Beziehung‘ zu GOTT, dem absolut Vollkommenen und unbegrenzt Unendlichen. In der Erkenntnisordnung wirken sie als die ersten Begriffe des menschlichen Verstehens, die eine Basis für alle weiteren wissenschaftlichen Erkenntnisse bilden. In der Seinsordnung sind die Transzendentalien ontologisch eins, gleichwertig, <span style="color:#00B000">(,mathematisch äquivalent‘)</span>, und daher konvertierbar, d.h. austauschbar, <span style="color:#00B000">(vgl. z. B. den scholastischen ,Merksatz‘ ''':''' <span style="font-family: Times;"><big>,ens et verum convertuntur‘</big></span>)</span>. Damit sind sie auch von einander abhängig, was GÖDEL sowohl im Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, für positive Eigenschaften, als auch in der Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, für die Wesenseigenschaften, syntaktisch formalisiert hat mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, weil sie sich gegenseitig, — mit ,modaler‘ Notwendigkeit —, gleichwertig ,implizieren‘, d.h. einschließen, <span style="color:#00B000">(im Axiom-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span>, und in der Definition-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''y'''‘ — </span>)</span>. Man kann die Transzendentalia, <span style="color:#00B000">(wie GÖDEL)</span>, auch ,Wesenseigenschaften‘ ''':''' <span style="color:#4C58FF"> — ‚'''X'''<sub>ess</sub>‘ —</span>, nennen, weil sie allem Seienden <span style="color:#FF6000">„wesentlich analog"</span> zukommen. Weil Transzendentalien miteinander austauschbar sind, sind sie auch widerspruchsfrei, was GÖDEL mit Axiom-1 syntaktisch darstellt. Die Gültigkeit und Wahrheit, d.h. die mathematisch-logische Evidenz von Axiom-1 und Axiom-2, beruht auf der ontologischen Allgemeinheit und Gültigkeit der Transzendentalia, die GÖDEL mit Definition-2, in sein Kalkül explizit eingeführt und als Wesenseigenschaften ,bestimmt‘ hat. <span style="color:#00B000">(Definitionen werden formal-syntaktisch durch das Äquivalenzzeichen <span style="color:#4C58FF">,'''↔'''‘</span> angezeigt, gelesen als <span style="color:#FF6000">„...ist genau dann ... wenn...“</span>)</span> Die GÖDEL-Axiome und -Definitionen werden jedoch sofort <span style="color:#FF6000">„modal falsch"</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit ,Nicht-Transzendentalia‘, wie z. B. ,rot‘ oder ,schwer‘, belegt werden. <span style="color:#00B000">(Dieser ,Sachverhalt‘ wird von Kritikern des GÖDEL-Systems, — zu vorschnell —, verwendet, um ihre Behauptungen zu ,belegen‘, das GÖDEL-Kalkül und seine Konsequenzen seien ,falsch‘.)</span>
Zum Überblick ''':''' <span style="color:#FF6000">„Transzendentalia“</span> sind universale, alles Seiende charakterisierende Begriffe, die über kategoriale Einteilungen hinausgehen, und sowohl in der klassischen Scholastik, als auch in der modernen Philosophie, <span style="color:#00B000">(KANT, Uwe MEIXNER<ref>vgl. die ,transzendentalen‘ Bedingungen möglicher Erkenntnisse bei KANT; und auch in der ,Axiomatischen Ontologie‘ bei Uwe MEIXNER</ref>)</span>, als Grundlage der Metaphysik und Erkenntnistheorie dienen. Sie sind die <span style="color:#FF6000">„ersten Begriffe des Seins“</span>, die jedem Ding als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(Perfektionen)</span>, inhärent sind, <span style="color:#FF6000">„analogisch"</span> abgestuft, auf einen ,ultimativ‘-unbegrenzten Bezugspunkt ausgerichtet, und die sich im Denken, <span style="color:#00B000">(für uns als wahr)</span>, und in der moralischen Wertung, <span style="color:#00B000">(für uns als gut und edel)</span>, manifestieren, relativ zum ,ultimativ‘-unbegrenzten Bezugspunkt ihrer selbst. Die faktische, zusätzliche Unvollkommenheit, die sich generell in der notwendigen, und unausweichlichen Vergänglichkeit aller Dinge zeigt, ist einem ontologischen Defekt ,geschuldet‘, der stark zeitabhängig ist, d.h. der einen Anfang und ein Ende hat.
Das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''Notwendige Existenz ist eine positive Eigenschaft''«</span>, ist immer falsch, wenn es auf etwas aus der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> angewendet wird, wie z. B. auf einen <span style="color:#FF6000">„Tsunami“</span>, dessen ‚Existenz‘ für uns nicht ‚positiv‘ ist. KANT hat schon festgestellt ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Das gilt für alles, was <span style="color:#FF6000">„existiert“</span>. Das Axiom-5 hat nur dann seine Gültigkeit, ist nur dann ,wahr‘, wenn <span style="color:#FF6000">„Dasein“</span> <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span> <span style="color:#00B000">(Essenz)</span> in eins zusammenfallen. Bei allen Dingen, die ‚da‘ sind, ist ihr ‚Da-Sein‘ ontologisch immer verschieden zu dem ‚was‘ sie sind ''':''' zu ihrem ,Was-Sein‘. In der philosophischen Tradition, seit ARISTOTELES, wird die ontologische Identität, d.i. die Koinzidenz, der innere Zusammenhang von ‚Sein‘ und ‚Wesen‘ allein nur dem <span style="color:#FF6000">„selbst ‚unbewegten‘ Erstbewegenden“</span> zugeschrieben, dem <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“</span><span style="color:#00B000"> | ,prôton kinoûn akinêton‘</span>, von dem ARISTOTELES etwas später sagt ''':''' <span style="color:#FF6000">»''denn dies ist der Gott''«</span> und dann hinzufügt ''':''' <span style="color:#FF6000">»''so sagen wir ja''«</span>; d.h. das ist eine Interpretation aus dem Glaubenskontext des ARISTOTELES. Er war ein Gott-gläubiger Grieche. Wer an GOTT glaubt, kann das nachvollziehen. GÖDEL musste dieses Axiom-5 postulieren, sonst wäre sein Kalkül nicht aufgegangen, ohne dass er deswegen schon an GOTT glauben müsste. Er hat für sein Kalkül das ontologische Theorem von der Identität von ‚Sein‘ und ‚Wesen‘ im ‚unbewegten Erstbeweger‘ des ARISTOTELES benutzt, ohne diese Herkunft explizit referenziert zu haben. <span style="color:#00B000">(Gilt auch für Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit, das GOTT-Sein, das ‚Dasein‘ GOTTES, ist eine positive Wesenseigenschaft, eine Perfektion; d.h. ist das ‚Wesen‘ GOTTES ''':''' GOTT ist perfekt''«</span>)</span>. Die ontologische Identität von Sein und Wesen, Existenz und Essenz, wie auch die Koinzidenz von Möglichkeit und Wirklichkeit, von Ursache und Wirkung, sowie auch die ontologische Einheit von <span style="color:#00B000">(Erkenntnis-)</span>Subjekt und <span style="color:#00B000">(Erkenntnis-)</span>Objekt im <span style="color:#FF6000">»''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“</span><span style="color:#00B000"> | ,noêseôs noêsis‘ <small>(<span style="font-family: Times;"><big>,''Metaphysik''‘</big></span> XII 9, 1074b34)</small></span>, und der innere Zusammenhang der <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, gilt nur in der <span style="color:#FF6000">„unverursachten Letztursache"</span>, auf die ARISTOTELES bei seiner Prinzipienforschung gestoßen ist.
Es gibt verschiedene Versuche, die GÖDEL-Axiome durch sog. ,Modelle‘, relativ zu einfacheren ,Welten‘, zu verifizieren, um damit ihre relative Konsistenz nachzuweisen. Für GÖDEL aber <span style="color:#FF6000">»''sind die Axiome nur dann'' <span style="color:#00B000">[ in unserer ,realen‘ Welt ]</span> ''wahr'' <span style="color:#00B000">[ und annehmbar ]</span>«</span>, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt'' <span style="color:#00B000">[ d.h. jeder auch nur ,möglichen‘ Welt ]</span> ''sind''«</span>. Diese Bedingung verweist jede Verifikation und jede Interpretation der Axiome auf das ,Nicht-Zufällige‘, das ,Notwendige‘, ,Absolute‘, in dem die Axiome und Definitionen des GÖDEL-Kalküls erst dadurch ihren Sinn und ihre Bedeutung bekommen, wenn sie vom ,Absoluten‘ und ,Unendlichen‘ her erklärt und verstanden werden. Damit insistiert GÖDEL auf eine genuin <span style="color:#4C58FF">,theologische‘</span> Interpretation seines Kalküls, mit der <span style="color:#4C58FF">„Theologie“</span> zum Begriff GOTT, dem unbegrenzt Unendlichen, als Verifikationskriterium. Das entspricht auch der ,methodologischen‘ Prämisse seines Kalküls. Die wichtigsten Axiome und Definitionen im GÖDEL-Kalkül sind jedoch bloße ,Annahmen‘, deren Evidenz, sowohl die ,mathematische‘ als auch die <span style="color:#4C58FF">,theologische‘</span>, erst evaluiert, d.h. ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> werden muss. Das bedeutet ''':''' die logische Verifikation der Axiome und Definitionen von GOTT und seinen Vollkommenheiten kann nur Kalkül-intern durch den Aufweis ihrer Widerspruchsfreiheit erfolgen, d.i. <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span>. Logisch evaluierte und verifizierte Axiome und Definitionen sind die ,modal‘ notwendigen, d.h. die ,transzendentalen‘ Voraussetzungen für die Ergebnisse eines Kalküls, damit seine Theoreme und Korollare in unserer ,realen‘ Welt als logisch ,wahr‘ und damit für uns auch als ,annehmbar‘ gelten können, während die Prämissen eines Kalküls, <span style="color:#00B000">(die Argument Einführung, <span style="color:#4C58FF">— '''AE:''' —</span> )</span>, nicht notwendige, und somit ,modal‘ frei gewählte ,Annahmen‘ sind. Jedoch aus diesen ,modal‘ frei gewählten, ,möglichen‘ <span style="color:#00B000">( <span style="color:#4C58FF">'''◇'''</span> )</span> Prämissen folgen mit Hilfe der ,bewiesenen‘ <span style="color:#00B000">( ╞ )</span> Axiome und Definitionen die Ergebnisse mit ,modaler‘ Notwendigkeit <span style="color:#00B000">( <span style="color:#4C58FF">'''□'''</span> )</span>.
Die Logik des GÖDEL-Systems ist eine ,Prädikatenlogik‘ zweiter Stufe, in der die Quantoren nicht nur Individuum-Variable, sondern auch Eigenschafts-Variable, <span style="color:#00B000">(als noch ,unbestimmte‘ Prädikate im Allgemeinen)</span>, binden können. Die formale Struktur des GÖDEL-Kalküls besteht aus fünf Axiomen und drei Definitionen, mit deren Hilfe in drei Beweisgängen drei Theoreme und mehrere Korollare aus seiner ,methodologischen‘ Prämisse ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitet werden können, wobei die beiden ersten Beweisgänge, mit ihren Ergebnissen, den dritten vorbereiten, in dem es dann um das Theorem ANSELMS geht. Die Prämisse des GÖDEL-Kalküls in allen Beweisgängen ist der traditionelle ,GOTT-Glaube‘, in der Formulierung speziell nach LEIBNIZ. Ein Axiom, eine Definition, zwei Theoreme und alle Korollare im GÖDEL-Kalkül sind Aussagen über <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>. Alle fünf Axiome, eine Definition und ein Theorem, <span style="color:#00B000">(und das Korollar aus Axiom-4)</span>, sind auch Aussagen über die Eigenschaft <span style="color:#FF6000">„Vollkommenheit“, „Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, die in der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> als die Wesenseigenschaft GOTTES gilt ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist vollkommen''«</span> bzw. <span style="color:#FF6000">»''GOTT ist das Vollkommenste der Wesen''«</span>, <span style="color:#00B000">(DESCARTES)</span>. Zwei Definitionen sind Aussagen über die allgemeinen Wesenseigenschaften aller Seienden, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, die Transzendentalien, die, als notwendige Existenz, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, auch GOTT zugeordnet werden, mit der Besonderheit bei GOTT, dass sowohl alle Eigenschaften, als auch alle anderen Zuordnungen, wie Sein und Wesen, wie Ursache und Wirkung, usw., im Unendlichen, GOTT, <span style="color:#FF6000">„koinzident“</span> sind, d.h. in GOTT paarweise perspektivisch in ,eins‘ zusammenfallen, und die auch, als Transzendentalia, konvertierbar, d.h. austauschbar sind. Diese Sachverhalte machen deutlich, dass eine spezifische ,Verifikation‘ und sachgerechte ,Evaluierung‘ der GÖDEL-Axiomatik nur genuin <span style="color:#4C58FF">,theologisch‘</span> erfolgen kann. Die Evaluierung der <span style="color:#FF6000">»''mathematischen Evidenz''«</span> des GÖDEL-Systems, im Allgemeinen, muss jedoch entsprechend der Maßstäbe einer modalen Prädikatenlogik zweiter Stufe durchgeführt werden.
Das GÖDEL-Kalkül unterscheidet <span style="color:#00B000">(in Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>)</span> formal-syntaktisch zwischen der Eigenschaft ,Existenz‘, <span style="color:#4C58FF"> — ‚'''E'''‘ —</span>, die nur GOTT zugeordnet werden kann, und dem Existenz-Operator, <span style="color:#4C58FF">— ‚'''∃'''‘ —</span>, der auch allem Übrigen, das nicht GOTT ist, zugeordnet wird. Es gibt hier auch den formal-syntaktischen Unterschied zwischen der, <span style="color:#00B000">(von mir notierten, jedoch von GÖDEL schon intendierten und angesprochenen)</span>, speziellen ,Notwendigkeit‘, <span style="color:#4C58FF"> — <sub>not</sub> —</span>, die nur der Existenz GOTTES zugeordnet ist, und der modalen ,Notwendigkeit‘, <span style="color:#4C58FF">— ‚'''□'''‘ —</span>, die auf Verschiedenes bezogen werden kann. Diese Unterschiede sind Hinweise, dass GÖDEL in seiner Kalkül-Logik und -Syntax, die Außerordentlichkeit und Eigenständigkeit GOTTES berücksichtigt, der, als Schöpfer der Welt, prinzipiell und absolut <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span> ist, die erst durch GOTT auch das ist, was sie ist.
===<div class="center"><span style="color:#660066">Die Genese des Kalküls</span></div>===
Wie kommt GÖDEL zu seinem Kalkül '''?''' Sein Gewährsmann war Gottfried Wilhelm LEIBNIZ, <span style="color:#00B000">(1646-1716)</span>, den er sehr schätzte. Die rekonstruierbare Genese seines Kalküls findet man in LEIBNIZ ''':''' ''<span style="font-family: Times;"><big>‚Neue Abhandlungen über den menschlichen Verstand‘</big></span>'', <span style="color:#00B000">(1704)</span>‚ ''<span style="font-family: Times;"><big>Viertes Buch, Kapitel X ''':''' ‚Von unserer Erkenntnis des Daseins Gottes‘</big></span>'', Seite 475f.
Hier der <span style="color:#00B000">[ kommentierte ]</span> Textausschnitt zum sog. ontologischen ‚Gottesbeweis‘''':'''
::<span style="color:#FF6000">»</span>''Folgendes etwa ist der Gang seines'' <span style="color:#00B000">[ d.h. ANSELMS, Erzbischof von Canterbury; 1033-1109, ]</span> ''Beweises ''':''' GOTT ist das Größte'', <span style="color:#00B000">[ ANSELM spricht vom biblischen GOTT des Glaubens, als ''':''' <span style="color:#FF6000">»''den, über dem ,Größeres‘'' | <span style="font-family: Times;"><big>‚maius‘</big></span> | ''nicht mehr gedacht werden kann''«</span> ]</span>, ''oder, wie DESCARTES es ausdrückt ''':''' das Vollkommenste der Wesen oder auch ein Wesen von äußerster Größe und Vollkommenheit'' ''':''' <span style="color:#00B000"> [ GÖDEL ''':''' </span><span style="color:#4C58FF">‚'''P'''‘</span> <span style="color:#00B000">:= ‚Perfektion‘, ‚positive Eigenschaft‘ ]</span>, ''das alle Grade derselben in sich schließt.''<span style="color:#00B000"> [ GÖDEL-Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>. Definition-1 bildet die traditionelle Vorstellung von GOTT ab. ]</span> ''Dies also ist der Begriff GOTTES.'' <span style="color:#00B000">[ Der Term <span style="color:#4C58FF">— ,'''G'''‘ —</span> steht hier für den biblischen ‚Begriff‘ <span style="color:#FF6000">„GOTT“</span> als ,Individuumname‘ '''!''' ]</span> ''Sehen wir nun, wie aus diesem Begriff das ‚Dasein’ folgt.''<span style="color:#00B000"> [ GÖDEL ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist notwendig aus sich ‚da‘''«</span> ''':''' Term :10:, 1. Hauptergebnis im 3. Beweisgang. ]</span> ''Es ist etwas <u>mehr</u>, ‚da‘ zu sein, als nicht ‚da‘ zu sein, oder auch das ‚Dasein‘ fügt der Größe oder der Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''einen Grad hinzu, und wie DESCARTES es ausspricht, das ‚Dasein‘ ist selbst eine Vollkommenheit.''<span style="color:#FF6000">«</span>
<span style="color:#00B000">(Diesen Ausspruch DESCARTES übernimmt GÖDEL im Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''notwendige Existenz''</span> [ alias ‚Dasein GOTTES’ ] <span style="color:#FF6000">''ist eine positive Eigenschaft''</span> [ alias Vollkommenheit ]<span style="color:#FF6000">«</span>. Dem widerspricht KANT ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>. Das Axiom-5 ist daher nur dann ‚wahr‘, wenn ‚Wirklichsein‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια οὖσα</big></span>“</span> | ‚enérgeia oúsa‘ | d.h. ‚Dasein‘ und ‚Wesen‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ | — genauer ''':''' ‚Wesenseigenschaften’ —, ontologisch ,eins‘ sind, d.h. wenn <span style="color:#FF6000">„Existieren“</span> immer schon die <span style="color:#FF6000">„Wesenseigenschaft“</span> GOTTES ist. Was nach ARISTOTELES nur im <span style="color:#FF6000">„unbewegten Erstbeweger“</span> der Fall ist; bzw. mit LEIBNIZ ''':''' <span style="color:#FF6000">»''was das Privilegium der Gottheit allein ist''«</span> '''!''' Aus der ,methodologischen‘ ,Annahme‘ im 2. Beweisgang GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den GOTT der Christen''«</span>, und mit Hilfe von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, bzw. <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, mit Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind notwendig aus sich, — von Natur aus —, positiv''«</span>, mit Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span> ''':''' <span style="color:#FF6000">»''Zum Wesen gehören notwendig auch alle Konsequenzen aus einer Wesenseigenschaft''«</span>, und mit Axiom-1 und der Definition für GOTT, folgt nach einigen logischen Umformungen das GÖDEL-Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist genau dann der GOTT der Christen, wenn das Wesen dieses GOTTES sein eigenes Sein ist''«</span>. Dasein und Wesen sind im Unendlichen, GOTT <span style="color:#FF6000">„koinzident“</span> ,eins‘, übereinstimmend mit dem Theorem des ARISTOTELES. Mit diesem, im Kalkül <u>ohne</u> Axiom-5 ,regulär‘ (├ ) abgeleiteten Theorem, widerlegt er KANT für den individuellen Spezialfall <span style="color:#4C58FF">‚'''G'''‘</span> := <span style="color:#FF6000">„GOTT“</span>. Nachprüfbar im Anhang ''':''' im ‚ontologischen‘ Beweis für das Basis-Theorem-2. Somit ist Axiom-5 ,wahr‘, und KANT, der <span style="color:#FF6000">»''eine Abneigung gegen das Gebet hatte''«</span> und auch <span style="color:#FF6000">»''nie zu den sonntäglichen Kirchgängern zählte''«</span><ref>Uwe SCHULTZ ''':''' ‚''<span style="font-family: Times;"><big>Immanuel Kant</big></span>''‘, Rowohlt Monographie 50659, Seite 12</ref>, hat sich hier, im Bezug auf GOTT, geirrt. <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, war für KANT nie eine ernstzunehmende Option. Die <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, die natürlich immer auch verbunden sein muss mit der täglichen ,Erfahrung‘ einer Glaubens-Praxis, im Gebet und in den Gottesdienst-Feiern des <span style="color:#4C58FF">„Theologen“</span>, und die daraus entsteht, ist eine ziemlich ,ausgereifte‘ Disziplin. Es haben sich, durch Jahrhunderte hindurch, viele gläubige und auch gescheite Menschen, schon im Judentum, und dann im Christentum, und ebenfalls im Islam, darum bemüht.)</span>
:: <span style="color:#FF6000">»</span>''Darum ist dieser Grad von Größe und Vollkommenheit oder auch diese Vollkommenheit, welche im ‚Dasein‘ besteht, in diesem höchsten, durchaus großen, ganz vollkommenen Wesen, denn sonst würde ihm ein Grad fehlen, was gegen seine Definition wäre. Und folglich ist dies höchste Wesen ‚da‘. Die Scholastiker, ohne selbst ihren'' <span style="font-family: Times;"><big>doctor angelicus</big></span> <span style="color:#00B000">[ := THOMAS von Aquin ]</span> ''auszunehmen, haben diesen Beweis verachtet'', <span style="color:#00B000">[ wie später auch Immanuel KANT ]</span>, ''und ihn als einen Paralogismus'' <span style="color:#00B000">[ := Fehlschluss ]</span> ''betrachtet, worin sie sehr unrecht gehabt haben; und DESCARTES, welcher die scholastische Philosophie im Kolleg der Jesuiten zu La Flèche lange genug studiert hatte, hat sehr recht gehabt, ihn wieder zu Ehren zu bringen. Es ist nicht ein Paralogismus, sondern ein unvollständiger Beweis'', <span style="color:#00B000">[ den GÖDEL vervollständigt hat ]</span>, ''der etwas voraussetzt, was man noch hätte beweisen sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' <span style="color:#00B000">[ '''::''' <span style="color:#4C58FF">— '''◇''' —</span> '''::''' ,möglich‘, ,konsistent‘, ,denkbar‘; GÖDEL beweist im 1. Beweisgang aus Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, <span style="color:#FF6000">»''positive Eigenschaften'', <span style="color:#00B000">[ die allgemeinen Transzendentalien ]</span>, ''sind widerspruchsfrei''«</span>, mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, folgt Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist widerspruchsfrei möglich''«</span> ]</span>. ''Und es ist schon etwas, dass man durch diese Bemerkung beweist ''':''' gesetzt, dass GOTT'' <span style="color:#00B000">['' <span style="color:#FF6000">»widerspruchsfrei«</span> '']</span> '',möglich‘ ist, so ‚ist‘ er'' <span style="color:#00B000">[ ,notwendig‘ '''::''' <span style="color:#4C58FF">— '''□''' —</span> '''::''' für jede mögliche Welt auch wirklich aus sich ‚da‘ ]</span>, ''was das Privilegium der Gottheit allein ist'' ''':''' <span style="color:#00B000">[ Im 3. Beweisgang, Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' ‚ANSELMS Prinzip‘ ''':''' <span style="color:#FF6000">»''Weil GOTT widerspruchsfrei ,möglich‘ ist, darum ist auch der Glaube widerspruchsfrei, der annimmt, dass GOTT aus sich ,notwendig‘ da ist''«</span>; mit Korollar-3 ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ —</span>, <span style="color:#FF6000">»''Es gibt notwendig nur einen einzigen GOTT''«</span>. Damit ist auch der Monotheïsmus bewiesen. ]</span> ''Man hat recht, die Möglichkeit eines jeden Wesens anzunehmen und vor allem die GOTTES, bis ein anderer das Gegenteil beweist''. <span style="color:#00B000">[ Das Gegenteil besagt, dass GOTT ,unmöglich‘ ist. Hier setzt der Möglichkeitsbeweis im GÖDEL-Kalkül an, und beweist, dass diese Aussage zu einem Widerspruch führt. ]</span> ''Somit gibt dieser metaphysische Beweis schon einen moralischen zwingenden Schluss ab, wonach wir dem gegenwärtigen Stande unserer Erkenntnisse zufolge urteilen müssen, dass GOTT ‚da‘ sei, und demgemäß handeln.'' <span style="color:#00B000">[ Aber nicht logisch zwingend '''!''' Denn die Interpretation <span style="color:#4C58FF">— ‚'''G'''‘ —</span> mit dem GOTT der Bibel, als ,methodologische‘ Kalkül-Prämisse, ist nicht zwingend, jedoch ,modal‘ möglich, <span style="color:#4C58FF">— '''◇''' —</span>, und im christlichen Glaubenskontext sinnvoll, was mit einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls gezeigt werden kann. Damit wäre dann auch die Frage beantwortet, ob das GÖDEL-System sich plausibel als eine Theorie von GOTT und seinen Eigenschaften interpretieren lässt, bzw. als eine <span style="color:#FF6000">»''axiomatische''«</span> <span style="color:#4C58FF">„Theologie“</span>, wie sie André FUHRMANN apostrophiert. Das <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ist der ,Individuumname‘ für den GOTT der Bibel, — ,GOTT‘ groß geschrieben —, im monotheïstischen, christlichen Glaubenskontext, den auch LEIBNIZ teilt. Dann steht der ,Name‘ auch synonym für das ,existierende‘ Individuum, d.h. für dessen ,Existenz‘. ]</span> ''Es wäre aber doch zu wünschen, dass gescheite Männer'' <span style="color:#00B000">[ sic ! ]</span> ''den Beweis mit der Strenge einer mathematischen Evidenz vollendeten'', <span style="color:#00B000">[ was GÖDEL veranlasst hat, seine Version eines ‚ontologischen Beweises’ zu kreieren, dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> man heute mit Computerprogrammen<ref>siehe Fußnote 12</ref> schon nachgewiesen hat ]</span> ... <span style="color:#FF6000">«</span>.
Für GÖDEL war dieser Text eine intellektuelle Herausforderung, und er hat sie angenommen. Das war für GÖDEL sicher keine Glaubensangelegenheit. GOTT hat es ja auch nicht nötig, ‚bewiesen‘ zu werden. Wer <span style="color:#4C58FF">— ‚'''G'''‘ —</span> z. B. mit dem sog. ‚Urknall‘ gleich setzt, macht die <span style="color:#FF6000">»''zufällige Struktur der Welt''«</span> im ‚Urknall‘, <span style="color:#00B000">(pantheistisch)</span> zu einem ,Gott‘, was GÖDEL dezidiert für sein Kalkül ausgeschlossen haben wollte.
Kurt GÖDEL schreibt 1961 in einem Brief, in Anlehnung an den obigen Text ''':'''
::<span style="color:#FF6000">»...''ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig ''<span style="color:#00B000">[ sic '''!''' ]</span>, ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', <span style="color:#00B000">[ dass es GOTT gibt ]</span>, ''mit allen bekannten Tatsachen'', <span style="color:#00B000">[ z. B. mit den Maßstäben einer modernen Logik ]</span>, ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker LEIBNIZ versucht''.«</span><ref>Zitiert nach SCHIMANOVICH-GALIDESCU, M.-E. ''':''' ‚''<span style="font-family: Times;"><big>Princeton–Wien 1946–1966. Briefe an die Mutter</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kurt Gödel – Leben und Werk</big></span>''‘, Hg. B.BULDT et alia, Wien (HÖLDER–PICHLER–TEMSKY), 2001, Band 1</ref>
===<div class="center"><span style="color:#660066">Die Interpretation des Kalküls</span></div>===
Wenn man sich das GÖDEL-Kalkül ansieht, wie es heute formalisiert vorliegt, stellt sich die Frage ''':''' <span style="color:#FF6000">„Lässt sich dieses System plausibel als eine Theorie von GOTT <span style="color:#00B000">(als eine ‚Rede von GOTT’ := <span style="color:#4C58FF">,Theologie’</span>)</span> und seiner Eigenschaften verstehen '''?''' “ — „Ist hier eine genuin <span style="color:#4C58FF">,theologische’</span> Interpretation möglich '''?''' “</span> Seine Herkunft aus der intellektuellen Auseinandersetzung des Logikers GÖDEL mit dem GOTT-gläubigen Philosophen LEIBNIZ und dem christlichen Theologen und Erzbischof ANSELM rechtfertigt diese Frage. Die <span style="color:#FF6000">„mathematische Evidenz“</span> des GÖDEL-Formalismus, <span style="color:#00B000">(im Anhang nachgestellt)</span>, ist allgemein anerkannt, <span style="color:#00B000">(Vorbehalte dagegen gibt es nur bei der Interpretation seiner Syntax, d.h. ob die Axiome und Definitionen, wie GÖDEL sie konzipiert hat, bzw. ob die Theoreme und Korollare, die aus diesen Axiomen ,regulär’ (├ ) abgeleitet werden, auch in unserer realen Welt ,wahr’ und ,annehmbar’ sind)</span>. Die <span style="color:#FF6000">„theologische Evidenz“</span> des GÖDEL-Systems wird durch eine ,Verankerung’ der Axiome und Definitionen in den <span style="color:#4C58FF">,theologisch’</span>-philosophischen Diskurs über GOTT evaluiert, der schon seit zweieinhalbtausend Jahren läuft. In diesen zweieinhalbtausend Jahren hat sich, — gegen ARISTOTELES und die antike Philosophie —, die Erkenntnis durchgesetzt, dass GOTT <span style="color:#FF6000">»''unabhängig''«</span> von der <span style="color:#FF6000">»''zufälligen''«</span> Raum-Zeit-Struktur unserer vergänglichen Welt ist. In meiner Darstellung des GÖDEL-Kalküls folge ich, <span style="color:#00B000">(im Unterschied zum Autographen GÖDELS, vom 10. Feb 1970)</span>, in der Axiom-Formulierung und -Nummerierung, in der Syntax, und in der Beweis-Struktur, der Arbeit von André FUHRMANN ''':''' ''<span style="font-family: Times;"><big>‚Existenz und Notwendigkeit. Kurt Gödels axiomatische Theologie‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Logik in der Philosophie‘</big></span>'' Hg. SCHROEDER-HEISTER, SPOHN und OLSSON, 2005, Synchron, Heidelberg, Seite 349–374. <span style="color:#00B000">(Die tiefer gestellte Notation der spezifischen ,Eigenschaft‘ einer Eigenschaft ist meine Ergänzung zur formalen Syntax, z. B. ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>'''x'''‘ — </span>, angeregt durch die indizierende Schreibweise GÖDELS ''':''' <span style="color:#4C58FF">— ,'''G''' Ess. '''x'''’ —</span>.)</span> Die Erkenntnisse zur Straffung und Präzisierung der GÖDEL-Syntax, <span style="color:#00B000">(besonders im Möglichkeitsbeweis)</span>, stammen aus der Arbeit von Günther J. WIRSCHING ''':''' ,''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, im Web <ref>https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf</ref>. <span style="color:#00B000">(Auch der Hinweis auf AVICENNA kommt von WIRSCHING.)</span> Die Zitate von THOMAS von Aquin´s Stellungnahme zum Theorem ANSELMS, und von Georg Wilhelm Friedrich HEGEL zur Immanuel KANTS Ablehnung des Theorem ANSELMS, befinden sich in Franz SCHUPP, ,<span style="font-family: Times;"><big>''Geschichte der Philosophie im Überblick''</big></span>‘, Band 2 ‚<span style="font-family: Times;"><big>''Christliche Antike, Mittelalter''</big></span>‘, Hamburg 2003, Seite 168 und Seite 170.
Meines Erachtens ist der entscheidende Ansatzpunkt einer <span style="color:#4C58FF">„theologischen“</span> Interpretation das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>.
‚Frei‘ nach KANT ‚formuliere‘ ich ‚kurz‘ ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Hier die Positionen KANTS zum Thema ‚Existenz‘ und ‚Eigenschaften‘ ''':'''
::<span style="color:#FF6000">»</span>''… unbeschadet der wirklichen Existenz äußerer Dinge'', <span style="color:#00B000">[ kann man ]</span> ''von einer Menge ihrer Prädikate'', <span style="color:#00B000">[ d.h. Eigenschaften ],</span> ''sagen'' … ''':''' ''sie gehöreten nicht zu diesen ‚Dingen an sich selbst‘, sondern nur zu ihren Erscheinungen, und hätten außer unserer Vorstellung'' <span style="color:#00B000">[ ihrer, als ,wirklich‘ gedachten Erscheinung, ]</span> ''keine eigene Existenz, … weil ich finde, dass … '''alle Eigenschaften, die die Anschauung eines Körpers ausmachen''', bloß zu seiner Erscheinung gehören; denn die Existenz des Dinges, was erscheint, wird dadurch nicht … aufgehoben, sondern nur gezeigt, dass wir es'', <span style="color:#00B000">[ das Ding ]</span>, ''wie es ‚an sich selbst‘ sei'', <span style="color:#00B000">[ d.h. existiert ]</span>, ''durch Sinne gar nicht erkennen können''.<span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Prolegomena zu einer jeden künftigen Metaphysik, die als Wissenschaft wird auftreten können</big></span>''‘, Seite 289; https://www.korpora.org/kant/aa04/289.html</ref> <span style="color:#00B000"><small>(Hervorhebung durch KANT.)</small> [ Seine Prädikate, d.h. Eigenschaften, jedoch können wir mit unseren Sinnen ,anschauen‘, aber nur in Kombination mit unserer Vorstellung ihrer, als ,wirklich‘ gedachten Erscheinung, vermittelt durch den sog. ,transzendentalen Schematismus‘ unserer Einbildungskraft ''':'''</span> <span style="color:#FF6000">»</span>''Eine verborgene Kunst in den Tiefen der menschlichen Seele''<span style="color:#FF6000">«</span>, <span style="color:#00B000">jedoch auch eines der ,dunkelsten‘ Kapitel in der K.d.r.V., bedingt durch KANTS Konzept von ,Wirklichkeit‘, bzw. ,Sein‘. ]</span>
Mit anderen Worten, man kann die ‚Existenz‘, bzw. das ‚Sein‘ der Dinge, <span style="color:#00B000">(das ‚Ding an sich’ bei KANT)</span>, nicht unter dem Mikroskop finden. Die ‚Existenz‘ bzw. das ‚Sein‘ ist keine sinnlich registrierbare ‚Eigenschaft‘ z. B. des rekonstruierten ‚Stadt-Schlosses‘ in Berlin. <span style="color:#00B000">(‚Sein‘ ist kein reales ‚Prädikat‘.)</span> Dafür haben wir andere Fähigkeiten ''':''' Ich kann seine ‚Existenz‘ mit meinem Verstand einsehen, weil auch ich selbst ‚existiere‘. Seine ‚Ansicht‘, wie ‚gefällig‘ es ist, und auch weitere ‚Eigenschaften‘, die mir auffallen, kann ich mit einem Handy-Foto dokumentieren. Diese ‚Eigenschaften‘ sind nicht die Ursache, dass das ‚Berliner Schloss‘ existiert. Wohl aber die Rekonstruktion dieses Schlosses ist die ‚Ursache‘, dass es ,existiert‘, und jetzt so aussieht. Insofern ist ‚Existenz‘ keine ‚Eigenschaft‘, sondern die ‚Existenz‘ des Dinges ist die Voraussetzung, der ‚Grund‘, dass ich die ‚Eigenschaften‘ des Dinges mit meinen Sinnen feststellen kann.
In einer Auseinandersetzung mit CARTESIUS schreibt KANT, philosophisch ‚tiefgründig‘ und logisch ‚exakt‘, über dessen <span style="color:#FF6000"><span style="font-family: Times;"><big>„Cogito, ergo sum“</big></span></span> ''':'''
::<span style="color:#FF6000">»</span>''Das ‚Ich denke‘ ist ein empirischer Satz, und hält den Satz ‚Ich existiere‘ in sich. Ich kann aber nicht sagen ''':''' ‚Alles, was denkt, existiert‘; denn da würde die Eigenschaft des Denkens'', <span style="color:#00B000">[ eine essentielle Eigenschaft ]</span>, ''alle Wesen, die sie besitzen, zu notwendigen'' <span style="color:#00B000">[ d.h. notwendig existierenden ]</span> ''Wesen machen''. <span style="color:#00B000">[ Was allein nur von GOTT ausgesagt werden kann; mit AVICENNA, als anerkannter ARISTOTELES-Kommentator ''':''' <span style="color:#FF6000">»''GOTT ist das einzige Sein, bei dem Essenz'' <span style="color:#00B000">[ ‚Wesenseigenschaften‘ ]</span> ''und Existenz'' <span style="color:#00B000">[ ‚Dasein‘ ]</span> ''nicht zu trennen sind und das daher notwendig an sich da ist''«, <span style="color:#00B000">— konform mit GÖDEL ''':'''</span> »''notwendige Existenz ist eine positive'' <span style="color:#00B000">[ essentielle ]</span> ''Eigenschaft''«</span> ].</span> ''Daher kann meine Existenz auch nicht aus dem Satz, ‚Ich denke‘, als'' <span style="color:#00B000">[ logisch ]</span> ''gefolgert angesehen werden, wie CARTESIUS dafür hielt (weil sonst der Obersatz : ‚Alles, was denkt, existiert‘, vorausgehen müsste), sondern ist mit ihm identisch.'' <span style="color:#00B000">[ Eine einfache Schlussfolgerung ''':''' meine ‚Existenz‘ ist auch nicht von meiner ‚Eigenschaft‘ Denken ‚verursacht‘. ,Existenz‘ ist nicht bloß ein ,Gedanke‘ von mir. ]</span><span style="color:#FF6000">«</span> <span style="color:#00B000">(Aus der Anmerkung 41 zu den ‚''<span style="font-family: Times;"><big>Paralogismen der reinen Vernunft</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 275,<ref>https://korpora.org/kant/aa03/275.html</ref> mit meinem Einschub des AVICENNA-Zitat aus Wikipedia.<ref>{{w|Avicenna#Metaphysik}}</ref>)</span>
Mit anderen Worten ''':''' <span style="color:#FF6000">„Die Eigenschaft, dass ich denken kann, ist nicht die Ursache meiner ‚Existenz‘“</span>, sondern, <span style="color:#FF6000">„Die Liebe meiner Eltern und ihre Entscheidung füreinander ist die Ursache meiner ‚Existenz‘. Daher ‚bin’ ich. Und weil ich ein Mensch ‚bin‘, kann ich denken.“</span> Auch mit diesen Anmerkungen ist leicht einsehbar, dass ‚Existenz‘ keine ‚Eigenschaft‘ ist — außer bei GOTT. In GOTT ist ‚Dasein‘ die ‚Wesenseigenschaft‘ GOTTES, d.h. ‚Dasein‘ und ‚Wesen‘ sind in GOTT untrennbar verbunden; sind <span style="color:#FF6000">„koinzident“</span> ‚eins‘. Das ist die Einzigartigkeit im Wesen GOTTES, dass GOTT immer schon ‚da‘ ist. Die Frage nach dem ‚Wesen‘ GOTTES lautet ''':''' <span style="color:#FF6000">„Was bist du ? “</span>/<span style="color:#CC66FF">„Wer bist Du ? “</span> Antwort, Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'' <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Weil GOTT für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, hat GOTT es nicht nötig, ‚bewiesen‘ zu werden. <span style="color:#00B000">(In der Mathematik ist ein ‚Satz‘ erst dann ‚wahr‘ und ‚existent‘, wenn er bewiesen ist. Bei GOTT ist es jedoch nicht so ''':''' GOTTES ‚Existenz‘ ist nicht erst dann ‚wahr‘, wenn seine ‚Existenz‘ von uns ‚bewiesen‘ ist. Sein ‚Dasein‘ ist jedem unserer ‚Beweisversuche‘ immer schon voraus. Der Zugang zu GOTT ist nicht der ,Beweis‘, sondern der ,Glaube‘. Wer an GOTT glauben ,will‘, dem antwortet GOTT. Wer nicht an GOTT glauben ,will‘, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Die Glaubens-Entscheidung hat jedoch für jeden Menschen eine existenzielle Konsequenz ''':''' <span style="color:#CC66FF">»''Wer glaubt und sich taufen lässt, wird gerettet; wer aber nicht glaubt'', <span style="color:#00B000">[ und diese Entscheidung auch im Augenblick der ,Wahrheit‘, im Tod, in der sog. ,Endentscheidung‘, nicht widerruft ]</span>, ''wird verurteilt werden''«,</span> <small>({{Bibel | Markus Evangelium |16|16|EU}})</small>. Das Urteil lautet ''':''' <span style="color:#CC66FF">»''zweiter Tod ''':''' der Feuersee''«</span>, <small>({{Bibel | Offenbarung |20|14f|EU}})</small>, ohne Berufungsmöglichkeit. <span style="color:#CC66FF">»''Ohne Glauben aber ist es unmöglich, Gott zu gefallen; denn wer zu Gott kommen will, muss glauben, dass er ist und dass er denen, die ihn suchen, ihren Lohn geben wird''«.</span> <small>({{Bibel | Hebräer Brief |11|6|LUT}})</small>)</span>
Das GÖDEL-Axiom-5 ist m.E. der entscheidende Ansatzpunkt einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation der GÖDEL-Axiomatik.
===<div class="center"><span style="color:#660066">Das Kalkül ist kein Existenz-Beweis für GOTT</span></div>===
Die allgemeine <span style="color:#FF6000">»''mathematische Evidenz''«</span> des GÖDEL-Formalismus, d.h. seine ‚Schlusskraft‘, ist von kompetenten Leuten<ref>„GÖDELS Argumentationskette ist nachweisbar korrekt – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO nun gezeigt;“ vgl. https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html</ref> schon festgestellt worden, <span style="color:#00B000">(im Anhang ‚nachrechenbar‘ mit den Regeln und Gesetzen einer modalen Prädikatenlogik 2. Stufe)</span>. Das GÖDEL-Kalkül ist jedoch kein ‚moderner‘<span style="color:#FF6000">„Existenz-Beweis“</span> für GOTT, wofür es gehalten oder meistens bezweifelt wird, sondern setzt, <span style="color:#00B000">(theoretisch methodisch)</span>, den <span style="color:#FF6000">„Glauben an die Existenz GOTTES“</span> schon voraus, ohne ihn zu hinterfragen. Das <span style="color:#FF6000">„Dasein“</span> bzw. die <span style="color:#FF6000">„Existenz“</span> GOTTES wird mit der Definition-1 für <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, bzw. mit dem Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, im Kalkül ‚definitorisch‘ bzw. ‚axiomatisch‘ als Kalkül-,Annahme‘, als <span style="color:#FF6000">„Prämisse“</span>, eingeführt, unter der Voraussetzung, dass die ‚Eigenschaft‘ <span style="color:#4C58FF">‚'''G'''‘ := </span><span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(Essenz)</span> und das <span style="color:#FF6000">„Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> <span style="color:#00B000">(Existenz)</span>, ontologisch ‚identisch‘, genauer ''':''' <span style="color:#FF6000">„koinzident“</span> sind, was GÖDEL im Axiom-5 definitiv für sein System vorschreibt ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>. Das <span style="color:#FF6000">„Dasein GOTTES“</span> ist faktisch äquivalent zur <span style="color:#FF6000">„notwendigen Existenz als GOTT“</span>; und <span style="color:#FF6000">„Göttlichkeit“</span> ist die <span style="color:#FF6000">„positive Eigenschaft in GOTT“</span>. Beides ist nach Axiom-5 ‚identisch‘, d.h. dem ‚Sein nach‘ dasselbe, und daher konvertierbar. Beide, <span style="color:#00B000">(sowohl die Essenz, als auch die Existenz GOTTES)</span>, werden daher auch mit demselben Term ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span> im Kalkül dargestellt. Der traditionelle, christliche ,GOTT-Glaube‘ wird zugleich mit diesem Term <span style="color:#4C58FF">‚'''G'''‘ := </span> <span style="color:#FF6000">„GOTT“ <span style="color:#00B000">|</span> „göttlich“</span>, im 2. Beweisgang, dem Basisbeweis, und im 3. Beweisgang für das Theorem ANSELMS, jeweils als ,methodologische‘ Prämisse :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> regulär <span style="color:#00B000">( ├ )</span> und explizit eingeführt ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht für den GOTT'' <span style="color:#4C58FF">‚'''G'''‘</span> ''der Christen''«</span>. Das ist die ,modal‘-frei gewählte, <span style="color:#4C58FF">„theologische“</span> Kalkül-,Annahme‘, <span style="color:#00B000">(als ,Argument-Einführung‘ := <span style="color:#4C58FF">‚'''AE:'''‘</span> )</span>, und wird dann mit Definition-1 näher ,bestimmt‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ — </span> ''':''' <span style="color:#FF6000"> »''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht genau dann für ‚GOTT‘'' <span style="color:#00B000">|</span> ''‚göttlich‘'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle positiven Eigenschaften, bzw. Vollkommenheiten'', <span style="color:#4C58FF">‚'''PX'''‘</span>, ''hat''«</span>, entsprechend dem ‚Quelltext‘ bei LEIBNIZ. <span style="color:#00B000">(Das ,postulierte‘ Axiom-3 ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, wird standardmäßig gelesen als <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, hat aber auch die alternative Leseart ''':''' <span style="color:#FF6000">»''GOTT ist perfekt d.h. vollkommen''«</span>, was <span style="color:#4C58FF">„theologisch“</span> auch richtig ist; mit <span style="color:#4C58FF">‚'''P'''‘ </span> := <span style="color:#FF6000">„Perfektion“/„Vollkommenheit“</span> ist dann die Summe aller <span style="color:#FF6000">„positiven Eigenschaften“</span>.)</span> Mit Axiom-3, — in dieser <span style="color:#4C58FF">„theologischen“</span> Leseart —, ist der ‚Wenn-Satz‘ in Definition-1 ‚aufgelöst‘ ''':''' <span style="color:#FF6000">»''GOTT hat alle positiven Eigenschaften, weil er ‚perfekt‘ ist''«</span>.
In Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, wird die ,für uns‘ <span style="color:#FF6000">„notwendige Existenz“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —, </span> durch die ,aus sich‘ <span style="color:#FF6000">„notwendig“</span> <span style="color:#4C58FF">— '''□''' —</span> instanziierten <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(als zu den Transzendentalia gehörig)</span>, bestimmt. Das GÖDEL-Kalkül setzt sowohl in Definition-3 als auch im Axiom-5 das Theorem des ARISTOTELES von der ontologischen ‚Identität‘, d.i. die Koinzidenz von <span style="color:#FF6000">„Dasein“</span>, <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#00B000">(Essenz)</span> im prinzipiell <span style="color:#FF6000">„unbewegten Erstbewegenden“</span> voraus. Ohne diese Annahme bzw. ohne Axiom-5, würde das GÖDEL-Kalkül nicht ‚funktionieren‘. Das GÖDEL-Theorem-2.1 ''':''' <span style="color:#4C58FF">— ‚'''Gx→G'''<sub>ess</sub>'''x'''‘ —</span>, kann unter dieser Voraussetzung dann, <span style="color:#4C58FF">„theologisch“</span> richtig und eindeutig, so gelesen werden ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für GOTT'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''als Individuum steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span>, ''das Wesen'', <span style="color:#4C58FF">—<sub>ess</sub>—, </span> <span style="color:#00B000">(,Essenz‘)</span>, ''GOTTES'' <span style="color:#4C58FF">‚'''x'''‘</span>«</span><ref>vgl. z.B. THOMAS von Aquin ''':''' ,''<span style="font-family: Times;"><big>De Ente et Essentia</big></span>''’, Kapitel 5 ''':''' „Deus, cuius essentia est ipsummet suum esse“ ''':''' „GOTT, dessen Wesen sein eigenes Sein ist“.</ref>, statt der <span style="color:#4C58FF">„theologisch“</span> unrichtigen Lesearten in der Wikipedia ''':''' <span style="color:#FF6000">»''Göttlich ist eine essentielle Eigenschaft jedes göttlichen Wesens''«</span><ref>{{w|Gottesbeweis#Kurt_Gödel|Gottesbeweis 2.1.2, Theorem 2}}; Version vom 10.09.2025</ref>, oder bei Christoph BENZMÜLLER et alia, im sog. ,Theorembeweiser‘ ''':''' <span style="color:#FF6000">»''Gottähnlich zu sein ist eine Essenz von jeder gottähnlichen Entität''«</span><ref>[https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html ‚Gödels „Gottesbeweis“ bestätigt’, Theorem 2]</ref>, mit der suggestiven Annahme, es gäbe polytheïstisch, mehrere ,göttliche Wesen‘, bzw. ,gottähnliche Entitäten‘, was der monotheïstischen, abendländischen Tradition, bzw. dem <span style="color:#4C58FF">„theologischen“</span> Theorem von der ,Unvergleichlichkeit‘ und ,Einzigartigkeit‘ GOTTES widerspricht, das im GÖDEL-Kalkül mit Korollar-3 bestätigt wird. <span style="color:#00B000">(Die Interpretation <span style="color:#4C58FF">‚'''G'''‘ :=</span> <span style="color:#FF6000">„GOTT“</span>, als ,Individuumname‘, ist synonym zum <span style="color:#FF6000">„Dasein <span style="color:#00B000">(Existenz)</span> GOTTES“</span>, und äquivalent zur ‚positiven Eigenschaft‘ <span style="color:#FF6000">„Göttlichkeit“</span>, alias <span style="color:#FF6000">„göttlich zu sein“</span> = <span style="color:#FF6000">„GOTT zu sein“</span> = <span style="color:#FF6000">„GOTT-Sein“</span>; und mit dem GÖDEL-Term ''':''' <span style="color:#4C58FF">‚'''G'''<sub>ess</sub>‘ :=</span> <span style="color:#FF6000">„das Wesen <span style="color:#00B000">(Essenz)</span> GOTTES“</span>.)</span>
<div class="center"><span style="color:#FF6000"><span style="color:#4C58FF">‚'''G'''‘ :=</span> „'''G'''öttlichkeit“ <span style="color:#4C58FF">↔</span> „'''G'''OTT“ <span style="color:#4C58FF">↔</span> „'''G'''OTT-Sein“</span> </div>
Die Rechtfertigung für diese <span style="color:#4C58FF">„theologische“</span> Dreifach-Äquivalenz für <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, im GÖDEL-Kalkül, gibt Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''die positive <u>Eigenschaft</u>'', <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ''Göttlichkeit'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''äquivalent zu GOTT als Individuum-Name'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''ist auch äquivalent zum Dasein GOTTES'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''gleichbedeutend mit notwendiger <u>Existenz</u>'', <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>'', dem <u>Sein</u> GOTTES für uns''«</span>. Hier hat GÖDEL explizit <span style="color:#FF6000">„Eigenschaft“</span> mit <span style="color:#FF6000">„Existenz“</span> bzw. <span style="color:#FF6000">„Sein“</span> gleichgesetzt; <span style="color:#00B000">(was jedoch nach KANT für alles, was in unserer Welt ‚existiert‘, bzw. für alles, was zur <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> gehört, wie GÖDEL selbst sagt, in jedem Fall ‚unstatthaft‘ ist ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>)</span>. Jedoch wegen dieser ‚Gleichsetzung‘, die einzig und allein, der aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition entsprechend, singulär nur in GOTT ‚statthaft‘ ist, kann jetzt die ‚positive Eigenschaft‘ <span style="color:#00B000">(Essenz)</span> <span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(ontologisch korrekt)</span> gelesen werden als <span style="color:#FF6000">„das, was GOTT zu dem macht, ‚was‘ GOTT an sich selbst ist“</span>, nämlich zu seinem <span style="color:#FF6000">„GOTT-Sein“</span> <span style="color:#00B000">(Existenz)</span>, zu seinem <span style="color:#FF6000">„Dasein als GOTT“</span>; zur Tatsache, dass <span style="color:#FF6000">„GOTT GOTT ist“</span>, d.h. dass <span style="color:#FF6000">„GOTT als GOTT ‚da‘ ist“</span>. Das ist, <span style="color:#00B000">(und da folgt ARISTOTELES seinem Lehrer PLATO)</span>, nach traditioneller Auslegung, die übliche, ontologische Funktion des ‚Wesens‘<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ |</span> eines Seienden ''':''' es ‚macht‘ das Seiende zu dem, ‚was‘ es ist; es ist die ‚Ursache‘ dafür, dass das Seiende, das ‚ist‘, ‚was‘ es ist | ‚Was-Sein‘ — ‚Wesen‘. <span style="color:#00B000">(ARISTOTELES lokalisiert jedoch das ,Wesen‘ im Seienden, im Gegensatz zu PLATO, der das ,Wesen‘, — ,getrennt‘ vom Seienden —, in den allgemeinen ,Ideen‘ lokalisiert.)</span>
Da aber in ‚Gott‘, <span style="color:#00B000">(dem <span style="color:#FF6000">„unbewegten, ‚unverursachten‘ Erstbeweger“</span>)</span>, Prozesshaftes, ‚Ursächliches‘ auszuschließen ist, ist die übliche prozesshafte, ‚ursächliche‘ Funktion von <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span><span style="color:#00B000"> | ‚ousía‘ |</span> ,Wesen‘ im <span style="color:#FF6000">„Erstbewegenden“</span> nach ARISTOTELES, sozusagen, schon ‚zum Abschluss‘ gekommen, schon ‚verwirklicht‘, — <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐν-έργεια οὖσα</big></span>“</span><span style="color:#00B000"> | ‚en-érgeia oúsa‘</span> —, schon ‚ins-Werk‘ gesetzt; <span style="color:#00B000">(<span style="color:#FF6000">„<span style="font-family: Times;"><big>τὸ ἔργον</big></span>“</span> | ‚to érgon‘ | ‚das Werk‘; <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια</big></span>“</span> | ‚enérgeia‘ | ,Wirksamkeit‘, ,Wirklichkeit‘, ,Aktualität‘, ,Energie‘; und <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὖσα</big></span>“</span> | ,oúsa‘ | feminin Nominativ Singular von <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὤν</big></span>“</span> | ‚ón‘ | ‚seiend‘)</span>. Sein ,Wesen‘ ist im ,Dasein‘ vollendet, ist ,wirkliches, verwirklichendes Sein‘, ‚seiende Aktualität‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>actus purus</big></span>“</span> ''':''' sein Wesen ist ‚reine Tätigkeit‘, ,reine verwirklichende Gegenwärtigkeit‘, d.h. ,existent‘, ohne jede prozesshafte ‚Potenzialität‘. Aus der wichtigen und richtigen Erkenntnis, dass GOTT <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer Welt''«</span> ist, folgt mit der ontologischen Identität von ,Dasein‘ und ,Wesen‘ in GOTT ''':''' Der zeitlos ewige GOTT ist <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''immer schon da''«</span>, m.a.W. ist <span style="color:#FF6000">„zeitlos-ursprungslos“</span>. Insofern ist <span style="color:#FF6000">„Göttlichkeit“</span> die <span style="color:#FF6000">„Wesenseigenschaft“</span>, die im <span style="color:#FF6000">„Dasein GOTTES“</span> d.h. in <span style="color:#FF6000">„GOTT“</span>, schon ihr ‚Ziel‘, ihre Vollendung, — <span style="color:#FF6000">„Perfektion“</span>, Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, erreicht hat. GOTT ist <span style="color:#FF6000">»''vollkommen''«</span> und darum auch <span style="color:#FF6000">»''notwendig für uns immer schon ‚da‘''«</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ — </span>. GOTT ist in seinem ‚zeitlosen Wesen‘ <span style="color:#FF6000">„unverursacht“</span>, da er <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''vollkommen''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''□PG'''‘ —</span>, <span style="color:#00B000">(eine Instanz von Axiom-4)</span>. <span style="color:#FF6000">„Vollkommenheit“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ist die <span style="color:#FF6000">„Wesenseigenschaft“</span>, bzw. das <span style="color:#FF6000">„Wesen GOTTES“</span> ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>. <span style="color:#FF6000">»''GOTT ist ,der‘ Vollkommenste''«</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, d.h. <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist die unbegrenzte Summe der unendlichen Vollkommenheiten''«</span>. Und zur absoluten <span style="color:#FF6000">„Vollkommenheit“</span> gehört <span style="color:#FF6000">„notwendig“</span> auch das <span style="color:#FF6000">„Existieren“</span> ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span>. <span style="color:#FF6000">„Notwendige Existenz“</span> gehört zu den ,ultimativen‘ Transzendentalia in GOTT, was GÖDEL mit Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, syntaktisch formalisiert hat, wenn sowohl das <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, als auch alle <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span> im Kalkül, für den Dreifaltigen GOTT der Christen stehen, was dann im Korollar-3, mit der Identität, <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, bzw. der Koinzidenz beider Individuum-Variablen, explizit gezeigt wird.
Entscheidend für diese Interpretation des GÖDEL-Systems ist ''':''' nur unter der ,modal‘ notwendigen Voraussetzung der ontologischen ‚Identität‘ von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, Theorem-2 ''':''' <span style="color:#4C58FF"> — '''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>, bzw. der ‚Gleichsetzung‘, <span style="color:#00B000">(Koinzidenz)</span>, von <span style="color:#FF6000">„notwendiger Existenz“</span> mit den ‚positiven‘ Wesenseigenschaften, der <span style="color:#FF6000">„Essenz“</span> in GOTT, Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, ‚funktioniert‘ die GÖDEL-Axiomatik '''!''' Diese ‚Identität‘, bzw. ,Koinzidenz‘ wird in ARISTOTELES, ‚''<span style="font-family: Times;"><big>Metaphysik</big></span>''‘, Buch XII 7, in einem Indizienbeweis erbracht, der mit der Methode der philosophischen Induktion zum Ergebnis kommt ''':'''
::<span style="color:#FF6000">» … ''es muss'' <span style="color:#00B000">[ notwendig ]</span> ''etwas geben, das, ohne selbst ‚bewegt‘'' <span style="color:#00B000">[ </span>''worden''<span style="color:#00B000"> ]</span> ''zu sein'', <span style="color:#00B000">[ ‚unentstanden‘ ]</span>, ''alles Übrige wie ein Geliebtes ‚bewegt‘'' <span style="color:#00B000">[ ‚entstehen lässt‘ ]</span>«</span>, das darum selbst ‚zugleich‘ <span style="color:#FF6000">„<span style="font-family: Times;"><big>αἴδιον καί οὐσία καί ἐνέργεια οὖσα</big></span>“ <span style="color:#00B000">| ,aídion kai ousía kai enérgeia oúsa‘ |</span> »<span style="color:#00B000">[ zeitlich-]</span>''ewig, sowohl <u>Wesen</u>'', <span style="color:#00B000">[ etwas Konkretes, Essentielles ]</span>, ''als auch seiende Wirksamkeit — ''<span style="color:#00B000">[ </span>„<span style="font-family: Times;"><big>actus purus</big></span>“, „reine Tätigkeit“<span style="color:#00B000"> ]</span> ''— verwirklichendes, wirkliches <u>Sein</u> ist'', <span style="color:#00B000">[ ein Existierendes, das alles Übrige ,zur Existenz‘ bringen kann ]</span> «</span>, bzw. <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὀρεκτόν καί νοητόν</big></span>“ <span style="color:#00B000"> | ,orektón kai noêtón‘ | </span>»''das ersehnt und erkennbar ist''.«</span> <span style="color:#00B000">(''<span style="font-family: Times;"><big>vgl. ,Metaphysik</big></span>''‘ XII 7, 1072a,23 – 1072b,4)</span>
Was <span style="color:#FF6000">»''alles Übrige''«</span> ,zur Existenz‘ bringen kann, bzw. ,verwirklichen‘ kann, ohne selbst ,entstanden‘ zu sein, muß auch selbst, als etwas Konkretes, Essentielles, immer schon ,existieren‘, bzw. ,wirklich sein‘. Die, daraus abgeleitete, und damit ,erkannte‘, ontologische ‚Identität‘, — ,Koinzidenz‘ —, von ‚Wesen‘ und ‚Sein‘, <span style="color:#00B000">(Ziel aller Sehnsucht und jedes Erkenntnisstrebens)</span>, <span style="color:#FF6000">»''ist das Privilegium der Gottheit allein''«</span> ''':''' mit Gottfried Wilhelm LEIBNIZ interpretiert, entsprechend einer adäquaten, aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition. Dieses induktive, ‚ontologisch‘ a-posteriori Ergebnis aus der ‚Prinzipienforschung‘ des ARISTOTELES ist die metaphysische und logische Voraussetzung, dass GÖDEL seine Axiomatik im Kalkül des sog. ‚ontologischen Gottesbeweises‘ a-priori des ANSELM von Canterbury, und nach LEIBNIZ, deduktiv korrekt formulieren konnte; <span style="color:#00B000">(vgl. 3. Beweisgang)</span>.
Angenommen, die Variable <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für den <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, der Christen, <span style="color:#00B000">(siehe Anhang, Term :01: im 2. Beweisgang)</span>, dann ist, — auf Grund von diesem Beweisgang —, in unserer Welt ,wahr‘ und evident ''':''' sowohl die ‚positive Eigenschaft‘ <span style="color:#FF6000">»''Göttlichkeit''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als auch das faktische <span style="color:#FF6000">»''‚Da‘-Sein'' <span style="color:#00B000">[ Existenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ‚benennen‘, ontologisch ident, denselben Sachverhalt ''':''' nämlich das, was wir das <span style="color:#FF6000">»''Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>, nennen. <span style="color:#FF6000">»''Göttlichkeit'', bzw. ''GOTT-‚Sein‘ ist das Wesen GOTTES''«</span>, <span style="color:#00B000">(Theorem-2.1)</span>, und dann umgedreht und äquivalent ''':''' <span style="color:#FF6000">»''Das Wesen GOTTES ist sein ‚Da‘-Sein als GOTT'', bzw. ''seine Göttlichkeit''«</span>, <span style="color:#00B000">(Theorem-2.2)</span>, m.a.W. ''':''' <span style="color:#FF6000">»''GOTT ist wesentlich ‚grundlos‘'' <span style="color:#00B000">[ d.h. </span> ''notwendig aus sich''<span style="color:#00B000"> ]</span> ''‚da‘''«</span>. Das ist das Einzigartige im <span style="color:#FF6000">»''Wesen GOTTES''«</span> ''':''' GOTT ist ohne zeitlichen Anfang, zeitlos-ewig, für uns immer schon ‚da‘, und das ‚ist‘ sein <span style="color:#FF6000">»''Wesen''«</span>; vorausgesetzt, ,angenommen‘, man glaubt an GOTT ''':''' Term :01:. <span style="color:#00B000">(Der schon von GÖDEL indizierte Term <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ — </span> ,expliziert‘ nur eine der drei Lesearten, die der Term <span style="color:#4C58FF"> — ‚'''G'''‘ — „theologisch“</span> ,impliziert‘.)</span> Theorem-2 hat somit die syntaktische Form einer Definition ''':'''
<div class="center"><span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span></div>
Somit kann GOTT ‚explizit‘ <span style="color:#00B000">(aus einer bewiesenen Kalkül-Definition)</span> <span style="color:#4C58FF">„theologisch“</span> genauer ‚bestimmt‘ werden ''':''' <span style="color:#FF6000">»''GOTT ist gerade deswegen GOTT, weil sein überzeitlich-ewiges und an sich ‚grundloses‘'' <span style="color:#00B000">[ aber für uns notwendiges ]</span> ''Dasein'' <span style="color:#00B000">[ Existenz ]</span> ''als GOTT, ontologisch, — dem Sein nach —, identisch ist mit seinem persönlichen und für uns liebevollen Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''als GOTT; diese Identität von Dasein und Wesen gilt einzig und allein nur bei GOTT.''«</span> Die philosophische Frage nach dem <span style="color:#FF6000">„Wesen GOTTES“</span> lautet, <span style="color:#00B000">(auf die Person bezogen)</span> ''':''' <span style="color:#FF6000">„Was bist du ? “</span> Sie ist äquivalent zur <span style="color:#4C58FF">,theologisch’</span>-biblischen Frage des MOSE ''':''' <span style="color:#CC66FF">„Wer bist Du ? “</span> Die bekannte Antwort des GOTTES-JHWH aus ‚Exodus 3,14‘, im Dornbusch, thematisiert das persönliche, für uns liebevolle und für immer notwendige <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'', <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Mit diesem Zitat aus der Bibel ist die GÖDEL-Axiomatik, sozusagen, <span style="color:#4C58FF">„theologisch“</span> ‚verifiziert‘. Sie hat einerseits im Theorem-2 ihren philosophischen ‚Abschluss’ erreicht, und andererseits damit formal-syntaktisch den ‚Anschluss‘ an eine allgemeine Basis-Glaubensaussage gefunden, die ‚an sich‘ für jeden CHRIST-gläubigen Menschen ‚selbstverständlich‘ ist. Was in der Metaphysik des ARISTOTELES das Ergebnis einer philosophischen ,Induktion‘ a-posteriori ist ''':''' <span style="color:#FF6000">„,Dasein‘ ist das ,Wesen‘ GOTTES“</span>, — <span style="color:#00B000">(das mit Theorem-2, auch ein Ergebnis der deduktiven GÖDEL-Axiomatik a-priori ist ''':''' die Beweisgrundlage für den Konsequenz-Teil im Theorem AMSELMS)</span>, — das ist in der Bibel die Grundüberzeugung jedes Menschen, der an GOTT glaubt ''':''' GOTT ist für uns immer schon <span style="color:#FF6000">„da“</span>, weil er uns liebt. Das ist das, <span style="color:#FF6000">„was“</span> GOTT für uns als GOTT ausmacht, — sein Wesen ''':''' <span style="color:#CC66FF">»''Wir haben die Liebe, die GOTT zu uns hat, erkannt und gläubig angenommen. GOTT ist Liebe, und wer in der Liebe bleibt, bleibt in GOTT und GOTT bleibt in ihm''«</span>, <small>({{Bibel | 1. Johannesbrief |4|16|EU}})</small>.
Das eigentliche Ergebnis der GÖDEL-Axiomatik ist somit die ‚triviale‘ Erkenntnis, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, vorausgesetzt <span style="color:#00B000">(‚angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#CC66FF">»''Ehe die Berge geboren wurden, ehe die Erde entstand und das Weltall erschaffen wurden, bist du, o GOTT, von Ewigkeit zu Ewigkeit''«</span>, <small>({{Bibel | Psalm |90|2|LUT}})</small>. <span style="color:#00B000">(Der Glaube an die Zeitlosigkeit GOTTES ist mit der ‚Annahme‘ von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, und der ‚Annahme‘ der Definition-1 für <span style="color:#4C58FF"> ‚'''Gx'''‘ := </span> den <span style="color:#FF6000">„GOTT der Christen“</span>, im Kalkül ‚implizit‘ schon eingeführt, da die Axiome und Definitionen, — nach GÖDEL —, nur dann <span style="color:#FF6000">»''wahr''«</span> sind, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen''</span> [ Raum-Zeit-]<span style="color:#FF6000">''Struktur''«</span> unserer Welt sind. Das ,impliziert‘ auch, dass der GOTT von Axiom-3 und Definition-1 ebenfalls <span style="color:#FF6000">»''unabhängig''«</span> von Raum und Zeit, d.h. zeitlos-ewig ist '''!''' )</span>
Wer an den GOTT der Bibel glaubt, kann sich von der ‚Vernünftigkeit‘ seines Glaubens mit Hilfe des sog. ,ontologischen‘ Gottesbeweises nach ANSELM von Canterbury, mit Kurt GÖDEL <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, überzeugen. <span style="color:#00B000">(Das war auch die Absicht ANSEMS '''!''' )</span> Die Annahme, es sei ‚unmöglich‘, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span>, <span style="color:#00B000">(dezidierter Atheismus)</span>, führt im GÖDEL-Kalkül formal zu einem logischen Widerspruch; vgl. z. B. ‚''<span style="font-family: Times;"><big>Gödels Möglichkeitsbeweis</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, Seite 17, von Günther J. WIRSCHING; (https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf), d.h. es ist also nicht ‚unmöglich‘, dass es GOTT gibt. Der GOTT-Glaube ist mit den Maßstäben einer modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> und darum ,vernünftig‘. Damit steht fest ''':''' das GÖDEL-Kalkül ist kein moderner ‚Existenz-Beweis‘ für den GOTT der Bibel, sondern es setzt, <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, ,methodologisch‘, den Glauben an die Existenz eines zeitlos-ewigen GOTTES voraus, der, — <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer '' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> —, für uns immer schon ‚da‘ ist. Wenn aber einmal als fix ‚angenommen‘ worden ist, <span style="color:#00B000">(als Prämisse)</span>, dass es wahr ist, dass GOTT ‚existiert‘, dann ist natürlich die ‚Annahme‘, dass GOTT ‚nicht existiert‘, falsch. Aber sie ist auch ,unlogisch‘ und ,unsinnig‘, weil die Annahme ''':''' <span style="color:#FF6000">»''Es ist unmöglich, dass es einen GOTT gibt''«</span>, offensichtlich und eindeutig zu einem Widerspruch führt; was z. B. Günther J. WIRSCHING mit seiner Version des <span style="color:#00B000">(nicht umkehrbaren)</span> ‚Möglichkeitsbeweises‘ für ,GOTT‘, explizit vorexerziert hat; <span style="color:#00B000">( nachgestellt im Anhang ''':''' GÖDELS ‚Möglichkeitsbeweis‘ als ,Widerlegung‘ eines Nicht-GOTT-Glaubens; in Entsprechung zu Psalm 14,1 und Psalm 53,2 ''':''' <span style="color:#CC66FF">»''Der'' <span style="color:#00B000">[ ,unvernünftige‘ ]</span> ''Tor sagt in seinem Herzen ''':''' Es gibt keinen Gott. Sie handeln verderbt, handeln abscheulich; da ist keiner, der Gutes tut''«</span>. Historischer Hintergrund zu diesem Psalm-Text ''':''' Die Zerstörung des Tempels in Jerusalem 586 v.Ch. durch die Truppen des NEBUKADNEZAR II.)</span> Der Logiker GÖDEL hat in seinem System zum ,ontologischen Beweis‘ keine ‚formale Unentscheidbarkeit‘ <span style="color:#00B000">(Agnostizismus)</span> feststellen können, wie auf einem anderen Feld seiner Forschungsarbeiten.
Das GÖDEL-Konsequenz-Teil von der ‚Notwendigkeit‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, <span style="color:#00B000">(die ‚Konsequenz’ aus dem ‚widerspruchsfreien‘ Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —,</span>)</span> im ‚Theorem ANSELMS‘, ist <span style="color:#00B000">(im 3. Beweisgang, Term :10:)</span> dann auch eine weitere Explikation des Basis-Theorems-2 des Kalküls ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span>, über die ‚ontologische Identität‘ vom <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, mit seinem <span style="color:#FF6000">„Wesen“</span> ''':''' <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, nach einem <span style="color:#4C58FF">[ Modus ponens ]</span>, dargestellt mit Term :09:.
<span style="color:#00B000">(Die ontologische Identität von Dasein und Wesen in GOTT, ist die, für uns, <span style="color:#FF6000">„notwendige Präsenz <span style="color:#00B000">[ das Sein, <span style="color:#4C58FF">— ‚'''E'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, die äquivalent, bzw. koinzident ist zur <span style="color:#FF6000">„Vollkommenheit <span style="color:#00B000">[ das Wesen, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>. Diese Identität von Sein und Wesen in GOTT ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub> —</span>, bedeutet <span style="color:#4C58FF">,theologisch‘</span> konkret ''':''' die, für uns, notwendige Gegenwärtigkeit GOTTES, [ sein Dasein ], ist verwirklicht worden in der liebevollen [ Wesens-]Zuwendung GOTTES zu uns Menschen, in seiner Kindwerdung in Bethlehem, durch die Jungfrau MARIA ''':''' GOTTES Wesen ist ,Sein-mit-uns‘ ''':''' <span style="color:#CC66FF">»''sein Name'', <span style="color:#00B000">[ sein Wesen ]</span>, ''ist IMMANUEL, das heiß übersetzt ''':''' GOTT-ist-mit-uns''«, <small>({{Bibel | Matthäus Evangelium |1|23|EU}})</small></span>, der unsere Not-,wenden‘-wird, d.h. der uns und die Welt von der Korruption der Sünde und des Todes <span style="color:#4C58FF">,erlösen‘</span> will und wird; jedoch nicht ohne uns. Die <span style="color:#4C58FF">„Menschwerdung“</span> GOTTES in JESUS CHRISTUS, die <span style="color:#4C58FF">„Hypostatische Union“</span>, bzw. diese außergewöhnliche und einzigartige <span style="color:#FF6000">„Koinzidenz“</span> von GOTT und Mensch, ist der wirkliche und historische Beginn der <span style="color:#4C58FF">„Erlösung“</span> des Menschen und der Welt; vergegenwärtigt für jede Generation der Menschen in und durch die <span style="color:#4C58FF">„Kirche“</span> JESU CHRISTI.)</span>
Die, von GÖDEL im 1. Beweisgang, als Prämissen schon vorausgesetzten und ,angenommenen‘ Perfektionen, bzw. Vollkommenheiten, <span style="color:#00B000">(das sind die allgemeinen ,Transzendentalia‘ für alles Nicht-Göttliche in der Welt)</span>, werden im ersten Teil des 2. Beweisganges, mit Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dann auch als <span style="color:#FF6000">„positive Wesenseigenschaften“</span>, <span style="color:#00B000">(als die ultimativen ,Transzendentalia‘)</span>, in GOTT ‚definitiv‘ <span style="color:#00B000">( ╞ )</span> bestätigt; <span style="color:#00B000">(siehe Anhang, 2. Beweisgang, Anmerkung-2)</span>.
Im 3. Beweisgang ist das Basis-Theorem-2 die ,modal‘ notwendige, bzw. transzendentale, Voraussetzung, sowohl für das <span style="color:#FF6000">„an sich notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, im Term :10:, als auch für die <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, in den Ressourcen dieses Beweisganges ''':''' in der Definition-3, und im Axiom-5; <span style="color:#00B000">(das <span style="color:#4C58FF">— ‚'''E'''‘ —</span> wird nur GOTT zugeordnet; vgl. auch Anhang, 3. Beweisgang, Anmerkung-4)</span>. Dieses Basis-Theorem-2 ist auch zugleich die Antwort auf die Frage nach dem ‚Ursprung‘ GOTTES ''':''' GOTT ist <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> ‚da‘, von <span style="color:#CC66FF">„Ewigkeit zu Ewigkeit“</span>, denn es ‚ist‘ sein <span style="color:#FF6000">„Wesen“</span>, <span style="color:#00B000">(überzeitlich-ewig)</span> für uns immer schon ‚da‘ zu sein. Weitere ‚Einzelheiten‘ über Wesen und Eigenschaften GOTTES gehören in die Mystik, bzw. in die <span style="color:#4C58FF">„Theologie“</span>.
===<div class="center"><span style="color:#660066">Die Bedeutung des Kalküls</span></div>===
<div class="center">Immanuel KANT und Kurt GÖDEL im ‚Dialog‘</div>
KANT sagt ''':'''
::<span style="color:#FF6000">»</span>'''''Sein''' ist offenbar kein reales Prädikat''. ... ''Es ist bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Position'' <span style="color:#00B000">[ latinisiert, deutsch für ''':''' ,Setzung‘ ]</span> ''eines Dinges ... Nehme ich nun das Subjekt (Gott) mit allen seinen Prädikaten'' <span style="color:#00B000">[ d.h. Eigenschaften ]</span> ''(worunter auch die Allmacht gehört) zusammen, und sage ''':''' ‚'''Gott ist'''‘'', <span style="color:#00B000">[ ,GOTT existiert wirklich‘ ]</span>, ''oder ‚es ist ein Gott‘, so <u>setze</u> ich kein neues Prädikat'' <span style="color:#00B000">[ keine neue Eigenschaft ]</span> ''zum ‚Begriffe‘ von Gott ''':''''' <span style="color:#00B000">[ <span style="color:#0000FF; background-color:#FFFF00">‚Sein’ ist kein ‚reales Prädikat’ in GOTT</span>; ‚Existenz‘ ist in GOTT keine ‚Eigenschaft‘ ],</span> ... ''es kann daher zu dem Begriffe'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''der bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Möglichkeit ausdrückt, darum, dass ich dessen Gegenstand'', <span style="color:#00B000">[ GOTT ]</span>, ''als schlechthin gegeben (durch den Ausdruck ''':''' er ist'', <span style="color:#00B000">[ GOTT ist wirklich ]</span>'' ) <u>denke</u>, nichts weiter hinzukommen.'' <span style="color:#00B000">[ Beides ist ,bloß gedacht‘ '''!''' ]</span> ''Und so enthält das Wirkliche nichts mehr als das bloß Mögliche. Hundert ‚wirkliche‘ Taler enthalten nicht das mindeste <u>mehr</u>, als hundert ‚mögliche‘. Denn, da diese den'' <span style="color:#00B000">[ gedachten ]</span>'' ‚Begriff‘, jene aber den Gegenstand und dessen'' <span style="color:#00B000">[ gedachte ]</span>'' Position an sich selbst bedeuten, so würde, im Fall dieser'', <span style="color:#00B000">[ die 100, als ,wirklich‘ bloß gedachten Taler ]</span>, ''<u>mehr</u> enthielte als jener,'' <span style="color:#00B000">[ als ihr ‚gedachter‘ Begriff im Verstand, wie ΑNSELM von Canterbury für GOTT, als ‚wirklich‘ Existierenden, argumentierte, …''so würde'' ]</span> ''mein ‚Begriff‘'' <span style="color:#00B000">[ die 100 im Verstand ‚gedachten‘ Taler ]</span> ''nicht den ganzen Gegenstand ausdrücken, und also auch <u>nicht der angemessene Begriff</u> von ihm sein. Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben'', <span style="color:#00B000">[ als bei 100 bloß ‚gedachten‘ Talern ]</span> ... <span style="color:#FF6000">«</span> <span style="color:#00B000"><ref>‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 401; https://www.korpora.org/kant/aa03/401.html</ref></span>.
GÖDEL würde darauf <span style="color:#00B000">(korrespondierend zur aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition von der Identität von Sein und Wesen in GOTT)</span> antworten ''':'''
::<span style="color:#FF6000">»</span>Die <span style="color:#FF6000">„100 Taler“</span> sind der <span style="color:#FF6000">»''zufälligen Struktur der'' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> entnommen, und sind daher nicht mit GOTT vergleichbar, der, <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer Welt, <span style="color:#FF6000">„über“</span> dieser Welt steht. Einzig und allein nur von GOTT gilt ''':''' Der mit Dingen aus unserer Welt ,nicht vergleichbare‘ GOTT, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#FF6000">„existiert notwendig für uns“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, und <span style="color:#FF6000">„notwendiges Existieren, <u>Sein</u>“</span> ,ist‘ eine <span style="color:#FF6000">„positive <u>Wesen</u>seigenschaft“</span> in GOTT, <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, weil GOTT aus sich <span style="color:#FF6000">„vollkommen“ <span style="color:#00B000">|</span> „perfekt“</span> ist, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#0000FF; background-color:#FFFF00">‚Sein‘ ist in GOTT ein ‚reales Prädikat‘</span>; <span style="color:#00B000">(notwendige ‚Existenz’ ist eine positive ‚Wesenseigenschaft’ in GOTT)</span>, und nur bei GOTT '''!''' Zum zeitlos-ewigen GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(als methodologische Kalkül-Prämisse)</span>, kann man sagen ''':''' Weil es, wegen Axiom-1 und Axiom-2, <span style="color:#FF6000">„widerspruchsfrei möglich"</span> ist, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, darum ist GOTT auch das ‚einzige‘ <span style="color:#FF6000">„Wesen“</span>, <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, von dem ein Christ sagen kann, dass es <span style="color:#FF6000">„notwendig aus sich“</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, d.h. <span style="color:#FF6000">„grundlos“ <span style="color:#00B000">|</span> „unverursacht“</span>, für uns immer schon ‚da’ ist, und immer ,da’ sein wird; und zusätzlich gilt ''':''' Es gibt für jede mögliche Welt ‚nur‘ diesen einen GOTT ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ — </span><span style="color:#00B000">(Monotheïsmus, Korollar-3)</span>; vorausgesetzt, man geht von der ,Existenz’ dieses GOTTES aus, wobei diese Annahme für GÖDEL <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist.<span style="color:#FF6000">«</span>
Eine Beobachtung ''':''' KANT sagt, gleichsam als ,krönenden‘ Abschluss seiner Widerlegung des, — von ihm so genannten —, ,ontologischen Gottesbeweises‘ ''':''' <span style="color:#FF6000">»</span>''Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben, (d.i. ihrer Möglichkeit).''<span style="color:#FF6000">«</span> Diese Feststellung KANTS entspricht jedoch genau der Argumentation ANSELMS ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span>, d.h. GOTT ,existiert auch in Wirklichkeit‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was <u>mehr</u> ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ein bloßer Begriff ,im Verstand zu sein‘. Der ,Mehr-Wert‘ ergibt sich in beiden Fällen, sowohl bei den Talern als auch bei GOTT, aus der ,Wirklichkeit‘ ihrer Existenz, im Gegensatz zur bloßen, <span style="color:#00B000">(im Begriff gedachten)</span>, ,Möglichkeit‘ ihrer Existenz, so dass, in jedem Fall, der ,Begriff‘ im Verstand ohne Abstriche <span style="color:#FF6000">»</span>''den ganzen Gegenstand ausdrückt''<span style="color:#FF6000">«</span>, und von diesem auch <span style="color:#FF6000">»</span>''der angemessene Begriff''<span style="color:#FF6000">«</span> ist. Alles andere wäre eine ,Lüge‘. Mit dieser ,Beobachtung‘ ist das implizit ,Widersprüchliche‘ in KANTS Argumentation aufgedeckt ''':''' Das Wirkliche in KANTS Vermögenszustande enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, konträr zu seiner vorigen Behauptung ''':''' <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#FF6000">«</span> enthalte <span style="color:#FF6000">»'',nichts mehr‘</span> als das bloß Mögliche''<span style="color:#FF6000">«</span>. Diese Behauptung ist offensichtlich falsch. Das ist somit ein indirekter Beweis und damit eine Bestätigung für die analoge Argumentation ANSELMS aus dem Wiederspruch des Gegenteils, am Beispiel KANTS <span style="color:#FF6000">»</span>''Vermögenzustandes bei hundert wirklichen Talern''<span style="color:#FF6000">«</span>, in dem in Wirklichkeit <span style="color:#FF6000">,doch mehr‘</span> ist, <span style="color:#FF6000">»</span>''als bei dem bloßen Begriffe derselben''<span style="color:#FF6000">«</span>.
<span style="color:#00B000">(Diese ,Beobachtung‘ ist zugleich auch das entscheidende Indiz dafür, dass das systembedingte Konzept KANTS von der ,Existenz‘, bzw. vom ,Sein‘ eines jeden Gegenstandes, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.i. als seine ,Setzung‘ bloß im- und durch den Verstand, ,falsch‘ ist, — d.h. im Klartext ''':''' für KANT ist das ,Sein‘ eines Gegenstandes bloß ein ,Gedanke‘ in uns, wenn er meint, dass uns ein Gegenstand erst dann wirklich ,gegeben‘ sei, wenn wir uns den</span> <span style="color:#FF6000">»</span>''Gegenstand als schlechthin gegeben (durch den Ausdruck : <u>er ist</u>) <u>denken</u>''<span style="color:#FF6000">«</span>, <span style="color:#00B000">was nur dem Irrtum einer falschen System-Konzeption geschuldet sein kann. Auf Grund dieser Konzeption ist das</span> <span style="color:#FF6000">»</span>''Ding, wie es an sich selbst ist''<span style="color:#FF6000">«</span>, <span style="color:#00B000">für KANT systembedingt weder ,anschaubar‘, noch ,erkennbar‘. Diese falsche Konzeption über die ,Existenz‘, bzw. das ,Sein‘ eines Dinges, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">ist für KANT letztendlich auch die Beweisgrundlage und Voraussetzung für seine Ablehnung des ontologischen Argumentes für GOTT im Theorem ANSELMS. Wenn das ,wirkliche‘ Sein eines Dinges nichts anderes ist, als</span> <span style="color:#FF6000">»</span>''dessen'' <span style="color:#00B000">[ bloß gedachte ]</span> ''Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.h. als seine ,mögliche‘ Setzung bloß im- und durch den Verstand, — das ist das, als ,wirklich‘ bloß nur ,gedachte‘ Ding —, dann</span> <span style="color:#FF6000">»</span>''enthält''<span style="color:#FF6000">«</span> <span style="color:#00B000">natürlich</span> <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#00B000">, [ als die bloß gedachte Existenz ],</span> ''nichts mehr als das bloß Mögliche''<span style="color:#00B000">, [ als der gedachte Begriff ]<span style="color:#FF6000">«</span>, was offensichtlich unhaltbar ist. <span style="color:#4C58FF">[ Modus tollendo tollens ] </span> ''':''' Wenn die Konsequenz einer Wenn-Dann-Folgerung ,falsch‘ ist, dann ist auch ihre Voraussetzung, das System-Konzept KANTS, ,falsch‘ ''':''' d.i. seine ,Kopernikanische Wende‘ für die Metaphysik, soweit sie KANTS ,Sein’-Konzept betrifft. Korrekt und ,wahr‘ ist in jedem Fall ''':''' Das Wirkliche enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, und die Dinge ,existieren‘ schon immer unabhängig von unserem Denken. ,Existenz‘, das ,Sein‘, ist <span style="color:#FF6000">,doch mehr‘</span>, als bloß ein ,Gedanke‘ von uns.)</span>
Somit ist die Argumentation KANTS gegen den ontologischen Beweis ANSELMS für GOTT ,falsch‘ und unhaltbar, weil sie auf der ,falschen‘ Voraussetzung beruht ''':''' die ,Existenz‘, bzw. das ,Sein‘ eines jeden ,Gegenstandes‘, — wie z. B. auch die Existenz bei GOTT —, sei bloß dessen gedachte ,Position‘ an sich selbst, d.h. bloß seine ,Setzung‘ im- und durch den Verstand. Damit ,macht‘ er GOTT außerdem zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, und verkennt so, — wie vor ihm THOMAS von Aquin —, auch die Einzigartigkeit und Exklusivität GOTTES im Theorem ANSELMS.
<div class="center">Die <span style="color:#FF6000">„Rede von GOTT“</span> in der philosophischen Tradition</div>
Wenn man die philosophische Tradition der <span style="color:#FF6000">„Rede von GOTT“</span> im Lichte der Ergebnisse der <span style="color:#4C58FF">„axiomatischen Theologie“</span> GÖDELS liest, dann stellt sie sich am Beispiel bei ARISTOTELES, — AVICENNA, — ANSELM, und bei GÖDEL wie folgt dar ''':'''
<span style="color:#FF6000">»''Das Erstbewegende,'' (<span style="font-family: Times;"><big>,πρῶτον κινοῦν‘</big></span>), ''das, ohne selbst ‚bewegt‘ zu sein'', (<span style="font-family: Times;"><big>,ἀκίνητον‘</big></span> <span style="color:#00B000">| ''unverursacht, ,entstehungslos‘'' |</span> ), ''alles Übrige wie ein Geliebtes ‚bewegt‘'', (<span style="font-family: Times;"><big>,κινεῖ δὴ ὡς ἐρώμενον‘</big></span> <span style="color:#00B000"> | ''-verursacht, ,entstehen‘ lässt'' |</span> ), ''ist sowohl'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚Wesen‘'', (<span style="font-family: Times;"><big>,ἀΐδιον καί οὐσία‘</big></span> <span style="color:#00B000">| ''‚Substanz‘'' |</span> ), ''als auch'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚wirksames, verwirklichendes Sein‘'', (<span style="font-family: Times;"><big>‚ἀΐδιον καί ἐνέργεια οὖσα‘ = ‚actus purus‘</big></span><span style="color:#00B000"> | '',reine Tätigkeit‘'' |</span> ), … ''ersehnt'', (<span style="font-family: Times;"><big>,ὀρεκτόν‘</big></span>), ''und erkennbar'', (<span style="font-family: Times;"><big>,νοητόν‘</big></span>), ... ''denn dies ist der ‚Gott‘'', (<span style="font-family: Times;"><big>,τοῦτο γὰρ ὁ θεός‘</big></span>), <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, ''der'' <span style="color:#00B000">[ zeitlich-]</span>''Ewige'', (<span style="font-family: Times;"><big>,ἀΐδιον‘</big></span>), — ''der Unvergleichliche'', (<span style="font-family: Times;"><big>,ἄριστον‘</big></span> <span style="color:#00B000">| ''‚der Beste‘'' |</span> ), — ''der Lebendige'', (<span style="font-family: Times;"><big>,ζῷον‘</big></span> <span style="color:#00B000">| ,''das Leben selbst‘'' |</span> ), — ... ''so sagen wir ja'', (<span style="font-family: Times;"><big>,φαμὲν δὴ‘</big></span>), — ...«</span> ''':''' <span style="color:#00B000">(ARISTOTELES — Grieche)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als ,Individuumname‘, ist synonym mit <span style="color:#FF6000">„göttliches ‚Da-Sein’“</span>, das sowohl <span style="color:#FF6000">„aus sich vollkommen“</span>, als auch <span style="color:#FF6000">„notwendig für uns“</span> ‚da‘ ist; <span style="color:#00B000">(das ist das, an sich, vollkommene ‚Was-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, das zugleich, für uns, das notwendige ‚Da-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> — ist)</span>; <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span>. Das ist der <u>angemessene Begriff</u> von GOTT, und gilt ‚nur‘ von GOTT. Weil GOTT <span style="color:#FF6000">„vollkommen“</span> ist, ist <span style="color:#FF6000">„Da-Sein“ <span style="color:#00B000">|</span> „GOTT-Sein“ <span style="color:#00B000">|</span> „Göttlichkeit“</span> das <span style="color:#FF6000">„Wesen“</span> GOTTES ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>. Im Unendlichen, GOTT, sind <span style="color:#FF6000">„Essenz“</span> und <span style="color:#FF6000">„Existenz“</span> koinzident ,eins‘, und daher untrennbar, und <span style="color:#FF6000">»''darum ist GOTT das einzige ‚Sein’, das notwendig an sich ‚da‘ ist''«</span> ''':''' <span style="color:#00B000">(ABU ALI SINA alias AVICENNA — Muslim)</span>.
Der <span style="color:#00B000">(gedachte)</span> ‚Eigenschafts-Begriff‘ <span style="color:#FF6000">„Vollkommenheit (die Größe) GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#00B000">(‚Perfektion‘, die unbegrenzte Summe aller ‚positiven Eigenschaften‘ in GOTT)</span> schließt koinzident die ‚Eigenschaft’ <span style="color:#FF6000">„notwendige Existenz für uns“</span> mit ein ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>. GOTT wäre nicht <span style="color:#FF6000">„vollkommen“</span>, wenn er nicht auch real für uns ‚da‘ wäre, wenn er nicht ,immer schon’ <span style="color:#FF6000">„existierte“</span>. ‚Sein’ ist <u>mehr</u> als ‚Nicht-Sein’. ,Sein’, bzw. ,Existenz’ gehört in GOTT zu den ,Transzendentalia’. Das sind die <span style="color:#00B000">(ultimativen)</span> ,Wesenseigenschaften’ in GOTT. Der unbegrenzt Unendliche, GOTT, ist daher das <span style="color:#FF6000">»''vollkommenste Wesen, über das nichts ,Größeres‘ d.h. Vollkommeneres <u>mehr</u> ‚gedacht‘ werden kann''«</span> ''':''' <span style="color:#00B000">(ANSELM von Canterbury — Christ)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„Perfektion GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schließt koinzident das <span style="color:#FF6000">„notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> —, für uns mit ein, ohne einen zeitlichen Anfang und ohne ein zeitliches Ende. Das ist die ‚zeitlos-ewige‘, an sich absolute, und <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#00B000">(Das ist ein ,regulär‘-mögliches Korollar im 2. Beweisgang aus Term :16: ''':''' <span style="color:#4C58FF">— ‚'''Gy→Yy'''‘ —</span>, mit der <span style="color:#4C58FF">[ Instanz(Y:=E<sub>not</sub>) ]</span>, und der <span style="color:#4C58FF">[ FUB(y:=x) ]</span>; und auch ein ,regulär‘-mögliches Korollar im 3. Beweisgang ''':''' entsprechend der <span style="color:#FF6000">„logischen Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A → B ]</span> von Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> und Term :05: <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span> aus diesem Beweisgang. In Worten ''':''' <span style="color:#FF6000">»</span>''Angenommen, '' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> ''steht für den GOTT der Christen'' ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ — </span>, ''dann existiert dieser GOTT'', <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, ''für uns notwendig'', <span style="color:#4C58FF">— <sub>not</sub> —</span> <span style="color:#FF6000">«</span>.)</span> Der Unendliche, GOTT, ist <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer ‚vergänglichen‘, ,endlichen‘ Welt, welche prinzipiell vom dreidimensionalen Raum und von der unwiederbringlich ‚vergehenden‘ Zeit geprägt ist. Der ,GOTT der Christen‘ ist <span style="color:#FF6000">»''unabhängig''«</span> von dieser <span style="color:#FF6600">„vergehenden Raum-Zeit“, — »''jenes rätselhafte und anscheinend in sich widersprüchliche Etwas''« <span style="color:#00B000">(GÖDEL)<ref>Kurt GÖDEL, ‚''<span style="font-family: Times;"><big>Eine Bemerkung über die Beziehungen zwischen der Relativitätstheorie und der idealistischen Philosophie‘</big></span>'', in P.A.SCHILPP (Hg.): ‚''<span style="font-family: Times;"><big>Albert Einstein, Philosoph und Naturforscher‘</big></span>'', Seite 406</ref></span> —</span>. Ohne ‚Zeit‘ gibt es keinen zeitlichen Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘, <span style="color:#00B000">(beides ist zeitlos ,eins‘)</span>, und so ist der zeitlos-ewige GOTT, der <span style="color:#FF6000">»''notwendig aus sich ,existiert‘'' «</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ — </span>, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> für uns immer schon ‚da‘ ''':''' <span style="color:#00B000">(GÖDEL — ohne religiöses Bekenntnis)</span>.
Mit dem GÖDEL-Kalkül ist die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt worden, und ist somit für jeden Menschen nachvollziehbar, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie obige Beispiele zeigen.
'''Resümee :'''
Das GÖDEL-Kalkül zeigt mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, was notwendig folgt, wenn die Axiome ‚wahr‘ sind, <span style="color:#00B000">(die Axiome bilden formal-syntaktisch <span style="color:#FF6000">»''die theologische Weltanschauung''«</span> ab)</span>, unter der Voraussetzung, dass die Axiome <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>'' Struktur''«</span> unserer Welt sind. Die ,Verifikation‘ der Axiome und Definitionen von GOTT und seiner Vollkommenheiten gelingt GÖDEL, — entsprechend seiner Unabhängigkeits-Bedingung —, durch den Aufweis ihrer Widerspruchsfreiheit ''':''' sie sind somit ,wahr‘ und, — im Kontext einer <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> —, auch ,annehmbar‘ in unserer ,realen‘ Welt ''':''' <span style="color:#00B000">(siehe Anhang, 2. Beweisgang und Anmerkung-2)</span>. Er vermeidet damit den Fehler, der immer wieder im Diskurs über Gottesbeweise gemacht wird ''':''' GOTT mit seinen Geschöpfen zu vergleichen. Diese logisch-philosophische Rede von GOTT <span style="color:#00B000">(<span style="color:#FF6000">»''ohne sich auf den Glauben an irgendeine Religion zu stützen''«</span>)</span> hat eine <u>mehr</u> als zweitausendjährige Tradition hinter sich. Der <span style="color:#FF6000">„100-Taler-Gott“</span> des Philosophen KANT, hat heute, nachdem der Logiker und Systemtheoretiker GÖDEL sein System vorgelegt hat, an ‚Strahlkraft‘ verloren.
Kurt GÖDEL ''':'''
::<span style="color:#FF6000">» ''Die theologische Weltanschauung'', <span style="color:#00B000">[ dass GOTT für uns immer schon ‚da‘ ist ]</span>, ''ist rein verstandesmäßig mit allen bekannten Tatsachen durchaus vereinbar'';«</span> <span style="color:#00B000">[ d.h. sie ist das ,Resultat‘ der, — vom Glauben geleiteten —, ‚theoretischen Vernunft‘, alias ‚reinen Vernunft‘, und nicht bloß das ‚Postulat‘ einer ‚praktischen Vernunft‘, wie KANT meint ]. <span style="color:#FF6000">»''Der'' <span style="color:#00B000">[ christliche ]</span> ''Glaube ist die ‚Pupille‘ im ‚Auge‘ unseres Verstandes.''«</span> (Heilige KATHARINA von Siena, Lehrerin der Kirche, Patronin Europas<ref>vgl. <span style="font-family: Times;"><big>''Gebet 7 ‚Für die neuen Kardinäle‘, Rom, 21. Dezember 1378,''</big></span> aus <span style="font-family: Times;"><big>''Caterina von Siena ,Die Gebete‘.''</big></span> Kleinhain 2019, online: https://caterina.at/werke/gebete/gebete-detailansicht/gebet-7.html</ref> )</span>
Der sonst so rationale KANT, hier doch etwas emotionell, <span style="color:#00B000">(als wolle er die Ergebnisse im GÖDEL-Kalkül nicht wahr haben, die belegen, dass er sich bei GOTT geirrt, und die Funktion des christlichen Glaubens für die Philosophie falsch eingeschätzt hat)</span> ''':'''
::<span style="color:#FF6000">»</span> ''Es war etwas ganz Unnatürliches und eine bloße Neuerung des Schulwitzes, aus einer ganz willkürlich entworfenen Idee das Dasein des ihr entsprechenden Gegenstandes selbst ausklauben zu wollen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 403. https://www.korpora.org/kant/aa03/403.html</ref>.<span style="color:#FF6000">«</span>
Für KANT, für die Scholastiker, <span style="color:#00B000">(und auch für uns)</span>, ist es natürlich ‚logisch‘, dass aus einem als ‚möglich’ gedachten Begriff, <span style="color:#FF6000">»</span>''aus einer ganz willkürlich entworfenen Idee''<span style="color:#FF6000">«</span>, keine Existenzaussage abgeleitet werden kann. <span style="color:#00B000">(Aus dem bloß gedachten Begriff ,goldene Berge‘ folgt natürlich nicht, dass es solche in Wirklichkeit auch gibt.)</span> In der philosophisch-<span style="color:#4C58FF">,theologischen’</span> Tradition, die von ARISTOTELES herkommt, ist der Begriff <span style="color:#FF6000">»''GOTT''«</span> jedoch von allen anderen Begriffen so verschieden, so dass für GOTT diese Logik KANTS nicht mehr gilt. GOTT ist ,unvergleichlich‘ und ,einzigartig‘.
Dazu der Kommentar von HEGEL ''':'''
::<span style="color:#FF6000">»''Wenn KANT sagt, man könne aus dem Begriff'' <span style="color:#00B000">[ ‚GOTT‘ ]</span> ''die Realität nicht ,herausklauben‘, so ist da der Begriff als endlich gefasst''.« <span style="color:#00B000">[ In der Endlichkeit unserer Welt trifft die Logik KANTS zu, dass dem ‚Begriff‘ nicht ,notwendig‘ das ‚Sein‘ folgt, denn es gibt in ihr die ,Lüge‘, die das ,Wirklich-Sein‘ im Begriff bloß behauptet, ohne dass es ,in Wirklichkeit‘ zutrifft, was sie behauptet. Es gilt hier nach KANT ''':''' »''Sein ist kein reales Prädikat''«. Somit ist ]</span> »''...der Begriff ohne'' <span style="color:#00B000">[ reales ]</span> ''Sein ein Einseitiges und Unwahres, und ebenso das Sein, in dem kein Begriff ist'', <span style="color:#00B000">[ ist ]</span> ''das begrifflose Sein,'' <span style="color:#00B000">[ d.i. das relative ,Noch-Nicht-Begriffene‘ ]</span>.'' Dieser Gegensatz, der in die Endlichkeit fällt'' <span style="color:#00B000">[ im Endlichen zutrifft ]</span>, ''kann bei dem Unendlichen, GOTT, gar nicht statthaben''<ref>Georg Wilhelm Friedrich HEGEL, ‚<span style="font-family: Times;"><big>''Ausführungen des ontologischen Beweises''</big></span>‘ in den ‚<span style="font-family: Times;"><big>''Vorlesungen über die Philosophie der Religion vom Jahr 1831''</big></span>‘ . Hamburg 1966, Seiten 175 bzw. 174</ref>; <span style="color:#00B000">[ denn ,Begriff‘, bzw. ,Denken‘ und ,Sein‘ sind in dem Unendlichen, GOTT, untrennbar und real immer dasselbe. Auf Grund dieser ontologischen Identität ,personifiziert‘ und ,repräsentiert‘ GOTT die ,Wahrheit‘ ''':''' GOTT ist die ,Wahrheit‘. In GOTT, dem <span style="color:#FF6000">„Schöpfer der Welt“</span>, folgt dem ,Begriff‘ immer ,notwendig‘ das ,Sein‘ ''':''' <span style="color:#CC66FF">»''GOTT sprach ''':''' Es werde ,Licht‘. Und es wurde Licht''«, <small>{{Bibel | Genesis |1|3|EU}}</small>;</span> oder auch ''':''' <span style="color:#CC66FF">»''Der Herr sprach, und sogleich geschah es; er gebot, und alles war da''«,</span> <small>{{Bibel | Psalm |33|9|EU}}</small>.]</span>«</span>
Das Entscheidende bei der <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls ist, dass der <span style="color:#00B000">(Begriff)</span> GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, nicht auf die Ebene seiner ,endlichen‘ Geschöpfe und unserer Welt gestellt wird, <span style="color:#00B000">(d.i. das ‚Universum‘ im ,Urknall‘, die ‚100-Taler‘, ein ‚Tsunami‘, auch ,einfache Modelle‘ von unserer Welt, etc.)</span>, und damit verglichen wird, sondern, dass der GOTT der Christen in seiner Einzigartigkeit und Besonderheit als <span style="color:#FF6000">»''der Unendliche''«</span> belassen und als <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer vergänglichen Welt, — als <span style="color:#FF6000">»''der Unvergleichliche''«</span> —, verstanden wird. <span style="color:#00B000">(Alle Kritiken des sog. ,ontologischen‘ Gottesbeweises übersehen die Einzigartigkeit und Besonderheit des <span style="color:#FF6000">»''Unendlichen''«</span>, und/oder wollen diese nicht ,wahr‘ haben.)</span> Auch THOMAS von Aquin ,verortet‘ den GOTT ANSELMS, — in seiner Kritik an dessen Theorem —, irrtümlich unter die ,Dinge‘ der uns umgebenden ,Natur‘, wenn er sagt ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse in rerum natura</big></span>“</span>, d.h. wörtlich, dass der GOTT ANSELMS <span style="color:#FF6000">»</span>''in der Natur der Dinge'' <span style="color:#00B000">(unserer Welt)</span> ''existiert''<span style="color:#FF6000">«</span>, und verkennt somit, — wie nach ihm auch KANT —, die ,Unvergleichlichkeit‘ GOTTES, <span style="color:#00B000">(vgl. STh I q.2 a.1 ad 2<ref>„Deus … illud quo maius cogitari non potest; non tamen propter hoc sequitur quod intelligat id quod significatur per nomen, esse in rerum natura; sed in apprehensione intellectus tantum.“ ——— »''GOTT ist'' (nach ANSELM) ''der, über den Größeres nicht mehr gedacht werden kann. Aber nicht deswegen, weil er'', (der Narr von Psalm 14.1, den ANSELM zitiert), ''das versteht, was durch diesen Namen,'' (d.h. mit dem Begriff ,GOTT‘, als der ,Größte‘, im Theorem ANSELMS), ''bezeichnet wird, folgt daraus'', (wie ANSELM meint), ''dass er auch versteht, dass er'', (der GOTT ANSELMS), ''auch in der ,Natur‘ der Dinge'' (unserer Welt) ''existiert''; <span style="color:#00B000">[ was ANSELM so nie gesagt hat ]</span>. ''Daraus folgt nur, dass er'', (als ,GOTT‘), ''bloß in der Auffassung seines Verstandes'', (d.h. nur im Denken des Narren als ,Begriff‘), ''existiert.''« ——— Hier ,verortet‘ THOMAS einerseits den unendlichen GOTT, von dem das Theorem ANSELMS spricht, irrtümlich unter die endlichen Dinge der uns umgebenden ,Natur‘, was sachlich dem theologischen Theorem der Unvergleichlichkeit GOTTES widerspricht, der nicht unter die Dinge unserer Welt eingereiht werden darf. Anderseits verliert er dadurch auch den ,Blick‘ für die Außerordentlichkeit und Besonderheit GOTTES, dessen Natur völlig verschieden und unabhängig von der ,Natur‘ unserer raum-zeitlichen Welt ist. GÖDEL beweist jedoch, mit ANSELM, weil es notwendig, ohne Widerspruch, (»''bloß in der Auffassung unseres Verstandes''«), möglich ist, dass GOTT existiert, ist es korrekt, daraus auch mit Notwendigkeit zu folgern, dass der Glaube des Erzbischofs ANSELM, und der Glaube seiner Anvertrauten, von der Wirklichkeit GOTTES, widerspruchsfrei, logisch richtig, und damit sinnvoll ist; denn Möglichkeit und Wirklichkeit sind in GOTT koinzident ,eins‘. Das ist das Privilegium GOTTES allein, der einzigartig und unvergleichlich ist. Damit zeigt er auf, dass THOMAS die Unvergleichlichkeit und Einzigartigkeit GOTTES in seinem Vorhalt nicht bedacht hat; und außerdem ANSELM missverstanden hat.</ref>)</span>; jedenfalls hier in der Auseinandersetzung mit ANSELM. Dagegen spricht ANSELM im ,''<span style="font-family: Times;"><big>Proslogion</big></span>''‘, Seite 85f, nur von einem <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span> GOTTES, d.h. dass GOTT ,auch in Wirklichkeit existiert‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was ,größer‘, bzw. ,mehr‘ ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ,im Verstand zu sein‘; wobei die ,zeitlose-überzeitliche‘ Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES jedoch völlig verschieden und <span style="color:#FF6000">»''unabhängig von der zufälligen''«</span> Wirklichkeit <span style="color:#00B000">(die ,Natur‘)</span> der ,raum-zeitlichen‘ Welt der Dinge ist. Daher ist sie mit dieser auch nicht vergleichbar. GOTT ist <span style="color:#FF6000">„vollkommen“</span> und alle <span style="color:#FF6000">„Vollkommenheiten“</span> in GOTT, <span style="color:#00B000">(die ultimativen ,Transzendentalia‘)</span>, sind koinzident ,eins‘, — ,fallen <span style="color:#FF6000">„notwendig“</span> perspektivisch in eins zusammen‘, und sind daher konvertierbar. Darum ist auch die Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES ,einzigartig‘ und ,unvergleichlich‘.
Mit Korollar-3 ist die Exklusivität und Außerordentlichkeit GOTTES definitiv im Kalkül ,bewiesen‘ <span style="color:#00B000">( ╞ )</span>. Der abendländische Monotheïsmus ist somit eine ,logische‘ Konsequenz aus den GÖDEL-Axiomen. <span style="color:#00B000">(Das <span style="color:#4C58FF">„theologische“</span> Theorem von der ,Einzigartigkeit‘ und Exklusivität GOTTES, d.h. hier im Kontext ''':''' die exklusive Einheit von GOTT und Mensch in JESUS CHRISTUS; von Vater, Sohn und Geist im <span style="color:#4C58FF">„Dreifaltigen“</span>; von Essenz und Existenz, von Begriff und Sein, von Ursache und Wirkung, von Subjekt und Objekt, von Möglichkeit und Wirklichkeit, und die unbegrenzte Summeneinheit und Koinzidenz der unendlichen Transzendentalien in GOTT, ist, — mit HEGEL —, die Voraussetzung und Bedingung jeder Philosophie ''':''' <span style="color:#FF6000">»''Die Einheit muss am Anfang der Philosophie stehen''«</span>; und ist zugleich auch ihr gesuchtes und bewiesenes Endergebnis und Ziel ''':''' <span style="color:#FF6000">»''Diese Einheit muss auch das Resultat der Philosophie sein''«</span><ref>https://hegel-system.de/de/gottesbeweis.htm#hegels-kritik-an-kant</ref>, was hier im GÖDEL-Kalkül ,logisch‘ mit Korollar-3 verifiziert wird ''':''' <span style="color:#4C58FF">— ‚'''□(∃xGx ∧ ∀y(Gy→x=y))'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist exklusiv einzigartig''«</span>.)</span>
Die Einzigartigkeit GOTTES bedingt die Koinzidenz, den inneren Zusammenhang aller seiner Vollkommenheiten und Zuschreibungen, <span style="color:#00B000">(Axiom-2)</span>, d.h. ihr paarweise, perspektivisches ,Zusammenfallen in eins‘ im Unendlichen, GOTT. ——— Aus der Notwendigkeit aller positiven Eigenschaften und Zuschreibungen, <span style="color:#00B000">(d.h. aus den, an sich, notwendigen, ultimativen Transzendentalien, Axiom-4)</span>, die in GOTT paarweise, als ,Wesenseigenschaften‘ koinzident ,eins‘ sind, <span style="color:#00B000">(Definition-2)</span>, ist die Einzigkeit GOTTES für uns erschließbar, <span style="color:#00B000">(Korollar-3)</span>. Axiom-4 ist die erste, ,modal‘ <span style="color:#FF6000">„notwendige“</span>, d.h. die transzendentale Voraussetzung für Korollar-3.
Wenn im Korollar-3 das <span style="color:#4C58FF">— ‚'''x'''‘ —</span> z. B. für GOTT, dem ,Vater‘ der Christen, und das <span style="color:#4C58FF">— ‚'''y'''‘ —</span> für GOTT, dem ,Sohn‘, d.h. für ,JESUS CHRISTUS‘ steht, oder für den ,HEILIGEN GEIST‘, <span style="color:#00B000">(den ,Dreifaltigen GOTT‘ der Christenheit)</span>; oder auch für die Gottesbezeichnung ,GOTT-ADONAI‘ der Juden, oder für die Gottesbezeichnung ,ALLAH‘ der Muslime steht, dann weist dieses Korollar, für <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span>, mit der ,ontologischen Identität‘ ''':''' <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, auf die ,Koinzidenz‘ des <span style="color:#4C58FF">„Dreifaltigen“</span>, und auf die <span style="color:#4C58FF">„Hypostatische Union“</span> der Naturen von GOTT und Mensch in JESUS CHRISTUS,
bzw. auch auf den inneren Zusammenhang der drei Buch-Religionen hin.
===<div class="center"><span style="color:#660066">Anhang : das GÖDEL-Kalkül</span></div>===
In der ,Legende zum GÖDEL-Kalkül‘ wird an einige Basics erinnert, und diese für die operative Praxis im anstehenden Kalkül, mit Hilfe von logischen Meta-Terme, adaptiert. Zusätzliche, notwendige Regeln und Gesetze werden dann ,benannt‘, wenn sie in der Kalkül-Durchführung auftreten.
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">Legende zum GÖDEL-Kalkül</span></div>
|-
|
<small>
<math>\begin{align}
{\color{blue}\text{ ◇}} \text{ :: konsistent ↔ widerspruchsfrei ↔ möglich ↔ denkbar, } & {\color{blue}\text{ □}} \text{ :: notwendig ↔ wirklich, für jede mögliche Welt ↔ exklusiv} \\
\text{logischer Meta-Term ::} {\color{blue}\text{ [ A ├ B ]}} \text{ ::} & \text{ „aus A folgt im Kalkül ,regulär‘ (├ ) B.“} \\
\text{ A, B sind Aussagen über Eigenschaften, (A ist keine Eigenschaft);} & \text{ die Aussage, z.B. in der Kalkül-Zeile 10, wird als ,Term :10:‘ bezeichnet} \\
{\color{blue}\text{ AE}} \text{ ::} & \text{ Argument Einführung, Prämisse, Postulat } \\
{\color{blue}\text{ Xx}} \text{ ::} & \text{ „X ist eine Eigenschaft der Individuum-Variable x.“ } \\
{\color{blue}\text{ ¬PX}} \text{ ::} & \text{ „X ist keine positive Eigenschaft, ist keine Perfektion, ist nicht vollkommen.“ } \\
{\color{blue}\text{ Instanz(X := Y)}} \text{ ::} & \text{ Substitution der Eigenschaft X durch die ,bestimmte‘ Eigenschaft Y } \\
\text{ (Eine ,Instanz‘ ist ein Exemplar aus einer Menge gleichartiger Dinge;} & \text{ hier die ,bestimmte‘ Eigenschaft Y, als Ersatz für das unbestimmte X.) } \\
{\color{blue}\text{ FUB(x := y)}} \text{ ::} & \text{ Freie-Um-Benennung der Individuum-Variable x in y } \\
\text{ ,modal‘-frei gewählte Kalkül-Prämisse ::} {\color{blue}\text{ Gx}} \text{ ::} & \text{ „Die Variable x steht für den GOTT der Christen.“ } \\
{\color{blue}\text{ [ G(y) ├ ⱯyG(y) ]}} \text{ ::} & \text{ All-Operator-Einführung der Variable y für GOTT } \\
\text{ „Angenommen, die Variable y steht für GOTT, dann } & \text{folgt ,regulär‘ (├ ), dass auch jedes y im Kalkül für GOTT steht.“}\\
{\color{blue}\text{[ ⱯXA(X) ├ A(X) ]}} \text{ ::} & \text{ All-Operator-Beseitigung für die substituierte Eigenschaft X } \\
\text{ „Wenn X durch eine ,bestimmte‘ Eigenschaft ,instanziiert‘ ist oder } & \text{wird, dann kann der All-Operator von X ,regulär‘ (├ ) beseitigt werden.}\\
{\color{blue}\text{ KOMM(↔)}} \text{ ::} & \;{\color{blue}\text{[ (A↔ B) ↔ (B ↔ A) ]}} \text{ :: Kommutativgesetz für ( ↔ )}\\
{\color{blue}\text{ DIST(□∧)}} \text{ ::} & \;{\color{blue}\text{[ (□A ∧ □B) ↔ □(A ∧ B) ]}} \text{ :: Distributivgesetz für (□∧ )} \\
\text{ (hypothetischer Syllogismus, häufige logische Schlussregel) ::} & \;{\color{blue}\text{[ A → B, A ├ B ]}} \text{ :: (Modus ponendo ponens) :: Abtrennregel.} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn A wahr ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch B wahr ist.“} \\
\text{ (negativer hypothetischer Syllogismus) ::} & \;{\color{blue}\text{[ A → B, ¬B ├ ¬A ]}} \text{ :: (Modus tollendo tollens)} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn B falsch ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch A falsch ist.“} \\
\text{''KONDITIONALER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ A ├ B ╞ A → B ]}} \text{ :: (logische Implikation)} \\
\text{ „Angenommen, A ist ,regulär‘ Axiom oder Prämisse, und B ist im } & \text{Kalkül ,regulär‘ abgeleitet, dann ist ,bewiesen‘ ( ╞ ) : A impliziert B, ist wahr.“} \\
\text{''INDIREKTER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ ¬A → F ╞ A ]}} \text{ :: (Reductio ad absurdum)} \\
\text{ „Wenn im Kalkül aus ¬A ,regulär‘ eine Kontradiktion } & \text{F folgt, dann ist A ,bewiesen‘ ( ╞ ) : A ist ,wahr‘.“} \\
\end{align}</math>
</small>
|}
A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Eine Prädikatenlogik zweiter Stufe ist eine Logik, in der die Quantoren auch Eigenschaftsausdrücke <span style="color:#00B000">(<span style="color:#FF6000">„Prädikate”</span>)</span> binden können''. <span style="color:#00B000">[ Die ,Prädikate‘ werden in einem Kalkül dieser Logik durch Definitionen ,bestimmt‘ ]</span>. ''Wir werden uns im folgenden recht frei einer dafür geeigneten formalen Sprache bedienen. Äußere Quantoren werden meist weggelassen und wir schreiben kurz'' <span style="color:#4C58FF">— ‚'''Xx'''‘ — </span> ''bzw.'' <span style="color:#4C58FF">— ‚'''PX'''‘ — </span> ''um auszudrücken, dass das Individuum'' <span style="color:#4C58FF">— ‚'''x'''‘ — </span> ''die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''hat, bzw. dass die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''die höherstufige Eigenschaft'' <span style="color:#4C58FF">— ‚'''P'''‘ — </span> ''<span style="color:#00B000">(für <span style="color:#FF6000">„positiv”</span>)</span> hat;'' <span style="color:#00B000"> [ wobei die Eigenschaft <span style="color:#4C58FF">— ‚'''P'''‘ — </span> als einzige im Kalkül ,unbestimmt‘ bleibt ]</span>. <span style="color:#FF6000">«</span><ref>A. FUHRMANN ‚''<span style="font-family: Times;"><big>‚G‘ wie Gödel. Kurt Gödels axiomatische Theologie</big></span>''‘, Seite 6, Anmerkung 3. Konform mit seinem Artikel in ‚''<span style="font-family: Times;"><big>Logik in der Philosophie</big></span>''‘ hg. v. P. SCHROEDER-HEISTER, W. SPOHN und E. OLSSON. 2005, Synchron, Heidelberg.</ref>
Der All-Quantor für Eigenschaften, hier im GÖDEL-Kalkül der ,modalen‘ Prädikatenlogik zweiter Stufe, bindet die ,unbestimmte‘ Eigenschafts-Variable <span style="color:#4C58FF">— ‚'''X'''‘ —</span> ausschließlich nur in den Definitionen im 2. und 3. Beweisgang . <span style="color:#00B000"> (Im ersten Beweisgang gibt es keine Definition.)</span> Dieser All-Quantor wird dann jedes Mal in der Beweis-Durchführung durch die Substitution ''':''' <span style="color:#4C58FF"> [ Instanz(X:= ..) ]</span> mit ,bestimmte‘ Eigenschafts-Konstanten wie <span style="color:#4C58FF">— (X:= G) —</span>, bzw. <span style="color:#4C58FF">— (X:= ¬Y) —</span>, oder <span style="color:#4C58FF">— (X:= E<sub>not</sub>) —</span> ,regulär‘ <span style="color:#00B000">(├ )</span> beseitigt ''':''' <span style="color:#4C58FF"> [ ⱯXA(X) ├ A(X) ]</span>; wobei die Eigenschafts-Konstante im Kalkül entweder als Zwischenergebnis ,regulär‘ abgeleitet, <span style="color:#00B000">(,errechnet‘)</span>, oder mit einer Definition schon ,bestimmt‘ worden ist.
Die spezifische ‚Eigenschaft‘ einer Eigenschaft wird hier, in der formalen Syntax der ,modalen‘ Prädikatenlogik zweiter Stufe, als eine tiefer gestellte Abkürzung <span style="color:#00B000">(als Index)</span> an ihre Trägereigenschaft angehängt, wie z. B. ‚wesentlich‘, bzw. ‚essentiell‘ durch <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, oder ‚notwendig‘ durch <span style="color:#4C58FF"> — <sub>not</sub> —</span>. In der Definition-3 steht der Term ''':''' <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span>, um auszudrücken, dass das Individuum <span style="color:#4C58FF">— ‚'''x'''‘ —</span> notwendig <span style="color:#4C58FF">— <sub>not</sub> —</span> die Eigenschaft ''':''' <span style="color:#4C58FF">— ‚'''E'''‘ —</span>, für ,Existenz‘, hat, d.h. <span style="color:#FF6000">»''das <span style="color:#4C58FF">‚'''x'''‘</span> existiert notwendig''«</span>. Der schon von GÖDEL indizierte Term ''':''' <span style="color:#4C58FF">—‚'''G'''<sub>ess</sub>'''x'''‘ —</span> kann gelesen werden als ''':''' <span style="color:#FF6000">»''Das Individuum <span style="color:#4C58FF">‚'''x'''‘</span> hat die Wesenseigenschaft, <span style="color:#4C58FF"> — <sub>ess</sub> — </span> ''':''' GOTT zu sein, <span style="color:#4C58FF">‚'''G'''‘ </span>''«</span>, statt der ,an sich‘ konformen, aber <span style="color:#4C58FF">„theologisch“</span> etwas ungenauen Formulierung ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist wesentlich göttlich''«</span>; oder mit der Voraussetzung ''':''' <span style="color:#4C58FF">— ‚'''Gx'''→'''G'''<sub>ess</sub>'''x'''‘ — </span> deutlicher und <span style="color:#4C58FF">„theologisch“</span> korrekt ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für den GOTT der Christen'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span> ''das Wesen dieses GOTTES'', <span style="color:#4C58FF">— <sub>ess</sub>‚'''x'''‘ —</span>, <span style="color:#00B000">(,Essenz‘)</span>«</span>; wobei, — entsprechend der ,methodologischen‘ Prämisse des Kalküls <span style="color:#00B000">(<span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> ''':''' das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den ,GOTT der Christen‘)</span> —, bei der Interpretation der Terme dieses besonderen Kalküls, die <span style="color:#4C58FF">„christliche Theologie”</span> für den Begriff <span style="color:#FF6000">„GOTT”</span>, Korrektur und die leitende Instanz ist. Dabei muss die Dreifach-Äquivalenz von <span style="color:#4C58FF"><span style="color:#4C58FF">— ‚'''G'''‘ — </span></span>berücksichtigt werden. Welche der drei Äquivalenzen, bzw. Lesearten von <span style="color:#4C58FF">— ‚'''G'''‘ — </span> bei einem bestimmten Term im Kalkül zulässig ist, muss <span style="color:#4C58FF">„theologisch”</span> überprüft und evaluiert werden. Bei manchen können sogar alle drei Lesearten <span style="color:#4C58FF">„theologisch”</span> zulässig sein.
Warum es in der modalen Prädikatenlogik zweiter Stufe, im GÖDEL-System, ,Definitionen‘ gibt, erklärt GÖDEL formal-syntaktisch ''':''' <span style="color:#FF6000">»''Definitionen dienen ja nur der kürzeren Schreibwelse und sind daher prinzipiell überflüssig.''«</span> <span style="color:#00B000">(Aus der Anmerkung 6 in seinem Hauptwerk ''':''' ,''<span style="font-family: Times;"><big>Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I</big></span>''‘.)</span> Für die <span style="color:#4C58FF">„theologische”</span> Interpretation und Hermeneutik seines Kalküls, sind die ,Definitionen‘ im GÖDEL-System jedoch wesentlich, und letztlich entscheidend. Erst dadurch wird sein Axiomensystem zur <span style="color:#4C58FF">„axiomatischen Theologie”</span>. GÖDEL gibt selbst den hermeneutischen Hinweis dazu, wenn er über den höherstufigen Eigenschaftsbegriff <span style="color:#FF6000">»''positiv''«</span> sagt, der nur ,indirekt‘ definiert wird, jedoch mit seinem gesamten Axiomensystem ''':''' <span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne, (unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span> Die Deutung dieses ,höherstufigen‘ Begriffs als ein anderes Wort für <span style="color:#FF6000">„Transzendentalia“</span> ergibt sich aus der <span style="color:#4C58FF">„theologischen”</span> Evaluierung, d.h. der Einordnung des GÖDEL-Systems in die ,laufende‘ <span style="color:#FF6000">„Rede von GOTT“</span>, seit Menschen, sich über den Sinn der Welt und unseres Lebens in ihr, Gedanken machen. GOTT, der ,transzendent‘, — unabhängig —, zur Welt ist, ist Thema im Theorem ANSELMS, um das es ja im GÖDEL-Kalkül geht. Eine <span style="color:#4C58FF">„theologische”</span> Hermeneutik des GÖDEL-Systems ist daher legitim, die, als ein Bemühen um ein überzeugendes Verstehen, aus dem <span style="color:#4C58FF">„theologischen”</span> Vorwissen vieler Generationen schöpft.
Um philosophische, und sogar <span style="color:#4C58FF">„theologische”</span> Theoreme exakt zu formulieren, und untersuchen zu können, hat der Ausnahmelogiker GÖDEL, im 20. Jahrhundert, ein Tor aufgestoßen, das uns ermöglichen kann, <span style="color:#FF6000">»''mathematisch evident''«</span>, und logisch objektiv nachprüfbar, in diesen Disziplinen zu argumentieren. Mit seiner modalen Prädikatenlogik zweiter Stufe, hat GÖDEL dem alten Wunsch eines Raimundus LULLUS, eines Gottfried Wilhelm LEIBNIZ, eines Immanuel KANT, und anderer, nach einer nachprüfbaren ,Universalsprache‘ in den Geisteswissenschaften, entsprochen; analog zur Mathematik, als Universalsprache in den Naturwissenschaften. Der sog. ,Theorembeweiser‘ der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO, mit Hilfe eines Computers, im 21. Jahrhundert, ist die kongeniale und logische Folge aus diesem Quanten-Schritt GÖDELS.
In der folgenden Neu-Kalkülisierung, wird jeder einzelne operative Logik-Schritt des Kalküls in der '''linken Spalte''' nummeriert und als Term-Ergebnis angezeigt, und in der '''rechten Spalte''' werden die dafür benötigten Term-Komponenten und die dabei angewendeten Logik-Regeln und -Gesetze, mit Meta-Terme, dokumentiert. Am Anfang stehen die Ressourcen und das angestrebte Ziel des Beweisganges, <span style="color:#00B000">(das Theorem)</span>. Die GÖDEL Axiome und Definitionen, die Theoreme und Korollare, die Zwischenergebnisse, das Endergebnis, und die logischen Meta-Terme, <span style="color:#00B000">[ in eckigen Klammern ]</span>, werden kontextabhängig, <span style="color:#00B000">(durch ''„Benennungen“'')</span>, interpretiert, <span style="color:#00B000">(angezeigt durch ,Interpretationspunkte‘ — '''::''' —, falls nötig)</span>. Der jeweilige Beweisgang wird in den Anmerkungen ausführlich und umfassend kommentiert. Die Kalkül-Prämissen, <span style="color:#00B000">(<span style="color:#4C58FF">'''AE:'''</span> Argument Einführung)</span>, sind der modal-frei gewählte Einstieg in das Kalkül. Sie dokumentieren, zusammen mit dem angestrebten Beweis-Ziel, eine bestimmte Problemlage in einem externen Diskurs, der mit dem modalen Logik-System hier, formal-syntaktisch überprüft, und gegebenenfalls, verifiziert oder falsifiziert werden soll. Korollare sind einfache, logische Folgerungen aus dem jeweiligen Beweisgang. Theoreme und Korollare sind ,modal‘ gleichwertig.
====<div class="center"><span style="color:#660066">1. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 1, (Möglichkeitsbeweis)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe__________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist die Eigenschaft X nicht positiv“} \\
\text{(Axiom 2)} & \quad (P\ X \wedge \;\Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x)) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaften Y, die aus einer positiven Eigenschaft X modal} \\
\text{ } & \quad & \ & \; \; \text{notwendig folgen, sind auch positive Eigenschaften“} \\
\text{(Axiom 3)} & \quad P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Theorem 1)} &\quad P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{ (◇ :: „möglich“ ↔ „konsistent“ ↔ „denkbar“; □ :: „notwendig“) } \\
\text{ } & \text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad P\ X \ & \ & \text{ AE: „Angenommen, es gibt positive Eigenschaften, Perfektionen“} \\
\text{02} & \quad P\ X \;\Rightarrow\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{ AE: „Angenommen, positive Eigenschaften sind nicht konsistent“} \\
\text{03} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{04} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{05} & \quad \text{ ├ }\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{:01:02:[Modus ponendo ponens] :: [A, A → B├ B] :AE:} \\
\text{06} & \quad \neg\neg \Box \neg \exists x \ X \ x \ & \ & \text{:05:[ ◇A ↔ ¬□¬A] :: (Modalregel)} \\
\text{07} & \quad \neg\neg \Box \neg\neg \forall x \neg X \ x \ & \ & \text{:06:[∃xA ↔ ¬Ɐx¬A] :: (Quantoren Regel)} \\
\text{08} & \quad \text{ ├ }\; \Box \; \forall x \neg X \ x \ & \ & \text{:07:NEG :: [¬¬A↔A] :: (Gesetz der Aussagenlogik)} \\
\text{09} & \quad \Box \; \forall x \neg X \ x \Leftrightarrow\ W & \ & \text{:02:08:[(:02:↔W) → (├:08:↔W)] :: (Kalkülregel)} \\
\text{10} & \quad \Box \; \forall x \ X \ x \Leftrightarrow\ F & \ & \text{:09:[(¬A↔W)↔(A↔F)] :: (Regel für Wahrheitswerte)} \\
\text{11} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:03:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{12} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \text{ } & \text{:10:11:[(:10:↔F) → (:11:↔F)] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{13} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \ & \text{:01:12:[Konjunktion] :: [A, B ├ A∧B]} \\
\text{14} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow \; (\neg x = x))) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(Y:=( ¬x= ..)) :: (Substitution für Eigenschaften)} \\
\text{15} & \quad \ P (\neg x = .. ) & \ & \text{:13:14:[Modus ponens] :: (logische Schlussregel)} \\
\text{16} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{17} & \quad \neg P (\ x = .. )\ & \ & \text{:15:16:[Modus ponens]}\\
\text{18} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:04:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{19} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \text{ } & \text{:10:18:[(:10:↔F) → (:18:↔W)] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{20} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \ & \text{:01:19:[Konjunktion] } \\
\text{21} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x))) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(Y:=(x=..))} \\
\text{22} & \quad \ P (\ x = .. )\ & \ & \text{:20:21:[Modus ponens]}\\
\text{23} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ & \text{:17:22:[Konjunktion] ⇒ Kontradiktion !}\\
\text{24} & \quad \neg \Diamond \; \exists x \ X \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:05:23:[├A├B╞ A→B] :: ''KONDITIONALER BEWEIS''}\\
\text{25} & \quad \neg\neg \Diamond \; \exists x \ X \ x & \ & \text{:24:23:[Modus tollendo tollens] :: [A→B,¬B ├ ¬A]}\\
\text{26} & \quad \text{ ├ }\; \Diamond \; \exists x \ X \ x & \ & \text{:25:NEG; bzw. :05:23:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS''}\\
\text{27} & \quad \ P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{:01:26:[├A├B ╞ A→B]} \\
\text{(Theorem 1)} & \;\text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\text{28} & \quad \ P\ G \;\Longrightarrow\; \Diamond \; \exists x \ G \ x \ & \ & \text{:27:Instanz(X:=G) } \\
\text{29} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{(A3):28:[Modus ponens]} \\
\text{(Korollar 1)} & \;\text{„Das Dasein GOTTES ist definitiv denkbar“} & \ & \text{„Es ist widerspruchsfrei möglich, dass es GOTT gibt“} \\
\end{align}</math>
</small>
|}
Anmerkung-1 ''':''' <span style="color:#00B000">(Der GÖDEL-Term <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, im Axiom-2 ist an sich überflüssig, da dieser hier als Prämisse :01: ohnehin ,angenommen‘ wird. Der Beweisgang kommt mit Axiom-2 auch ohne diesen GÖDEL-Term zum selben Ergebnis, und verkürzt sich damit sogar um zwei Schritte ''':''' Zeile 13 und Zeile 20 sind dann unnötig.)</span>
Der Beweisgang geht mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als Kalkül-Ressource, prinzipiell von der Existenz eines GOTTES aus. Mit der Prämisse :01: <span style="color:#00B000">(hier im 1. Beweisgang)</span> postuliert GÖDEL vorerst allgemein, dass es <span style="color:#FF6000">»''Vollkommenheit, d.h. positive Eigenschaften''«</span> in unserer Welt gibt ''':''' <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, ohne im Kalkül zu definieren, was darunter zu verstehen ist. Definiert wird dann <span style="color:#00B000">(im 2. Beweisgang)</span>, was eine <span style="color:#FF6000">»''wesentliche Eigenschaft''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(im Sinne von ,Transzendentalia‘)</span>; und mit Hilfe dieser Eigenschaft definiert GÖDEL <span style="color:#00B000">(im 3. Beweisgang)</span>, was eine <span style="color:#FF6000">»''notwendige Existenz''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, die er <span style="color:#00B000">(im selben Beweisgang)</span> axiomatisch mit den <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> gleich setzt ''':''' Axiom-5 ''':''' <span style="color:#4C58FF"> —‚'''PE'''<sub>not</sub>‘ —</span>. Erst im 2. Beweisgang wird mit Term :13:, nach einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, definitiv bewiesen <span style="color:#00B000">( ╞ )</span>, dass die, von GÖDEL, hier postulierten, <span style="color:#00B000">(allgemeinen)</span>, positiven Eigenschaften, <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, tatsächlich auch in GOTT <span style="color:#FF6000">»''positive Eigenschaften''«</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, sind; <span style="color:#00B000">(das sind die ultimativen ,Transzendentalia‘ in GOTT)</span>. Jetzt aber muss vorerst der ,Wunsch‘, bzw. die LEIBNIZ-Frage beantwortet werden ''':''' Ob, mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, <span style="color:#FF6000">»''GOTT''«</span> ,möglich‘ ist, der, nach traditioneller Auffassung, <span style="color:#FF6000">»''ein Wesen von äußerster Größe und Vollkommenheit'' <span style="color:#00B000">[ ist ]</span>, ''das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(nach LEIBNIZ; was GÖDEL mit Definition-1 ,abbildet‘)</span>. Wenn man also beweisen will, dass die Existenz eines solchen ''<span style="color:#FF6000">»GOTTES«</span>'' ,möglich‘ sein soll, dann muss man beweisen, dass dieses postulierte System der <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> möglich und formal ,widerspruchsfrei‘ ist. Das Ergebnis des 1. Beweisganges, das ,Theorem-1‘, <span style="color:#00B000">(,Erster Satz‘)</span>, fasst A. FUHRMANN zusammen als ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>. Wenn sie nicht konsistent wären, käme es zu unlösbaren Widersprüchen, <span style="color:#00B000">(Term :24:)</span>. Term :27: ,besagt‘ ''':''' <span style="color:#FF6000">»''Es ist definitiv, d.h. ohne Widerspruch möglich, dass es positive Eigenschaften gibt''«</span>; denn die Behauptung, es sei nicht möglich, dass es positive Eigenschaften, <span style="color:#00B000">(das sind die ,Transzendentalia‘)</span>, in unserer Welt gibt, führt zu einem Widerspruch, und ist daher falsch und ,unlogisch’. Einmal Axiom-1 und zweimal Axiom-2, <span style="color:#00B000">(das die Gleichwertigkeit aller positiven Eigenschaften nachdrücklich klarstellt)</span>, sichern hier die Konsistenz <span style="color:#FF6000">»''aller positiven Eigenschaften in der Welt'', <span style="color:#00B000">[ die ,Transzendentalien‘ ]</span>, ''und damit auch die, die in GOTT sind''«</span>. <span style="color:#00B000">(Der 2. Beweisgang bestätigt, dass es in GOTT tatsächlich positive Eigenschaften gibt.)</span> Die ,Gleichwertigkeit‘ aller Transzendentalia, <span style="color:#00B000">(ihre ,Äquivalenz‘)</span>, ist formal-syntaktisch daran erkennbar, dass die beiden Eigenschafts-Variablen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> im Axiom-2 für beliebige, unterschiedliche ,positive‘ Eigenschaften gegenseitig austauschbar, <span style="color:#00B000">(,konvertierbar‘)</span>, sind. Das heißt, dass beliebige, unterschiedliche ,positive‘ Eigenschaften, für die diese Variablen stehen, sich paarweise, wechselseitig ,implizieren‘, einschließen, und damit notwendig voneinander abhängen, d.h. koinzident ,eins‘ sind, konvertierbar, und somit gleichwertig sind; entsprechend dem Theorem von den Transzendentalia. Zu Term :29:, dem Korollar zu Theorem-1, notiert GÖDEL am 10. Feb. 1970, <span style="color:#00B000">(übersetzt von Joachim BROMAND)</span> ''':''' <span style="color:#FF6000">»''◇∃xG(x) besagt, dass das System aller positiver Eigenschaften kompatibel ist'',</span> <span style="color:#00B000">[ d.h. miteinander verträglich, weil ohne Widersprüche ].</span> <span style="color:#FF6000">''Dies ist ,wahr‘ auf Grund von Axiom-2,'' <span style="color:#00B000">[ weil alle positiven Eigenschaften, d.h. die Transzendentalien, koinzident gleichwertig und konvertierbar sind ]</span>.«</span> Darum ist es definitiv ,möglich‘, dass es diesen GOTT gibt, der <span style="color:#FF6000">»''alle Grade der Vollkommenheit in sich schließt''«</span> und <span style="color:#FF6000">»''über dem ,Größeres‘ nicht mehr gedacht werden kann''«</span>, und, in weiterer Konsequenz, ist der GOTT-Glaube deshalb ,notwendig‘ widerspruchsfrei und sinnvoll, nach Theorem-3 ''':''' <u>Wenn</u> es ,ohne Widerspruch‘ ''<span style="color:#FF6000">»möglich, bzw. denkbar«</span>'' ist, dass es ''<span style="color:#FF6000">»GOTT«</span>'' gibt, <u>dann</u> folgt daraus ''<span style="color:#FF6000">»notwendig«</span>'' ''':''' es ist auch ,widerspruchsfrei‘, wenn man als Voraussetzung ,annimmt‘, dass es ''<span style="color:#FF6000">»GOTT wirklich, für jede mögliche Welt«</span>'' gibt ''':''' Term :11: im 3. Beweisgang. Der Wenn-Satz ist hier mit Korollar-1 bewiesen; der Dann-Satz wird im 3. Beweisgang bewiesen <span style="color:#00B000">( ╞ )</span>, d.i. die Widerspruchsfreiheit und Sinnhaftigkeit des GOTT-Glaubens.
Die ontologische ,Identität‘, d.h. die ,Gleichsetzung‘, bzw. die ,Koinzidenz‘ von Strukturen, die in der Endlichkeit für uns verschieden sind, jedoch in dem unbegrenzt Unendlichen, GOTT, paarweise, perspektivisch in eins zusammenfallen, wie ,Sein‘ und ,Wesen‘, wie ,Ursache‘ und ,Wirkung‘ usw., und auch die Äquivalenz und Austauschbarkeit der Transzendentalien, haben im GÖDEL-Kalkül die logisch-syntaktische Form einer, aus sich, ,modal‘ notwendigen Implikation zwischen zwei verschiedenen, gegenseitig austauschbaren Eigenschafts-Variablen ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>. Dieses Term-Element stellt formal-syntaktisch die Gleichwertigkeit, <span style="color:#00B000">(Äquivalenz)</span>, bzw. die paarweise Koinzidenz aller positiven Eigenschaften und Zuordnungen in GOTT dar; sowohl hier im Axiom-2, als auch in der Definition-2 über die ,Wesenseigenschaften‘, im 2. Beweisgang, mit jeweils verschiedenen, frei umbenennbaren, Individuum-Variablen. Dieses Term-Element ,gilt‘ allgemein jedoch nur für positive Eigenschaften, alias ,Transzendentalia‘, und wird sofort <span style="color:#FF6000">„modal falsch“</span>, wenn für <span style="color:#4C58FF">— ‚'''X'''‘ —</span>, oder <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, Eigenschaften eingesetzt werden, die, — von Natur aus —, weder positiv noch negativ sind, wie z. B. ,rot‘ oder ,schwer‘. Die wechselseitige Austauschbarkeit der noch ,unbestimmten‘ Eigenschafts-Variablen, für beliebige positive Eigenschaften, ist formal äquivalent zur freien Umbenennung der noch ,unbestimmten‘ Individuum-Variablen ''':''' <span style="color:#4C58FF">[ FUB(x:=y) ]</span>. Der formale, gegenseitige, allgemeine Austausch der positiven Eigenschafts-Variablen, bzw. die formale Gleichsetzung beliebiger positiver Eigenschaften, kann, auf Grund der Äquivalenz aller Vollkommenheiten, bzw. ,Transzendentalia‘, auch dann noch durchgeführt werden, wenn eine, von zwei Eigenschafts-Variablen, durch eine Definition oder eine Schlussfolgerung ,bestimmt‘ worden ist, und dadurch zu einer positiven Eigenschafts-Konstante, d.h. zu einer ,bestimmten‘, positiven Eigenschaft geworden ist. Das ist z. B. bei einer instanziierenden Substitution der Fall ''':''' <span style="color:#4C58FF">[ Instanz(X:=..) ]</span>. Das ist eine spezifische Eigenheit der GÖDEL-Axiomatik, weil alle relevanten, positiven Eigenschaften und Zuordnungen in GOTT, als <span style="color:#FF6000">„ultimative Transzendentalia“</span>, immer auch miteinander kompatibel sind. Mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, wird formal die <span style="color:#FF6000">„Koinzidenz“</span> aller ,Transzententalia‘ in der Welt, und auch der ,Zusammenfall‘ aller Gegensätze in GOTT, abgebildet.
Da die Variable <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht, <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(im Korollar-1)</span>, ist die Eigenschaft ''':''' ''<span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'' ''':''' <span style="color:#4C58FF">(¬x=..)</span>, d.h. das <span style="color:#FF6000">„Ungleichsein“</span>, das <span style="color:#FF6000">„Anderssein“</span> GOTTES, <span style="color:#00B000">(Prämisse :03:)</span>, die entscheidende Voraussetzung und Norm für jeden Diskurs über GOTT ''':''' um der <span style="color:#FF6000">„Unvergleichlichkeit“</span>
GOTTES gerecht zu werden, darf GOTT niemals mit etwas aus der ''<span style="color:#FF6000">»zufälligen Struktur der Welt«</span>'' verglichen, d.h. gleich gesetzt werden. Der Term :18: <span style="color:#4C58FF">(x=x) ↔ W</span> erinnert an die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin‘''«</span>. <span style="color:#00B000">(In der mystischen Tradition, im ''<span style="font-family: Times;"><big>‚Dialog über die Vorsehung‘</big></span>'', dem Hauptwerk der Heiligen KATHARINA von Siena, Mystikerin und Lehrerin der Kirche, sagt GOTT-VATER zur KATHARINA ''':''' <span style="color:#FF6000">»''ICH BIN der IST'', <span style="color:#00B000">[ aus mir selbst ]</span>, ''du bist, die nicht ist'', <span style="color:#00B000">[ aus dir selbst ]</span>.«</span> Das ist eine wichtige, deutende Ergänzung, und die authentische <span style="color:#4C58FF">,theologische‘</span> Interpretation dieser Exodus Text-Stelle. Das ist der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES.)</span>
Zum Term :03: notiert A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Die Notation'' <span style="color:#4C58FF">(¬x=..)</span> ''für die Eigenschaft ''':''' <span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'', <span style="color:#00B000">[ d.h. <span style="color:#FF6000">„Ungleichheit“, „Anderssein“</span>, bzw. die Notation <span style="color:#4C58FF">(x=..)</span> für den Existenzmodus-Perfektion ''':''' <span style="color:#FF6000">„Gleichheit“, „Idendität“</span> ]</span>, ''ist suggestiv und informell und ersetzt hier einen formal korrekten Abstraktionsausdruck wie'' <span style="color:#4C58FF">λy.(¬x=y)</span>, <span style="color:#00B000">[ bzw. <span style="color:#4C58FF">λy.(x=y)</span> ]</span>. ''Für die formal korrektere Notation bedarf es der zusätzlichen Vereinbarung, dass der Ausdruck'' <span style="color:#4C58FF">λy.(¬x=y)</span> ''gleichbedeutend sei mit dem Ausdruck'' <span style="color:#4C58FF">¬λy.(x=y)</span>. ''Diese Vereinbarung ist harmlos, da wir aufgrund der Regel der λ–Konversion'' ''':''' <span style="color:#4C58FF">λy.Xy.x ↔ Xx</span>, <span style="color:#00B000">[ mit der <span style="color:#4C58FF">Instanz(X:=(¬x=..))</span> ]</span>, ''so schließen dürfen'' ''':''' <span style="color:#4C58FF">λy.(¬x=y).x ↔ ¬x=x ↔ <span style="color:#00B000">¬(x=x)</span> ↔ ¬λy.(x=y).x</span> .<span style="color:#FF6000">«</span> <ref>A. FUHRMANN a.a.O. Seite 7, Anmerkung 4 (von mir korrigiert und ergänzt)</ref>
In der Kalkül-Zeile 29 wird das Möglichkeits-Korollar-1 durch einen <span style="color:#4C58FF">[ Modus ponens ]</span> mit Axiom-3 von der Kalkül-Prämisse-Term :01: ,abgekoppelt‘, d.h. es ist nicht mehr vom Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span> logisch abhängig. Das Möglichkeits-Korollar-1 behält jedoch die bewiesene Widerspruchsfreiheit von Theorem-1, und ist damit nur mehr von Axiom-1 und Axiom-2 abhängig, was für das Theorem-ANSELMS am Schluss entscheidend ist. Erklärung zu Term :05: Das Ergebnis einer Logik-Operation zwischen Prämissen ist ,regulär‘ <span style="color:#00B000">(├ )</span> den Prämissen zuzurechnen.
Das Modale-Prinzip KRIPKE-Γ-Ɐx, <span style="color:#4C58FF">['''RK''']</span>, in Worten ''':''' <span style="color:#FF6000">»''Wenn mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''gilt, und daraus logisch folgt, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''auch die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''gilt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar'' ''':''' ''es ist wahr, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''aus der Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''logisch folgt''«</span>. Der Term <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span> steht formal-syndaktisch, allgemein für ,Transzendentalia‘, und ist für alle ,Nicht-Transzendentalia‘ <span style="color:#FF6000">„modal falsch“</span>.
====<div class="center"><span style="color:#660066">2. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 2, (,Basisbeweis‘)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe____________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.2)} & \quad \neg P\ X \;\Longrightarrow\;\ P\neg X\ & \ & \text{„Wenn X nicht positiv ist, dann ist die Negation ¬X positiv“} \\
\text{(Axiom 3)} & \quad \ P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{(Axiom 4)} & \quad \ P\ X \;\Longrightarrow\; \Box \; \ P\ X \ & \ & \text{„Positive Eigenschaften sind notwendig aus sich positiv“} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 2)} & \quad \ X_{ess}\ x \;\Leftrightarrow X\ x \wedge \forall Y \left(\ Y\ x \Rightarrow \Box \; \forall y (\ X\ y \Rightarrow \ Y\ y)\right) & \ & \text{„X ist genau dann eine wesentliche Eigenschaft von x, wenn x sie hat, und} \\
\text{ } & \quad & \text { } & \;\;\text{alle anderen Eigenschaften Y von x notwendig aus dieser Eigenschaft X folgen“} \\
\text{[RM]} &\quad \ A \;\Longrightarrow\;\ B\; \text{ ├ }\;\Box \; A \Longrightarrow\;\Box\; \ B\ & \ & \text{( :: Modales Prinzip)} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{(,G‘ :: „Göttlichkeit“ ↔ „GOTT“ ↔ „Dasein GOTTES“)} \\
\text{ } &\;\text{„Das Wesen GOTTES ist sein Dasein“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} &\quad \ G\ x \ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} &\quad \ Y\ x \ & \ & \text{ AE: „Angenommen, GOTT hat die Eigenschaften Y“} \\
\text{03} &\quad \neg P\ Y & \ & \text{ AE: „Angenommen, die Y in GOTT sind nicht positiv“} \\
\text{04} &\quad \neg P \ Y \Rightarrow \ P \neg Y\ & \ &\text{(A1.2):Instanz(X:=Y) :: (Substitution für Eigenschaften) } \\
\text{05} &\quad \ P \neg Y \ & \ & \text {:03:04:[Modus ponens] :: [A, A → B├ B] } \\
\text{06} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{07} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:06:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{08} &\quad \ P \neg Y \Rightarrow \neg Y \ x\ & \ &\text{:07:Instanz(X:=¬Y)} \\
\text{09} &\quad \neg Y \ x\ & \ &\text{:05:08:[Modus ponens]} \\
\text{10} &\quad \text{ ├ }\; (Y\ x \wedge \neg Y \ x) \;\Leftrightarrow\;\ F\ & \ & \text{:02:09:[Konjunktion] ⇒ Kontradiktion !} \\
\text{11} &\quad \neg P\ Y \; \Rightarrow \; (Y\ x \wedge \neg Y \ x )\ & \ &\text{:03:10:[├A├B ╞ A → B] :: ''KONDITIONALER BEWEIS''} \\
\text{12} &\quad \neg\neg P\ Y \ & \ &\text{:11:10:[Modus tollendo tollens] :: [A → B,¬B├ ¬A]} \\
\text{13} &\quad \text{ ├ }\; P\ Y \ & \ &\text{:12:NEG; bzw. :03:10:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS'' :AE:} \\
\text{14} &\quad \ P\ Y \;\Rightarrow\;\Box \; \ P\ Y \ & \ & \text{(A4):Instanz(X:=Y)} \\
\text{15} &\quad \Box \; \ P\ Y \ & \ & \text{:13:14:[Modus ponens]} \\
\text{16} &\quad \ G \ y \Rightarrow \ Y \ y\ & \ &\text{:01:02:[├A├B ╞ A→B]:FUB(x:=y)} \\
\text{17} &\quad \text{ ├ }\; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:16:[G(y) ├ ⱯyG(y)]} \\
\text{18} &\quad \Box \; \ P\ Y \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:13:17:[├A├B ╞ A→B]:[RM]} \\
\text{19} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:15:18:[Modus ponens]} \\
\text{20} &\quad \ Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:02:19:[├A├B ╞ A→B]} \\
\text{21} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x & \ &\text{:20:01:[Konjunktion] :: [A, B├ A ∧ B]} \\
\text{22} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ X \ y \Rightarrow \ Y \ y)) \wedge \ X \ x\;\Leftrightarrow\; X_{ess}\ x \ & \ &\text{(D2):KOMM(↔):KOMM(∧):[ⱯYA(Y) ├ A(Y)] wegen :13:} \\
\text{23} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x\;\Leftrightarrow\; G_{ess}\ x \ & \ &\text{:22:Instanz(X:=G)} \\
\text{24} & \quad \text{ ├ }\; G_{ess}\ x \ & \ &\text{:21:23:[Modus ponens]:AE: wegen :30:} \\
\text{25} &\quad \ G\ x \;\Rightarrow\; \ G_{ess}\ x \ & \ & \text{:01:24:[├A├B ╞ A→B] :: Theorem 2.1} \\
\text{26} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] } \\
\text{27} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:26:[ⱯXA(X) ├ A(X)]} \\
\text{28} &\quad \ P \ G \Rightarrow \ G \ x\ & \ &\text{:27:Instanz(X:=G)} \\
\text{29} &\quad \text{ ├ }\; G \ x\ & \ &\text{(A3):28:[Modus ponens]} \\
\text{30} &\quad \ G_{ess}\ x \;\Rightarrow \ G \ x\ & \ &\text{:24:29:[├A├B ╞ A→B] :: Theorem 2.2 } \\
\text{31} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{:25:30:[Konjunktion]:BIKONDITIONAL :: [(A→B) ∧ (B→A) ↔ (A↔B)] } \\
\text{(Theorem 2)} &\; \text{„Dasein, GOTT-Sein, ist das Wesen GOTTES“} & \ & \Longleftarrow\; \text{was zu beweisen war ! } \\
\text{32} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:19:Instanz(Y:=(x=..))} \\
\text{33} &\quad \ G\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:01:32:[├A├B ╞ A→B]} \\
\text{(Korollar 2)} & \;\text{„Es gibt notwendig höchstens einen GOTT“} & \ & \text{„Wenn es GOTT gibt, dann gibt es für jede mögliche Welt nur einen GOTT“} \\
\end{align}</math>
</small>
|}
<span style="color:#00B000"><small>(In den Kalkül-Zeilen 16, 18, 31 mussten zwei-, und in Zeile 22 drei Kalkül-Schritte, d.h. Logik-Operationen in eine Zeile zusammengezogen werden, weil der Parser dieser speziellen Mathematik-Funktion in Wikibooks jedes Mal wegen Puffer-Überlauf abstürzt, wenn zu den bestehenden Zeilen noch eine neue Zeile, oder ein Text-Element, zusätzlich eingefügt wird. Das vermindert etwas die Transparenz des Kalküls.)</small></span>
Anmerkung-2 ''':''' <span style="color:#00B000">(Dieser Beweisgang kommt auch ohne das ,unbestimmte‘ Konjunkt <span style="color:#4C58FF"> — ‚'''Xx'''‘ —</span> in der Definition-2 zum gleichen Ergebnis, und wird dadurch um eine Zeile verkürzt ''':''' Zeile 21 entfällt, und <span style="color:#4C58FF">[ KOMM(∧) ]</span> ist dann unnötig. Dieses Konjunkt wird hier ebenfalls schon in der Kalkül-Prämisse :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, als ,Annahme‘ gesetzt, vorentschieden und ,bestimmt‘ mit der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>. Es war also logisch korrekt, dass GÖDEL, in seiner Notiz vom 10. Feb. 1970 zum ontologischen Beweis, dieses Konjunkt weggelassen hat, was ihm von Kommentatoren als ein Flüchtigkeitsfehler angerechnet worden war. Der gesamte 2. Beweisgang bewegt sich im Geltungsbereich der Prämisse Term :01:, d.h. ist in jeder Zeile von der Annahme abhängig ''':''' die Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span> steht für den GOTT der Christen. In der Kalkül-Zeile 33 wird mit Korollar-2 diese Abhängigkeit, für den Term :32:, explizit dargestellt.)</span>
Der Beweisgang geht mit der Prämisse :01: prinzipiell, als ,modal‘ freigewählte Voraussetzung, von der Existenz eines GOTTES aus. Im 1. Beweisgang wurde bewiesen, dass die von GÖDEL ,postulierten‘ <span style="color:#FF6000">»''allgemeinen positiven Eigenschaften, Vollkommenheiten, Perfektionen'', <span style="color:#00B000">[ die sog. ,Transzendentalien‘ ]</span> ''konsistent''«</span>, d.i. widerspruchsfrei sind. Hier, in diesem Beweisgang wird nun die Prämisse vom 1. Beweisgang, <span style="color:#4C58FF"> — ‚'''PX'''‘ —</span>, im Bezug auf GOTT hinterfragt ''':''' Gibt es auch in GOTT so Etwas, wie <span style="color:#FF6000">»''Vollkommenheit, Positives, Perfektes''«</span> '''?''' Die ,Annahme‘ jedoch, dass es <span style="color:#FF6000">»''in GOTT keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span> <span style="color:#00B000">(keine Transzendentalien)</span> gibt, <span style="color:#00B000">(Prämisse Term :03:)</span>,<span style="color:#4C58FF"> — ‚'''¬PY'''‘ —</span>, d.h. dass die <span style="color:#00B000">(wesentlichen)</span> Eigenschaften in GOTT keine <span style="color:#FF6000">„Vollkommenheiten“</span> seien, führt aber zu einem unlösbaren Widerspruch, <span style="color:#00B000">(Term :10:)</span>. Mit Term :13:, als 1. Hauptergebnis, ist damit, — als ,neue‘ Prämisse, <span style="color:#00B000">(ersetzt Term :03:)</span> —, definitiv ,bewiesen‘ <span style="color:#00B000">( ╞ , d.h. es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, dass alle Eigenschaften, die hier mit <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> symbolisiert werden, <span style="color:#FF6000">„positive Eigenschaften“</span>, d.h. <span style="color:#FF6000">„Perfektionen“</span> sind, von denen das Kalkül ,annimmt‘, <span style="color:#00B000">(Prämissen Term :01:, Term :02: und speziell Term :16:)</span>, dass der GOTT der Christen sie besitzt. Alle ,Wesenseigenschaften‘ in GOTT ''':''' <span style="color:#4C58FF">— ‚'''Y'''<sub>ess</sub>‘ —</span>, die durch den Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —, </span> dargestellt werden, sind somit <span style="color:#FF6000">„Vollkommenheiten“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span><span style="color:#00B000">, (,ultimative Transzendentalien‘, aller ,Grade‘)</span>. Damit ist definitiv ‚bestätigt‘, <span style="color:#00B000">( ╞ , es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, was mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schon ‚angenommen‘ worden ist ''':''' <span style="color:#FF6000">»''GOTT ist perfekt; er hat alle positiven Eigenschaften''«</span>; und auch Definition-1 ist damit ,verifiziert‘ ''':''' <span style="color:#FF6000">»''GOTT ist genau deswegen GOTT, weil er, als GOTT, positive Eigenschaften aller Grade in sich schließt''«</span>; entsprechend dem Quelltext bei LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. <span style="color:#00B000">(Der ,Schlüsselbegriff‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> ist der ,Schlüssel‘ zur Erkenntnis, dass GOTT ,notwendig‘, sowohl ,wesentlich‘ für uns, als auch an sich ,grundlos‘, immer schon ,da‘ ist.)</span> Hier, <span style="color:#00B000">(im 2. Beweisgang)</span>, hat Axiom-1, <span style="color:#00B000">(im Term :04:)</span>, sicher gestellt, dass die Eigenschaften in GOTT, <span style="color:#00B000">(Definition-1; Term :06:)</span>, tatsächlich <span style="color:#FF6000">„ultimativ positiv, perfekt und vollkommen“</span> sind ''':''' <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>. Das GÖDEL-Axiom-1 bezieht seine ,Potenz‘ aus dem Prinzip vom ,auszuschließenden‘ Widerspruch ''':''' eine Eigenschaft kann nicht zugleich ,positiv‘ und ,nicht positiv‘ sein '''!'''
Formal lässt sich das 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' schon aus Term :23: in diesem Beweisgang mit der <span style="color:#4C58FF">[ Vereinfachung ] :: [ A∧B ├ B ]</span> ohne Weiteres ,regulär‘ ableiten, — analog zu den Vorgehensweisen bei A. FUHRMANN und G.J. WIRSCHING. <span style="color:#00B000">(Beide Aussagen dieser ,Konjunktion‘ sind ,gleichwertig‘ und wahr, daher partizipiert das Theorem-2 auch am Ergebnis der Widerspruchsfreiheit von Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dem 1. Hauptergebnis. Beide Aussagen im Term :23: interpretieren sich gegenseitig.)</span> Der hier gewählte, etwas längere Weg zum Ergebnis, soll die innere Struktur und Abhängigkeit der Ergebnisse von bestimmten Voraussetzungen offen legen, und ihren ,Zweck‘ verdeutlichen. Die beiden Hauptergebnisse im Basisbeweis gehen vom vorgefundenen und traditionell vorgegebenen Begriff von ,GOTT‘ aus, <span style="color:#00B000">(Term :06:, Term :16: und Term :26:)</span>. Das ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 1. Hauptergebnis, hier im 2. Beweisgang, Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span> ''':''' <span style="color:#FF6000">»''die Eigenschaften in GOTT sind vollkommen, d.h. sind die ultimativen Transzendentalia''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als auch die Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span>, für die Annahme ''':''' den ,GOTT der Christen‘, der deswegen GOTT ist, weil er alle Grade der Vollkommenheit in sich schließt. Und das ebenfalls ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 2. Hauptergebnis, hier im selben Beweisgang, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''das Wesen GOTTES ist sein eigenes Sein''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, als auch die Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, für die Wesenseigenschaft ''':''' ,notwendige Existenz‘, und widerlegt den Einwand KANTS, für den Spezialfall ''':''' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für ,GOTT‘. Zwei Axiome und zwei Definitionen von GOTT und seinen Vollkommenheiten werden durch die Ergebnisse im Basisbeweis des GÖDEL-Kalküls in unserer realen Welt als ,wahr‘, <span style="color:#00B000">(genauer als ,widerspruchsfrei‘)</span>, und, — im Rahmen des christlichen Glaubens —, als ,annehmbar‘ bestätigt. <span style="color:#00B000">(Anmerkung zu Term :24: ''':''' eine Prämisse ist regulär-,modal‘ immer ,frei‘ wählbar.)</span>
Zusammengefasst heißt das ''':''' die ,strittige‘ Begründung der ,methodologischen‘ Prämisse des GÖDEL-Kalküls ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#00B000">(Prämisse, Term :01:)</span>, weil <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#00B000">(Korollar-1)</span> ''':''' <span style="color:#FF6000">»''Das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den GOTT der Christen, für den es ohne Widerspruch denkbar ist, dass es ihn gibt''«</span>, <span style="color:#00B000">(ANSELMS Prinzip, trotz der ,Warnung‘ KANTS)</span>, ist ,wahr‘ und für uns ,annehmbar, denn es ist auch, auf Grund der Ergebnisse des 2. Beweisganges, in unserer realen Welt ,wahr‘ und ,annehmbar‘, weil schon als ,widerspruchsfrei‘ verifiziert ''':''' <span style="color:#FF6000">»''Der GOTT der Christen'' <span style="color:#00B000">(Term :01:)</span> '',existiert‘ für uns ,notwendig‘''«</span> ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, <span style="color:#00B000">(d.i. das ,regulär‘-mögliche Korollar sowohl im 2. als auch im 3. Beweisgang)</span>, denn dieser GOTT ist aus sich ,vollkommen‘ ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, und zu seiner ,Vollkommenheit‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> gehört auch notwendig sein ,Existieren‘ ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. <span style="color:#00B000">(Jeder dieser Terme ist im-, und durch den 2. Beweisgang, im Geltungsbereich der Prämisse Term :01:, als ,wahr‘ und ,annehmbar‘ bewiesen, bzw. verifiziert.)</span> Das ist der ,Kern‘ des ontologischen Arguments, und somit ist auch diese ,strittige‘ Begründung der Prämisse des GÖDEL-Kalküls mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. sie ist logisch ,richtig‘ und, im Kontext des christlichen Glaubens, vernünftig. Die Annahme des Gegenteils zu dieser Prämisse ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Es ist undenkbar, dass es diesen GOTT gibt''«</span>, führt jedoch, unabhängig von jeder Glaubensüberzeugung, zu einem Widerspruch — ist unlogisch und daher ,falsch‘, <span style="color:#00B000">(siehe Anhang ''':''' Widerlegung)</span>. Die Behauptung einer ,formalen Unentscheidbarkeit‘ zu den Annahmen über die Existenz GOTTES, ob oder nicht, <span style="color:#00B000">(d.h. ein ,methodologischer‘ Agnostizismus)</span>, ist gegen jede ,Logik‘; und ist auch ,falsch‘, d.h. der Agnostizismus ist einfach nur ein ,logischer Irrtum‘. Denn aus dem, im Kalkül abgeleiteten, Widerspruch aus der einen Annahme, und damit ihrer Unrichtigkeit, folgt notwendig die Richtigkeit der gegenteiligen Annahme. Damit ist eine klare Entscheidung getroffen.
Das Modale-Prinzip <span style="color:#4C58FF">['''RM''']</span> in Worten ''':''' <span style="color:#FF6000">»''Wenn es wahr ist, dass aus'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> ''ein'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> ''logisch folgt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar, dass, wenn'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist, auch'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist''«</span>. <span style="color:#00B000">(Das <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> in Term :18: ist als ,modal notwendig‘ durch den Term :15: verifiziert '''!''' )</span>
Mit dem 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#FF6000">»'',Dasein‘ ist das ,Wesen‘ GOTTES''«</span>, folgt die GÖDEL-Axiomatik der philosophisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition der ,Rede von GOTT‘ seit ARISTOTELES, und schließt sich damit formal-syntaktisch zugleich auch der religiösen Überzeugung der Christen an, die glauben, dass GOTT, als unser Vater, aus Liebe, in seinem Sohn, JESUS CHRISTUS, für uns immer schon <span style="color:#FF6000">»''da''«</span> ist, <span style="color:#00B000">(der Sohn ist koinzident ,eins‘ mit GOTT, dem Vater und dem GEIST)</span>, wirksam in und durch seine <span style="color:#4C58F0">„Kirche“</span>, im HEILIGEN GEIST, bis ans Ende der Zeit. Das ist das, <span style="color:#FF6000">»''was''«</span> GOTT eigentlich für uns ausmacht, — die Selbstmitteilung seines unergründlichen Wesens in den Sakramenten der <span style="color:#4C58F0">„Kirche“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin da für euch und für immer, als der ich ''<span style="color:#00B000">[ immer schon gewesen ]</span> ''bin''«</span>; <span style="color:#00B000">(d.i. das <span style="color:#4C58FF">,theologisch‘</span>-exegetische ,Axiom‘ der Christen, und eine <span style="color:#4C58FF">,theologisch‘</span> korrekte Explikation der ,regulären‘ Kalkül-Prämisse Term :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, jeweils im 2. und 3. Beweisgang)</span>. Das heißt aber nicht, dass der Autor des Kalküls sich mit diesem Glauben identifiziert hat, <span style="color:#00B000">(,hat‘ er auch nicht)</span>, oder dass der Leser des ontologischen Beweises von Kurt GÖDEL sich damit identifizieren muss, wenn er dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> anerkennt.
Zur erweiterten <span style="color:#4C58FF">„theologischen“</span> Explikation der Kalkül-Prämisse ''':''' Die <span style="color:#4C58F0">„Kirche“</span> ist das ,Meisterwerk‘ GOTTES ''':''' In ihr ist es GOTT gelungen, etwas Göttliches und Unzerstörbares in unsere korrupte Welt einzupflanzen ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Etwas Göttliches existiert notwendig, d.h. ,unzerstörbar‘ in unserer Welt''«</span>. Sie ist, durch die Menschwerdung des GOTTES Sohnes, JESUS CHRISTUS, dessen <span style="color:#4C58F0">„Leib“</span> die <span style="color:#4C58F0">„Kirche“</span> ist, untrennbar mit Menschen verbunden, die schon, von allem Anfang an, und jetzt immer noch, durch die Sünde korrumpiert sind. Mit ihr will und wird GOTT unsere Welt und die Menschheit, bis ans Ende der Zeit, von der Sünde und von deren Konsequenz, dem <span style="color:#00B000">(ewigen)</span> Tod <span style="color:#4C58FF">„erlösen“</span>, <span style="color:#00B000">(jedoch nicht ohne die Zustimmung des Menschen)</span>. Mit dieser Explikation wird die Tragweite des ontologischen Arguments ANSELMS, und damit auch die <span style="color:#4C58FF">„theologische“</span> Relevanz der GÖDEL-Axiomatik erkennbar. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT, <span style="color:#00B000">(Term :01:)</span>.
====<div class="center"><span style="color:#660066">3. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 3, (ANSELMS Theorem)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe___________________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 5)} & \quad P\ E_{not}\; \ & \text { } & \text{„Notwendige Existenz ist eine positive Eigenschaft“} \\
\text{ } & \text{( :: Das ist nur dann wahr, wenn ,Dasein‘ und ,Wesen‘ } & \ & \text{( :: dagegen KANT : ,Existenz‘ ist keine ,Eigenschaft‘,} \\
\text{ } & \;\;\text{in eins zusammenfallen ! ARISTOTELES : Theorem-2)}\ & \ & \;\;\text{,Sein‘ ist für alles, was existiert, kein ,reales Prädikat‘ ! )} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 3)} & \quad \ E_{not}\ x \;\Longleftrightarrow\;\ \forall X \left(\ X_{ess}\ x \Longrightarrow \Box \; \exists y \ X\ y \right) & \ & \text{„Notwendige Existenz ist genau dann eine Eigenschaft von x, wenn} \\
\text{ } & \quad & \ & \;\;\text{alle wesentl. Eigenschaften von x notwendig instanziiert sind“} \\
\text{(Korollar 1)} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{„Es ist widespruchsfrei möglich, dass es GOTT gibt“} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ &\text{„Dasein, GOTT-Sein, Existenz ist das Wesen, die Essenz GOTTES“} \\
\text{(Korollar 2)} &\quad \ G\ x \;\Longrightarrow\; \Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{„Wenn es GOTT gibt, dann gibt es notwendig nur einen GOTT“} \\
\text{(Theorem 3)} & \quad \Diamond \; \exists x \ G \ x \;\Longrightarrow\; \Box \; \exists x \ G \ x \ & \ & \text{( :: ANSELMS Prinzip)} \\
\text{ } & \text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{01} & \quad \ G \ x\ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} & \quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ & \text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{03} & \quad \ P \ X \Rightarrow \ X \ x\ & \ & \text{:02:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{04} & \quad \ P \ E_{not}\;\Rightarrow \ E_{not}\ x\ & \ & \text{:03:Instanz(X:= Enot) :: (Substitution für Eigenschaften)} \\
\text{05} & \quad \ E_{not}\ x\ & \ & \text{(A5):04:[Modus ponens] :: [A, A → B├ B]} \\
\text{06} & \quad \forall X \left(\ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y \right) & \ & \text{(D3):05:[Modus ponens]} \\
\text{07} & \quad \ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y & \ & \text{:06:[ⱯXA(X) ├ A(X)]} \\
\text{08} & \quad \ G_{ess}\ x \Rightarrow \Box \; \exists y \ G\ y & \ & \text{:07:Instanz(X:= G)} \\
\text{09} & \quad \ G_{ess}\ x \ & \ & \text{(Th2):01:[Modus ponens]} \\
\text{10} & \quad \text{ ├ }\;\Box \; \exists x \ G\ x & \ & \text{:08:09:[Modus ponens]:FUB(y:=x) :: (Freie-Um-Benennung der Var.)} \\
\text{ } & \text{„Es gibt GOTT wirklich, für jede mögliche Welt“} & \ & \Longleftarrow\; \text{1. Hauptergebnis !} \\
\text{11} & \quad \;\Diamond \exists x \ G \ x \;\Longrightarrow \; \Box \; \exists x \ G\ x & \ & \text{(K1):10:[├A├B ╞ A→B] :: ''KONDITIONALER BEWEIS''} \\
\text{(Theorem 3)} & \;\text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen war ! 2. Hauptergebnis ! } \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{12} & \quad \;\Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{(K2):01:[Modus ponens]} \\
\text{13} & \quad \;\Box \; (\exists x \ G\ x \wedge \; \forall y(\ G \ y \Longrightarrow \ (x = y)))\ & \ & \text{:10:12:[Konjunktion]:DIST(□∧)} \\
\text{(Korollar 3)} & \;\text{„Es gibt notwendig genau nur einen GOTT“} & \ & \text{„Es gibt für jede mögliche Welt nur den GOTT der Christen“} \\
\end{align}</math>
</small>
|}
Anmerkung-3 ''':''' <span style="color:#00B000">(Ein Theorem und zwei Korollare, aus den beiden vorhergehenden Beweisgängen, werden hier, im 3. Beweisgang, zu ,Axiomen‘, die das Theorem-ANSELMS und sein Korollar mit-verifizieren und bestätigen.)</span>
Dieser Beweisgang ist das Ziel aller Bemühungen. Hier wird der sog. ,ontologische Gottesbeweis‘ nach ANSELM von Canterbury formal-syntaktisch dargestellt und als logisch nachvollziehbar von GÖDEL bestätigt. Damit hat er aber auch klar gestellt, dass der ontologische Beweis ANSELMS kein Beweis für die ,Existenz‘ des GOTTES der Bibel sein kann, bzw. sein ,will‘ ''':''' Denn mit der Prämisse, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(Term :01:, wie auch schon im ,Basisbeweis‘, und ausformuliert hier in Term :02:, mit der Definition für GOTT)</span>, wird mit dem traditionellen, abendländischen ,GOTT-Glauben‘, der ,glaubt‘, dass der Gott der Christen tatsächlich existiert, — methodologisch als ,Annahme‘ —, der Beweisgang schon regulär und explizit eröffnet, aus dem sich dann, logisch korrekt, mit Hilfe der GÖDEL-Axiome und Definitionen, das ,Theorem ANSELMS‘ ergibt; <span style="color:#00B000">(hier jedoch, mit Günther J. WIRSCHING, ohne den Umweg bei GÖDEL über den <span style="color:#4C58FF">[ Modus Barbara ] :: [ A → B, B → C ├ A → C ] </span>, mit dem modalen Axiom-BECKER ''':''' <span style="color:#4C58FF">— ‚'''◇□A→□A'''‘ —</span>, als <span style="color:#4C58FF">‚B → C‘</span> im kategorischen Syllogismus, das André FUHRMANN recherchiert hat)</span>. GÖDEL verwendet zur Darstellung des sog. ,ontologischen Gottesbeweises‘ nach ANSELM die Struktur eines modal-logischen Kalküls. Ein modal-logisches Kalkül ist ein genau geregeltes Schema, in dem bei bestimmten ,Annahmen‘ <span style="color:#00B000">(Axiome, Definitionen, Prämissen)</span> etwas anderes als das Vorausgesetzte, auf Grund des Vorausgesetzten mit Notwendigkeit folgt. Entsprechend der ,Modalität‘ der sechs ,modal‘ notwendigen, d.h. transzendentalen Voraussetzungen, hier, für den 3. Beweisgang, die in den <span style="color:#00B000">(und durch die)</span> beiden vorhergehenden Beweisgängen schon als <span style="color:#FF6000">„modal wahr“</span>, bzw. als logisch annehmbar, verifiziert und/oder ,bewiesen‘ wurden, sind auch die beiden ,Schlusssätze‘ <span style="color:#00B000">(Theorem-3 und Korollar-3)</span> <span style="color:#FF6000">„modal wahr“</span>, bzw. logisch annehmbar '''!''' Die Wahl der Prämisse :01: dagegen ist nicht ,modal‘ notwendig, sondern beruht auf einer freien Entscheidung, und damit ist auch ihre Interpretation eine freie Entscheidung, mit der Voraussetzung, dass man das Kalkül mit Theoremen aus der <span style="color:#4C58FF">„christlichen Theologie“</span> evaluieren, und damit interpretieren will. Dazu berechtigt die Genese des Kalküls. Der Glaube an den GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, beruht immer auf einer freien Entscheidung. Das Kalkül, als solches, unabhängig von jeder Interpretation seiner Syntax, ist genau dann ,allgemein‘ <span style="color:#FF6000">»''mathematisch evident''«</span>, d.h. ,ist allgemein gültig‘, wenn es gültigen Logik-Regeln folgt. Die Bestimmung seiner Syntax jedoch, d.h. seine Interpretation, unterliegt hermeneutischen Kriterien, die nicht von Logik-Regeln abhängen, wie hier ''':''' <span style="color:#FF6000">»''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''«</span>, wie GÖDEL selbst hinzufügt. Mit der, — von GÖDEL eingeforderten —, ‚Unabhängigkeit‘ der Kalkül-Axiome von der zufälligen Struktur der Welt, wird implizit für das Kalkül auch festgelegt, dass <span style="color:#FF6000">„GOTT“</span> ‚unabhängig‘ von der zufälligen <span style="color:#00B000">(Raum-Zeit-)</span>Struktur unserer vergänglichen Welt, und daher ,zeitlos-ewig‘ ist, <span style="color:#00B000">(was <span style="color:#4C58FF">„theologisch“</span> korrekt ist)</span>, begründet durch Definition-1 und Axiom-3. Aus der zeitlosen Ewigkeit GOTTES folgt, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, denn bei Zeitlosigkeit gibt es keinen ,zeitlichen‘ und damit auch keinen ,ontologischen‘ Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘. Beides ist dann koinzident ,eins‘ ''':''' wie ,Wesen‘ und ,Dasein‘ in GOTT, bzw. wie ,Begriff‘ und ,Sein‘, oder ,Möglichkeit‘ und ,Wirklichkeit‘. <span style="color:#00B000">(Man vergleiche damit auch die ,postulierte‘ Einheit von ,Erkenntnisobjekt‘ und ,Erkenntnissubjekt‘ im ,Gott‘ des ARISTOTELES ''':''' im <span style="color:#FF6000">»<span style="color:#00B000">[ selbstbewussten ]</span> ''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“<span style="color:#00B000"> | </span>„noêseôs noêsis“</span> <small>(‚<span style="font-family: Times;"><big>''Metaphysik''</big></span>‘ XII 9, 1074b34)</small>, im Vollzug seiner Funktion als ,unbewegtes Bewegungsprinzip‘, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“<span style="color:#00B000"> | </span>„prôton kinoûn akinêton“</span> der Welt, das alles Übrige <span style="color:#FF6000">»''wie ein Geliebtes''«<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὡς ἐρώμενον</big></span>“</span> | <span style="color:#FF6000">„hôs erômenon“</span> bewegt; d.h. christlich ''':''' <span style="color:#FF6000">»''aus Liebe''«</span> ,entstehen‘ lässt.)</span>
Anmerkung-4 ''':''' Das <span style="color:#00B000">(im 2. Beweisgang)</span> schon bewiesene Theorem-2, d.i. die Koinzidenz von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, <span style="color:#00B000">(‚Existenz‘</span> und <span style="color:#00B000">‚Essenz‘)</span>, rechtfertigt sowohl Axiom-5 als auch die Definition-3, und widerlegt den Einwand KANTS. Somit ist deren Setzung <span style="color:#00B000">(hier, im 3. Beweisgang)</span> korrekt, und durch das Theorem-2 schon vorbestimmt und bestätigt, d.h. beide sind <span style="color:#FF6000">„modal wahr“</span> und ,logisch‘ annehmbar, da sie durch die Gültigkeit von Theorem-2 ,verifiziert‘ worden sind. Damit wird klar erkennbar, dass das Theorem-2 tatsächlich die Basis des GÖDEL-Kalküls ist. Und wenn damit Axiom-5 im GÖDEL-Kalkül ‚gerechtfertigt‘ ist, dann ist auch, <span style="color:#00B000">(als Voraussetzung dafür)</span>, das Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ — ''':''' </span> <span style="color:#FF6000">»''Positive Eigenschaften'', <span style="color:#00B000">[ ,Transzendentalia‘ ]</span>, ''sind notwendig aus sich'', <span style="color:#00B000">[ von Natur aus ]</span>, ''positiv''«</span>, im 2. Beweisgang erklärbar, in dem die ‚Positivität‘, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, einer Eigenschaft schon als ‚notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, charakterisiert worden ist, äquivalent zu Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, in dem die ‚Notwendigkeit‘, <span style="color:#4C58FF">— <sub>not</sub> —</span>, <span style="color:#00B000">(der Existenz <span style="color:#4C58FF">— ‚'''E'''‘ —</span>)</span>, dann als ‚positive‘ Eigenschaft, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ‚bestimmt‘ wird; <span style="color:#00B000">(unter der speziellen Voraussetzung, dass <span style="color:#FF6000">„Existieren“</span> definitiv als eine <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT ,instanziiert‘ ist; vgl. Definition-3. Eine ,bestimmte‘ Eigenschaft ist genau dann ,instanziiert‘, wenn sie an einem Träger real ,existiert‘. Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, besagt, dass die, von GÖDEL ,postulierte‘, und im Basis-Theorem-2 verifizierte, <span style="color:#FF6000">„notwendige Existenz“</span> zu den ,ultimativen‘ Transzendentalia in GOTT gehört. Genauer ''':''' Sie ist die ,Summe‘ aller Transzendentalia.)</span> Zum Axiom-4, <span style="color:#00B000">(bzw. zum Term :14:, im 2. Beweisgang)</span>, erklärt GÖDEL in seinen Notizen zum Kalkül ''':''' <span style="color:#FF6000">»''da es'' <span style="color:#00B000">[ das Notwendigsein, <span style="color:#4C58FF">— '''□''' —</span> ]</span> ''aus der Natur der'' <span style="color:#00B000">[ positiven ]</span> ''Eigenschaft folgt'', <span style="color:#00B000">[ deren Positivität, im selben Beweisgang, mit Term :13: vorher schon ,bewiesen‘ (╞ ) worden ist ]</span>«</span>. Die GÖDEL-Erklärung zum Axiom-4 entspricht der Modal-Regel zur sog. ,Nezessisierung‘ in der KRIPKE-Logik nach GÖDEL. <span style="color:#4C58FF">[ Nezessisierungsregel ] '''::''' [ ├ A →├ □ A ]</span> ''':''' <span style="color:#FF6000">»''Angenommen'', <span style="color:#4C58FF">‚'''A'''‘</span> ''ist in einem Kalkül eine Prämisse, oder darin regulär'' <span style="color:#4C58FF">(├ )</span> ''abgeleitet, dann folgt in diesem Kalkül regulär'' <span style="color:#4C58FF">(├ )</span>, ''dass dieses'' <span style="color:#4C58FF">‚'''A'''‘</span> ''auch ,modal‘ notwendig'' <span style="color:#4C58FF">— ,□‘ —</span> ''ist''«</span>. GÖDEL hat jedoch diese modale Notwendigkeit nur in der ,Natur‘ der positiven Eigenschaften, alias ,Transzendentalia‘, gesehen, und mit den Aussagen im Axiom-4 expliziert ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt, nur dann sind die Axiome wahr''«</span>. Ob dieselbe modale Notwendigkeit auch auf Aussagen über Eigenschaften, wie ,rot‘ oder ,schwer‘, die weder positiv noch negativ sind, zutrifft, ist nicht erwiesen. Hier kann nur von modaler ,Kontingenz‘ gesprochen werden, die universal, alles Seiende innerhalb der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> betrifft. Somit sind die Aussagen <span style="color:#4C58FF">— ‚'''A'''‘ —</span> in der GÖDEL-Regel, nur auf Aussagen über ,positive‘ Eigenschaften eingeschränkt, und nicht allgemein gültig. Die <span style="color:#4C58FF">[ Nezessisierungsregel ]</span> ist nur für <span style="color:#FF6000">„Transzendentalia“ „modal wahr“</span>, und für ,Nicht-Transzendentalia‘ immer <span style="color:#FF6000">„modal falsch“</span>.
Der unbegrenzt Unendliche, GOTT, — im Glauben der Christen —, ist deswegen ,notwendig für uns da‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, weil er als GOTT ,vollkommen‘, ,perfekt‘ und absolut ,positiv‘, d.h. absolut ,gut allein‘ ist, ohne jede Negativität ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>; <span style="color:#00B000">(was auch schon im 2. Beweisgang mit Term :13: verifiziert wurde)</span>. Und wenn GOTT ,vollkommen‘, ,perfekt‘, ,positiv‘, und absolut ,gut‘ ist, dann ist er das auch ,notwendig aus sich‘ ''':''' <span style="color:#4C58FF">— ‚'''PG → □PG'''‘ — ::</span> <span style="color:#00B000">(als Zusatz-Korollar im 2. Beweisgang mit Axiom-4 und der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>)</span>, d.h. ,aus seinem Wesen‘. Das ist gerade das, ,was‘ GOTT als GOTT ausmacht ''':''' sein ,Wesen‘, bzw. seine <span style="color:#FF6000">„Natur“</span>. Zusammen mit der Definition-1 für GOTT, <span style="color:#00B000">(und der Definition-2 ''':''' Alle Wesenseigenschaften hängen notwendig gleichwertig aus sich zusammen)</span>, ist dieses, aus der <span style="color:#FF6000">„Natur“</span> GOTTES sich ergebende, ‚Notwendigsein‘, <span style="color:#4C58FF">— '''□''' —</span>, aller ‚positiven‘ Eigenschaften im Axiom-4, und ihr logischer Zusammenhang, d.i. die Koinzidenz aller ,Vollkommenheiten‘ und ,Zuschreibungen‘ im Unendlichen, GOTT, ihr ,Zusammenfallen in eins‘, die entscheidende Voraussetzung, aus der sich dann für GÖDEL <span style="color:#00B000">(im 2. Beweisgang)</span> auch der logische Zusammenhang, bzw. die ontologische Identität, <span style="color:#00B000">(die Koinzidenz)</span>, von <span style="color:#FF6000">„Dasein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, im Basis-Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> mit Notwendigkeit ergibt. Damit hat GÖDEL ein altes <span style="color:#4C58FF">„theologisches“</span> Theorem der Vergessenheit entrissen. Das Theorem-2 ist dann, in weiterer Folge, die ,modal‘ notwendige, d.h. die transzendentale Voraussetzung auch für den Konsequenz-Teil im Theorem ANSELMS, <span style="color:#00B000">(Term :09: hier im 3. Beweisgang)</span>. <span style="color:#FF6000">„Positive Eigenschaften“<span style="color:#00B000"> | </span>„Vollkommenheiten“</span> sind ,immer‘ auch <span style="color:#FF6000">„notwendige Eigenschaften“</span>, daher ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. Das ,Dasein‘, die <span style="color:#FF6000">„Existenz“</span> ist ,immer‘ etwas <span style="color:#FF6000">„Positives“</span>, speziell in GOTT, dem Schöpfer jeder ,Existenz‘, bzw. allen ,Seins‘. Axiom-4 begründet im GÖDEL-Kalkül das Basis-Theorem-2, <span style="color:#00B000">(wie auch das Korollar-3 von der exklusiven Einzigartigkeit GOTTES)</span>, und ,verankert‘ diese Theoreme damit zugleich in der <span style="color:#4C58FF">,theologisch‘</span>-philosophischen Tradition der ,Rede von GOTT‘ bei ARISTOTELES, — AVICENNA, — ANSELM, — DESCARTES, — LEIBNIZ, — HEGEL, — und bei GÖDEL mit äußerster ,logischer‘ Klarheit.
Anmerkung-5 ''':''' Der ‚Schlüsselbegriff‘ in diesem Kalkül ''':''' <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Vollkommenheit“<span style="color:#00B000"> | </span>„Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, dominiert alle Axiome des GÖDEL-Kalküls, jedoch ohne inhaltlich genauer ‚bestimmt‘ worden zu sein. Für <span style="color:#4C58FF">— ‚'''P'''‘ — </span> gibt es keine explizite Definition '''!''' <span style="color:#00B000">(Das Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, besagt nur, dass die ,postulierten‘, positiven Eigenschaften, die <span style="color:#FF6000">„Transzendentalia“</span>, formal miteinander verträglich, d.h. ‚widerspruchsfrei‘ sind, wegen Axiom-2. Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, besagt, dass positive Eigenschaften ,gleichwertig‘ sind, d.h. gleich ,wahr‘ sind, weil sie ,notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, aus sich, alle paarweise mit- und voneinander ,impliziert‘ sind, sich gegenseitig ,einschließen‘, und damit eine Einheit bilden, d.h. in GOTT ,eins‘ sind. Axiom-2 ist somit zugleich eine ,indirekte‘ Definition für ,positive‘ Eigenschaften ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, besagt ''':''' Weil die ,gleichwertigen‘, positiven Eigenschaften sich gegenseitig implizieren, und damit notwendig von einander abhängen, d.h. koinzident in GOTT ,eins‘ sind, — wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht —, dann sind sie somit auch die ,wesentlichen‘ Eigenschaften, die <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, in GOTT, der, wesentlich und exklusiv, notwendig ,Einer‘ ist. Die Definition-2 ist nur dann <span style="color:#FF6000">„modal wahr“</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit positive Eigenschaften, d.h. mit <span style="color:#FF6000">„Transzendentalien“</span>, besetzt werden. Diese Definition ist jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn ihre Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind. Fußnote zu Definition-2 in der GÖDEL-Notiz ''':''' <span style="color:#FF6000">»''any two essences of x are nec. equivalent''«</span>. Die paarweise, notwendige Äquivalenz von zwei beliebigen Wesenseigenschaften der Individuum-Variable <span style="color:#4C58FF">‚'''x'''‘</span>, wird hier, spezifisch für GOTT, d.h. wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT, dem ,Einen‘, steht, zur <span style="color:#FF6000">„Koinzidenz“</span>, — zum paarweise ,Zusammenfallen aller Gegensätze in Einem‘ —, dem inneren Zusammenhang aller seiner <span style="color:#FF6000">„ultimativen“</span> Vollkommenheiten, d.h. aller <span style="color:#FF6000">„Transzendentalia“</span> und Zuschreibungen, in dem unbegrenzt Unendlichen, GOTT, den schon der Philosoph und Kardinal NIKOLAUS von Cues als <span style="font-family: Times;"><big>,coincidentia oppositorum‘</big></span> verstanden hat.)</span>
In den entscheidenden ‚Schlusssätzen‘ des Kalküls ist der ‚Schlüsselbegriff‘ verschwunden. Hier ist nur mehr von GOTT, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, die Rede ''':''' Korollar-1, <span style="color:#FF6000">»''Es ist definitiv denkbar, dass es GOTT gibt''«</span>, Theorem-2, <span style="color:#FF6000">»''Dasein, GOTT-Sein, Göttlichkeit ist das Wesen GOTTES''«</span>, Theorem-3, <span style="color:#FF6000">»''Weil GOTT definitiv denkbar, d.h. widerspruchsfrei möglich ist, darum ist auch der Glaube an GOTT widerspruchsfrei, logisch richtig und mathematisch evident, der annimmt, dass es GOTT, mit Notwendigkeit, wirklich gibt''«</span>, <span style="color:#00B000">(nach ANSELM von Canterbury, und was spezifisch das <span style="color:#FF6000">»</span>''Privilegium der Gottheit allein''<span style="color:#FF6000">«</span> ist, nach LEIBNIZ)</span>, und Korollar-3, <span style="color:#FF6000">»''Es gibt notwendig aus sich, d.i. unverursacht, nur einen GOTT''«</span>. Das GÖDEL-Kalkül ist zu diesen Erkenntnissen gekommen, ohne die Eigenschaften, bzw. die ‚Vollkommenheiten‘ GOTTES, d.h. wer oder was GOTT ‚an sich‘ selbst ist, genauer bestimmen zu müssen, <span style="color:#00B000">(was ,für uns‘ ohnehin ,unmöglich‘ ist)</span>; außer im Theorem-2, in dem das <span style="color:#FF6000">„Dasein“</span> GOTTES als die ‚für uns‘ bestimmende und wichtigste <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT erkannt worden ist, — immer vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. Der GOTT des GÖDEL-Kalküls ist nicht mehr der an Raum und Zeit gebundene ‚Gott‘ des ARISTOTELES, sondern der von Raum und Zeit <span style="color:#FF6000">»''unabhängige''«</span> GOTT der Bibel bei ANSELM und bei LEIBNIZ. Das GÖDEL-Kalkül, <span style="color:#00B000">(wie ja auch der sog. ‚ontologische Gottesbeweis‘ ANSELMS)</span>, kann jedoch, — bei aller ‚Coolness‘ —, keinen GOTT-Glauben ‚erzeugen‘, sondern setzt vielmehr die Existenz GOTTES notwendig als gegeben schon voraus. Das Kalkül des Logiker GÖDEL beweist aber, dass der traditionelle ‚GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. logisch ,richtig‘ und <span style="color:#FF6000">»''mathematisch evident''«</span> ist, weil der ‚Nicht-GOTT-Glaube‘, <span style="color:#FF6000">»''die atheistische Weltanschauung''«</span>, im Möglichkeitsbeweis notwendig zu unlösbaren Widersprüchen führt, und somit logisch ,falsch‘ ist. <span style="color:#00B000">(Die ,Logik‘ hat aber, — bekanntlich —, bei allen wichtigen, persönlichen Entscheidungen immer nur eine untergeordnete Rolle '''!''' )</span>
Anmerkung-6 ''':''' Das erste, ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitete, Hauptergebnis im 3. Beweisgang, Term :10: <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' der Glaube, dass GOTT ,notwendig‘ existiert, ist die logische Konsequenz aus der Prämisse, Term :1: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>. Dieses erste Hauptergebnis hat also den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist daher davon ,abhängig‘, d.h. Term :10: ist der Ausdruck einer ,Glaubensüberzeugung‘. Das zweite Hauptergebnis im 3. Beweisgang, das Theorem ANSELMS ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, dagegen, ist die Darstellung der Abhängigkeit des ersten Hauptergebnisses von dem, vorher schon bewiesenen, ,Axiom‘ von der ,möglichen‘ Existenz GOTTES ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang. Dem geht folgende Beobachtung voraus ''':''' Der Term ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, hat in seiner syntaktischen Stellung hier, im Theorem-3, nicht mehr den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist damit, in seiner Position als Konsequenz-Teil im Theorem ANSELMS, auch nicht mehr davon syntaktisch abhängig, sondern stützt sich formal-syntaktisch nur auf die behauptete Möglichkeit GOTTES; daher muss diese ,angenommene‘ Möglichkeit noch bewiesen <span style="color:#00B000">( ╞ )</span> werden. Dazu die Feststellung LEIBNIZ‘, der diesen Zusammenhang, und seinen Mangel, erkannt hat ''':'''
::Das Theorem ANSELMS ist <span style="color:#FF6000">» ''ein unvollständiger Beweis, der etwas voraussetzt, was man noch hätte beweisen'' <span style="color:#00B000">( ╞ )</span> ''sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' «</span>.
Diesen <span style="color:#FF6000">»''unvollständigen Beweis''«</span> hat GÖDEL im 1. Beweisgang mit dem ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleiteten, und widerspruchfreien Möglichkeits-Korollar-1, vervollständigt, und damit hat er mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span> bewiesen ''':''' <span style="color:#FF6000">»''Diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens''«</span> enthält <span style="color:#FF6000">»''keinen Widerspruch''«</span> '''!''' Das Korollar-1 ist nur vom logischen Axiom-1 und von der mathematischen Äquivalenz der Perfektionen, <span style="color:#00B000">(der Transzendentalien)</span>, im Axiom-2 ,abhängig‘, und nicht mehr von der ,methodologischen‘ Kalkül-Prämisse, dem traditionellen GOTT-Glauben. Damit hat das Glaubens-Theorem ANSELMS die gesuchte <span style="color:#FF6000">»''mathematische Evidenz''«</span> erreicht, unabhängig von jeder Glaubensüberzeugung. Entscheidend dafür ist der mathematisch-logische Beweis GÖDELS, dass der Nicht-GOTT-Glaube zu einem Widerspruch führt.
Zusammenfassung ''':'''
Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>, ist die logische Konsequenz aus der Prämisse im 1. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, den, — <u>modal-frei</u> — gewählten, ,angenommenen‘ positiven Eigenschaften, bzw. ,Transzendentalia‘.
Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' <span style="color:#FF6000">»''GOTT-Sein ist das Wesen GOTTES''«</span>, ist die logische Konsequenz aus der Prämisse im 2. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, dem, — <u>modal-frei</u> — gewählten, ,angenommenen‘ GOTT-Glauben der Christen.
Im Unterschied dazu ist im 3. Beweisgang, das Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' der Glaube, dass es einen GOTT notwendig gibt ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, die logische Konsequenz aus dem, — <u>modal-notwendig</u> — als widerspruchsfrei ,bewiesenen‘, Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, im 1. Beweisgang, <span style="color:#00B000">(auch im Beweisgang ,Widerlegung‘ im Anhang)</span>, und damit ist das Glaubens-Theorem-3, als ganzes, ,widerspruchsfrei‘. Das Theorem ANSELMS ist, mit Korollar-1, nur vom logischen Axiom-1 der Widerspruchsfreiheit, und der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften, <span style="color:#00B000">(aller Transzendentalia)</span>, im Axiom-2, abhängig. Damit ist die Bedingung für die geforderte, spezielle <span style="color:#FF6000">»''mathematische Evidenz''«</span>, und auch für die Widerspruchsfreiheit im Glaubens-Theorem ANSELMS erfüllt; unabhängig von jeder Glaubensüberzeugung. Weil es <span style="color:#FF6000">„modal wahr“</span> ist, dass die Transzendentalien, bzw. die Vollkommenheiten ontologisch, — dem Sein nach —‚ alle <span style="color:#00B000">(zueinander)</span> widerspruchsfrei, und alle <span style="color:#00B000">(miteinander)</span> gleichwertig sind, ist es auch <span style="color:#FF6000">„modal wahr“</span>, dass es möglich ist, dass GOTT, — dem Sein nach —‚ da ist, <span style="color:#00B000">(d.h. existiert)</span>, der die unbegrenzte Summe aller ultimativen Transzendentalia, bzw. der unendlichen Vollkommenheiten allen Grades ist, wie es der ,christliche Glaube‘ des Erzbischofs ANSELM und seiner Anvertrauten ,annimmt‘.
====<div class="center"><span style="color:#660066">Widerlegung</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDEL-Kalkül : der Möglichkeitsbeweis als Widerlegung des Nicht-GOTT-Glaubens</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe_____________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist X nicht positiv“} \\
\text{(Axiom 2)} & \quad \Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaft Y in allen x, die aus der Eigenschaft X in allen x} \\
\text{ } & \quad & \ & \; \; \text{mit modaler Notwendigkeit folgt, ist eine positive Eigenschaft“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Korollar-1)} &\quad \Diamond \; \exists x \ G \ x \ & \ & \; \; \text{( „das —,x‘— steht für den GOTT, —,G‘—, der Christen“ )} \\
\text{ } & \text{„Es ist möglich, dass es den GOTT der Christen gibt“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad \; \neg \Diamond \; \exists x \ G \ x \ & \ & \text{ AE: „Es ist unmöglich, dass es diesen GOTT gibt“ (dezidierter Atheismus)} \\
\text{02} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{03} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{04} & \quad \neg\neg \Box \neg \exists x \ G \ x \ & \ & \text{:01:[ ◇A ↔ ¬□¬A ] :: (Modalregel) } \\
\text{05} & \quad \neg\neg \Box \neg\neg \forall x \neg \ G \ x \ & \ & \text{:04:[ ∃xA ↔ ¬Ɐx¬A ] :: (Quantorenregel) } \\
\text{06} & \quad \text{ ├ }\; \Box \; \forall x \neg G \ x \ & \ & \text{:05:NEG :: [ ¬¬A↔A ] :: (Gesetz der Aussagenlogik) } \\
\text{07} & \quad \Box \; \forall x \neg G \ x \Leftrightarrow\ W & \ & \text{:01:06:[ (:01:↔W) → (├:06:↔W) ] :: (Kalkülregel) } \\
\text{08} & \quad \Box \; \forall x \ G \ x \Leftrightarrow\ F & \ & \text{:07:[ (¬A↔W)↔(A↔F) ] :: (Regel für Wahrheitswerte)} \\
\text{ } & \text{„Jeder GOTT-Glaube ist notwendig falsch ! “} & \ & \Longleftarrow\; \text{die logische Konsequenz aus der Prämisse :01: !} \\
\text{09} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:02:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{10} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (\neg x = x)) & \text { } & \text{:08:09:[ (:08:↔F) → (:09:↔F) ] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{11} & \quad \Box \; \forall x (\ G \ x \Rightarrow \; (\neg x = x)) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=(¬x= ..)) } \\
\text{12} & \quad \ P (\neg x = .. ) & \ & \text{:10:11:[ Modus ponens ] :: [ A→B, A ├ B ]} \\
\text{13} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{14} & \quad \neg P (\ x = .. )\ & \ & \text{:12:13:[ Modus ponens ] :: (log. Schlussregel)}\\
\text{15} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:03:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{16} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) & \ & \text{:08:15:[ (:08:↔F) → (:15:↔W) ] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{17} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=( x= ..))} \\
\text{18} & \quad \ P (\ x = .. )\ & \ & \text{:16:17:[ Modus ponens ]}\\
\text{19} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ &
\text{:14:18:[ Konjunktion ] ⇒ Kontradiktion !}\\
\text{20} & \quad \neg \Diamond \; \exists x \ G \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:01:19:[ ├A├B╞ A→B ] :: ''KONDITIONALER BEWEIS''}\\
\text{ } & {\color{RedOrange}\text{Der Atheismus führt zu einem logischen Widerspruch ! }} & \ & \Longleftarrow\; \text{was mit Term :20: bewiesen ist !} \\
\text{21} & \quad \neg\neg \Diamond \; \exists x \ G \ x & \ & \text{:20:19:[ Modus tollendo tollens ] :: [ A→B,¬B ├ ¬A ]}\\
\text{22} & \quad \; \Diamond \; \exists x \ G \ x & \ & \text{:21:NEG }\\
\text{(Korollar-1)} & \;\text{„Es ist definitiv möglich, dass es diesen GOTT gibt“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\end{align}</math>
</small>
|}
Anmerkung-7 ''':''' <span style="color:#00B000">( Dieser Beweisgang ist praktisch identisch mit dem 1. Beweisgang, jedoch gestrafft und präzisiert nach G.J.WIRSCHING. Diese Widerlegung des Nicht-GOTT-Glaubens beginnt sofort mit dem Korollar-1 <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> aus dem 1. Beweisgang, als in Frage gestelltes ,Theorem‘, und beweist, ohne das Axiom-3 <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, und ohne die GÖDEL-Prämisse <span style="color:#4C58FF">— ,'''PX'''‘ —</span>, in einem Zwischenergebnis, die innere Widersprüchlichkeit und damit auch die Unhaltbarkeit der atheistischen Glaubens-Annahme, aus rein logischen ,Gründen‘, bzw. Axiomen. )</span>
Dieser Beweisgang geht von der Existenz GOTTES, <span style="color:#4C58FF">— ,'''G'''‘ —</span>, als Glaubens-Annahme, aus, wobei aber die Möglichkeit seiner Existenz, und damit die Sinnhaftigkeit des Glaubens an GOTT, durch die Prämisse :01: in Frage gestellt wird, und daher im Kalkül überprüft werden muss. Denn mit der Behauptung der Existenz GOTTES allein ist es nicht getan. Es muss auch seine ,Möglichkeit‘, d.h. die Sinnhaftigkeit des Glaubens an GOTT aufgewiesen werden. LEIBNIZ hat als erster, <span style="color:#00B000">(nach ANSELM)</span>, dieses Problem gesehen, und GÖDEL hat dafür die Lösung gefunden. Dieser Beweisgang, <span style="color:#00B000">(analog zum Möglichkeitsbeweis von Günther J. WIRSCHING konzipiert)</span>, setzt in den Axiomen, genau wie im 1. Beweisgang, die Existenz von etwas <span style="color:#FF6000">„Positiven“, „Perfekten“, „Vollkommenen“</span>, <span style="color:#4C58FF">— ,'''P'''‘ —</span>, <span style="color:#00B000">(d.h. die Transzendentalien)</span>, allgemein für die Welt voraus, <span style="color:#00B000">(was im Axiom-3 ''':''' <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, auch GOTT ultimativ zugeordnet wird ''':''' <span style="color:#FF6000">»''GOTT ist absolut positiv, perfekt und vollkommen''«</span>)</span>; das dann im 2. Beweisgang mit Term :13: als widerspruchsfrei, <span style="color:#00B000">(als ,wahr‘ und ,annehmbar‘ im Kontext des christlichen Glaubens)</span>, schon ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> worden ist. Die Existenz von ,Transzendentalien‘ in der Welt, ist ein, mit Beispielen belegbares, allgemeines Faktum; ihre Existenz auch in GOTT ist mit dem Term :13: des 2. Beweisganges bewiesen, die jedoch im Unendlichen, GOTT, als Transzendentalia, auch in ,ultimativer‘ Form vorliegen. Axiom-1 ,besagt‘, dass Eigenschaften nicht zugleich, vollkommen und nicht vollkommen, sein können. Axiom-2 ,besagt‘, dass, allgemein, alle Vollkommenheiten, <span style="color:#00B000">(alle Transzendentalien)</span>, gleichwertig, <span style="color:#00B000">(mathematisch äquivalent)</span>, sind. <span style="color:#00B000">(Axiom-2 wird hier um das GÖDEL-Konjunkt <span style="color:#4C58FF">— ,'''PX'''‘ —</span> verkürzt dargestellt. Damit ist auch Axiom-3 für diesen Beweisgang unnötig geworden, ohne dass sich wegen dieser Kürzung am Ergebnis etwas ändert. Axiom-2 wird jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn seine Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind, die keine ,Transzendentalia‘ sind.)</span> Die Eigenschaft <span style="color:#4C58FF">— (¬x=..) —</span> ,besagt‘, dass GOTT <span style="color:#FF6000">„unvergleichlich“</span> ist, wenn <span style="color:#4C58FF">,'''x'''‘</span> für GOTT steht. <span style="color:#00B000">(Der informelle Term, <span style="color:#4C58FF">— (¬x=..) —</span>, ersetzt hier, wie bei A. FUHRMANN, den formal korrekten Abstraktionsausdruck ''':''' <span style="color:#4C58FF">— λy.(¬x=y) —</span>, aus dem Lambda-Kalkül.)</span> Der Term :16: <span style="color:#4C58FF">— (x=x) ↔ W —</span> steht für die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚IST‘'' <span style="color:#00B000">(aus mir selbst)</span>«</span>, der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES. Der GOTT der abendländischen, christlichen Tradition wird mit <span style="color:#4C58FF">— ,'''G'''‘ —</span> bezeichnet ''':''' d.i. der <span style="color:#FF6000">„GOTT der Christen“</span>, entsprechend der ,methodologischen‘ Prämisse und der ,Genese‘ des Kalküls, syntaktisch formalisiert in der Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn es alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>, nach der Vorgabe von LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Mit Korollar-1 hat dieser Beweisgang dasselbe Endergebnis, wie der 1. Beweisgang. Der Beweis, dass der dezidierte Atheismus zu einem logischen Widerspruch führt, und damit falsch ist, ist ein Zwischenergebnis in diesem Beweisgang, und begründet mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, und unabhängig von jeder Glaubensüberzeugung, den, von LEIBNIZ gesuchten, Möglichkeitsbeweis für die Existenz GOTTES im Argument des Erzbischofs, und bestätigt damit die Sinnhaftigkeit des GOTT-Glaubens. Einmal Axiom-1 und zweimal Axiom-2 sichern hier das Ergebnis des Kalküls ''':''' das Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>''':''' <span style="color:#FF6000">»''Es ist definitiv möglich, dass es den GOTT der Christen gibt''«</span>. Diese zwei Axiome sind die einzigen, und modal-notwendigen, d.h. die transzendentalen Voraussetzungen und Bedingungen für das Endergebnis ''':''' der Widerspruchsfreiheit und Sinnhaftigkeit des Glaubens der Christen an GOTT; <span style="color:#00B000">(dasselbe gilt natürlich auch für die <span style="color:#4C58FF">„theologische“</span> Weltanschauung jeder monotheïstischen Religion '''!''' Dem Erzbischof ANSELM ging es damals nur um seinen Glauben an GOTT.)</span>.
Die Logik-Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso sequitur quotlibet, etiam verum“</big></span></span>, <span style="color:#00B000">(‚Aus Falschem folgt irgendetwas, auch Wahres‘)</span>, ist der scholastische Ausdruck für die ‚Implikation‘ <span style="color:#00B000">(Folgerung)</span> von Aussagen, die nur dann falsch, <span style="color:#4C58FF">— F —</span> ist, wenn das Antezedens wahr, <span style="color:#4C58FF">— W —</span>, und die Konsequenz falsch, <span style="color:#4C58FF">— F —</span> ist. Andernfalls ist sie immer wahr, <span style="color:#4C58FF">— W —</span>, auch wenn die Voraussetzung falsch, <span style="color:#4C58FF">— F —</span> ist ''':''' ‚Modern‘ darstellbar durch die ‚Wahrheitswertetafel‘ für die ‚materiale Implikation‘, <span style="color:#4C58FF">— ,(A → B)‘ —</span> <span style="color:#FF6000">„wenn A, dann B“</span>. Damit ist auch der <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ] </span> verstehbar; <span style="color:#00B000">(vgl. die vierte Zeile der ‚materialen Implikation‘)</span>. Der positive hypothetische Syllogismus ''':''' <span style="color:#4C58FF">[ Modus ponendo ponens ] :: [ A → B, A ├ B ] </span> ist aus der ersten Zeile ablesbar.
Die folgende Tabelle gibt für jeden ,Wahrheitswert‘ der Aussagen <math>A</math> und <math>B</math> das Resultat einiger zweiwertiger Verknüpfungen an ''':'''
{|class="wikitable hintergrundfarbe2" style="text-align:center;"
|-
!colspan="2"|''Belegung''!!Konjunktion!!Disjunktion!!materiale<br /> Implikation!!Äquivalenz<br /> Bikonditional!!kopulative<br /> Konjunktion
|-
!<math>A</math>
!<math>B</math>
!<math>A</math> und <math>B</math>
!<math>A</math> oder <math>B</math>
!wenn <math>A</math> dann <math>B</math>
!sowohl <math>A</math> als auch <math>B</math>
!entweder <math>A</math> oder <math>B</math>
|-
!W!!W
|W||W||W||W||F
|-
!W!!F
|F||W||F||F||W
|-
!F!!W
|F||W||W||F||W
|-
!F!!F
|F||F||W||W||F
|}
<span style="color:#00B000">(Eine ‚Konjunktion‘ ist nur dann ,wahr‘, wenn beide Aussagen einer ‚Konjunktion‘ wahr sind. Eine ‚kopulative Konjunktion‘ ist nur dann ,wahr‘, wenn entweder die eine, oder die andere Aussage der ‚kopulativen Konjunktion‘ wahr ist. Es besteht also eine Wenn-Dann-Verbindung zwischen beiden Aussagen — eine ,Kopplung‘. Das ist die logische Grundlage von Axiom-1 im GÖDEL-Formalismus)</span>
Um das Widersprüchliche der ,Annahme‘ nachzuweisen, dass positive Eigenschaften ,nicht konsistent‘ seien, <span style="color:#00B000">(im 1. Beweisgang)</span>, bzw. um das Unlogische und Sinnwidrige der ,Annahme‘ klarzustellen, es sei ,unmöglich‘, dass es einen GOTT gibt, <span style="color:#00B000">(hier, in der Widerlegung)</span>, verwendet das GÖDEL-Kalkül den Gegensatz ''':''' wahr, <span style="color:#4C58FF">— W —</span>, falsch, <span style="color:#4C58FF">— F —</span>, zwischen der dritten und vierten Zeile der Wahrheitswertetafel, für zwei ,wahre‘ <span style="color:#4C58FF">— W —</span> ,materiale Implikationen‘, in denen die Voraussetzung jeweils falsch, <span style="color:#4C58FF">— F —</span>, ist, entsprechend der Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso, <span style="color:#4C58FF">— F —</span>, sequitur quotlibet, <span style="color:#4C58FF">— F —</span>, etiam verum, <span style="color:#4C58FF">— W —</span>“</big></span></span>, jeweils mit der Hilfe von Axiom-1 und Axiom-2, in einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>; hier unabhängig von jeder Glaubensüberzeugung. Im Gegensatz dazu, wird, <span style="color:#00B000">(im 2. Beweisgang)</span>, aus dem Glauben an GOTT, auch mit einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, speziell mit Axiom-1, das Widersprüchliche in der ,Annahme‘ nachgewiesen, es gäbe in GOTT <span style="color:#FF6000">»''keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span>, d.h. keine ,Transzendentalia‘. In dieser <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, im 2. Beweisgang, wird vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span> ''':''' es gibt den GOTT der Christen, <span style="color:#00B000">(als Prämisse :01:)</span>, der ,unvergleichlich‘ und ,einzigartig‘ ist, und in dem auch alle ,Transzendentalia‘ <span style="color:#FF6000">„koinzident“</span> ,eins‘ sind, entsprechend Axiom-2.
Für KANT entsteht ein Widerspruch in den Prädikaten eines Satzes.
::<span style="color:#FF6000">»</span> ''Wenn ich das Prädicat in einem identischen Urtheile aufhebe'', <span style="color:#00B000">[ durch eine Negation ]</span>, ''und behalte das Subject, so entspringt ein Widerspruch''. <span style="color:#00B000">[ Wenn ich sage ''':''' ,''GOTT ist nicht allmächtig''‘, entsteht ein Widerspruch zur richtigen Aussage ''':''' ,''GOTT ist allmächtig''‘. ]</span> … ''Wenn ihr aber sagt ''':''' ,GOTT ist nicht‘, so ist weder die Allmacht, noch irgendein anderes seiner Prädicate gegeben; denn sie sind alle zusammt dem Subjecte aufgehoben'', <span style="color:#00B000">[ negiert ]</span>, ''und es zeigt sich in diesem Gedanken nicht der mindeste Widerspruch.'' <span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 398f; https://www.korpora.org/kant/aa03/398.html</ref>
Es ist richtig, wie KANT sagt, der Widerspruch entsteht nicht in dem Gedanken ''':''' <span style="color:#FF6000">»</span>''GOTT ist nicht''<span style="color:#FF6000">«</span>. GÖDEL zeigt daher, dass der Widerspruch erst dann entsteht, wenn von der Annahme ausgegangen wird ''':''' ''<span style="color:#FF6000">»</span>Es ist unmöglich, dass GOTT ist''<span style="color:#FF6000">«</span>. Daraus folgt dann ,regulär‘, mit Hilfe von Axiom-1 und Axiom-2, <span style="color:#00B000">(d.h. mit den Theoremen von den Transzendentalien)</span>, die logische ,Möglichkeit‘ GOTTES, unabhängig von jeder Glaubensüberzeugung. Wie LEIBNIZ klar erkannt hat, muss zuerst, aus dem Widerspruch des Gegenteils, die logische ,Möglichkeit‘, <span style="color:#00B000">(die Konsistenz)</span>, der Existenz GOTTES bewiesen werden ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, bevor daraus die reale ,Notwendigkeit‘ GOTTES abgeleitet werden kann ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, dessen ,Existenz‘ jedoch, aus dem ,Glauben‘, im Voraus, schon angenommen worden ist. Dieser Sachverhalt ist das ausschließliche Spezifikum GOTTES, <span style="color:#00B000">(das <span style="color:#FF6000">»''Privilegium der Gottheit allein''«</span>)</span>, und gilt nur bei GOTT, als dem Unvergleichlichen und Einzigartigen. Dieses ,Spezifikum‘ wird im Theorem ANSELMS abgebildet ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, auf Grund von Axiom-2, das den inneren Zusammenhang, die Koinzidenz auch von ,Möglichkeit‘ und ,Notwendigkeit‘ im Unendlichen, GOTT, erkennen lässt. Bis Zeile 10, im 3. Beweisgang, reicht der Geltungsbereich der ,modal‘-frei gewählten Kalkül-Prämisse :01:, der ,methodologische‘ GOTT-Glaube. In Zeile 11 liegt der ,Schwerpunkt‘ des ontologischen Beweises dann aber am, — modal als notwendig — ,bewiesenen‘ Widerspruch des Gegenteils zum GOTT-Glauben, <span style="color:#00B000"> (formal-syntaktisch dargestellt als widerspruchfreies Antezedens, <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang)</span>, und nicht mehr am ,angenommenen‘ GOTT-Glauben der Kalkül-Voraussetzung, <span style="color:#00B000">(nun dargestellt als Konsequenz <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> im Theorem ANSELMS)</span>. Das Möglichkeits-Korollar-1 muss jetzt immer, wie folgt, gelesen werden ''':''' <span style="color:#FF6000">»''Es ist <u>widerspruchfrei</u> möglich, dass GOTT ist''«</span>. Damit hat er, — angeregt durch LEIBNIZ, und mit ihm —, die fast einhellig akzeptierte Fehldeutung des ontologisch-<span style="color:#4C58FF">„theologischen“</span> Arguments ANSELMS für GOTT durch gewichtige philosophische, <span style="color:#00B000">(KANT<ref>GOTT ist absolut einzigartig und unvergleichlich. KANT macht GOTT jedoch zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, indem er die Existenz, bzw. das ,Sein‘ GOTTES mit dem ,Sein der Dinge‘ gleich setzt. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! KANT verkennt damit die Einzigartigkeit und Besonderheit GOTTES. Das ,Sein‘ der Dinge ist, — wie KANT sagt —, kein ,reales Prädikat’, d.h. Existenz ist keine Eigenschaft. Jedoch in GOTT ist ,Sein‘ ein ,reales Prädikat‘, d.h. Existieren ist ,real‘ die Wesenseigenschaft GOTTES, denn GOTT ist der, der für uns, — aus Liebe —, immer schon ,da‘ ist ''':''' in der ,Hypostatischen Union‘, sowohl als GOTT von Ewigkeit zu Ewigkeit, als auch als Mensch in unserer Zeitlichkeit. Das ist das, was GOTT für uns ausmacht —, sein Wesen.</ref>)</span>, und <span style="color:#4C58FF">„theologische“</span>, <span style="color:#00B000">(THOMAS<ref>GOTT ist absolut einzigartig und unvergleichlich. THOMAS unterscheidet die ,Natur GOTTES‘ nicht von der ,Natur der Dinge‘, indem er die ,Natur‘ des GOTTES ANSELMS irrtümlich mit der ,Natur‘ der Dinge gleich setzt. Damit reiht er GOTT unter die vielen Dinge unserer Welt ein, indem er für den GOTT ANSELMS annimmt ''':''' GOTT ,esse in rerum natura‘, d.h. wörtlich, dass der GOTT ANSELMS in der ,Natur‘ der Dinge existiert, <span style="color:#00B000">(was ANSELM nie gesagt hat)</span>. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! Die ,zeitlose-überzeitliche‘ Wirklichkeit, (Natur), GOTTES ist völlig verschieden und unabhängig von der zufälligen Wirklichkeit, (die ,Natur‘), unserer ,raum-zeitlichen‘ Welt. Daher ist sie mit dieser auch nicht vergleichbar. Thomas verkennt damit die Einzigartigkeit und Besonderheit GOTTES.</ref>)</span>, Autoritäten zurechtgerückt, welche die Einzigartigkeit und Unvergleichlichkeit des Unendlichen, GOTT, bei ihrer Beurteilung des Theorem ANSELMS nicht berücksichtigt, sondern den Unendlichen, <span style="color:#00B000">(irrtümlich)</span>, unter die endlichen Dinge unserer Welt eingereiht haben. GÖDEL hat mit dem bewiesenen Widerspruch des Gegenteils zum GOTT-Glauben, den Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Theorem ANSELMS geliefert, was, nach LEIBNIZ, für die Akzeptanz dieses Theorems noch gefehlt hat. Das Theorem ANSELMS besagt universell ''':''' Die <span style="color:#FF6000">»''theologische Weltanschauung''«</span> der Juden, Christen und Muslime, <span style="color:#00B000">(und des ägyptischen Pharaos ECHNATON und seiner Frau NOFRETETE)</span>, die ,annehmen‘, dass es mit ,Notwendigkeit‘ <span style="color:#4C58FF">— ‚'''□'''‘ —</span> <span style="color:#00B000">(nur)</span> einen GOTT gibt, ist logisch richtig und <span style="color:#FF6000">»''mathematisch evident''«</span>, weil es <u>ohne Widerspruch</u> ,denkbar‘ <span style="color:#4C58FF">— ‚'''◇'''‘ —</span> ist, dass es GOTT gibt ''':''' Nicht mehr und nicht weniger, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>.
Es geht hier bei GÖDEL nicht um Theoriefindung oder ähnliches. GÖDEL ist kein ,spekulierender‘ Theoretiker. GÖDEL ist Logiker und Mathematiker. Was er sagt, ist mathematisch wahr und logisch richtig. Wenn er sagt, dass die Aussage ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ — »''wahr''«</span> ist ''':''' <span style="color:#FF6000">»''es ist möglich, dass es Gott gibt'' ''':''' ''das ist ,wahr‘ wegen Axiom-2 (und Axiom-1)''«</span>, dann spricht er hier von der mathematischen Wahrheit. Logischerweise ist dann die konträre Aussage ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ — »''falsch''«</span> ''':''' <span style="color:#FF6000">»''es ist nicht möglich, dass es einen Gott gibt''«</span>, und zwar mathematisch falsch, weil sich aus dieser Aussage ein Widerspruch ergibt. Jeder, der die mathematische Logik GÖDELS lesen kann, kann das sehen und verstehen ''':''' Das Zwischenergebnis, <span style="color:#00B000">(Term :20:)</span>, in dieser Kalkül-Ableitung, die logische Konsequenz aus der Annahme des dezidierten Atheismus, es sei unmöglich, dass es GOTT gibt, ist der faktische, nachprüfbare, und für jeden Menschen sichtbare Beweis dafür, dass diese Annahme in einen Widerspruch mündet, und damit falsch und unlogisch ist. Das bedeutet, es ist eine Tatsache, bzw. es ist Faktum, dass der Atheismus, — mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span> —, wirklich falsch und unlogisch ist, und daher, mit Recht, als ,Unsinn‘ bezeichnet werden darf '''!''' Das ist nicht bloß als eine Theoriefindung, oder als eine Interpretation eines Autors zu verstehen. Das ist vielmehr genau so wahr und <span style="color:#FF6000">»''mathematisch evident''«</span>, wie, dass zwei mal zwei vier ergibt, und wirklich genau so logisch richtig, wie, dass die Erde sich um die Sonne dreht. Das ist gerade das Überraschende und Unerwartete am Gödel-Kalkül. Es geht hier nicht mehr um Theoriefindung oder Interpretationen, denen man zustimmen kann oder nicht. Es geht hier <span style="color:#FF6000">»''rein verstandesmäßig''«</span> um mathematisch-logische Fakten. Damit steht GÖDEL, in seiner Bedeutung, in gewisser Weise, neben KOPERNIKUS, weil seine Kalkül-Ergebnisse, wie die Berechnungs-Ergebnisse dieses Pioniers der damaligen Zeitenwende, heute, in unserem Äon, ebenfalls mit eingefleischte Vorurteile aufräumen, ohne aber, dass GÖDEL für sich selbst, im Glauben, logisch konsequent gewesen wäre. <span style="color:#00B000">(Er ist sich der Tragweite und der Konsequenzen seiner <span style="color:#4C58FF">„axiomatischen Theologie“</span> anscheinend nicht bewusst gewesen, wenn er sagt ''':''' Man sei heute noch <span style="color:#FF6000">»''weit davon entfernt, das theologische Weltbild wissenschaftlich begründen zu können''«</span>, nachdem sein Kalkül das <span style="color:#FF6000">„atheistische Weltbild“</span> fundamental ins Wanken gebracht und als irrationalen ,Unsinn‘ entlarvt hat. Sein Kalkül ,beweist‘ ( ╞ ) indirekt, dass das <span style="color:#FF6000">„theologische Weltbild“</span>, im Beweisgang ,Widerlegung‘, aus dem Widerspruch des Gegenteils, mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span>, offensichtlich doch, wissenschaftlich begründet werden kann)</span>.
----
Kurt GÖDEL ist auch deswegen ein Ausnahmelogiker.
----
===<div class="center"><span style="color:#660066">Epilog für Skeptiker</span></div>===
Wenn man das GÖDEL-Argument genau liest, dann ist nur die Annahme ''':''' <span style="color:#FF6000"> „es ist möglich, dass es GOTT gibt“</span> bewiesen, weil aus der Annahme ''':''' <span style="color:#FF6000">„es ist unmöglich, dass es GOTT gibt“</span> ein logischer Widerspruch ableitbar ist. Die Aussage ''':''' <span style="color:#FF6000">„es gibt GOTT“</span> ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Menschen, der dann aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann ''':''' <span style="color:#FF6000">»''es gibt GOTT wirklich''«</span>, wenn er will ''':''' <span style="color:#FF6000">»''Es stimmt also, was ich glaube '''!''''' «</span> Das ist das Argument ANSELMS, der ein christlicher Amtsträger war, und der daher von dieser Grundannahme auch ausgeht. Solange in den Voraussetzungen des Möglichkeitsbeweises im GÖDEL-Kalkül kein Widerspruch nachweisbar ist, und solange in der logischen Durchführung dieses Beweises keine schweren Mängel festgestellt werden können, ist das Ergebnis des Möglichkeitsbeweises, wie GÖDEL ihn durchgeführt hat, korrekt, und die Folgerungen daraus, logisch richtig, dass es sich hier um <span style="color:#FF6000">»''mathematische Evidenz''«</span> handelt, <span style="color:#00B000">(z. B. wie 2 x 2 = 4)</span>. Aber niemand ist gezwungen, aus der Möglichkeit, dass es GOTT gibt, daraus zu schließen, dass es GOTT auch mit Notwendigkeit gibt, wie das im Argument ANSELMS geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit LEIBNIZ, der selbst an GOTT geglaubt hat, mit Bestimmtheit sagen ''':''' <span style="color:#FF6000">»''gesetzt, dass GOTT möglich ist, so ist er, was das Privilegium der Gottheit allein ist''«</span>, weil GÖDEL mit seinem Kalkül den noch ausstehenden Beweis der Widerspruchsfreiheit dafür geliefert hat.
Wenn Du den 3. Beweisgang des GÖDEL-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument ANSELMS, der identisch ist mit dem Term in der Zeile 10, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, immer noch formallogisch abhängig ist von der methodologischen Glaubens-Prämisse, Term :01:, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den Gott der Christen''«</span>. Diese Abhängigkeit ist bis zur Zeile 10 offensichtlich und logisch korrekt. <span style="color:#00B000">(Man könnte nach dieser Zeile, ohne Weiteres, ,regulär‘ die <span style="color:#FF6000">„logische Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A→B ]</span> mit Term :01: und Term :10: als ein mögliches Korollar bilden ''':''' <span style="color:#4C58FF">— ‚'''Gx→□∃xGx'''‘ — </span>)</span>. Das bedeutet, der Konsequenz-Teil im Theorem ANSELMS, der in diesem ,regulär‘-möglichen Korollar an zweiter Stelle steht, ist damit in seiner Formal-Struktur offensichtlich ,regulär‘ von der Glaubens-Prämisse, Term :01:, abhängig, d.h. er ist der Ausdruck einer Glaubensüberzeugung. Im Theorem ANSELMS steht er jetzt, in der Zeile 11, als Konsequenz-Teil auch an zweiter Stelle, hat aber nicht mehr seine Glaubens-Prämisse als notwendige Bedingung an erster Stelle vor sich, wie im ,regulär‘-möglichen Korollar. Jetzt steht eine neue und andere Voraussetzung als Begründung vor ihm. Der Schwerpunkt des Argument ANSELMS liegt damit am Begründungs-Teil des ANSELM-Theorems, der jetzt die erste Stelle im Theorem einnimmt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist möglich, dass es GOTT gibt''«</span>, der erst dadurch entstanden ist, und davon abhängig ist, weil sein Gegenteil ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist unmöglich, dass es GOTT gibt''«</span>, zu einem Widerspruch geführt hat. Dieser Begründungs-Teil, das Antezedens, im Argument ANSELMS, ist daher nicht mehr von der methodologischen Glaubens-Prämisse, Term :01:, abhängig, sondern nur vom Axiom-1, der Widerspruchsfreiheit, und von der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften im Axiom-2, die im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, die Widerspruchsfreiheit der Möglichkeit des GOTT-Glaubens mit Notwendigkeit herbeigeführt haben. Daraus ergibt sich eine logische Verschiebung in der Argumentationskette, denn dieser Begründungs-Teil, der jetzt die Widerspruchsfreiheit für den Konsequenz-Teil liefert, ist selbst unabhängig und frei von jeder Glaubensüberzeugung. Weil widerspruchsfrei und <span style="color:#FF6000">»''mathematisch evident''«</span>, muss er als logische Begründung für die Widerspruchsfreiheit und als Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Konsequenz-Teils gelesen werden, und damit bestätigt er die Widerspruchsfreiheit und Sinnhaftigkeit der Glaubensüberzeugung eines gläubigen Menschen, <span style="color:#00B000">(was auch das Ziel ANSELMS war)</span>. Das heißt also ''':''' der Glaube dieses Menschen ist widerspruchsfrei und sinnvoll, und enthält keinen Zirkelschluss, weil sein Gegenteil, der Nicht-GOTT-Glaube, zu einem Widerspruch führt; <span style="color:#00B000">(das hat GÖDEL mit seinem Kalkül-System bewiesen, dessen Argumentationskette mit einem Computer-Programm, dem sog. ,Theorembeweiser‘, überprüft worden ist, und als <span style="color:#FF6000">»''nachweisbar korrekt''«</span> befunden wurde)</span>. Das Theorem ANSELMS beweist, nach GÖDEL, dass der Glaube an GOTT, mit <span style="color:#FF6000">»''mathematische Evidenz''«</span> notwendig widerspruchsfrei und sinnvoll ist, weil der Nicht-GOTT-Glaube notwendig zu einem Widerspruch führt. <u>Das Theorem beweist jedoch nicht, dass die Existenz GOTTES notwendig ist</u>, <span style="color:#00B000">(wie es fast immer fälschlich gelesen wurde und wird)</span>, sondern, das Theorem ANSELMS geht davon aus, als nicht hinterfragtes Faktum, dass GOTT notwendig, schon immer existiert, und beweist, mit dem GÖDEL-Kalkül, dass diese Glaubens-Annahme widerspruchsfrei und sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL abschließend sagt. GOTT hat es ja auch nicht ,nötig‘, bewiesen zu werden. Für den Erzbischof ANSELM war die Existenz GOTTES, überall und jederzeit, die ungefragte und für ihn die selbstverständlichste Voraussetzung aller seiner Bemühungen, in seinem Leben, und in seinem Beruf als christlicher Amtsträger, und auch als Theologe in den philosophischen Überlegungen über seinen Glauben. Mit diesen Überlegungen hat er, mit GÖDEL, bewiesen ''':''' Glaube ist nicht irrational, kein Sprung ins Unbekannte, sondern eine freie, vernünftige Entscheidung. Glaube ist rational und vertrauenswürdig.
Zusammengefasst heißt das Ergebnis dieser Bemühungen ANSELMS ''':''' Wenn Du an GOTT glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist auch logisch in der <u>bewiesenen Möglichkeit</u>, dass es GOTT geben kann, begründet, und damit ist er widerspruchsfrei, sinnvoll und kein Zirkelschluss. Dein Glaube an GOTT beruht jedoch, nach wie vor und in erster Linie, auf Deiner freien Entscheidung für GOTT, und nicht auf dem Zwang einer ,logischen‘ Argumentation. Wenn Du nicht an GOTT glauben willst, dann <u>musst Du, und sollst Du, auch nicht deswegen</u> an GOTT glauben, weil der Nicht-GOTT-Glaube zu einem Widerspruch führt, und damit falsch und unlogisch ist. Denn der Glaube an GOTT muss immer eine freie und Deine ganz persönliche Entscheidung für GOTT sein und bleiben. Niemand darf zum Glauben an GOTT gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Warum '''?''' Weil GOTT die Liebe ist '''!''' Und die Liebe duldet keinen Zwang '''!'''
Zum Abschluss, und für eine bessere Verständlichkeit dieser Studie, hat die KI, der ich diese Studie für die Erstellung eines Podcast übergeben habe, eine, — sogar für Kinder —, verständliche Metapher kreiert. Sie sagt, man stelle sich vor ''':''' Es sei irgendwo ein ,Schatz’ vergraben, und es gäbe auch eine ,Schatzkarte’ für diesen ,Schatz’. Kurt GÖDEL ist nun gekommen, und hat mit seinem Kalkül bewiesen, dass diese ,Schatzkarte’ korrekt ist und fehlerfrei. Ob aber jemand, mit Hilfe dieser ,Schatzkarte’ auf ,Schatzsuche’ gehen will oder nicht ''':''' das ist und bleibt jedem selbst überlassen, und ist immer eine freie, und ganz persönliche Entscheidung. Damit hat die KI erstaunlich treffend, sowohl die Bedeutung, als auch die reale Funktion des GOTT-Glaubens in der Lebens-Wirklichkeit unserer Welt und Zeit charakterisiert, in Übereinstimmung mit der Gleichniserzählung JESU vom ,Schatz im Acker’; <small><span style="color:#00B000">( vgl. {{Bibel | Matthäus-Evangelium |13|44|EU}} )</span></small>. Der ,Schatz’ ist die <span style="color:#FF6000">„<span style="font-family: Times;"><big>Βασιλεία του Θεού</big></span>“</span><span style="color:#00B000"> | ,Basileía tou Theoú’</span>, d.h. das <span style="color:#CC66FF">»''Königtum GOTTES''«</span>, oder auch das <span style="color:#CC66FF">»''Himmelreich''«</span>. Die ,Schatzkarte’ ist der Glaube an GOTT. Die ,Schatzsuche’ ist der Weg des Glaubens in der Nachfolge JESU, der uns den Weg zeigt zum Ziel, zur Erfüllung aller unserer Sehnsüchte und Wünsche.
----
----
;Fußnoten
<references />
4iw85mbpk4eymgqlzzmjoa0u4j4xiz8
1090676
1090672
2026-09-10T21:15:02Z
Santiago
19191
/* Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘ */Zusatz
1090676
wikitext
text/x-wiki
[[Kategorie: Buch]]
{{Regal|ort=Philosophie}}
{{Vorlage:StatusBuch|9}}
==<div class="center"><span style="color:#660066">'''Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘'''</span></div>==
<span style="font-family: Times;"><big><div class="center">לַמְנַצֵּ֗חַ לְדָ֫וִ֥ד אָ֘מַ֤ר נָבָ֣ל בְּ֭לִבּוֹ אֵ֣ין אֱלֹהִ֑ים הִֽשְׁחִ֗יתוּ הִֽתְעִ֥יבוּ עֲלִילָ֗ה אֵ֣ין עֹֽשֵׂה־טֽוֹב׃
(Psalm 14,1)</div></big></span>
----
===<div class="center"><span style="color:#660066">Vorwort</span></div>===
Zur Orientierung ''':''' Die Diskussion um GOTT läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser ANSELM gesagt ''':''' <span style="color:#FF6000">»''Ich glaube an GOTT'' … <span style="color:#00B000">[ sonst wäre er sicher
nicht Erzbischof von Canterbury geworden ]</span> … ''aber ich möchte auch wissen und verstehen, ob das stimmt und sinnvoll ist, was ich da glaube '''!''''' «</span> Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Professor und Philosoph aus Königsberg, Immanuel KANT, hat das, was ANSELM da aufgeschrieben hat, gelesen, <span style="color:#00B000">(vermittelt durch CARTESIUS)</span>, und das dann den <span style="color:#FF6000">„ontologischen Gottesbeweis“</span> genannt, <span style="color:#00B000">(obwohl es in Wirklichkeit gar kein Gottesbeweis ist; genauer ''':''' es ist kein Beweis für die Existenz GOTTES)</span>, und dieser große KANT hat dann großartig bewiesen, das, was ANSELM da aufgeschrieben hat, sei falsch. Es sei <span style="color:#FF6000">„ja gar kein“</span> Gottesbeweis '''!''' <span style="color:#00B000">( Naja, was denn sonst '''?''' )</span> Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichbaren GOTT mit hundert Talern in seinem Vermögenszustande verglichen hat. <span style="color:#00B000">(Das ist aber eine andere Geschichte.)</span> Hundert Taler und GOTT haben ,an sich‘ nichts gemeinsam, außer, wenn KANT ,wirklich‘ hundert Taler hat, und GOTT auch ,wirklich‘ existiert, <span style="color:#00B000">(wie ANSELM und gläubige Menschen glauben)</span>, dann gibt es GOTT und die Taler eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit KANT läuft die ganze Diskussion um GOTT immer nur als Diskussion um den <span style="color:#00B000">(von KANT)</span> so genannten <span style="color:#FF6000">„ontologischen, <span style="color:#00B000">[ kosmologischen, teleologischen etc. ]</span> Gottesbeweis“</span> —, obwohl es niemals einen Beweis für die Existenz GOTTES geben kann und niemals geben wird. <span style="color:#00B000">(Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich versucht zu sagen, weil keiner dieser sog. Beweise für die Existenz eines GOTTES stringent ist.)</span> Beweisen kann man die Existenz von Naturgesetzen. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie dann mit Mehrheitenbeschlüsse verändern. Wenn GOTT ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz GOTTES wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. GOTT ist <span style="color:#FF6000">„Person“</span>, — für Christgläubige ''':''' <span style="color:#FF6000">„ein GOTT in drei Personen“</span>. Und GOTT ist <span style="color:#FF6000">„Geist“</span>. Das besagt, dass GOTT nicht mit materiellen Dingen aus unserer Welt verglichen werden darf; <span style="color:#00B000">(was sowohl THOMAS von Aquin als auch Immanuel KANT doch getan haben)</span>. Und ganz wesentlich ''':''' der Zugang zu GOTT läuft nicht über den Beweis, sondern immer nur über den Glauben. Wer an GOTT glauben will, dem antwortet GOTT auf seine Weise — nämlich <span style="color:#FF6000">„geistig“</span> bzw. <span style="color:#FF6000">„geistlich“</span>. Wer nicht an GOTT glauben will, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Glaube ist immer eine freie Entscheidung des Menschen für GOTT. Niemand darf gezwungen werden. Wenn es einen Beweis für GOTT gäbe, wäre jeder vernünftige Mensch gezwungen, an GOTT zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Existenzbeweis für GOTT '''!!!''' ... Daher darf man das Kalkül des Logiker GÖDEL, <span style="color:#00B000">(und damit auch das Theorem ANSELMS)</span>, nicht als einen Existenzbeweis für GOTT lesen. Sowohl ANSELM als auch GÖDEL setzen die Existenz GOTTES notwendig als gegeben schon voraus. Das GÖDEL-System, und auch das Theorem ANSELMS, sind bloß die logische Bestätigung der Widerspruchsfreiheit der Glaubensüberzeugung eines Menschen, der sich schon entschieden hat, an GOTT zu glauben; und nicht der Grund für seine Entscheidung. Alle sogenannten ,Gottesbeweise‘, sind in Wirklichkeit nichts anderes, als nachträgliche Evaluierungen eines GOTT-Glaubens, bzw. ,Wege‘, <span style="color:#00B000">(bei THOMAS von Aquin)</span>, die aufzeigen, dass der GOTT-Glaube widerspruchsfrei, sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL sagt. GOTT hat es nicht nötig, ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> zu werden.
===<div class="center"><span style="color:#660066">Einleitung</span></div>===
Eine Studie zum GÖDEL-Kalkül. Der Logiker Kurt GÖDEL <span style="color:#00B000">(1906-1978)</span> hat mit diesem Kalkül eine moderne Rekonstruktion des, <span style="color:#00B000">(von KANT)</span>, so genannten ‚ontologischen Gottesbeweises‘ nach ANSELM von Canterbury auf modal-logischer Basis vorgelegt. Damit hat er die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt, d.h. sie soll für jeden Menschen nachvollziehbar sein, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie er sagt. GÖDEL ,nimmt‘ als Logiker, angeregt durch den Philosophen und Mathematiker Gottfried Wilhelm LEIBNIZ, rein theoretisch, fürs Erste, einmal ‚an‘, <span style="color:#00B000">(als Prämisse, d.i. der Term :01: im 3. Beweisgang zum Theorem ANSELMS im Anhang)</span>, dass es GOTT gibt ''':''' d.i. ein sog. ,methodologischer GOTT-Glaube‘, und untersucht die logischen Konsequenzen. Dabei zeigt sich, beim genaueren Hinsehen, dass der ‚Nicht-GOTT-Glaube‘, der ‚dezidierte‘ Atheismus, <span style="color:#00B000">(im Beweisgang ,Widerlegung‘ im Anhang)</span>, überraschender Weise, zu einem Widerspruch führt, und damit logisch ,falsch‘ ist. Jedoch, GÖDEL kann und will mit seinem Kalkül keinen ,GOTT-Glauben‘ ,erzeugen‘, d.h. das GÖDEL-Kalkül ist kein <span style="color:#FF6000">„Existenz-Beweis"</span> für den GOTT der Bibel, sondern, es setzt die Existenz eines GOTTES, einfach als gegeben, schon voraus. GÖDEL beweist dann mit seinem System, dass der traditionelle abendländische ,GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, <span style="color:#00B000">(d.i. die Kalkül-Prämisse, und das, daraus ,regulär‘ (├ ) abgeleitete, Theorem ANSELMS)</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> <span style="color:#00B000">(d.h. logisch ,richtig‘)</span> ist, im Gegensatz zum ,Nicht-GOTT-Glauben‘, der davon ausgeht, dass es keinen GOTT gibt. GÖDEL beweist mit seinem System ''':''' der traditionelle GOTT-Glaube ist, — mit mathematisch-logischer Evidenz —, widerspruchfrei und wahr. <span style="color:#00B000">(Der Beweis aus dem Widerspruch des Gegenteils ist ein ,indirekter Beweis‘ und kein ,Zirkelbeweis‘ '''!''' )</span> GÖDEL blieb bis zu seinem Tod ohne ein dezidiertes religiöses Bekenntnis. <span style="color:#00B000">(Das Leben ist nicht immer ,logisch‘.)</span>
Entsprechend der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> ist GOTT der Größte, <span style="color:#FF6000">»''über dem nichts Größeres mehr gedacht werden kann''«</span>, <span style="color:#00B000">(ANSELM)</span>; bzw. <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>, und der für uns immer schon ,da‘ ist. Das ist die methodologische Prämisse des GÖDEL-Kalküls. Davon ausgehend, zeigen seine Axiome und Definitionen, dass es zu einem Widerspruch führt, falls man ,annimmt‘, es sei nicht möglich, dass es <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> gibt. Aus dem Widerspruch des Gegenteils wird von GÖDEL, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, dann ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> ''':''' es ist doch möglich, dass es <span style="color:#FF6000">„GOTT“</span> wirklich gibt. Somit ist der Glaube an <span style="color:#FF6000">„GOTT“</span>, — weil widerspruchsfrei —, mit den Worten GÖDELS ''':''' <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span>.
Immanuel KANT <span style="color:#00B000">(1724-1804)</span> scheint diesen Fall vorausgesehen zu haben, dass versucht werden könnte, die ,Möglichkeit‘ GOTTES aus einem Widerspruch zu ,beweisen‘ ''':'''
::<span style="color:#FF6000">»</span> <span style="color:#00B000">[ Angenommen, es gibt ]</span> ''doch einen und zwar nur diesen '''Einen''' Begriff'' <span style="color:#00B000">[ ,GOTT‘, so dass ]</span> ''das Nichtsein oder das Aufheben seines Gegenstandes'' <span style="color:#00B000">[ GOTT ]</span>, ''in ,sich selbst‘ widersprechend sei; und dieses ist der Begriff des allerrealsten Wesens. Es hat, sagt ihr, alle Realität'', <span style="color:#00B000">[ bzw. alle Vollkommenheit ]</span>, ''und ihr seid berechtigt, ein solches Wesen als ,möglich‘ anzunehmen'' ... <span style="color:#00B000">[ denn das GÖDEL-Kalkül ,beweist‘ ( ╞ ) in der ,Widerlegung‘ im Anhang, wie auch im 1. Beweisgang, aus einem Widerspruch, dass die Existenz GOTTES definitiv logisch ,möglich‘ ist. ]</span> … ''obgleich der sich nicht widersprechende'', <span style="color:#00B000">[ ,mögliche‘ ]</span>, ''Begriff'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''noch lange nicht die'' <span style="color:#00B000">[ reale ]</span> ''Möglichkeit des Gegenstandes'', <span style="color:#00B000">[ GOTT ]</span>, ''beweiset. … Das ist eine Warnung, von der Möglichkeit der Begriffe (logische)'', <span style="color:#4C58FF">— '''◇''' —</span>, ''nicht sofort auf die Möglichkeit der Dinge (reale)'', <span style="color:#4C58FF">— '''□''' —</span>, ''zu schließen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 399; https://www.korpora.org/kant/aa03/399.html</ref>. <span style="color:#00B000">[ Trotz dieser Warnung, wird dieser Schluss dennoch im Theorem ANSELMS vollzogen, bzw. mit GÖDEL im 3. Beweisgang ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> '''!''' ]</span>. <span style="color:#FF6000">«</span>
Warum das <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist, und inwieweit KANT sich irrt, wird in dieser Studie gezeigt.
===<div class="center"><span style="color:#660066">Der Schlüsselbegriff im Kalkül</span></div>===
Der ‚Schlüsselbegriff‘ in diesem Kalkül ist <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Perfektion“, „Vollkommenheit“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Für diesen wichtigen Begriff gibt es aber im Kalkül selbst keine explizite Definition, sondern er wird nur durch seine Verwendung innerhalb des Kalküls indirekt ‚definiert‘. <span style="color:#00B000">(Das heißt ''':''' <span style="color:#4C58FF"> — ‚'''P'''‘ — </span> bezeichnet ein System von ,Eigenschaften‘, die ,positiv‘, bzw. ,vollkommen‘ | ,perfekt‘ | genannt werden, von denen im Kalkül wohl beweisbar ist, dass sie sich gegenseitig ,nicht widersprechen‘, weil sie im System als solche ,gleichwertig‘, bzw. gleich ,wahr‘ sind, jedoch ohne sie erschöpfend aufzählen zu können, oder auch nur sagen zu können, was sie alle im einzelnen bedeuten, außer, dass sie kompatibel sind.)</span> Mit der Wahl dieses Schlüsselbegriffes hat GÖDEL eine wesentliche Vorentscheidung für die Ergebnisse des Kalküls getroffen '''!''' In seinen Notizen zum ‚ontologischen Beweis‘ vom 10. Februar 1970 gibt GÖDEL, — für die nachträgliche Interpretation dieses Begriffes <span style="color:#00B000">(und auch für das Kalkül selbst)</span> —, die richtungsweisende Erklärung ''':'''
::<span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne...''«</span>
::Und er fügt in Klammer hinzu ''':'''
::<span style="color:#FF6000">»...''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span><ref>GÖDEL, Kurt, ''<span style="font-family: Times;"><big>‚Ontological proof‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Collected Works‘</big></span>'', vol. III, ed. S.FEFERMAN et al., Oxford (U.P.), 1995; 403–404.</ref>
GÖDEL-Axiom-1 ''':''' <span style="color:#4C58FF">— ‚('''PX <small><math>{ \color{Blue} \dot\lor}</math></small> P¬X''')‘ ↔<span style="color:#00B000"> ‚('''¬PX ↔ P¬X''')‘</span> — </span> ''':''' <span style="color:#FF6000"> »''Entweder die Eigenschaft'' <span style="color:#4C58FF">‚'''X'''‘</span> ''oder ihre Negation'' <span style="color:#4C58FF">‚'''¬X'''‘</span> ''ist positiv''«</span>. Hier ist der Hauptkritikpunkt, dass es Eigenschaften gibt, die ,an sich‘ weder positiv noch negativ sind. Beispiele wären ''':''' ‚rothaarig‘ oder ‚schwerwiegend‘; solche Eigenschaften können aber ,für mich‘ entweder positiv oder negativ sein, abhängig von meiner Betrachtungsweise und subjektiven Vorlieben. Diese Eigenschaften, wie ‚rothaarig‘ an sich, oder meine positiv-negativen ‚Betrachtungsweisen‘, sind jedoch der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> entnommen und treffen nicht den <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Er orientierte sich an LEIBNIZ, welcher im Bezug zum ‚ontologischen Beweis‘ definiert ''':'''
::<span style="color:#FF6000">»''Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''nenne ich jede einfache Eigenschaft, die sowohl positiv als auch absolut ist, oder dasjenige, was sie ausdrückt, ohne jede Begrenzung ausdrückt''.«</span><ref>Zitiert nach Thomas GAWLICK, in ''<span style="font-family: Times;"><big>‚Was sind und was sollen mathematische Gottesbeweise ?‘</big></span>'', Predigt vom 8.1.2012 in der Kreuzkirche zu Hannover. https://web.archive.org/web/20130524164359/http://www.idmp.uni-hannover.de/fileadmin/institut/IDMP-Studium-Mathematik/downloads/Gawlick/Predigt_Gawlick_Gottesbeweise.pdf</ref>
Die Seins-Eigentümlichkeiten <span style="color:#00B000">(Daseinsmodi, Perfektionen)</span> wie ‚wahr‘, ‚gut‘, ‚edel‘ usw. entsprechen dem <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Das sind Beispiele für ‚absolut‘ positive Begriffe aus der Lehre der Seinsanalogie ''':''' <span style="font-family: Times;"><big>‚verissimum‘, ‚optimum‘, ‚nobilissimum‘</big></span>, usw., die, an sich, <span style="color:#FF6000">»''ohne jede Begrenzung gelten''«</span>; zu finden in der <span style="font-family: Times;"><big>‚Via quarta‘</big></span>, bei THOMAS von Aquin, über die <span style="color:#FF6000">„analoge"</span> Abstufung im ‚Sein‘ der Dinge. Diese <span style="color:#FF6000">„analoge"</span> ‚Abstufung‘ ist dann die faktische Begrenztheit <span style="color:#00B000">(d.h. Unvollkommenheit)</span> im <span style="color:#FF6000">»''zufälligen''«</span> ‚Sein‘ der Dinge —. Die <span style="color:#FF6000">„positiven Eigenschaften“</span> GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, wie Wahrheit, Einheit, Gutheit, <span style="color:#00B000">(von ,Güte‘)</span>, Schönheit, Adel, <span style="color:#00B000">(von ,edel‘)</span>, Gleichheit, Andersheit, Wirklichkeit, ,Sein‘ im Sinne von Etwas-sein, etc. werden <span style="color:#FF6000">„Perfektionen“</span>, oder auch <span style="color:#FF6000">„Transzendentalia“</span> genannt, <span style="color:#00B000">(von lateinisch ''':''' <span style="font-family: Times;"><big>transcendere</big></span>, <span style="color:#FF6000">„übersteigen“</span>)</span>. In der mittelalterlichen Scholastik sind Transzendentalien die Grundbegriffe, die allem Seienden als <span style="color:#FF6000">„Modus“</span>, <span style="color:#00B000">(d.h. ,Eigentümlichkeit‘, als allgemeine Seinsweisen)</span>, zukommen. Wegen ihrer Allgemeinheit ,übersteigen‘ sie die besonderen Seinsweisen, welche ARISTOTELES die ,Kategorien‘ nannte. Ontologisch betrachtet, werden die Transzendentalien als das allem Seienden Gemeinsame aufgefasst, da sie von allem ausgesagt werden können. Von der KI werden sie, nicht unpassend, als <span style="color:#FF6000">„ultimative Eigenschaften des Seins“</span> bezeichnet, die <span style="color:#FF6000">„jenseits der materiellen Welt existieren“</span>, <span style="color:#00B000">(da sie ,ultimativ‘ nur von GOTT, als den unbegrenzt Vollkommenen, ausgesagt werden können, die jedoch, auch von allen übrigen Seienden, wegen deren seinsmäßigen Unvollkommenheit und Begrenztheit, abgestuft, d.h. <span style="color:#FF6000">„analog"</span>, ausgesagt werden)</span>. Diese Transzendentalien sind ,inakzident‘, das heißt, sie entstehen nicht aus anderen Begriffen, sondern sind erste, unteilbare Bestimmungen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> des Denkens und des Seins, die allen Seienden ''':''' <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span>, unabhängig von ihren speziellen Eigenschaften, als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(bzw. Unvollkommenheiten)</span>, mit ,modaler‘ Notwendigkeit, <span style="color:#4C58FF">— ‚□‘ —</span>, <span style="color:#FF6000">„analogisch"</span> zukommen, d.h. sie sind in allen Seienden, seinsmäßig abgestuft und abgegrenzt, ,relativ‘ zum unbegrenzt Unendlichen ihrer selbst, und <span style="color:#FF6000">»''dasjenige, was sie ausdrücken, drücken sie ohne jede Begrenzung aus''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>; und damit stehen sie ontologisch in einer <span style="color:#FF6000">„analogen"</span> ,Beziehung‘ zu GOTT, dem absolut Vollkommenen und unbegrenzt Unendlichen. In der Erkenntnisordnung wirken sie als die ersten Begriffe des menschlichen Verstehens, die eine Basis für alle weiteren wissenschaftlichen Erkenntnisse bilden. In der Seinsordnung sind die Transzendentalien ontologisch eins, gleichwertig, <span style="color:#00B000">(,mathematisch äquivalent‘)</span>, und daher konvertierbar, d.h. austauschbar, <span style="color:#00B000">(vgl. z. B. den scholastischen ,Merksatz‘ ''':''' <span style="font-family: Times;"><big>,ens et verum convertuntur‘</big></span>)</span>. Damit sind sie auch von einander abhängig, was GÖDEL sowohl im Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, für positive Eigenschaften, als auch in der Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, für die Wesenseigenschaften, syntaktisch formalisiert hat mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, weil sie sich gegenseitig, — mit ,modaler‘ Notwendigkeit —, gleichwertig ,implizieren‘, d.h. einschließen, <span style="color:#00B000">(im Axiom-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span>, und in der Definition-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''y'''‘ — </span>)</span>. Man kann die Transzendentalia, <span style="color:#00B000">(wie GÖDEL)</span>, auch ,Wesenseigenschaften‘ ''':''' <span style="color:#4C58FF"> — ‚'''X'''<sub>ess</sub>‘ —</span>, nennen, weil sie allem Seienden <span style="color:#FF6000">„wesentlich analog"</span> zukommen. Weil Transzendentalien miteinander austauschbar sind, sind sie auch widerspruchsfrei, was GÖDEL mit Axiom-1 syntaktisch darstellt. Die Gültigkeit und Wahrheit, d.h. die mathematisch-logische Evidenz von Axiom-1 und Axiom-2, beruht auf der ontologischen Allgemeinheit und Gültigkeit der Transzendentalia, die GÖDEL mit Definition-2, in sein Kalkül explizit eingeführt und als Wesenseigenschaften ,bestimmt‘ hat. <span style="color:#00B000">(Definitionen werden formal-syntaktisch durch das Äquivalenzzeichen <span style="color:#4C58FF">,'''↔'''‘</span> angezeigt, gelesen als <span style="color:#FF6000">„...ist genau dann ... wenn...“</span>)</span> Die GÖDEL-Axiome und -Definitionen werden jedoch sofort <span style="color:#FF6000">„modal falsch"</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit ,Nicht-Transzendentalia‘, wie z. B. ,rot‘ oder ,schwer‘, belegt werden. <span style="color:#00B000">(Dieser ,Sachverhalt‘ wird von Kritikern des GÖDEL-Systems, — zu vorschnell —, verwendet, um ihre Behauptungen zu ,belegen‘, das GÖDEL-Kalkül und seine Konsequenzen seien ,falsch‘.)</span>
Zum Überblick ''':''' <span style="color:#FF6000">„Transzendentalia“</span> sind universale, alles Seiende charakterisierende Begriffe, die über kategoriale Einteilungen hinausgehen, und sowohl in der klassischen Scholastik, als auch in der modernen Philosophie, <span style="color:#00B000">(KANT, Uwe MEIXNER<ref>vgl. die ,transzendentalen‘ Bedingungen möglicher Erkenntnisse bei KANT; und auch in der ,Axiomatischen Ontologie‘ bei Uwe MEIXNER</ref>)</span>, als Grundlage der Metaphysik und Erkenntnistheorie dienen. Sie sind die <span style="color:#FF6000">„ersten Begriffe des Seins“</span>, die jedem Ding als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(Perfektionen)</span>, inhärent sind, <span style="color:#FF6000">„analogisch"</span> abgestuft, auf einen ,ultimativ‘-unbegrenzten Bezugspunkt ausgerichtet, und die sich im Denken, <span style="color:#00B000">(für uns als wahr)</span>, und in der moralischen Wertung, <span style="color:#00B000">(für uns als gut und edel)</span>, manifestieren, relativ zum ,ultimativ‘-unbegrenzten Bezugspunkt ihrer selbst. Die faktische, zusätzliche Unvollkommenheit, die sich generell in der notwendigen, und unausweichlichen Vergänglichkeit aller Dinge zeigt, ist einem ontologischen Defekt ,geschuldet‘, der stark zeitabhängig ist, d.h. der einen Anfang und ein Ende hat.
Das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''Notwendige Existenz ist eine positive Eigenschaft''«</span>, ist immer falsch, wenn es auf etwas aus der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> angewendet wird, wie z. B. auf einen <span style="color:#FF6000">„Tsunami“</span>, dessen ‚Existenz‘ für uns nicht ‚positiv‘ ist. KANT hat schon festgestellt ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Das gilt für alles, was <span style="color:#FF6000">„existiert“</span>. Das Axiom-5 hat nur dann seine Gültigkeit, ist nur dann ,wahr‘, wenn <span style="color:#FF6000">„Dasein“</span> <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span> <span style="color:#00B000">(Essenz)</span> in eins zusammenfallen. Bei allen Dingen, die ‚da‘ sind, ist ihr ‚Da-Sein‘ ontologisch immer verschieden zu dem ‚was‘ sie sind ''':''' zu ihrem ,Was-Sein‘. In der philosophischen Tradition, seit ARISTOTELES, wird die ontologische Identität, d.i. die Koinzidenz, der innere Zusammenhang von ‚Sein‘ und ‚Wesen‘ allein nur dem <span style="color:#FF6000">„selbst ‚unbewegten‘ Erstbewegenden“</span> zugeschrieben, dem <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“</span><span style="color:#00B000"> | ,prôton kinoûn akinêton‘</span>, von dem ARISTOTELES etwas später sagt ''':''' <span style="color:#FF6000">»''denn dies ist der Gott''«</span> und dann hinzufügt ''':''' <span style="color:#FF6000">»''so sagen wir ja''«</span>; d.h. das ist eine Interpretation aus dem Glaubenskontext des ARISTOTELES. Er war ein Gott-gläubiger Grieche. Wer an GOTT glaubt, kann das nachvollziehen. GÖDEL musste dieses Axiom-5 postulieren, sonst wäre sein Kalkül nicht aufgegangen, ohne dass er deswegen schon an GOTT glauben müsste. Er hat für sein Kalkül das ontologische Theorem von der Identität von ‚Sein‘ und ‚Wesen‘ im ‚unbewegten Erstbeweger‘ des ARISTOTELES benutzt, ohne diese Herkunft explizit referenziert zu haben. <span style="color:#00B000">(Gilt auch für Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit, das GOTT-Sein, das ‚Dasein‘ GOTTES, ist eine positive Wesenseigenschaft, eine Perfektion; d.h. ist das ‚Wesen‘ GOTTES ''':''' GOTT ist perfekt''«</span>)</span>. Die ontologische Identität von Sein und Wesen, Existenz und Essenz, wie auch die Koinzidenz von Möglichkeit und Wirklichkeit, von Ursache und Wirkung, sowie auch die ontologische Einheit von <span style="color:#00B000">(Erkenntnis-)</span>Subjekt und <span style="color:#00B000">(Erkenntnis-)</span>Objekt im <span style="color:#FF6000">»''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“</span><span style="color:#00B000"> | ,noêseôs noêsis‘ <small>(<span style="font-family: Times;"><big>,''Metaphysik''‘</big></span> XII 9, 1074b34)</small></span>, und der innere Zusammenhang der <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, gilt nur in der <span style="color:#FF6000">„unverursachten Letztursache"</span>, auf die ARISTOTELES bei seiner Prinzipienforschung gestoßen ist.
Es gibt verschiedene Versuche, die GÖDEL-Axiome durch sog. ,Modelle‘, relativ zu einfacheren ,Welten‘, zu verifizieren, um damit ihre relative Konsistenz nachzuweisen. Für GÖDEL aber <span style="color:#FF6000">»''sind die Axiome nur dann'' <span style="color:#00B000">[ in unserer ,realen‘ Welt ]</span> ''wahr'' <span style="color:#00B000">[ und annehmbar ]</span>«</span>, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt'' <span style="color:#00B000">[ d.h. jeder auch nur ,möglichen‘ Welt ]</span> ''sind''«</span>. Diese Bedingung verweist jede Verifikation und jede Interpretation der Axiome auf das ,Nicht-Zufällige‘, das ,Notwendige‘, ,Absolute‘, in dem die Axiome und Definitionen des GÖDEL-Kalküls erst dadurch ihren Sinn und ihre Bedeutung bekommen, wenn sie vom ,Absoluten‘ und ,Unendlichen‘ her erklärt und verstanden werden. Damit insistiert GÖDEL auf eine genuin <span style="color:#4C58FF">,theologische‘</span> Interpretation seines Kalküls, mit der <span style="color:#4C58FF">„Theologie“</span> zum Begriff GOTT, dem unbegrenzt Unendlichen, als Verifikationskriterium. Das entspricht auch der ,methodologischen‘ Prämisse seines Kalküls. Die wichtigsten Axiome und Definitionen im GÖDEL-Kalkül sind jedoch bloße ,Annahmen‘, deren Evidenz, sowohl die ,mathematische‘ als auch die <span style="color:#4C58FF">,theologische‘</span>, erst evaluiert, d.h. ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> werden muss. Das bedeutet ''':''' die logische Verifikation der Axiome und Definitionen von GOTT und seinen Vollkommenheiten kann nur Kalkül-intern durch den Aufweis ihrer Widerspruchsfreiheit erfolgen, d.i. <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span>. Logisch evaluierte und verifizierte Axiome und Definitionen sind die ,modal‘ notwendigen, d.h. die ,transzendentalen‘ Voraussetzungen für die Ergebnisse eines Kalküls, damit seine Theoreme und Korollare in unserer ,realen‘ Welt als logisch ,wahr‘ und damit für uns auch als ,annehmbar‘ gelten können, während die Prämissen eines Kalküls, <span style="color:#00B000">(die Argument Einführung, <span style="color:#4C58FF">— '''AE:''' —</span> )</span>, nicht notwendige, und somit ,modal‘ frei gewählte ,Annahmen‘ sind. Jedoch aus diesen ,modal‘ frei gewählten, ,möglichen‘ <span style="color:#00B000">( <span style="color:#4C58FF">'''◇'''</span> )</span> Prämissen folgen mit Hilfe der ,bewiesenen‘ <span style="color:#00B000">( ╞ )</span> Axiome und Definitionen die Ergebnisse mit ,modaler‘ Notwendigkeit <span style="color:#00B000">( <span style="color:#4C58FF">'''□'''</span> )</span>.
Die Logik des GÖDEL-Systems ist eine ,Prädikatenlogik‘ zweiter Stufe, in der die Quantoren nicht nur Individuum-Variable, sondern auch Eigenschafts-Variable, <span style="color:#00B000">(als noch ,unbestimmte‘ Prädikate im Allgemeinen)</span>, binden können. Die formale Struktur des GÖDEL-Kalküls besteht aus fünf Axiomen und drei Definitionen, mit deren Hilfe in drei Beweisgängen drei Theoreme und mehrere Korollare aus seiner ,methodologischen‘ Prämisse ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitet werden können, wobei die beiden ersten Beweisgänge, mit ihren Ergebnissen, den dritten vorbereiten, in dem es dann um das Theorem ANSELMS geht. Die Prämisse des GÖDEL-Kalküls in allen Beweisgängen ist der traditionelle ,GOTT-Glaube‘, in der Formulierung speziell nach LEIBNIZ. Ein Axiom, eine Definition, zwei Theoreme und alle Korollare im GÖDEL-Kalkül sind Aussagen über <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>. Alle fünf Axiome, eine Definition und ein Theorem, <span style="color:#00B000">(und das Korollar aus Axiom-4)</span>, sind auch Aussagen über die Eigenschaft <span style="color:#FF6000">„Vollkommenheit“, „Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, die in der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> als die Wesenseigenschaft GOTTES gilt ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist vollkommen''«</span> bzw. <span style="color:#FF6000">»''GOTT ist das Vollkommenste der Wesen''«</span>, <span style="color:#00B000">(DESCARTES)</span>. Zwei Definitionen sind Aussagen über die allgemeinen Wesenseigenschaften aller Seienden, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, die Transzendentalien, die, als notwendige Existenz, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, auch GOTT zugeordnet werden, mit der Besonderheit bei GOTT, dass sowohl alle Eigenschaften, als auch alle anderen Zuordnungen, wie Sein und Wesen, wie Ursache und Wirkung, usw., im Unendlichen, GOTT, <span style="color:#FF6000">„koinzident“</span> sind, d.h. in GOTT paarweise perspektivisch in ,eins‘ zusammenfallen, und die auch, als Transzendentalia, konvertierbar, d.h. austauschbar sind. Diese Sachverhalte machen deutlich, dass eine spezifische ,Verifikation‘ und sachgerechte ,Evaluierung‘ der GÖDEL-Axiomatik nur genuin <span style="color:#4C58FF">,theologisch‘</span> erfolgen kann. Die Evaluierung der <span style="color:#FF6000">»''mathematischen Evidenz''«</span> des GÖDEL-Systems, im Allgemeinen, muss jedoch entsprechend der Maßstäbe einer modalen Prädikatenlogik zweiter Stufe durchgeführt werden.
Das GÖDEL-Kalkül unterscheidet <span style="color:#00B000">(in Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>)</span> formal-syntaktisch zwischen der Eigenschaft ,Existenz‘, <span style="color:#4C58FF"> — ‚'''E'''‘ —</span>, die nur GOTT zugeordnet werden kann, und dem Existenz-Operator, <span style="color:#4C58FF">— ‚'''∃'''‘ —</span>, der auch allem Übrigen, das nicht GOTT ist, zugeordnet wird. Es gibt hier auch den formal-syntaktischen Unterschied zwischen der, <span style="color:#00B000">(von mir notierten, jedoch von GÖDEL schon intendierten und angesprochenen)</span>, speziellen ,Notwendigkeit‘, <span style="color:#4C58FF"> — <sub>not</sub> —</span>, die nur der Existenz GOTTES zugeordnet ist, und der modalen ,Notwendigkeit‘, <span style="color:#4C58FF">— ‚'''□'''‘ —</span>, die auf Verschiedenes bezogen werden kann. Diese Unterschiede sind Hinweise, dass GÖDEL in seiner Kalkül-Logik und -Syntax, die Außerordentlichkeit und Eigenständigkeit GOTTES berücksichtigt, der, als Schöpfer der Welt, prinzipiell und absolut <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span> ist, die erst durch GOTT auch das ist, was sie ist.
===<div class="center"><span style="color:#660066">Die Genese des Kalküls</span></div>===
Wie kommt GÖDEL zu seinem Kalkül '''?''' Sein Gewährsmann war Gottfried Wilhelm LEIBNIZ, <span style="color:#00B000">(1646-1716)</span>, den er sehr schätzte. Die rekonstruierbare Genese seines Kalküls findet man in LEIBNIZ ''':''' ''<span style="font-family: Times;"><big>‚Neue Abhandlungen über den menschlichen Verstand‘</big></span>'', <span style="color:#00B000">(1704)</span>‚ ''<span style="font-family: Times;"><big>Viertes Buch, Kapitel X ''':''' ‚Von unserer Erkenntnis des Daseins Gottes‘</big></span>'', Seite 475f.
Hier der <span style="color:#00B000">[ kommentierte ]</span> Textausschnitt zum sog. ontologischen ‚Gottesbeweis‘''':'''
::<span style="color:#FF6000">»</span>''Folgendes etwa ist der Gang seines'' <span style="color:#00B000">[ d.h. ANSELMS, Erzbischof von Canterbury; 1033-1109, ]</span> ''Beweises ''':''' GOTT ist das Größte'', <span style="color:#00B000">[ ANSELM spricht vom biblischen GOTT des Glaubens, als ''':''' <span style="color:#FF6000">»''den, über dem ,Größeres‘'' | <span style="font-family: Times;"><big>‚maius‘</big></span> | ''nicht mehr gedacht werden kann''«</span> ]</span>, ''oder, wie DESCARTES es ausdrückt ''':''' das Vollkommenste der Wesen oder auch ein Wesen von äußerster Größe und Vollkommenheit'' ''':''' <span style="color:#00B000"> [ GÖDEL ''':''' </span><span style="color:#4C58FF">‚'''P'''‘</span> <span style="color:#00B000">:= ‚Perfektion‘, ‚positive Eigenschaft‘ ]</span>, ''das alle Grade derselben in sich schließt.''<span style="color:#00B000"> [ GÖDEL-Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>. Definition-1 bildet die traditionelle Vorstellung von GOTT ab. ]</span> ''Dies also ist der Begriff GOTTES.'' <span style="color:#00B000">[ Der Term <span style="color:#4C58FF">— ,'''G'''‘ —</span> steht hier für den biblischen ‚Begriff‘ <span style="color:#FF6000">„GOTT“</span> als ,Individuumname‘ '''!''' ]</span> ''Sehen wir nun, wie aus diesem Begriff das ‚Dasein’ folgt.''<span style="color:#00B000"> [ GÖDEL ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist notwendig aus sich ‚da‘''«</span> ''':''' Term :10:, 1. Hauptergebnis im 3. Beweisgang. ]</span> ''Es ist etwas <u>mehr</u>, ‚da‘ zu sein, als nicht ‚da‘ zu sein, oder auch das ‚Dasein‘ fügt der Größe oder der Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''einen Grad hinzu, und wie DESCARTES es ausspricht, das ‚Dasein‘ ist selbst eine Vollkommenheit.''<span style="color:#FF6000">«</span>
<span style="color:#00B000">(Diesen Ausspruch DESCARTES übernimmt GÖDEL im Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''notwendige Existenz''</span> [ alias ‚Dasein GOTTES’ ] <span style="color:#FF6000">''ist eine positive Eigenschaft''</span> [ alias Vollkommenheit ]<span style="color:#FF6000">«</span>. Dem widerspricht KANT ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>. Das Axiom-5 ist daher nur dann ‚wahr‘, wenn ‚Wirklichsein‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια οὖσα</big></span>“</span> | ‚enérgeia oúsa‘ | d.h. ‚Dasein‘ und ‚Wesen‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ | — genauer ''':''' ‚Wesenseigenschaften’ —, ontologisch ,eins‘ sind, d.h. wenn <span style="color:#FF6000">„Existieren“</span> immer schon die <span style="color:#FF6000">„Wesenseigenschaft“</span> GOTTES ist. Was nach ARISTOTELES nur im <span style="color:#FF6000">„unbewegten Erstbeweger“</span> der Fall ist; bzw. mit LEIBNIZ ''':''' <span style="color:#FF6000">»''was das Privilegium der Gottheit allein ist''«</span> '''!''' Aus der ,methodologischen‘ ,Annahme‘ im 2. Beweisgang GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den GOTT der Christen''«</span>, und mit Hilfe von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, bzw. <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, mit Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind notwendig aus sich, — von Natur aus —, positiv''«</span>, mit Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span> ''':''' <span style="color:#FF6000">»''Zum Wesen gehören notwendig auch alle Konsequenzen aus einer Wesenseigenschaft''«</span>, und mit Axiom-1 und der Definition für GOTT, folgt nach einigen logischen Umformungen das GÖDEL-Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist genau dann der GOTT der Christen, wenn das Wesen dieses GOTTES sein eigenes Sein ist''«</span>. Dasein und Wesen sind im Unendlichen, GOTT <span style="color:#FF6000">„koinzident“</span> ,eins‘, übereinstimmend mit dem Theorem des ARISTOTELES. Mit diesem, im Kalkül <u>ohne</u> Axiom-5 ,regulär‘ (├ ) abgeleiteten Theorem, widerlegt er KANT für den individuellen Spezialfall <span style="color:#4C58FF">‚'''G'''‘</span> := <span style="color:#FF6000">„GOTT“</span>. Nachprüfbar im Anhang ''':''' im ‚ontologischen‘ Beweis für das Basis-Theorem-2. Somit ist Axiom-5 ,wahr‘, und KANT, der <span style="color:#FF6000">»''eine Abneigung gegen das Gebet hatte''«</span> und auch <span style="color:#FF6000">»''nie zu den sonntäglichen Kirchgängern zählte''«</span><ref>Uwe SCHULTZ ''':''' ‚''<span style="font-family: Times;"><big>Immanuel Kant</big></span>''‘, Rowohlt Monographie 50659, Seite 12</ref>, hat sich hier, im Bezug auf GOTT, geirrt. <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, war für KANT nie eine ernstzunehmende Option. Die <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, die natürlich immer auch verbunden sein muss mit der täglichen ,Erfahrung‘ einer Glaubens-Praxis, im Gebet und in den Gottesdienst-Feiern des <span style="color:#4C58FF">„Theologen“</span>, und die daraus entsteht, ist eine ziemlich ,ausgereifte‘ Disziplin. Es haben sich, durch Jahrhunderte hindurch, viele gläubige und auch gescheite Menschen, schon im Judentum, und dann im Christentum, und ebenfalls im Islam, darum bemüht.)</span>
:: <span style="color:#FF6000">»</span>''Darum ist dieser Grad von Größe und Vollkommenheit oder auch diese Vollkommenheit, welche im ‚Dasein‘ besteht, in diesem höchsten, durchaus großen, ganz vollkommenen Wesen, denn sonst würde ihm ein Grad fehlen, was gegen seine Definition wäre. Und folglich ist dies höchste Wesen ‚da‘. Die Scholastiker, ohne selbst ihren'' <span style="font-family: Times;"><big>doctor angelicus</big></span> <span style="color:#00B000">[ := THOMAS von Aquin ]</span> ''auszunehmen, haben diesen Beweis verachtet'', <span style="color:#00B000">[ wie später auch Immanuel KANT ]</span>, ''und ihn als einen Paralogismus'' <span style="color:#00B000">[ := Fehlschluss ]</span> ''betrachtet, worin sie sehr unrecht gehabt haben; und DESCARTES, welcher die scholastische Philosophie im Kolleg der Jesuiten zu La Flèche lange genug studiert hatte, hat sehr recht gehabt, ihn wieder zu Ehren zu bringen. Es ist nicht ein Paralogismus, sondern ein unvollständiger Beweis'', <span style="color:#00B000">[ den GÖDEL vervollständigt hat ]</span>, ''der etwas voraussetzt, was man noch hätte beweisen sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' <span style="color:#00B000">[ '''::''' <span style="color:#4C58FF">— '''◇''' —</span> '''::''' ,möglich‘, ,konsistent‘, ,denkbar‘; GÖDEL beweist im 1. Beweisgang aus Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, <span style="color:#FF6000">»''positive Eigenschaften'', <span style="color:#00B000">[ die allgemeinen Transzendentalien ]</span>, ''sind widerspruchsfrei''«</span>, mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, folgt Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist widerspruchsfrei möglich''«</span> ]</span>. ''Und es ist schon etwas, dass man durch diese Bemerkung beweist ''':''' gesetzt, dass GOTT'' <span style="color:#00B000">['' <span style="color:#FF6000">»widerspruchsfrei«</span> '']</span> '',möglich‘ ist, so ‚ist‘ er'' <span style="color:#00B000">[ ,notwendig‘ '''::''' <span style="color:#4C58FF">— '''□''' —</span> '''::''' für jede mögliche Welt auch wirklich aus sich ‚da‘ ]</span>, ''was das Privilegium der Gottheit allein ist'' ''':''' <span style="color:#00B000">[ Im 3. Beweisgang, Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' ‚ANSELMS Prinzip‘ ''':''' <span style="color:#FF6000">»''Weil GOTT widerspruchsfrei ,möglich‘ ist, darum ist auch der Glaube widerspruchsfrei, der annimmt, dass GOTT aus sich ,notwendig‘ da ist''«</span>; mit Korollar-3 ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ —</span>, <span style="color:#FF6000">»''Es gibt notwendig nur einen einzigen GOTT''«</span>. Damit ist auch der Monotheïsmus bewiesen. ]</span> ''Man hat recht, die Möglichkeit eines jeden Wesens anzunehmen und vor allem die GOTTES, bis ein anderer das Gegenteil beweist''. <span style="color:#00B000">[ Das Gegenteil besagt, dass GOTT ,unmöglich‘ ist. Hier setzt der Möglichkeitsbeweis im GÖDEL-Kalkül an, und beweist, dass diese Aussage zu einem Widerspruch führt. ]</span> ''Somit gibt dieser metaphysische Beweis schon einen moralischen zwingenden Schluss ab, wonach wir dem gegenwärtigen Stande unserer Erkenntnisse zufolge urteilen müssen, dass GOTT ‚da‘ sei, und demgemäß handeln.'' <span style="color:#00B000">[ Aber nicht logisch zwingend '''!''' Denn die Interpretation <span style="color:#4C58FF">— ‚'''G'''‘ —</span> mit dem GOTT der Bibel, als ,methodologische‘ Kalkül-Prämisse, ist nicht zwingend, jedoch ,modal‘ möglich, <span style="color:#4C58FF">— '''◇''' —</span>, und im christlichen Glaubenskontext sinnvoll, was mit einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls gezeigt werden kann. Damit wäre dann auch die Frage beantwortet, ob das GÖDEL-System sich plausibel als eine Theorie von GOTT und seinen Eigenschaften interpretieren lässt, bzw. als eine <span style="color:#FF6000">»''axiomatische''«</span> <span style="color:#4C58FF">„Theologie“</span>, wie sie André FUHRMANN apostrophiert. Das <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ist der ,Individuumname‘ für den GOTT der Bibel, — ,GOTT‘ groß geschrieben —, im monotheïstischen, christlichen Glaubenskontext, den auch LEIBNIZ teilt. Dann steht der ,Name‘ auch synonym für das ,existierende‘ Individuum, d.h. für dessen ,Existenz‘. ]</span> ''Es wäre aber doch zu wünschen, dass gescheite Männer'' <span style="color:#00B000">[ sic ! ]</span> ''den Beweis mit der Strenge einer mathematischen Evidenz vollendeten'', <span style="color:#00B000">[ was GÖDEL veranlasst hat, seine Version eines ‚ontologischen Beweises’ zu kreieren, dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> man heute mit Computerprogrammen<ref>siehe Fußnote 12</ref> schon nachgewiesen hat ]</span> ... <span style="color:#FF6000">«</span>.
Für GÖDEL war dieser Text eine intellektuelle Herausforderung, und er hat sie angenommen. Das war für GÖDEL sicher keine Glaubensangelegenheit. GOTT hat es ja auch nicht nötig, ‚bewiesen‘ zu werden. Wer <span style="color:#4C58FF">— ‚'''G'''‘ —</span> z. B. mit dem sog. ‚Urknall‘ gleich setzt, macht die <span style="color:#FF6000">»''zufällige Struktur der Welt''«</span> im ‚Urknall‘, <span style="color:#00B000">(pantheistisch)</span> zu einem ,Gott‘, was GÖDEL dezidiert für sein Kalkül ausgeschlossen haben wollte.
Kurt GÖDEL schreibt 1961 in einem Brief, in Anlehnung an den obigen Text ''':'''
::<span style="color:#FF6000">»...''ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig ''<span style="color:#00B000">[ sic '''!''' ]</span>, ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', <span style="color:#00B000">[ dass es GOTT gibt ]</span>, ''mit allen bekannten Tatsachen'', <span style="color:#00B000">[ z. B. mit den Maßstäben einer modernen Logik ]</span>, ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker LEIBNIZ versucht''.«</span><ref>Zitiert nach SCHIMANOVICH-GALIDESCU, M.-E. ''':''' ‚''<span style="font-family: Times;"><big>Princeton–Wien 1946–1966. Briefe an die Mutter</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kurt Gödel – Leben und Werk</big></span>''‘, Hg. B.BULDT et alia, Wien (HÖLDER–PICHLER–TEMSKY), 2001, Band 1</ref>
===<div class="center"><span style="color:#660066">Die Interpretation des Kalküls</span></div>===
Wenn man sich das GÖDEL-Kalkül ansieht, wie es heute formalisiert vorliegt, stellt sich die Frage ''':''' <span style="color:#FF6000">„Lässt sich dieses System plausibel als eine Theorie von GOTT <span style="color:#00B000">(als eine ‚Rede von GOTT’ := <span style="color:#4C58FF">,Theologie’</span>)</span> und seiner Eigenschaften verstehen '''?''' “ — „Ist hier eine genuin <span style="color:#4C58FF">,theologische’</span> Interpretation möglich '''?''' “</span> Seine Herkunft aus der intellektuellen Auseinandersetzung des Logikers GÖDEL mit dem GOTT-gläubigen Philosophen LEIBNIZ und dem christlichen Theologen und Erzbischof ANSELM rechtfertigt diese Frage. Die <span style="color:#FF6000">„mathematische Evidenz“</span> des GÖDEL-Formalismus, <span style="color:#00B000">(im Anhang nachgestellt)</span>, ist allgemein anerkannt, <span style="color:#00B000">(Vorbehalte dagegen gibt es nur bei der Interpretation seiner Syntax, d.h. ob die Axiome und Definitionen, wie GÖDEL sie konzipiert hat, bzw. ob die Theoreme und Korollare, die aus diesen Axiomen ,regulär’ (├ ) abgeleitet werden, auch in unserer realen Welt ,wahr’ und ,annehmbar’ sind)</span>. Die <span style="color:#FF6000">„theologische Evidenz“</span> des GÖDEL-Systems wird durch eine ,Verankerung’ der Axiome und Definitionen in den <span style="color:#4C58FF">,theologisch’</span>-philosophischen Diskurs über GOTT evaluiert, der schon seit zweieinhalbtausend Jahren läuft. In diesen zweieinhalbtausend Jahren hat sich, — gegen ARISTOTELES und die antike Philosophie —, die Erkenntnis durchgesetzt, dass GOTT <span style="color:#FF6000">»''unabhängig''«</span> von der <span style="color:#FF6000">»''zufälligen''«</span> Raum-Zeit-Struktur unserer vergänglichen Welt ist. In meiner Darstellung des GÖDEL-Kalküls folge ich, <span style="color:#00B000">(im Unterschied zum Autographen GÖDELS, vom 10. Feb 1970)</span>, in der Axiom-Formulierung und -Nummerierung, in der Syntax, und in der Beweis-Struktur, der Arbeit von André FUHRMANN ''':''' ''<span style="font-family: Times;"><big>‚Existenz und Notwendigkeit. Kurt Gödels axiomatische Theologie‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Logik in der Philosophie‘</big></span>'' Hg. SCHROEDER-HEISTER, SPOHN und OLSSON, 2005, Synchron, Heidelberg, Seite 349–374. <span style="color:#00B000">(Die tiefer gestellte Notation der spezifischen ,Eigenschaft‘ einer Eigenschaft ist meine Ergänzung zur formalen Syntax, z. B. ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>'''x'''‘ — </span>, angeregt durch die indizierende Schreibweise GÖDELS ''':''' <span style="color:#4C58FF">— ,'''G''' Ess. '''x'''’ —</span>.)</span> Die Erkenntnisse zur Straffung und Präzisierung der GÖDEL-Syntax, <span style="color:#00B000">(besonders im Möglichkeitsbeweis)</span>, stammen aus der Arbeit von Günther J. WIRSCHING ''':''' ,''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, im Web <ref>https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf</ref>. <span style="color:#00B000">(Auch der Hinweis auf AVICENNA kommt von WIRSCHING.)</span> Die Zitate von THOMAS von Aquin´s Stellungnahme zum Theorem ANSELMS, und von Georg Wilhelm Friedrich HEGEL zur Immanuel KANTS Ablehnung des Theorem ANSELMS, befinden sich in Franz SCHUPP, ,<span style="font-family: Times;"><big>''Geschichte der Philosophie im Überblick''</big></span>‘, Band 2 ‚<span style="font-family: Times;"><big>''Christliche Antike, Mittelalter''</big></span>‘, Hamburg 2003, Seite 168 und Seite 170.
Meines Erachtens ist der entscheidende Ansatzpunkt einer <span style="color:#4C58FF">„theologischen“</span> Interpretation das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>.
‚Frei‘ nach KANT ‚formuliere‘ ich ‚kurz‘ ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Hier die Positionen KANTS zum Thema ‚Existenz‘ und ‚Eigenschaften‘ ''':'''
::<span style="color:#FF6000">»</span>''… unbeschadet der wirklichen Existenz äußerer Dinge'', <span style="color:#00B000">[ kann man ]</span> ''von einer Menge ihrer Prädikate'', <span style="color:#00B000">[ d.h. Eigenschaften ],</span> ''sagen'' … ''':''' ''sie gehöreten nicht zu diesen ‚Dingen an sich selbst‘, sondern nur zu ihren Erscheinungen, und hätten außer unserer Vorstellung'' <span style="color:#00B000">[ ihrer, als ,wirklich‘ gedachten Erscheinung, ]</span> ''keine eigene Existenz, … weil ich finde, dass … '''alle Eigenschaften, die die Anschauung eines Körpers ausmachen''', bloß zu seiner Erscheinung gehören; denn die Existenz des Dinges, was erscheint, wird dadurch nicht … aufgehoben, sondern nur gezeigt, dass wir es'', <span style="color:#00B000">[ das Ding ]</span>, ''wie es ‚an sich selbst‘ sei'', <span style="color:#00B000">[ d.h. existiert ]</span>, ''durch Sinne gar nicht erkennen können''.<span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Prolegomena zu einer jeden künftigen Metaphysik, die als Wissenschaft wird auftreten können</big></span>''‘, Seite 289; https://www.korpora.org/kant/aa04/289.html</ref> <span style="color:#00B000"><small>(Hervorhebung durch KANT.)</small> [ Seine Prädikate, d.h. Eigenschaften, jedoch können wir mit unseren Sinnen ,anschauen‘, aber nur in Kombination mit unserer Vorstellung ihrer, als ,wirklich‘ gedachten Erscheinung, vermittelt durch den sog. ,transzendentalen Schematismus‘ unserer Einbildungskraft ''':'''</span> <span style="color:#FF6000">»</span>''Eine verborgene Kunst in den Tiefen der menschlichen Seele''<span style="color:#FF6000">«</span>, <span style="color:#00B000">jedoch auch eines der ,dunkelsten‘ Kapitel in der K.d.r.V., bedingt durch KANTS Konzept von ,Wirklichkeit‘, bzw. ,Sein‘. ]</span>
Mit anderen Worten, man kann die ‚Existenz‘, bzw. das ‚Sein‘ der Dinge, <span style="color:#00B000">(das ‚Ding an sich’ bei KANT)</span>, nicht unter dem Mikroskop finden. Die ‚Existenz‘ bzw. das ‚Sein‘ ist keine sinnlich registrierbare ‚Eigenschaft‘ z. B. des rekonstruierten ‚Stadt-Schlosses‘ in Berlin. <span style="color:#00B000">(‚Sein‘ ist kein reales ‚Prädikat‘.)</span> Dafür haben wir andere Fähigkeiten ''':''' Ich kann seine ‚Existenz‘ mit meinem Verstand einsehen, weil auch ich selbst ‚existiere‘. Seine ‚Ansicht‘, wie ‚gefällig‘ es ist, und auch weitere ‚Eigenschaften‘, die mir auffallen, kann ich mit einem Handy-Foto dokumentieren. Diese ‚Eigenschaften‘ sind nicht die Ursache, dass das ‚Berliner Schloss‘ existiert. Wohl aber die Rekonstruktion dieses Schlosses ist die ‚Ursache‘, dass es ,existiert‘, und jetzt so aussieht. Insofern ist ‚Existenz‘ keine ‚Eigenschaft‘, sondern die ‚Existenz‘ des Dinges ist die Voraussetzung, der ‚Grund‘, dass ich die ‚Eigenschaften‘ des Dinges mit meinen Sinnen feststellen kann.
In einer Auseinandersetzung mit CARTESIUS schreibt KANT, philosophisch ‚tiefgründig‘ und logisch ‚exakt‘, über dessen <span style="color:#FF6000"><span style="font-family: Times;"><big>„Cogito, ergo sum“</big></span></span> ''':'''
::<span style="color:#FF6000">»</span>''Das ‚Ich denke‘ ist ein empirischer Satz, und hält den Satz ‚Ich existiere‘ in sich. Ich kann aber nicht sagen ''':''' ‚Alles, was denkt, existiert‘; denn da würde die Eigenschaft des Denkens'', <span style="color:#00B000">[ eine essentielle Eigenschaft ]</span>, ''alle Wesen, die sie besitzen, zu notwendigen'' <span style="color:#00B000">[ d.h. notwendig existierenden ]</span> ''Wesen machen''. <span style="color:#00B000">[ Was allein nur von GOTT ausgesagt werden kann; mit AVICENNA, als anerkannter ARISTOTELES-Kommentator ''':''' <span style="color:#FF6000">»''GOTT ist das einzige Sein, bei dem Essenz'' <span style="color:#00B000">[ ‚Wesenseigenschaften‘ ]</span> ''und Existenz'' <span style="color:#00B000">[ ‚Dasein‘ ]</span> ''nicht zu trennen sind und das daher notwendig an sich da ist''«, <span style="color:#00B000">— konform mit GÖDEL ''':'''</span> »''notwendige Existenz ist eine positive'' <span style="color:#00B000">[ essentielle ]</span> ''Eigenschaft''«</span> ].</span> ''Daher kann meine Existenz auch nicht aus dem Satz, ‚Ich denke‘, als'' <span style="color:#00B000">[ logisch ]</span> ''gefolgert angesehen werden, wie CARTESIUS dafür hielt (weil sonst der Obersatz : ‚Alles, was denkt, existiert‘, vorausgehen müsste), sondern ist mit ihm identisch.'' <span style="color:#00B000">[ Eine einfache Schlussfolgerung ''':''' meine ‚Existenz‘ ist auch nicht von meiner ‚Eigenschaft‘ Denken ‚verursacht‘. ,Existenz‘ ist nicht bloß ein ,Gedanke‘ von mir. ]</span><span style="color:#FF6000">«</span> <span style="color:#00B000">(Aus der Anmerkung 41 zu den ‚''<span style="font-family: Times;"><big>Paralogismen der reinen Vernunft</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 275,<ref>https://korpora.org/kant/aa03/275.html</ref> mit meinem Einschub des AVICENNA-Zitat aus Wikipedia.<ref>{{w|Avicenna#Metaphysik}}</ref>)</span>
Mit anderen Worten ''':''' <span style="color:#FF6000">„Die Eigenschaft, dass ich denken kann, ist nicht die Ursache meiner ‚Existenz‘“</span>, sondern, <span style="color:#FF6000">„Die Liebe meiner Eltern und ihre Entscheidung füreinander ist die Ursache meiner ‚Existenz‘. Daher ‚bin’ ich. Und weil ich ein Mensch ‚bin‘, kann ich denken.“</span> Auch mit diesen Anmerkungen ist leicht einsehbar, dass ‚Existenz‘ keine ‚Eigenschaft‘ ist — außer bei GOTT. In GOTT ist ‚Dasein‘ die ‚Wesenseigenschaft‘ GOTTES, d.h. ‚Dasein‘ und ‚Wesen‘ sind in GOTT untrennbar verbunden; sind <span style="color:#FF6000">„koinzident“</span> ‚eins‘. Das ist die Einzigartigkeit im Wesen GOTTES, dass GOTT immer schon ‚da‘ ist. Die Frage nach dem ‚Wesen‘ GOTTES lautet ''':''' <span style="color:#FF6000">„Was bist du ? “</span>/<span style="color:#CC66FF">„Wer bist Du ? “</span> Antwort, Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'' <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Weil GOTT für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, hat GOTT es nicht nötig, ‚bewiesen‘ zu werden. <span style="color:#00B000">(In der Mathematik ist ein ‚Satz‘ erst dann ‚wahr‘ und ‚existent‘, wenn er bewiesen ist. Bei GOTT ist es jedoch nicht so ''':''' GOTTES ‚Existenz‘ ist nicht erst dann ‚wahr‘, wenn seine ‚Existenz‘ von uns ‚bewiesen‘ ist. Sein ‚Dasein‘ ist jedem unserer ‚Beweisversuche‘ immer schon voraus. Der Zugang zu GOTT ist nicht der ,Beweis‘, sondern der ,Glaube‘. Wer an GOTT glauben ,will‘, dem antwortet GOTT. Wer nicht an GOTT glauben ,will‘, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Die Glaubens-Entscheidung hat jedoch für jeden Menschen eine existenzielle Konsequenz ''':''' <span style="color:#CC66FF">»''Wer glaubt und sich taufen lässt, wird gerettet; wer aber nicht glaubt'', <span style="color:#00B000">[ und diese Entscheidung auch im Augenblick der ,Wahrheit‘, im Tod, in der sog. ,Endentscheidung‘, nicht widerruft ]</span>, ''wird verurteilt werden''«,</span> <small>({{Bibel | Markus Evangelium |16|16|EU}})</small>. Das Urteil lautet ''':''' <span style="color:#CC66FF">»''zweiter Tod ''':''' der Feuersee''«</span>, <small>({{Bibel | Offenbarung |20|14f|EU}})</small>, ohne Berufungsmöglichkeit. <span style="color:#CC66FF">»''Ohne Glauben aber ist es unmöglich, Gott zu gefallen; denn wer zu Gott kommen will, muss glauben, dass er ist und dass er denen, die ihn suchen, ihren Lohn geben wird''«.</span> <small>({{Bibel | Hebräer Brief |11|6|LUT}})</small>)</span>
Das GÖDEL-Axiom-5 ist m.E. der entscheidende Ansatzpunkt einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation der GÖDEL-Axiomatik.
===<div class="center"><span style="color:#660066">Das Kalkül ist kein Existenz-Beweis für GOTT</span></div>===
Die allgemeine <span style="color:#FF6000">»''mathematische Evidenz''«</span> des GÖDEL-Formalismus, d.h. seine ‚Schlusskraft‘, ist von kompetenten Leuten<ref>„GÖDELS Argumentationskette ist nachweisbar korrekt – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO nun gezeigt;“ vgl. https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html</ref> schon festgestellt worden, <span style="color:#00B000">(im Anhang ‚nachrechenbar‘ mit den Regeln und Gesetzen einer modalen Prädikatenlogik 2. Stufe)</span>. Das GÖDEL-Kalkül ist jedoch kein ‚moderner‘<span style="color:#FF6000">„Existenz-Beweis“</span> für GOTT, wofür es gehalten oder meistens bezweifelt wird, sondern setzt, <span style="color:#00B000">(theoretisch methodisch)</span>, den <span style="color:#FF6000">„Glauben an die Existenz GOTTES“</span> schon voraus, ohne ihn zu hinterfragen. Das <span style="color:#FF6000">„Dasein“</span> bzw. die <span style="color:#FF6000">„Existenz“</span> GOTTES wird mit der Definition-1 für <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, bzw. mit dem Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, im Kalkül ‚definitorisch‘ bzw. ‚axiomatisch‘ als Kalkül-,Annahme‘, als <span style="color:#FF6000">„Prämisse“</span>, eingeführt, unter der Voraussetzung, dass die ‚Eigenschaft‘ <span style="color:#4C58FF">‚'''G'''‘ := </span><span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(Essenz)</span> und das <span style="color:#FF6000">„Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> <span style="color:#00B000">(Existenz)</span>, ontologisch ‚identisch‘, genauer ''':''' <span style="color:#FF6000">„koinzident“</span> sind, was GÖDEL im Axiom-5 definitiv für sein System vorschreibt ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>. Das <span style="color:#FF6000">„Dasein GOTTES“</span> ist faktisch äquivalent zur <span style="color:#FF6000">„notwendigen Existenz als GOTT“</span>; und <span style="color:#FF6000">„Göttlichkeit“</span> ist die <span style="color:#FF6000">„positive Eigenschaft in GOTT“</span>. Beides ist nach Axiom-5 ‚identisch‘, d.h. dem ‚Sein nach‘ dasselbe, und daher konvertierbar. Beide, <span style="color:#00B000">(sowohl die Essenz, als auch die Existenz GOTTES)</span>, werden daher auch mit demselben Term ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span> im Kalkül dargestellt. Der traditionelle, christliche ,GOTT-Glaube‘ wird zugleich mit diesem Term <span style="color:#4C58FF">‚'''G'''‘ := </span> <span style="color:#FF6000">„GOTT“ <span style="color:#00B000">|</span> „göttlich“</span>, im 2. Beweisgang, dem Basisbeweis, und im 3. Beweisgang für das Theorem ANSELMS, jeweils als ,methodologische‘ Prämisse :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> regulär <span style="color:#00B000">( ├ )</span> und explizit eingeführt ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht für den GOTT'' <span style="color:#4C58FF">‚'''G'''‘</span> ''der Christen''«</span>. Das ist die ,modal‘-frei gewählte, <span style="color:#4C58FF">„theologische“</span> Kalkül-,Annahme‘, <span style="color:#00B000">(als ,Argument-Einführung‘ := <span style="color:#4C58FF">‚'''AE:'''‘</span> )</span>, und wird dann mit Definition-1 näher ,bestimmt‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ — </span> ''':''' <span style="color:#FF6000"> »''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht genau dann für ‚GOTT‘'' <span style="color:#00B000">|</span> ''‚göttlich‘'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle positiven Eigenschaften, bzw. Vollkommenheiten'', <span style="color:#4C58FF">‚'''PX'''‘</span>, ''hat''«</span>, entsprechend dem ‚Quelltext‘ bei LEIBNIZ. <span style="color:#00B000">(Das ,postulierte‘ Axiom-3 ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, wird standardmäßig gelesen als <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, hat aber auch die alternative Leseart ''':''' <span style="color:#FF6000">»''GOTT ist perfekt d.h. vollkommen''«</span>, was <span style="color:#4C58FF">„theologisch“</span> auch richtig ist; mit <span style="color:#4C58FF">‚'''P'''‘ </span> := <span style="color:#FF6000">„Perfektion“/„Vollkommenheit“</span> ist dann die Summe aller <span style="color:#FF6000">„positiven Eigenschaften“</span>.)</span> Mit Axiom-3, — in dieser <span style="color:#4C58FF">„theologischen“</span> Leseart —, ist der ‚Wenn-Satz‘ in Definition-1 ‚aufgelöst‘ ''':''' <span style="color:#FF6000">»''GOTT hat alle positiven Eigenschaften, weil er ‚perfekt‘ ist''«</span>.
In Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, wird die ,für uns‘ <span style="color:#FF6000">„notwendige Existenz“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —, </span> durch die ,aus sich‘ <span style="color:#FF6000">„notwendig“</span> <span style="color:#4C58FF">— '''□''' —</span> instanziierten <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(als zu den Transzendentalia gehörig)</span>, bestimmt. Das GÖDEL-Kalkül setzt sowohl in Definition-3 als auch im Axiom-5 das Theorem des ARISTOTELES von der ontologischen ‚Identität‘, d.i. die Koinzidenz von <span style="color:#FF6000">„Dasein“</span>, <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#00B000">(Essenz)</span> im prinzipiell <span style="color:#FF6000">„unbewegten Erstbewegenden“</span> voraus. Ohne diese Annahme bzw. ohne Axiom-5, würde das GÖDEL-Kalkül nicht ‚funktionieren‘. Das GÖDEL-Theorem-2.1 ''':''' <span style="color:#4C58FF">— ‚'''Gx→G'''<sub>ess</sub>'''x'''‘ —</span>, kann unter dieser Voraussetzung dann, <span style="color:#4C58FF">„theologisch“</span> richtig und eindeutig, so gelesen werden ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für GOTT'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''als Individuum steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span>, ''das Wesen'', <span style="color:#4C58FF">—<sub>ess</sub>—, </span> <span style="color:#00B000">(,Essenz‘)</span>, ''GOTTES'' <span style="color:#4C58FF">‚'''x'''‘</span>«</span><ref>vgl. z.B. THOMAS von Aquin ''':''' ,''<span style="font-family: Times;"><big>De Ente et Essentia</big></span>''’, Kapitel 5 ''':''' „Deus, cuius essentia est ipsummet suum esse“ ''':''' „GOTT, dessen Wesen sein eigenes Sein ist“.</ref>, statt der <span style="color:#4C58FF">„theologisch“</span> unrichtigen Lesearten in der Wikipedia ''':''' <span style="color:#FF6000">»''Göttlich ist eine essentielle Eigenschaft jedes göttlichen Wesens''«</span><ref>{{w|Gottesbeweis#Kurt_Gödel|Gottesbeweis 2.1.2, Theorem 2}}; Version vom 10.09.2025</ref>, oder bei Christoph BENZMÜLLER et alia, im sog. ,Theorembeweiser‘ ''':''' <span style="color:#FF6000">»''Gottähnlich zu sein ist eine Essenz von jeder gottähnlichen Entität''«</span><ref>[https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html ‚Gödels „Gottesbeweis“ bestätigt’, Theorem 2]</ref>, mit der suggestiven Annahme, es gäbe polytheïstisch, mehrere ,göttliche Wesen‘, bzw. ,gottähnliche Entitäten‘, was der monotheïstischen, abendländischen Tradition, bzw. dem <span style="color:#4C58FF">„theologischen“</span> Theorem von der ,Unvergleichlichkeit‘ und ,Einzigartigkeit‘ GOTTES widerspricht, das im GÖDEL-Kalkül mit Korollar-3 bestätigt wird. <span style="color:#00B000">(Die Interpretation <span style="color:#4C58FF">‚'''G'''‘ :=</span> <span style="color:#FF6000">„GOTT“</span>, als ,Individuumname‘, ist synonym zum <span style="color:#FF6000">„Dasein <span style="color:#00B000">(Existenz)</span> GOTTES“</span>, und äquivalent zur ‚positiven Eigenschaft‘ <span style="color:#FF6000">„Göttlichkeit“</span>, alias <span style="color:#FF6000">„göttlich zu sein“</span> = <span style="color:#FF6000">„GOTT zu sein“</span> = <span style="color:#FF6000">„GOTT-Sein“</span>; und mit dem GÖDEL-Term ''':''' <span style="color:#4C58FF">‚'''G'''<sub>ess</sub>‘ :=</span> <span style="color:#FF6000">„das Wesen <span style="color:#00B000">(Essenz)</span> GOTTES“</span>.)</span>
<div class="center"><span style="color:#FF6000"><span style="color:#4C58FF">‚'''G'''‘ :=</span> „'''G'''öttlichkeit“ <span style="color:#4C58FF">↔</span> „'''G'''OTT“ <span style="color:#4C58FF">↔</span> „'''G'''OTT-Sein“</span> </div>
Die Rechtfertigung für diese <span style="color:#4C58FF">„theologische“</span> Dreifach-Äquivalenz für <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, im GÖDEL-Kalkül, gibt Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''die positive <u>Eigenschaft</u>'', <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ''Göttlichkeit'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''äquivalent zu GOTT als Individuum-Name'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''ist auch äquivalent zum Dasein GOTTES'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''gleichbedeutend mit notwendiger <u>Existenz</u>'', <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>'', dem <u>Sein</u> GOTTES für uns''«</span>. Hier hat GÖDEL explizit <span style="color:#FF6000">„Eigenschaft“</span> mit <span style="color:#FF6000">„Existenz“</span> bzw. <span style="color:#FF6000">„Sein“</span> gleichgesetzt; <span style="color:#00B000">(was jedoch nach KANT für alles, was in unserer Welt ‚existiert‘, bzw. für alles, was zur <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> gehört, wie GÖDEL selbst sagt, in jedem Fall ‚unstatthaft‘ ist ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>)</span>. Jedoch wegen dieser ‚Gleichsetzung‘, die einzig und allein, der aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition entsprechend, singulär nur in GOTT ‚statthaft‘ ist, kann jetzt die ‚positive Eigenschaft‘ <span style="color:#00B000">(Essenz)</span> <span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(ontologisch korrekt)</span> gelesen werden als <span style="color:#FF6000">„das, was GOTT zu dem macht, ‚was‘ GOTT an sich selbst ist“</span>, nämlich zu seinem <span style="color:#FF6000">„GOTT-Sein“</span> <span style="color:#00B000">(Existenz)</span>, zu seinem <span style="color:#FF6000">„Dasein als GOTT“</span>; zur Tatsache, dass <span style="color:#FF6000">„GOTT GOTT ist“</span>, d.h. dass <span style="color:#FF6000">„GOTT als GOTT ‚da‘ ist“</span>. Das ist, <span style="color:#00B000">(und da folgt ARISTOTELES seinem Lehrer PLATO)</span>, nach traditioneller Auslegung, die übliche, ontologische Funktion des ‚Wesens‘<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ |</span> eines Seienden ''':''' es ‚macht‘ das Seiende zu dem, ‚was‘ es ist; es ist die ‚Ursache‘ dafür, dass das Seiende, das ‚ist‘, ‚was‘ es ist | ‚Was-Sein‘ — ‚Wesen‘. <span style="color:#00B000">(ARISTOTELES lokalisiert jedoch das ,Wesen‘ im Seienden, im Gegensatz zu PLATO, der das ,Wesen‘, — ,getrennt‘ vom Seienden —, in den allgemeinen ,Ideen‘ lokalisiert.)</span>
Da aber in ‚Gott‘, <span style="color:#00B000">(dem <span style="color:#FF6000">„unbewegten, ‚unverursachten‘ Erstbeweger“</span>)</span>, Prozesshaftes, ‚Ursächliches‘ auszuschließen ist, ist die übliche prozesshafte, ‚ursächliche‘ Funktion von <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span><span style="color:#00B000"> | ‚ousía‘ |</span> ,Wesen‘ im <span style="color:#FF6000">„Erstbewegenden“</span> nach ARISTOTELES, sozusagen, schon ‚zum Abschluss‘ gekommen, schon ‚verwirklicht‘, — <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐν-έργεια οὖσα</big></span>“</span><span style="color:#00B000"> | ‚en-érgeia oúsa‘</span> —, schon ‚ins-Werk‘ gesetzt; <span style="color:#00B000">(<span style="color:#FF6000">„<span style="font-family: Times;"><big>τὸ ἔργον</big></span>“</span> | ‚to érgon‘ | ‚das Werk‘; <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια</big></span>“</span> | ‚enérgeia‘ | ,Wirksamkeit‘, ,Wirklichkeit‘, ,Aktualität‘, ,Energie‘; und <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὖσα</big></span>“</span> | ,oúsa‘ | feminin Nominativ Singular von <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὤν</big></span>“</span> | ‚ón‘ | ‚seiend‘)</span>. Sein ,Wesen‘ ist im ,Dasein‘ vollendet, ist ,wirkliches, verwirklichendes Sein‘, ‚seiende Aktualität‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>actus purus</big></span>“</span> ''':''' sein Wesen ist ‚reine Tätigkeit‘, ,reine verwirklichende Gegenwärtigkeit‘, d.h. ,existent‘, ohne jede prozesshafte ‚Potenzialität‘. Aus der wichtigen und richtigen Erkenntnis, dass GOTT <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer Welt''«</span> ist, folgt mit der ontologischen Identität von ,Dasein‘ und ,Wesen‘ in GOTT ''':''' Der zeitlos ewige GOTT ist <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''immer schon da''«</span>, m.a.W. ist <span style="color:#FF6000">„zeitlos-ursprungslos“</span>. Insofern ist <span style="color:#FF6000">„Göttlichkeit“</span> die <span style="color:#FF6000">„Wesenseigenschaft“</span>, die im <span style="color:#FF6000">„Dasein GOTTES“</span> d.h. in <span style="color:#FF6000">„GOTT“</span>, schon ihr ‚Ziel‘, ihre Vollendung, — <span style="color:#FF6000">„Perfektion“</span>, Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, erreicht hat. GOTT ist <span style="color:#FF6000">»''vollkommen''«</span> und darum auch <span style="color:#FF6000">»''notwendig für uns immer schon ‚da‘''«</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ — </span>. GOTT ist in seinem ‚zeitlosen Wesen‘ <span style="color:#FF6000">„unverursacht“</span>, da er <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''vollkommen''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''□PG'''‘ —</span>, <span style="color:#00B000">(eine Instanz von Axiom-4)</span>. <span style="color:#FF6000">„Vollkommenheit“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ist die <span style="color:#FF6000">„Wesenseigenschaft“</span>, bzw. das <span style="color:#FF6000">„Wesen GOTTES“</span> ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>. <span style="color:#FF6000">»''GOTT ist ,der‘ Vollkommenste''«</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, d.h. <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist die unbegrenzte Summe der unendlichen Vollkommenheiten''«</span>. Und zur absoluten <span style="color:#FF6000">„Vollkommenheit“</span> gehört <span style="color:#FF6000">„notwendig“</span> auch das <span style="color:#FF6000">„Existieren“</span> ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span>. <span style="color:#FF6000">„Notwendige Existenz“</span> gehört zu den ,ultimativen‘ Transzendentalia in GOTT, was GÖDEL mit Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, syntaktisch formalisiert hat, wenn sowohl das <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, als auch alle <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span> im Kalkül, für den Dreifaltigen GOTT der Christen stehen, was dann im Korollar-3, mit der Identität, <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, bzw. der Koinzidenz beider Individuum-Variablen, explizit gezeigt wird.
Entscheidend für diese Interpretation des GÖDEL-Systems ist ''':''' nur unter der ,modal‘ notwendigen Voraussetzung der ontologischen ‚Identität‘ von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, Theorem-2 ''':''' <span style="color:#4C58FF"> — '''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>, bzw. der ‚Gleichsetzung‘, <span style="color:#00B000">(Koinzidenz)</span>, von <span style="color:#FF6000">„notwendiger Existenz“</span> mit den ‚positiven‘ Wesenseigenschaften, der <span style="color:#FF6000">„Essenz“</span> in GOTT, Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, ‚funktioniert‘ die GÖDEL-Axiomatik '''!''' Diese ‚Identität‘, bzw. ,Koinzidenz‘ wird in ARISTOTELES, ‚''<span style="font-family: Times;"><big>Metaphysik</big></span>''‘, Buch XII 7, in einem Indizienbeweis erbracht, der mit der Methode der philosophischen Induktion zum Ergebnis kommt ''':'''
::<span style="color:#FF6000">» … ''es muss'' <span style="color:#00B000">[ notwendig ]</span> ''etwas geben, das, ohne selbst ‚bewegt‘'' <span style="color:#00B000">[ </span>''worden''<span style="color:#00B000"> ]</span> ''zu sein'', <span style="color:#00B000">[ ‚unentstanden‘ ]</span>, ''alles Übrige wie ein Geliebtes ‚bewegt‘'' <span style="color:#00B000">[ ‚entstehen lässt‘ ]</span>«</span>, das darum selbst ‚zugleich‘ <span style="color:#FF6000">„<span style="font-family: Times;"><big>αἴδιον καί οὐσία καί ἐνέργεια οὖσα</big></span>“ <span style="color:#00B000">| ,aídion kai ousía kai enérgeia oúsa‘ |</span> »<span style="color:#00B000">[ zeitlich-]</span>''ewig, sowohl <u>Wesen</u>'', <span style="color:#00B000">[ etwas Konkretes, Essentielles ]</span>, ''als auch seiende Wirksamkeit — ''<span style="color:#00B000">[ </span>„<span style="font-family: Times;"><big>actus purus</big></span>“, „reine Tätigkeit“<span style="color:#00B000"> ]</span> ''— verwirklichendes, wirkliches <u>Sein</u> ist'', <span style="color:#00B000">[ ein Existierendes, das alles Übrige ,zur Existenz‘ bringen kann ]</span> «</span>, bzw. <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὀρεκτόν καί νοητόν</big></span>“ <span style="color:#00B000"> | ,orektón kai noêtón‘ | </span>»''das ersehnt und erkennbar ist''.«</span> <span style="color:#00B000">(''<span style="font-family: Times;"><big>vgl. ,Metaphysik</big></span>''‘ XII 7, 1072a,23 – 1072b,4)</span>
Was <span style="color:#FF6000">»''alles Übrige''«</span> ,zur Existenz‘ bringen kann, bzw. ,verwirklichen‘ kann, ohne selbst ,entstanden‘ zu sein, muß auch selbst, als etwas Konkretes, Essentielles, immer schon ,existieren‘, bzw. ,wirklich sein‘. Die, daraus abgeleitete, und damit ,erkannte‘, ontologische ‚Identität‘, — ,Koinzidenz‘ —, von ‚Wesen‘ und ‚Sein‘, <span style="color:#00B000">(Ziel aller Sehnsucht und jedes Erkenntnisstrebens)</span>, <span style="color:#FF6000">»''ist das Privilegium der Gottheit allein''«</span> ''':''' mit Gottfried Wilhelm LEIBNIZ interpretiert, entsprechend einer adäquaten, aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition. Dieses induktive, ‚ontologisch‘ a-posteriori Ergebnis aus der ‚Prinzipienforschung‘ des ARISTOTELES ist die metaphysische und logische Voraussetzung, dass GÖDEL seine Axiomatik im Kalkül des sog. ‚ontologischen Gottesbeweises‘ a-priori des ANSELM von Canterbury, und nach LEIBNIZ, deduktiv korrekt formulieren konnte; <span style="color:#00B000">(vgl. 3. Beweisgang)</span>.
Angenommen, die Variable <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für den <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, der Christen, <span style="color:#00B000">(siehe Anhang, Term :01: im 2. Beweisgang)</span>, dann ist, — auf Grund von diesem Beweisgang —, in unserer Welt ,wahr‘ und evident ''':''' sowohl die ‚positive Eigenschaft‘ <span style="color:#FF6000">»''Göttlichkeit''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als auch das faktische <span style="color:#FF6000">»''‚Da‘-Sein'' <span style="color:#00B000">[ Existenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ‚benennen‘, ontologisch ident, denselben Sachverhalt ''':''' nämlich das, was wir das <span style="color:#FF6000">»''Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>, nennen. <span style="color:#FF6000">»''Göttlichkeit'', bzw. ''GOTT-‚Sein‘ ist das Wesen GOTTES''«</span>, <span style="color:#00B000">(Theorem-2.1)</span>, und dann umgedreht und äquivalent ''':''' <span style="color:#FF6000">»''Das Wesen GOTTES ist sein ‚Da‘-Sein als GOTT'', bzw. ''seine Göttlichkeit''«</span>, <span style="color:#00B000">(Theorem-2.2)</span>, m.a.W. ''':''' <span style="color:#FF6000">»''GOTT ist wesentlich ‚grundlos‘'' <span style="color:#00B000">[ d.h. </span> ''notwendig aus sich''<span style="color:#00B000"> ]</span> ''‚da‘''«</span>. Das ist das Einzigartige im <span style="color:#FF6000">»''Wesen GOTTES''«</span> ''':''' GOTT ist ohne zeitlichen Anfang, zeitlos-ewig, für uns immer schon ‚da‘, und das ‚ist‘ sein <span style="color:#FF6000">»''Wesen''«</span>; vorausgesetzt, ,angenommen‘, man glaubt an GOTT ''':''' Term :01:. <span style="color:#00B000">(Der schon von GÖDEL indizierte Term <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ — </span> ,expliziert‘ nur eine der drei Lesearten, die der Term <span style="color:#4C58FF"> — ‚'''G'''‘ — „theologisch“</span> ,impliziert‘.)</span> Theorem-2 hat somit die syntaktische Form einer Definition ''':'''
<div class="center"><span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span></div>
Somit kann GOTT ‚explizit‘ <span style="color:#00B000">(aus einer bewiesenen Kalkül-Definition)</span> <span style="color:#4C58FF">„theologisch“</span> genauer ‚bestimmt‘ werden ''':''' <span style="color:#FF6000">»''GOTT ist gerade deswegen GOTT, weil sein überzeitlich-ewiges und an sich ‚grundloses‘'' <span style="color:#00B000">[ aber für uns notwendiges ]</span> ''Dasein'' <span style="color:#00B000">[ Existenz ]</span> ''als GOTT, ontologisch, — dem Sein nach —, identisch ist mit seinem persönlichen und für uns liebevollen Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''als GOTT; diese Identität von Dasein und Wesen gilt einzig und allein nur bei GOTT.''«</span> Die philosophische Frage nach dem <span style="color:#FF6000">„Wesen GOTTES“</span> lautet, <span style="color:#00B000">(auf die Person bezogen)</span> ''':''' <span style="color:#FF6000">„Was bist du ? “</span> Sie ist äquivalent zur <span style="color:#4C58FF">,theologisch’</span>-biblischen Frage des MOSE ''':''' <span style="color:#CC66FF">„Wer bist Du ? “</span> Die bekannte Antwort des GOTTES-JHWH aus ‚Exodus 3,14‘, im Dornbusch, thematisiert das persönliche, für uns liebevolle und für immer notwendige <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'', <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Mit diesem Zitat aus der Bibel ist die GÖDEL-Axiomatik, sozusagen, <span style="color:#4C58FF">„theologisch“</span> ‚verifiziert‘. Sie hat einerseits im Theorem-2 ihren philosophischen ‚Abschluss’ erreicht, und andererseits damit formal-syntaktisch den ‚Anschluss‘ an eine allgemeine Basis-Glaubensaussage gefunden, die ‚an sich‘ für jeden CHRIST-gläubigen Menschen ‚selbstverständlich‘ ist. Was in der Metaphysik des ARISTOTELES das Ergebnis einer philosophischen ,Induktion‘ a-posteriori ist ''':''' <span style="color:#FF6000">„,Dasein‘ ist das ,Wesen‘ GOTTES“</span>, — <span style="color:#00B000">(das mit Theorem-2, auch ein Ergebnis der deduktiven GÖDEL-Axiomatik a-priori ist ''':''' die Beweisgrundlage für den Konsequenz-Teil im Theorem AMSELMS)</span>, — das ist in der Bibel die Grundüberzeugung jedes Menschen, der an GOTT glaubt ''':''' GOTT ist für uns immer schon <span style="color:#FF6000">„da“</span>, weil er uns liebt. Das ist das, <span style="color:#FF6000">„was“</span> GOTT für uns als GOTT ausmacht, — sein Wesen ''':''' <span style="color:#CC66FF">»''Wir haben die Liebe, die GOTT zu uns hat, erkannt und gläubig angenommen. GOTT ist Liebe, und wer in der Liebe bleibt, bleibt in GOTT und GOTT bleibt in ihm''«</span>, <small>({{Bibel | 1. Johannesbrief |4|16|EU}})</small>.
Das eigentliche Ergebnis der GÖDEL-Axiomatik ist somit die ‚triviale‘ Erkenntnis, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, vorausgesetzt <span style="color:#00B000">(‚angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#CC66FF">»''Ehe die Berge geboren wurden, ehe die Erde entstand und das Weltall erschaffen wurden, bist du, o GOTT, von Ewigkeit zu Ewigkeit''«</span>, <small>({{Bibel | Psalm |90|2|LUT}})</small>. <span style="color:#00B000">(Der Glaube an die Zeitlosigkeit GOTTES ist mit der ‚Annahme‘ von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, und der ‚Annahme‘ der Definition-1 für <span style="color:#4C58FF"> ‚'''Gx'''‘ := </span> den <span style="color:#FF6000">„GOTT der Christen“</span>, im Kalkül ‚implizit‘ schon eingeführt, da die Axiome und Definitionen, — nach GÖDEL —, nur dann <span style="color:#FF6000">»''wahr''«</span> sind, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen''</span> [ Raum-Zeit-]<span style="color:#FF6000">''Struktur''«</span> unserer Welt sind. Das ,impliziert‘ auch, dass der GOTT von Axiom-3 und Definition-1 ebenfalls <span style="color:#FF6000">»''unabhängig''«</span> von Raum und Zeit, d.h. zeitlos-ewig ist '''!''' )</span>
Wer an den GOTT der Bibel glaubt, kann sich von der ‚Vernünftigkeit‘ seines Glaubens mit Hilfe des sog. ,ontologischen‘ Gottesbeweises nach ANSELM von Canterbury, mit Kurt GÖDEL <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, überzeugen. <span style="color:#00B000">(Das war auch die Absicht ANSEMS '''!''' )</span> Die Annahme, es sei ‚unmöglich‘, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span>, <span style="color:#00B000">(dezidierter Atheismus)</span>, führt im GÖDEL-Kalkül formal zu einem logischen Widerspruch; vgl. z. B. ‚''<span style="font-family: Times;"><big>Gödels Möglichkeitsbeweis</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, Seite 17, von Günther J. WIRSCHING; (https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf), d.h. es ist also nicht ‚unmöglich‘, dass es GOTT gibt. Der GOTT-Glaube ist mit den Maßstäben einer modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> und darum ,vernünftig‘. Damit steht fest ''':''' das GÖDEL-Kalkül ist kein moderner ‚Existenz-Beweis‘ für den GOTT der Bibel, sondern es setzt, <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, ,methodologisch‘, den Glauben an die Existenz eines zeitlos-ewigen GOTTES voraus, der, — <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer '' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> —, für uns immer schon ‚da‘ ist. Wenn aber einmal als fix ‚angenommen‘ worden ist, <span style="color:#00B000">(als Prämisse)</span>, dass es wahr ist, dass GOTT ‚existiert‘, dann ist natürlich die ‚Annahme‘, dass GOTT ‚nicht existiert‘, falsch. Aber sie ist auch ,unlogisch‘ und ,unsinnig‘, weil die Annahme ''':''' <span style="color:#FF6000">»''Es ist unmöglich, dass es einen GOTT gibt''«</span>, offensichtlich und eindeutig zu einem Widerspruch führt; was z. B. Günther J. WIRSCHING mit seiner Version des <span style="color:#00B000">(nicht umkehrbaren)</span> ‚Möglichkeitsbeweises‘ für ,GOTT‘, explizit vorexerziert hat; <span style="color:#00B000">( nachgestellt im Anhang ''':''' GÖDELS ‚Möglichkeitsbeweis‘ als ,Widerlegung‘ eines Nicht-GOTT-Glaubens; in Entsprechung zu Psalm 14,1 und Psalm 53,2 ''':''' <span style="color:#CC66FF">»''Der'' <span style="color:#00B000">[ ,unvernünftige‘ ]</span> ''Tor sagt in seinem Herzen ''':''' Es gibt keinen Gott. Sie handeln verderbt, handeln abscheulich; da ist keiner, der Gutes tut''«</span>. Historischer Hintergrund zu diesem Psalm-Text ''':''' Die Zerstörung des Tempels in Jerusalem 586 v.Ch. durch die Truppen des NEBUKADNEZAR II.)</span> Der Logiker GÖDEL hat in seinem System zum ,ontologischen Beweis‘ keine ‚formale Unentscheidbarkeit‘ <span style="color:#00B000">(Agnostizismus)</span> feststellen können, wie auf einem anderen Feld seiner Forschungsarbeiten.
Das GÖDEL-Konsequenz-Teil von der ‚Notwendigkeit‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, <span style="color:#00B000">(die ‚Konsequenz’ aus dem ‚widerspruchsfreien‘ Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —,</span>)</span> im ‚Theorem ANSELMS‘, ist <span style="color:#00B000">(im 3. Beweisgang, Term :10:)</span> dann auch eine weitere Explikation des Basis-Theorems-2 des Kalküls ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span>, über die ‚ontologische Identität‘ vom <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, mit seinem <span style="color:#FF6000">„Wesen“</span> ''':''' <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, nach einem <span style="color:#4C58FF">[ Modus ponens ]</span>, dargestellt mit Term :09:.
<span style="color:#00B000">(Die ontologische Identität von Dasein und Wesen in GOTT, ist die, für uns, <span style="color:#FF6000">„notwendige Präsenz <span style="color:#00B000">[ das Sein, <span style="color:#4C58FF">— ‚'''E'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, die äquivalent, bzw. koinzident ist zur <span style="color:#FF6000">„Vollkommenheit <span style="color:#00B000">[ das Wesen, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>. Diese Identität von Sein und Wesen in GOTT ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub> —</span>, bedeutet <span style="color:#4C58FF">,theologisch‘</span> konkret ''':''' die, für uns, notwendige Gegenwärtigkeit GOTTES, [ sein Dasein ], ist verwirklicht worden in der liebevollen [ Wesens-]Zuwendung GOTTES zu uns Menschen, in seiner Kindwerdung in Bethlehem, durch die Jungfrau MARIA ''':''' GOTTES Wesen ist ,Sein-mit-uns‘ ''':''' <span style="color:#CC66FF">»''sein Name'', <span style="color:#00B000">[ sein Wesen ]</span>, ''ist IMMANUEL, das heiß übersetzt ''':''' GOTT-ist-mit-uns''«, <small>({{Bibel | Matthäus Evangelium |1|23|EU}})</small></span>, der unsere Not-,wenden‘-wird, d.h. der uns und die Welt von der Korruption der Sünde und des Todes <span style="color:#4C58FF">,erlösen‘</span> will und wird; jedoch nicht ohne uns. Die <span style="color:#4C58FF">„Menschwerdung“</span> GOTTES in JESUS CHRISTUS, die <span style="color:#4C58FF">„Hypostatische Union“</span>, bzw. diese außergewöhnliche und einzigartige <span style="color:#FF6000">„Koinzidenz“</span> von GOTT und Mensch, ist der wirkliche und historische Beginn der <span style="color:#4C58FF">„Erlösung“</span> des Menschen und der Welt; vergegenwärtigt für jede Generation der Menschen in und durch die <span style="color:#4C58FF">„Kirche“</span> JESU CHRISTI.)</span>
Die, von GÖDEL im 1. Beweisgang, als Prämissen schon vorausgesetzten und ,angenommenen‘ Perfektionen, bzw. Vollkommenheiten, <span style="color:#00B000">(das sind die allgemeinen ,Transzendentalia‘ für alles Nicht-Göttliche in der Welt)</span>, werden im ersten Teil des 2. Beweisganges, mit Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dann auch als <span style="color:#FF6000">„positive Wesenseigenschaften“</span>, <span style="color:#00B000">(als die ultimativen ,Transzendentalia‘)</span>, in GOTT ‚definitiv‘ <span style="color:#00B000">( ╞ )</span> bestätigt; <span style="color:#00B000">(siehe Anhang, 2. Beweisgang, Anmerkung-2)</span>.
Im 3. Beweisgang ist das Basis-Theorem-2 die ,modal‘ notwendige, bzw. transzendentale, Voraussetzung, sowohl für das <span style="color:#FF6000">„an sich notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, im Term :10:, als auch für die <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, in den Ressourcen dieses Beweisganges ''':''' in der Definition-3, und im Axiom-5; <span style="color:#00B000">(das <span style="color:#4C58FF">— ‚'''E'''‘ —</span> wird nur GOTT zugeordnet; vgl. auch Anhang, 3. Beweisgang, Anmerkung-4)</span>. Dieses Basis-Theorem-2 ist auch zugleich die Antwort auf die Frage nach dem ‚Ursprung‘ GOTTES ''':''' GOTT ist <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> ‚da‘, von <span style="color:#CC66FF">„Ewigkeit zu Ewigkeit“</span>, denn es ‚ist‘ sein <span style="color:#FF6000">„Wesen“</span>, <span style="color:#00B000">(überzeitlich-ewig)</span> für uns immer schon ‚da‘ zu sein. Weitere ‚Einzelheiten‘ über Wesen und Eigenschaften GOTTES gehören in die Mystik, bzw. in die <span style="color:#4C58FF">„Theologie“</span>.
===<div class="center"><span style="color:#660066">Die Bedeutung des Kalküls</span></div>===
<div class="center">Immanuel KANT und Kurt GÖDEL im ‚Dialog‘</div>
KANT sagt ''':'''
::<span style="color:#FF6000">»</span>'''''Sein''' ist offenbar kein reales Prädikat''. ... ''Es ist bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Position'' <span style="color:#00B000">[ latinisiert, deutsch für ''':''' ,Setzung‘ ]</span> ''eines Dinges ... Nehme ich nun das Subjekt (Gott) mit allen seinen Prädikaten'' <span style="color:#00B000">[ d.h. Eigenschaften ]</span> ''(worunter auch die Allmacht gehört) zusammen, und sage ''':''' ‚'''Gott ist'''‘'', <span style="color:#00B000">[ ,GOTT existiert wirklich‘ ]</span>, ''oder ‚es ist ein Gott‘, so <u>setze</u> ich kein neues Prädikat'' <span style="color:#00B000">[ keine neue Eigenschaft ]</span> ''zum ‚Begriffe‘ von Gott ''':''''' <span style="color:#00B000">[ <span style="color:#0000FF; background-color:#FFFF00">‚Sein’ ist kein ‚reales Prädikat’ in GOTT</span>; ‚Existenz‘ ist in GOTT keine ‚Eigenschaft‘ ],</span> ... ''es kann daher zu dem Begriffe'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''der bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Möglichkeit ausdrückt, darum, dass ich dessen Gegenstand'', <span style="color:#00B000">[ GOTT ]</span>, ''als schlechthin gegeben (durch den Ausdruck ''':''' er ist'', <span style="color:#00B000">[ GOTT ist wirklich ]</span>'' ) <u>denke</u>, nichts weiter hinzukommen.'' <span style="color:#00B000">[ Beides ist ,bloß gedacht‘ '''!''' ]</span> ''Und so enthält das Wirkliche nichts mehr als das bloß Mögliche. Hundert ‚wirkliche‘ Taler enthalten nicht das mindeste <u>mehr</u>, als hundert ‚mögliche‘. Denn, da diese den'' <span style="color:#00B000">[ gedachten ]</span>'' ‚Begriff‘, jene aber den Gegenstand und dessen'' <span style="color:#00B000">[ gedachte ]</span>'' Position an sich selbst bedeuten, so würde, im Fall dieser'', <span style="color:#00B000">[ die 100, als ,wirklich‘ bloß gedachten Taler ]</span>, ''<u>mehr</u> enthielte als jener,'' <span style="color:#00B000">[ als ihr ‚gedachter‘ Begriff im Verstand, wie ΑNSELM von Canterbury für GOTT, als ‚wirklich‘ Existierenden, argumentierte, …''so würde'' ]</span> ''mein ‚Begriff‘'' <span style="color:#00B000">[ die 100 im Verstand ‚gedachten‘ Taler ]</span> ''nicht den ganzen Gegenstand ausdrücken, und also auch <u>nicht der angemessene Begriff</u> von ihm sein. Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben'', <span style="color:#00B000">[ als bei 100 bloß ‚gedachten‘ Talern ]</span> ... <span style="color:#FF6000">«</span> <span style="color:#00B000"><ref>‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 401; https://www.korpora.org/kant/aa03/401.html</ref></span>.
GÖDEL würde darauf <span style="color:#00B000">(korrespondierend zur aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition von der Identität von Sein und Wesen in GOTT)</span> antworten ''':'''
::<span style="color:#FF6000">»</span>Die <span style="color:#FF6000">„100 Taler“</span> sind der <span style="color:#FF6000">»''zufälligen Struktur der'' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> entnommen, und sind daher nicht mit GOTT vergleichbar, der, <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer Welt, <span style="color:#FF6000">„über“</span> dieser Welt steht. Einzig und allein nur von GOTT gilt ''':''' Der mit Dingen aus unserer Welt ,nicht vergleichbare‘ GOTT, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#FF6000">„existiert notwendig für uns“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, und <span style="color:#FF6000">„notwendiges Existieren, <u>Sein</u>“</span> ,ist‘ eine <span style="color:#FF6000">„positive <u>Wesen</u>seigenschaft“</span> in GOTT, <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, weil GOTT aus sich <span style="color:#FF6000">„vollkommen“ <span style="color:#00B000">|</span> „perfekt“</span> ist, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#0000FF; background-color:#FFFF00">‚Sein‘ ist in GOTT ein ‚reales Prädikat‘</span>; <span style="color:#00B000">(notwendige ‚Existenz’ ist eine positive ‚Wesenseigenschaft’ in GOTT)</span>, und nur bei GOTT '''!''' Zum zeitlos-ewigen GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(als methodologische Kalkül-Prämisse)</span>, kann man sagen ''':''' Weil es, wegen Axiom-1 und Axiom-2, <span style="color:#FF6000">„widerspruchsfrei möglich"</span> ist, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, darum ist GOTT auch das ‚einzige‘ <span style="color:#FF6000">„Wesen“</span>, <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, von dem ein Christ sagen kann, dass es <span style="color:#FF6000">„notwendig aus sich“</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, d.h. <span style="color:#FF6000">„grundlos“ <span style="color:#00B000">|</span> „unverursacht“</span>, für uns immer schon ‚da’ ist, und immer ,da’ sein wird; und zusätzlich gilt ''':''' Es gibt für jede mögliche Welt ‚nur‘ diesen einen GOTT ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ — </span><span style="color:#00B000">(Monotheïsmus, Korollar-3)</span>; vorausgesetzt, man geht von der ,Existenz’ dieses GOTTES aus, wobei diese Annahme für GÖDEL <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist.<span style="color:#FF6000">«</span>
Eine Beobachtung ''':''' KANT sagt, gleichsam als ,krönenden‘ Abschluss seiner Widerlegung des, — von ihm so genannten —, ,ontologischen Gottesbeweises‘ ''':''' <span style="color:#FF6000">»</span>''Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben, (d.i. ihrer Möglichkeit).''<span style="color:#FF6000">«</span> Diese Feststellung KANTS entspricht jedoch genau der Argumentation ANSELMS ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span>, d.h. GOTT ,existiert auch in Wirklichkeit‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was <u>mehr</u> ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ein bloßer Begriff ,im Verstand zu sein‘. Der ,Mehr-Wert‘ ergibt sich in beiden Fällen, sowohl bei den Talern als auch bei GOTT, aus der ,Wirklichkeit‘ ihrer Existenz, im Gegensatz zur bloßen, <span style="color:#00B000">(im Begriff gedachten)</span>, ,Möglichkeit‘ ihrer Existenz, so dass, in jedem Fall, der ,Begriff‘ im Verstand ohne Abstriche <span style="color:#FF6000">»</span>''den ganzen Gegenstand ausdrückt''<span style="color:#FF6000">«</span>, und von diesem auch <span style="color:#FF6000">»</span>''der angemessene Begriff''<span style="color:#FF6000">«</span> ist. Alles andere wäre eine ,Lüge‘. Mit dieser ,Beobachtung‘ ist das implizit ,Widersprüchliche‘ in KANTS Argumentation aufgedeckt ''':''' Das Wirkliche in KANTS Vermögenszustande enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, konträr zu seiner vorigen Behauptung ''':''' <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#FF6000">«</span> enthalte <span style="color:#FF6000">»'',nichts mehr‘</span> als das bloß Mögliche''<span style="color:#FF6000">«</span>. Diese Behauptung ist offensichtlich falsch. Das ist somit ein indirekter Beweis und damit eine Bestätigung für die analoge Argumentation ANSELMS aus dem Wiederspruch des Gegenteils, am Beispiel KANTS <span style="color:#FF6000">»</span>''Vermögenzustandes bei hundert wirklichen Talern''<span style="color:#FF6000">«</span>, in dem in Wirklichkeit <span style="color:#FF6000">,doch mehr‘</span> ist, <span style="color:#FF6000">»</span>''als bei dem bloßen Begriffe derselben''<span style="color:#FF6000">«</span>.
<span style="color:#00B000">(Diese ,Beobachtung‘ ist zugleich auch das entscheidende Indiz dafür, dass das systembedingte Konzept KANTS von der ,Existenz‘, bzw. vom ,Sein‘ eines jeden Gegenstandes, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.i. als seine ,Setzung‘ bloß im- und durch den Verstand, ,falsch‘ ist, — d.h. im Klartext ''':''' für KANT ist das ,Sein‘ eines Gegenstandes bloß ein ,Gedanke‘ in uns, wenn er meint, dass uns ein Gegenstand erst dann wirklich ,gegeben‘ sei, wenn wir uns den</span> <span style="color:#FF6000">»</span>''Gegenstand als schlechthin gegeben (durch den Ausdruck : <u>er ist</u>) <u>denken</u>''<span style="color:#FF6000">«</span>, <span style="color:#00B000">was nur dem Irrtum einer falschen System-Konzeption geschuldet sein kann. Auf Grund dieser Konzeption ist das</span> <span style="color:#FF6000">»</span>''Ding, wie es an sich selbst ist''<span style="color:#FF6000">«</span>, <span style="color:#00B000">für KANT systembedingt weder ,anschaubar‘, noch ,erkennbar‘. Diese falsche Konzeption über die ,Existenz‘, bzw. das ,Sein‘ eines Dinges, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">ist für KANT letztendlich auch die Beweisgrundlage und Voraussetzung für seine Ablehnung des ontologischen Argumentes für GOTT im Theorem ANSELMS. Wenn das ,wirkliche‘ Sein eines Dinges nichts anderes ist, als</span> <span style="color:#FF6000">»</span>''dessen'' <span style="color:#00B000">[ bloß gedachte ]</span> ''Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.h. als seine ,mögliche‘ Setzung bloß im- und durch den Verstand, — das ist das, als ,wirklich‘ bloß nur ,gedachte‘ Ding —, dann</span> <span style="color:#FF6000">»</span>''enthält''<span style="color:#FF6000">«</span> <span style="color:#00B000">natürlich</span> <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#00B000">, [ als die bloß gedachte Existenz ],</span> ''nichts mehr als das bloß Mögliche''<span style="color:#00B000">, [ als der gedachte Begriff ]<span style="color:#FF6000">«</span>, was offensichtlich unhaltbar ist. <span style="color:#4C58FF">[ Modus tollendo tollens ] </span> ''':''' Wenn die Konsequenz einer Wenn-Dann-Folgerung ,falsch‘ ist, dann ist auch ihre Voraussetzung, das System-Konzept KANTS, ,falsch‘ ''':''' d.i. seine ,Kopernikanische Wende‘ für die Metaphysik, soweit sie KANTS ,Sein’-Konzept betrifft. Korrekt und ,wahr‘ ist in jedem Fall ''':''' Das Wirkliche enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, und die Dinge ,existieren‘ schon immer unabhängig von unserem Denken. ,Existenz‘, das ,Sein‘, ist <span style="color:#FF6000">,doch mehr‘</span>, als bloß ein ,Gedanke‘ von uns.)</span>
Somit ist die Argumentation KANTS gegen den ontologischen Beweis ANSELMS für GOTT ,falsch‘ und unhaltbar, weil sie auf der ,falschen‘ Voraussetzung beruht ''':''' die ,Existenz‘, bzw. das ,Sein‘ eines jeden ,Gegenstandes‘, — wie z. B. auch die Existenz bei GOTT —, sei bloß dessen gedachte ,Position‘ an sich selbst, d.h. bloß seine ,Setzung‘ im- und durch den Verstand. Damit ,macht‘ er GOTT außerdem zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, und verkennt so, — wie vor ihm THOMAS von Aquin —, auch die Einzigartigkeit und Exklusivität GOTTES im Theorem ANSELMS.
<div class="center">Die <span style="color:#FF6000">„Rede von GOTT“</span> in der philosophischen Tradition</div>
Wenn man die philosophische Tradition der <span style="color:#FF6000">„Rede von GOTT“</span> im Lichte der Ergebnisse der <span style="color:#4C58FF">„axiomatischen Theologie“</span> GÖDELS liest, dann stellt sie sich am Beispiel bei ARISTOTELES, — AVICENNA, — ANSELM, und bei GÖDEL wie folgt dar ''':'''
<span style="color:#FF6000">»''Das Erstbewegende,'' (<span style="font-family: Times;"><big>,πρῶτον κινοῦν‘</big></span>), ''das, ohne selbst ‚bewegt‘ zu sein'', (<span style="font-family: Times;"><big>,ἀκίνητον‘</big></span> <span style="color:#00B000">| ''unverursacht, ,entstehungslos‘'' |</span> ), ''alles Übrige wie ein Geliebtes ‚bewegt‘'', (<span style="font-family: Times;"><big>,κινεῖ δὴ ὡς ἐρώμενον‘</big></span> <span style="color:#00B000"> | ''-verursacht, ,entstehen‘ lässt'' |</span> ), ''ist sowohl'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚Wesen‘'', (<span style="font-family: Times;"><big>,ἀΐδιον καί οὐσία‘</big></span> <span style="color:#00B000">| ''‚Substanz‘'' |</span> ), ''als auch'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚wirksames, verwirklichendes Sein‘'', (<span style="font-family: Times;"><big>‚ἀΐδιον καί ἐνέργεια οὖσα‘ = ‚actus purus‘</big></span><span style="color:#00B000"> | '',reine Tätigkeit‘'' |</span> ), … ''ersehnt'', (<span style="font-family: Times;"><big>,ὀρεκτόν‘</big></span>), ''und erkennbar'', (<span style="font-family: Times;"><big>,νοητόν‘</big></span>), ... ''denn dies ist der ‚Gott‘'', (<span style="font-family: Times;"><big>,τοῦτο γὰρ ὁ θεός‘</big></span>), <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, ''der'' <span style="color:#00B000">[ zeitlich-]</span>''Ewige'', (<span style="font-family: Times;"><big>,ἀΐδιον‘</big></span>), — ''der Unvergleichliche'', (<span style="font-family: Times;"><big>,ἄριστον‘</big></span> <span style="color:#00B000">| ''‚der Beste‘'' |</span> ), — ''der Lebendige'', (<span style="font-family: Times;"><big>,ζῷον‘</big></span> <span style="color:#00B000">| ,''das Leben selbst‘'' |</span> ), — ... ''so sagen wir ja'', (<span style="font-family: Times;"><big>,φαμὲν δὴ‘</big></span>), — ...«</span> ''':''' <span style="color:#00B000">(ARISTOTELES — Grieche)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als ,Individuumname‘, ist synonym mit <span style="color:#FF6000">„göttliches ‚Da-Sein’“</span>, das sowohl <span style="color:#FF6000">„aus sich vollkommen“</span>, als auch <span style="color:#FF6000">„notwendig für uns“</span> ‚da‘ ist; <span style="color:#00B000">(das ist das, an sich, vollkommene ‚Was-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, das zugleich, für uns, das notwendige ‚Da-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> — ist)</span>; <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span>. Das ist der <u>angemessene Begriff</u> von GOTT, und gilt ‚nur‘ von GOTT. Weil GOTT <span style="color:#FF6000">„vollkommen“</span> ist, ist <span style="color:#FF6000">„Da-Sein“ <span style="color:#00B000">|</span> „GOTT-Sein“ <span style="color:#00B000">|</span> „Göttlichkeit“</span> das <span style="color:#FF6000">„Wesen“</span> GOTTES ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>. Im Unendlichen, GOTT, sind <span style="color:#FF6000">„Essenz“</span> und <span style="color:#FF6000">„Existenz“</span> koinzident ,eins‘, und daher untrennbar, und <span style="color:#FF6000">»''darum ist GOTT das einzige ‚Sein’, das notwendig an sich ‚da‘ ist''«</span> ''':''' <span style="color:#00B000">(ABU ALI SINA alias AVICENNA — Muslim)</span>.
Der <span style="color:#00B000">(gedachte)</span> ‚Eigenschafts-Begriff‘ <span style="color:#FF6000">„Vollkommenheit (die Größe) GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#00B000">(‚Perfektion‘, die unbegrenzte Summe aller ‚positiven Eigenschaften‘ in GOTT)</span> schließt koinzident die ‚Eigenschaft’ <span style="color:#FF6000">„notwendige Existenz für uns“</span> mit ein ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>. GOTT wäre nicht <span style="color:#FF6000">„vollkommen“</span>, wenn er nicht auch real für uns ‚da‘ wäre, wenn er nicht ,immer schon’ <span style="color:#FF6000">„existierte“</span>. ‚Sein’ ist <u>mehr</u> als ‚Nicht-Sein’. ,Sein’, bzw. ,Existenz’ gehört in GOTT zu den ,Transzendentalia’. Das sind die <span style="color:#00B000">(ultimativen)</span> ,Wesenseigenschaften’ in GOTT. Der unbegrenzt Unendliche, GOTT, ist daher das <span style="color:#FF6000">»''vollkommenste Wesen, über das nichts ,Größeres‘ d.h. Vollkommeneres <u>mehr</u> ‚gedacht‘ werden kann''«</span> ''':''' <span style="color:#00B000">(ANSELM von Canterbury — Christ)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„Perfektion GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schließt koinzident das <span style="color:#FF6000">„notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> —, für uns mit ein, ohne einen zeitlichen Anfang und ohne ein zeitliches Ende. Das ist die ‚zeitlos-ewige‘, an sich absolute, und <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#00B000">(Das ist ein ,regulär‘-mögliches Korollar im 2. Beweisgang aus Term :16: ''':''' <span style="color:#4C58FF">— ‚'''Gy→Yy'''‘ —</span>, mit der <span style="color:#4C58FF">[ Instanz(Y:=E<sub>not</sub>) ]</span>, und der <span style="color:#4C58FF">[ FUB(y:=x) ]</span>; und auch ein ,regulär‘-mögliches Korollar im 3. Beweisgang ''':''' entsprechend der <span style="color:#FF6000">„logischen Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A → B ]</span> von Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> und Term :05: <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span> aus diesem Beweisgang. In Worten ''':''' <span style="color:#FF6000">»</span>''Angenommen, '' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> ''steht für den GOTT der Christen'' ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ — </span>, ''dann existiert dieser GOTT'', <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, ''für uns notwendig'', <span style="color:#4C58FF">— <sub>not</sub> —</span> <span style="color:#FF6000">«</span>.)</span> Der Unendliche, GOTT, ist <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer ‚vergänglichen‘, ,endlichen‘ Welt, welche prinzipiell vom dreidimensionalen Raum und von der unwiederbringlich ‚vergehenden‘ Zeit geprägt ist. Der ,GOTT der Christen‘ ist <span style="color:#FF6000">»''unabhängig''«</span> von dieser <span style="color:#FF6600">„vergehenden Raum-Zeit“, — »''jenes rätselhafte und anscheinend in sich widersprüchliche Etwas''« <span style="color:#00B000">(GÖDEL)<ref>Kurt GÖDEL, ‚''<span style="font-family: Times;"><big>Eine Bemerkung über die Beziehungen zwischen der Relativitätstheorie und der idealistischen Philosophie‘</big></span>'', in P.A.SCHILPP (Hg.): ‚''<span style="font-family: Times;"><big>Albert Einstein, Philosoph und Naturforscher‘</big></span>'', Seite 406</ref></span> —</span>. Ohne ‚Zeit‘ gibt es keinen zeitlichen Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘, <span style="color:#00B000">(beides ist zeitlos ,eins‘)</span>, und so ist der zeitlos-ewige GOTT, der <span style="color:#FF6000">»''notwendig aus sich ,existiert‘'' «</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ — </span>, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> für uns immer schon ‚da‘ ''':''' <span style="color:#00B000">(GÖDEL — ohne religiöses Bekenntnis)</span>.
Mit dem GÖDEL-Kalkül ist die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt worden, und ist somit für jeden Menschen nachvollziehbar, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie obige Beispiele zeigen.
'''Resümee :'''
Das GÖDEL-Kalkül zeigt mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, was notwendig folgt, wenn die Axiome ‚wahr‘ sind, <span style="color:#00B000">(die Axiome bilden formal-syntaktisch <span style="color:#FF6000">»''die theologische Weltanschauung''«</span> ab)</span>, unter der Voraussetzung, dass die Axiome <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>'' Struktur''«</span> unserer Welt sind. Die ,Verifikation‘ der Axiome und Definitionen von GOTT und seiner Vollkommenheiten gelingt GÖDEL, — entsprechend seiner Unabhängigkeits-Bedingung —, durch den Aufweis ihrer Widerspruchsfreiheit ''':''' sie sind somit ,wahr‘ und, — im Kontext einer <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> —, auch ,annehmbar‘ in unserer ,realen‘ Welt ''':''' <span style="color:#00B000">(siehe Anhang, 2. Beweisgang und Anmerkung-2)</span>. Er vermeidet damit den Fehler, der immer wieder im Diskurs über Gottesbeweise gemacht wird ''':''' GOTT mit seinen Geschöpfen zu vergleichen. Diese logisch-philosophische Rede von GOTT <span style="color:#00B000">(<span style="color:#FF6000">»''ohne sich auf den Glauben an irgendeine Religion zu stützen''«</span>)</span> hat eine <u>mehr</u> als zweitausendjährige Tradition hinter sich. Der <span style="color:#FF6000">„100-Taler-Gott“</span> des Philosophen KANT, hat heute, nachdem der Logiker und Systemtheoretiker GÖDEL sein System vorgelegt hat, an ‚Strahlkraft‘ verloren.
Kurt GÖDEL ''':'''
::<span style="color:#FF6000">» ''Die theologische Weltanschauung'', <span style="color:#00B000">[ dass GOTT für uns immer schon ‚da‘ ist ]</span>, ''ist rein verstandesmäßig mit allen bekannten Tatsachen durchaus vereinbar'';«</span> <span style="color:#00B000">[ d.h. sie ist das ,Resultat‘ der, — vom Glauben geleiteten —, ‚theoretischen Vernunft‘, alias ‚reinen Vernunft‘, und nicht bloß das ‚Postulat‘ einer ‚praktischen Vernunft‘, wie KANT meint ]. <span style="color:#FF6000">»''Der'' <span style="color:#00B000">[ christliche ]</span> ''Glaube ist die ‚Pupille‘ im ‚Auge‘ unseres Verstandes.''«</span> (Heilige KATHARINA von Siena, Lehrerin der Kirche, Patronin Europas<ref>vgl. <span style="font-family: Times;"><big>''Gebet 7 ‚Für die neuen Kardinäle‘, Rom, 21. Dezember 1378,''</big></span> aus <span style="font-family: Times;"><big>''Caterina von Siena ,Die Gebete‘.''</big></span> Kleinhain 2019, online: https://caterina.at/werke/gebete/gebete-detailansicht/gebet-7.html</ref> )</span>
Der sonst so rationale KANT, hier doch etwas emotionell, <span style="color:#00B000">(als wolle er die Ergebnisse im GÖDEL-Kalkül nicht wahr haben, die belegen, dass er sich bei GOTT geirrt, und die Funktion des christlichen Glaubens für die Philosophie falsch eingeschätzt hat)</span> ''':'''
::<span style="color:#FF6000">»</span> ''Es war etwas ganz Unnatürliches und eine bloße Neuerung des Schulwitzes, aus einer ganz willkürlich entworfenen Idee das Dasein des ihr entsprechenden Gegenstandes selbst ausklauben zu wollen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 403. https://www.korpora.org/kant/aa03/403.html</ref>.<span style="color:#FF6000">«</span>
Für KANT, für die Scholastiker, <span style="color:#00B000">(und auch für uns)</span>, ist es natürlich ‚logisch‘, dass aus einem als ‚möglich’ gedachten Begriff, <span style="color:#FF6000">»</span>''aus einer ganz willkürlich entworfenen Idee''<span style="color:#FF6000">«</span>, keine Existenzaussage abgeleitet werden kann. <span style="color:#00B000">(Aus dem bloß gedachten Begriff ,goldene Berge‘ folgt natürlich nicht, dass es solche in Wirklichkeit auch gibt.)</span> In der philosophisch-<span style="color:#4C58FF">,theologischen’</span> Tradition, die von ARISTOTELES herkommt, ist der Begriff <span style="color:#FF6000">»''GOTT''«</span> jedoch von allen anderen Begriffen so verschieden, so dass für GOTT diese Logik KANTS nicht mehr gilt. GOTT ist ,unvergleichlich‘ und ,einzigartig‘.
Dazu der Kommentar von HEGEL ''':'''
::<span style="color:#FF6000">»''Wenn KANT sagt, man könne aus dem Begriff'' <span style="color:#00B000">[ ‚GOTT‘ ]</span> ''die Realität nicht ,herausklauben‘, so ist da der Begriff als endlich gefasst''.« <span style="color:#00B000">[ In der Endlichkeit unserer Welt trifft die Logik KANTS zu, dass dem ‚Begriff‘ nicht ,notwendig‘ das ‚Sein‘ folgt, denn es gibt in ihr die ,Lüge‘, die das ,Wirklich-Sein‘ im Begriff bloß behauptet, ohne dass es ,in Wirklichkeit‘ zutrifft, was sie behauptet. Es gilt hier nach KANT ''':''' »''Sein ist kein reales Prädikat''«. Somit ist ]</span> »''...der Begriff ohne'' <span style="color:#00B000">[ reales ]</span> ''Sein ein Einseitiges und Unwahres, und ebenso das Sein, in dem kein Begriff ist'', <span style="color:#00B000">[ ist ]</span> ''das begrifflose Sein,'' <span style="color:#00B000">[ d.i. das relative ,Noch-Nicht-Begriffene‘ ]</span>.'' Dieser Gegensatz, der in die Endlichkeit fällt'' <span style="color:#00B000">[ im Endlichen zutrifft ]</span>, ''kann bei dem Unendlichen, GOTT, gar nicht statthaben''<ref>Georg Wilhelm Friedrich HEGEL, ‚<span style="font-family: Times;"><big>''Ausführungen des ontologischen Beweises''</big></span>‘ in den ‚<span style="font-family: Times;"><big>''Vorlesungen über die Philosophie der Religion vom Jahr 1831''</big></span>‘ . Hamburg 1966, Seiten 175 bzw. 174</ref>; <span style="color:#00B000">[ denn ,Begriff‘, bzw. ,Denken‘ und ,Sein‘ sind in dem Unendlichen, GOTT, untrennbar und real immer dasselbe. Auf Grund dieser ontologischen Identität ,personifiziert‘ und ,repräsentiert‘ GOTT die ,Wahrheit‘ ''':''' GOTT ist die ,Wahrheit‘. In GOTT, dem <span style="color:#FF6000">„Schöpfer der Welt“</span>, folgt dem ,Begriff‘ immer ,notwendig‘ das ,Sein‘ ''':''' <span style="color:#CC66FF">»''GOTT sprach ''':''' Es werde ,Licht‘. Und es wurde Licht''«, <small>{{Bibel | Genesis |1|3|EU}}</small>;</span> oder auch ''':''' <span style="color:#CC66FF">»''Der Herr sprach, und sogleich geschah es; er gebot, und alles war da''«,</span> <small>{{Bibel | Psalm |33|9|EU}}</small>.]</span>«</span>
Das Entscheidende bei der <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls ist, dass der <span style="color:#00B000">(Begriff)</span> GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, nicht auf die Ebene seiner ,endlichen‘ Geschöpfe und unserer Welt gestellt wird, <span style="color:#00B000">(d.i. das ‚Universum‘ im ,Urknall‘, die ‚100-Taler‘, ein ‚Tsunami‘, auch ,einfache Modelle‘ von unserer Welt, etc.)</span>, und damit verglichen wird, sondern, dass der GOTT der Christen in seiner Einzigartigkeit und Besonderheit als <span style="color:#FF6000">»''der Unendliche''«</span> belassen und als <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer vergänglichen Welt, — als <span style="color:#FF6000">»''der Unvergleichliche''«</span> —, verstanden wird. <span style="color:#00B000">(Alle Kritiken des sog. ,ontologischen‘ Gottesbeweises übersehen die Einzigartigkeit und Besonderheit des <span style="color:#FF6000">»''Unendlichen''«</span>, und/oder wollen diese nicht ,wahr‘ haben.)</span> Auch THOMAS von Aquin ,verortet‘ den GOTT ANSELMS, — in seiner Kritik an dessen Theorem —, irrtümlich unter die ,Dinge‘ der uns umgebenden ,Natur‘, wenn er sagt ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse in rerum natura</big></span>“</span>, d.h. wörtlich, dass der GOTT ANSELMS <span style="color:#FF6000">»</span>''in der Natur der Dinge'' <span style="color:#00B000">(unserer Welt)</span> ''existiert''<span style="color:#FF6000">«</span>, und verkennt somit, — wie nach ihm auch KANT —, die ,Unvergleichlichkeit‘ GOTTES, <span style="color:#00B000">(vgl. STh I q.2 a.1 ad 2<ref>„Deus … illud quo maius cogitari non potest; non tamen propter hoc sequitur quod intelligat id quod significatur per nomen, esse in rerum natura; sed in apprehensione intellectus tantum.“ ——— »''GOTT ist'' (nach ANSELM) ''der, über den Größeres nicht mehr gedacht werden kann. Aber nicht deswegen, weil er'', (der Narr von Psalm 14.1, den ANSELM zitiert), ''das versteht, was durch diesen Namen,'' (d.h. mit dem Begriff ,GOTT‘, als der ,Größte‘, im Theorem ANSELMS), ''bezeichnet wird, folgt daraus'', (wie ANSELM meint), ''dass er auch versteht, dass er'', (der GOTT ANSELMS), ''auch in der ,Natur‘ der Dinge'' (unserer Welt) ''existiert''; <span style="color:#00B000">[ was ANSELM so nie gesagt hat ]</span>. ''Daraus folgt nur, dass er'', (als ,GOTT‘), ''bloß in der Auffassung seines Verstandes'', (d.h. nur im Denken des Narren als ,Begriff‘), ''existiert.''« ——— Hier ,verortet‘ THOMAS einerseits den unendlichen GOTT, von dem das Theorem ANSELMS spricht, irrtümlich unter die endlichen Dinge der uns umgebenden ,Natur‘, was sachlich dem theologischen Theorem der Unvergleichlichkeit GOTTES widerspricht, der nicht unter die Dinge unserer Welt eingereiht werden darf. Anderseits verliert er dadurch auch den ,Blick‘ für die Außerordentlichkeit und Besonderheit GOTTES, dessen Natur völlig verschieden und unabhängig von der ,Natur‘ unserer raum-zeitlichen Welt ist. GÖDEL beweist jedoch, mit ANSELM, weil es notwendig, ohne Widerspruch, (»''bloß in der Auffassung unseres Verstandes''«), möglich ist, dass GOTT existiert, ist es korrekt, daraus auch mit Notwendigkeit zu folgern, dass der Glaube des Erzbischofs ANSELM, und der Glaube seiner Anvertrauten, von der Wirklichkeit GOTTES, widerspruchsfrei, logisch richtig, und damit sinnvoll ist; denn Möglichkeit und Wirklichkeit sind in GOTT koinzident ,eins‘. Das ist das Privilegium GOTTES allein, der einzigartig und unvergleichlich ist. Damit zeigt er auf, dass THOMAS die Unvergleichlichkeit und Einzigartigkeit GOTTES in seinem Vorhalt nicht bedacht hat; und außerdem ANSELM missverstanden hat.</ref>)</span>; jedenfalls hier in der Auseinandersetzung mit ANSELM. Dagegen spricht ANSELM im ,''<span style="font-family: Times;"><big>Proslogion</big></span>''‘, Seite 85f, nur von einem <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span> GOTTES, d.h. dass GOTT ,auch in Wirklichkeit existiert‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was ,größer‘, bzw. ,mehr‘ ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ,im Verstand zu sein‘; wobei die ,zeitlose-überzeitliche‘ Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES jedoch völlig verschieden und <span style="color:#FF6000">»''unabhängig von der zufälligen''«</span> Wirklichkeit <span style="color:#00B000">(die ,Natur‘)</span> der ,raum-zeitlichen‘ Welt der Dinge ist. Daher ist sie mit dieser auch nicht vergleichbar. GOTT ist <span style="color:#FF6000">„vollkommen“</span> und alle <span style="color:#FF6000">„Vollkommenheiten“</span> in GOTT, <span style="color:#00B000">(die ultimativen ,Transzendentalia‘)</span>, sind koinzident ,eins‘, — ,fallen <span style="color:#FF6000">„notwendig“</span> perspektivisch in eins zusammen‘, und sind daher konvertierbar. Darum ist auch die Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES ,einzigartig‘ und ,unvergleichlich‘.
Mit Korollar-3 ist die Exklusivität und Außerordentlichkeit GOTTES definitiv im Kalkül ,bewiesen‘ <span style="color:#00B000">( ╞ )</span>. Der abendländische Monotheïsmus ist somit eine ,logische‘ Konsequenz aus den GÖDEL-Axiomen. <span style="color:#00B000">(Das <span style="color:#4C58FF">„theologische“</span> Theorem von der ,Einzigartigkeit‘ und Exklusivität GOTTES, d.h. hier im Kontext ''':''' die exklusive Einheit von GOTT und Mensch in JESUS CHRISTUS; von Vater, Sohn und Geist im <span style="color:#4C58FF">„Dreifaltigen“</span>; von Essenz und Existenz, von Begriff und Sein, von Ursache und Wirkung, von Subjekt und Objekt, von Möglichkeit und Wirklichkeit, und die unbegrenzte Summeneinheit und Koinzidenz der unendlichen Transzendentalien in GOTT, ist, — mit HEGEL —, die Voraussetzung und Bedingung jeder Philosophie ''':''' <span style="color:#FF6000">»''Die Einheit muss am Anfang der Philosophie stehen''«</span>; und ist zugleich auch ihr gesuchtes und bewiesenes Endergebnis und Ziel ''':''' <span style="color:#FF6000">»''Diese Einheit muss auch das Resultat der Philosophie sein''«</span><ref>https://hegel-system.de/de/gottesbeweis.htm#hegels-kritik-an-kant</ref>, was hier im GÖDEL-Kalkül ,logisch‘ mit Korollar-3 verifiziert wird ''':''' <span style="color:#4C58FF">— ‚'''□(∃xGx ∧ ∀y(Gy→x=y))'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist exklusiv einzigartig''«</span>.)</span>
Die Einzigartigkeit GOTTES bedingt die Koinzidenz, den inneren Zusammenhang aller seiner Vollkommenheiten und Zuschreibungen, <span style="color:#00B000">(Axiom-2)</span>, d.h. ihr paarweise, perspektivisches ,Zusammenfallen in eins‘ im Unendlichen, GOTT. ——— Aus der Notwendigkeit aller positiven Eigenschaften und Zuschreibungen, <span style="color:#00B000">(d.h. aus den, an sich, notwendigen, ultimativen Transzendentalien, Axiom-4)</span>, die in GOTT paarweise, als ,Wesenseigenschaften‘ koinzident ,eins‘ sind, <span style="color:#00B000">(Definition-2)</span>, ist die Einzigkeit GOTTES für uns erschließbar, <span style="color:#00B000">(Korollar-3)</span>. Axiom-4 ist die erste, ,modal‘ <span style="color:#FF6000">„notwendige“</span>, d.h. die transzendentale Voraussetzung für Korollar-3.
Wenn im Korollar-3 das <span style="color:#4C58FF">— ‚'''x'''‘ —</span> z. B. für GOTT, dem ,Vater‘ der Christen, und das <span style="color:#4C58FF">— ‚'''y'''‘ —</span> für GOTT, dem ,Sohn‘, d.h. für ,JESUS CHRISTUS‘ steht, oder für den ,HEILIGEN GEIST‘, <span style="color:#00B000">(den ,Dreifaltigen GOTT‘ der Christenheit)</span>; oder auch für die Gottesbezeichnung ,GOTT-ADONAI‘ der Juden, oder für die Gottesbezeichnung ,ALLAH‘ der Muslime steht, dann weist dieses Korollar, für <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span>, mit der ,ontologischen Identität‘ ''':''' <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, auf die ,Koinzidenz‘ des <span style="color:#4C58FF">„Dreifaltigen“</span>, und auf die <span style="color:#4C58FF">„Hypostatische Union“</span> der Naturen von GOTT und Mensch in JESUS CHRISTUS,
bzw. auch auf den inneren Zusammenhang der drei Buch-Religionen hin.
===<div class="center"><span style="color:#660066">Anhang : das GÖDEL-Kalkül</span></div>===
In der ,Legende zum GÖDEL-Kalkül‘ wird an einige Basics erinnert, und diese für die operative Praxis im anstehenden Kalkül, mit Hilfe von logischen Meta-Terme, adaptiert. Zusätzliche, notwendige Regeln und Gesetze werden dann ,benannt‘, wenn sie in der Kalkül-Durchführung auftreten.
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">Legende zum GÖDEL-Kalkül</span></div>
|-
|
<small>
<math>\begin{align}
{\color{blue}\text{ ◇}} \text{ :: konsistent ↔ widerspruchsfrei ↔ möglich ↔ denkbar, } & {\color{blue}\text{ □}} \text{ :: notwendig ↔ wirklich, für jede mögliche Welt ↔ exklusiv} \\
\text{logischer Meta-Term ::} {\color{blue}\text{ [ A ├ B ]}} \text{ ::} & \text{ „aus A folgt im Kalkül ,regulär‘ (├ ) B.“} \\
\text{ A, B sind Aussagen über Eigenschaften, (A ist keine Eigenschaft);} & \text{ die Aussage, z.B. in der Kalkül-Zeile 10, wird als ,Term :10:‘ bezeichnet} \\
{\color{blue}\text{ AE}} \text{ ::} & \text{ Argument Einführung, Prämisse, Postulat } \\
{\color{blue}\text{ Xx}} \text{ ::} & \text{ „X ist eine Eigenschaft der Individuum-Variable x.“ } \\
{\color{blue}\text{ ¬PX}} \text{ ::} & \text{ „X ist keine positive Eigenschaft, ist keine Perfektion, ist nicht vollkommen.“ } \\
{\color{blue}\text{ Instanz(X := Y)}} \text{ ::} & \text{ Substitution der Eigenschaft X durch die ,bestimmte‘ Eigenschaft Y } \\
\text{ (Eine ,Instanz‘ ist ein Exemplar aus einer Menge gleichartiger Dinge;} & \text{ hier die ,bestimmte‘ Eigenschaft Y, als Ersatz für das unbestimmte X.) } \\
{\color{blue}\text{ FUB(x := y)}} \text{ ::} & \text{ Freie-Um-Benennung der Individuum-Variable x in y } \\
\text{ ,modal‘-frei gewählte Kalkül-Prämisse ::} {\color{blue}\text{ Gx}} \text{ ::} & \text{ „Die Variable x steht für den GOTT der Christen.“ } \\
{\color{blue}\text{ [ G(y) ├ ⱯyG(y) ]}} \text{ ::} & \text{ All-Operator-Einführung der Variable y für GOTT } \\
\text{ „Angenommen, die Variable y steht für GOTT, dann } & \text{folgt ,regulär‘ (├ ), dass auch jedes y im Kalkül für GOTT steht.“}\\
{\color{blue}\text{[ ⱯXA(X) ├ A(X) ]}} \text{ ::} & \text{ All-Operator-Beseitigung für die substituierte Eigenschaft X } \\
\text{ „Wenn X durch eine ,bestimmte‘ Eigenschaft ,instanziiert‘ ist oder } & \text{wird, dann kann der All-Operator von X ,regulär‘ (├ ) beseitigt werden.}\\
{\color{blue}\text{ KOMM(↔)}} \text{ ::} & \;{\color{blue}\text{[ (A↔ B) ↔ (B ↔ A) ]}} \text{ :: Kommutativgesetz für ( ↔ )}\\
{\color{blue}\text{ DIST(□∧)}} \text{ ::} & \;{\color{blue}\text{[ (□A ∧ □B) ↔ □(A ∧ B) ]}} \text{ :: Distributivgesetz für (□∧ )} \\
\text{ (hypothetischer Syllogismus, häufige logische Schlussregel) ::} & \;{\color{blue}\text{[ A → B, A ├ B ]}} \text{ :: (Modus ponendo ponens) :: Abtrennregel.} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn A wahr ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch B wahr ist.“} \\
\text{ (negativer hypothetischer Syllogismus) ::} & \;{\color{blue}\text{[ A → B, ¬B ├ ¬A ]}} \text{ :: (Modus tollendo tollens)} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn B falsch ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch A falsch ist.“} \\
\text{''KONDITIONALER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ A ├ B ╞ A → B ]}} \text{ :: (logische Implikation)} \\
\text{ „Angenommen, A ist ,regulär‘ Axiom oder Prämisse, und B ist im } & \text{Kalkül ,regulär‘ abgeleitet, dann ist ,bewiesen‘ ( ╞ ) : A impliziert B, ist wahr.“} \\
\text{''INDIREKTER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ ¬A → F ╞ A ]}} \text{ :: (Reductio ad absurdum)} \\
\text{ „Wenn im Kalkül aus ¬A ,regulär‘ eine Kontradiktion } & \text{F folgt, dann ist A ,bewiesen‘ ( ╞ ) : A ist ,wahr‘.“} \\
\end{align}</math>
</small>
|}
A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Eine Prädikatenlogik zweiter Stufe ist eine Logik, in der die Quantoren auch Eigenschaftsausdrücke <span style="color:#00B000">(<span style="color:#FF6000">„Prädikate”</span>)</span> binden können''. <span style="color:#00B000">[ Die ,Prädikate‘ werden in einem Kalkül dieser Logik durch Definitionen ,bestimmt‘ ]</span>. ''Wir werden uns im folgenden recht frei einer dafür geeigneten formalen Sprache bedienen. Äußere Quantoren werden meist weggelassen und wir schreiben kurz'' <span style="color:#4C58FF">— ‚'''Xx'''‘ — </span> ''bzw.'' <span style="color:#4C58FF">— ‚'''PX'''‘ — </span> ''um auszudrücken, dass das Individuum'' <span style="color:#4C58FF">— ‚'''x'''‘ — </span> ''die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''hat, bzw. dass die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''die höherstufige Eigenschaft'' <span style="color:#4C58FF">— ‚'''P'''‘ — </span> ''<span style="color:#00B000">(für <span style="color:#FF6000">„positiv”</span>)</span> hat;'' <span style="color:#00B000"> [ wobei die Eigenschaft <span style="color:#4C58FF">— ‚'''P'''‘ — </span> als einzige im Kalkül ,unbestimmt‘ bleibt ]</span>. <span style="color:#FF6000">«</span><ref>A. FUHRMANN ‚''<span style="font-family: Times;"><big>‚G‘ wie Gödel. Kurt Gödels axiomatische Theologie</big></span>''‘, Seite 6, Anmerkung 3. Konform mit seinem Artikel in ‚''<span style="font-family: Times;"><big>Logik in der Philosophie</big></span>''‘ hg. v. P. SCHROEDER-HEISTER, W. SPOHN und E. OLSSON. 2005, Synchron, Heidelberg.</ref>
Der All-Quantor für Eigenschaften, hier im GÖDEL-Kalkül der ,modalen‘ Prädikatenlogik zweiter Stufe, bindet die ,unbestimmte‘ Eigenschafts-Variable <span style="color:#4C58FF">— ‚'''X'''‘ —</span> ausschließlich nur in den Definitionen im 2. und 3. Beweisgang . <span style="color:#00B000"> (Im ersten Beweisgang gibt es keine Definition.)</span> Dieser All-Quantor wird dann jedes Mal in der Beweis-Durchführung durch die Substitution ''':''' <span style="color:#4C58FF"> [ Instanz(X:= ..) ]</span> mit ,bestimmte‘ Eigenschafts-Konstanten wie <span style="color:#4C58FF">— (X:= G) —</span>, bzw. <span style="color:#4C58FF">— (X:= ¬Y) —</span>, oder <span style="color:#4C58FF">— (X:= E<sub>not</sub>) —</span> ,regulär‘ <span style="color:#00B000">(├ )</span> beseitigt ''':''' <span style="color:#4C58FF"> [ ⱯXA(X) ├ A(X) ]</span>; wobei die Eigenschafts-Konstante im Kalkül entweder als Zwischenergebnis ,regulär‘ abgeleitet, <span style="color:#00B000">(,errechnet‘)</span>, oder mit einer Definition schon ,bestimmt‘ worden ist.
Die spezifische ‚Eigenschaft‘ einer Eigenschaft wird hier, in der formalen Syntax der ,modalen‘ Prädikatenlogik zweiter Stufe, als eine tiefer gestellte Abkürzung <span style="color:#00B000">(als Index)</span> an ihre Trägereigenschaft angehängt, wie z. B. ‚wesentlich‘, bzw. ‚essentiell‘ durch <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, oder ‚notwendig‘ durch <span style="color:#4C58FF"> — <sub>not</sub> —</span>. In der Definition-3 steht der Term ''':''' <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span>, um auszudrücken, dass das Individuum <span style="color:#4C58FF">— ‚'''x'''‘ —</span> notwendig <span style="color:#4C58FF">— <sub>not</sub> —</span> die Eigenschaft ''':''' <span style="color:#4C58FF">— ‚'''E'''‘ —</span>, für ,Existenz‘, hat, d.h. <span style="color:#FF6000">»''das <span style="color:#4C58FF">‚'''x'''‘</span> existiert notwendig''«</span>. Der schon von GÖDEL indizierte Term ''':''' <span style="color:#4C58FF">—‚'''G'''<sub>ess</sub>'''x'''‘ —</span> kann gelesen werden als ''':''' <span style="color:#FF6000">»''Das Individuum <span style="color:#4C58FF">‚'''x'''‘</span> hat die Wesenseigenschaft, <span style="color:#4C58FF"> — <sub>ess</sub> — </span> ''':''' GOTT zu sein, <span style="color:#4C58FF">‚'''G'''‘ </span>''«</span>, statt der ,an sich‘ konformen, aber <span style="color:#4C58FF">„theologisch“</span> etwas ungenauen Formulierung ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist wesentlich göttlich''«</span>; oder mit der Voraussetzung ''':''' <span style="color:#4C58FF">— ‚'''Gx'''→'''G'''<sub>ess</sub>'''x'''‘ — </span> deutlicher und <span style="color:#4C58FF">„theologisch“</span> korrekt ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für den GOTT der Christen'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span> ''das Wesen dieses GOTTES'', <span style="color:#4C58FF">— <sub>ess</sub>‚'''x'''‘ —</span>, <span style="color:#00B000">(,Essenz‘)</span>«</span>; wobei, — entsprechend der ,methodologischen‘ Prämisse des Kalküls <span style="color:#00B000">(<span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> ''':''' das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den ,GOTT der Christen‘)</span> —, bei der Interpretation der Terme dieses besonderen Kalküls, die <span style="color:#4C58FF">„christliche Theologie”</span> für den Begriff <span style="color:#FF6000">„GOTT”</span>, Korrektur und die leitende Instanz ist. Dabei muss die Dreifach-Äquivalenz von <span style="color:#4C58FF"><span style="color:#4C58FF">— ‚'''G'''‘ — </span></span>berücksichtigt werden. Welche der drei Äquivalenzen, bzw. Lesearten von <span style="color:#4C58FF">— ‚'''G'''‘ — </span> bei einem bestimmten Term im Kalkül zulässig ist, muss <span style="color:#4C58FF">„theologisch”</span> überprüft und evaluiert werden. Bei manchen können sogar alle drei Lesearten <span style="color:#4C58FF">„theologisch”</span> zulässig sein.
Warum es in der modalen Prädikatenlogik zweiter Stufe, im GÖDEL-System, ,Definitionen‘ gibt, erklärt GÖDEL formal-syntaktisch ''':''' <span style="color:#FF6000">»''Definitionen dienen ja nur der kürzeren Schreibwelse und sind daher prinzipiell überflüssig.''«</span> <span style="color:#00B000">(Aus der Anmerkung 6 in seinem Hauptwerk ''':''' ,''<span style="font-family: Times;"><big>Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I</big></span>''‘.)</span> Für die <span style="color:#4C58FF">„theologische”</span> Interpretation und Hermeneutik seines Kalküls, sind die ,Definitionen‘ im GÖDEL-System jedoch wesentlich, und letztlich entscheidend. Erst dadurch wird sein Axiomensystem zur <span style="color:#4C58FF">„axiomatischen Theologie”</span>. GÖDEL gibt selbst den hermeneutischen Hinweis dazu, wenn er über den höherstufigen Eigenschaftsbegriff <span style="color:#FF6000">»''positiv''«</span> sagt, der nur ,indirekt‘ definiert wird, jedoch mit seinem gesamten Axiomensystem ''':''' <span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne, (unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span> Die Deutung dieses ,höherstufigen‘ Begriffs als ein anderes Wort für <span style="color:#FF6000">„Transzendentalia“</span> ergibt sich aus der <span style="color:#4C58FF">„theologischen”</span> Evaluierung, d.h. der Einordnung des GÖDEL-Systems in die ,laufende‘ <span style="color:#FF6000">„Rede von GOTT“</span>, seit Menschen, sich über den Sinn der Welt und unseres Lebens in ihr, Gedanken machen. GOTT, der ,transzendent‘, — unabhängig —, zur Welt ist, ist Thema im Theorem ANSELMS, um das es ja im GÖDEL-Kalkül geht. Eine <span style="color:#4C58FF">„theologische”</span> Hermeneutik des GÖDEL-Systems ist daher legitim, die, als ein Bemühen um ein überzeugendes Verstehen, aus dem <span style="color:#4C58FF">„theologischen”</span> Vorwissen vieler Generationen schöpft.
Um philosophische, und sogar <span style="color:#4C58FF">„theologische”</span> Theoreme exakt zu formulieren, und untersuchen zu können, hat der Ausnahmelogiker GÖDEL, im 20. Jahrhundert, ein Tor aufgestoßen, das uns ermöglichen kann, <span style="color:#FF6000">»''mathematisch evident''«</span>, und logisch objektiv nachprüfbar, in diesen Disziplinen zu argumentieren. Mit seiner modalen Prädikatenlogik zweiter Stufe, hat GÖDEL dem alten Wunsch eines Raimundus LULLUS, eines Gottfried Wilhelm LEIBNIZ, eines Immanuel KANT, und anderer, nach einer nachprüfbaren ,Universalsprache‘ in den Geisteswissenschaften, entsprochen; analog zur Mathematik, als Universalsprache in den Naturwissenschaften. Der sog. ,Theorembeweiser‘ der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO, mit Hilfe eines Computers, im 21. Jahrhundert, ist die kongeniale und logische Folge aus diesem Quanten-Schritt GÖDELS.
In der folgenden Neu-Kalkülisierung, wird jeder einzelne operative Logik-Schritt des Kalküls in der '''linken Spalte''' nummeriert und als Term-Ergebnis angezeigt, und in der '''rechten Spalte''' werden die dafür benötigten Term-Komponenten und die dabei angewendeten Logik-Regeln und -Gesetze, mit Meta-Terme, dokumentiert. Am Anfang stehen die Ressourcen und das angestrebte Ziel des Beweisganges, <span style="color:#00B000">(das Theorem)</span>. Die GÖDEL Axiome und Definitionen, die Theoreme und Korollare, die Zwischenergebnisse, das Endergebnis, und die logischen Meta-Terme, <span style="color:#00B000">[ in eckigen Klammern ]</span>, werden kontextabhängig, <span style="color:#00B000">(durch ''„Benennungen“'')</span>, interpretiert, <span style="color:#00B000">(angezeigt durch ,Interpretationspunkte‘ — '''::''' —, falls nötig)</span>. Der jeweilige Beweisgang wird in den Anmerkungen ausführlich und umfassend kommentiert. Die Kalkül-Prämissen, <span style="color:#00B000">(<span style="color:#4C58FF">'''AE:'''</span> Argument Einführung)</span>, sind der modal-frei gewählte Einstieg in das Kalkül. Sie dokumentieren, zusammen mit dem angestrebten Beweis-Ziel, eine bestimmte Problemlage in einem externen Diskurs, der mit dem modalen Logik-System hier, formal-syntaktisch überprüft, und gegebenenfalls, verifiziert oder falsifiziert werden soll. Korollare sind einfache, logische Folgerungen aus dem jeweiligen Beweisgang. Theoreme und Korollare sind ,modal‘ gleichwertig.
====<div class="center"><span style="color:#660066">1. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 1, (Möglichkeitsbeweis)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe__________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist die Eigenschaft X nicht positiv“} \\
\text{(Axiom 2)} & \quad (P\ X \wedge \;\Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x)) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaften Y, die aus einer positiven Eigenschaft X modal} \\
\text{ } & \quad & \ & \; \; \text{notwendig folgen, sind auch positive Eigenschaften“} \\
\text{(Axiom 3)} & \quad P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Theorem 1)} &\quad P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{ (◇ :: „möglich“ ↔ „konsistent“ ↔ „denkbar“; □ :: „notwendig“) } \\
\text{ } & \text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad P\ X \ & \ & \text{ AE: „Angenommen, es gibt positive Eigenschaften, Perfektionen“} \\
\text{02} & \quad P\ X \;\Rightarrow\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{ AE: „Angenommen, positive Eigenschaften sind nicht konsistent“} \\
\text{03} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{04} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{05} & \quad \text{ ├ }\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{:01:02:[Modus ponendo ponens] :: [A, A → B├ B] :AE:} \\
\text{06} & \quad \neg\neg \Box \neg \exists x \ X \ x \ & \ & \text{:05:[ ◇A ↔ ¬□¬A] :: (Modalregel)} \\
\text{07} & \quad \neg\neg \Box \neg\neg \forall x \neg X \ x \ & \ & \text{:06:[∃xA ↔ ¬Ɐx¬A] :: (Quantoren Regel)} \\
\text{08} & \quad \text{ ├ }\; \Box \; \forall x \neg X \ x \ & \ & \text{:07:NEG :: [¬¬A↔A] :: (Gesetz der Aussagenlogik)} \\
\text{09} & \quad \Box \; \forall x \neg X \ x \Leftrightarrow\ W & \ & \text{:02:08:[(:02:↔W) → (├:08:↔W)] :: (Kalkülregel)} \\
\text{10} & \quad \Box \; \forall x \ X \ x \Leftrightarrow\ F & \ & \text{:09:[(¬A↔W)↔(A↔F)] :: (Regel für Wahrheitswerte)} \\
\text{11} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:03:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{12} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \text{ } & \text{:10:11:[(:10:↔F) → (:11:↔F)] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{13} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \ & \text{:01:12:[Konjunktion] :: [A, B ├ A∧B]} \\
\text{14} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow \; (\neg x = x))) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(Y:=( ¬x= ..)) :: (Substitution für Eigenschaften)} \\
\text{15} & \quad \ P (\neg x = .. ) & \ & \text{:13:14:[Modus ponens] :: (logische Schlussregel)} \\
\text{16} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{17} & \quad \neg P (\ x = .. )\ & \ & \text{:15:16:[Modus ponens]}\\
\text{18} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:04:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{19} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \text{ } & \text{:10:18:[(:10:↔F) → (:18:↔W)] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{20} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \ & \text{:01:19:[Konjunktion] } \\
\text{21} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x))) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(Y:=(x=..))} \\
\text{22} & \quad \ P (\ x = .. )\ & \ & \text{:20:21:[Modus ponens]}\\
\text{23} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ & \text{:17:22:[Konjunktion] ⇒ Kontradiktion !}\\
\text{24} & \quad \neg \Diamond \; \exists x \ X \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:05:23:[├A├B╞ A→B] :: ''KONDITIONALER BEWEIS''}\\
\text{25} & \quad \neg\neg \Diamond \; \exists x \ X \ x & \ & \text{:24:23:[Modus tollendo tollens] :: [A→B,¬B ├ ¬A]}\\
\text{26} & \quad \text{ ├ }\; \Diamond \; \exists x \ X \ x & \ & \text{:25:NEG; bzw. :05:23:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS''}\\
\text{27} & \quad \ P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{:01:26:[├A├B ╞ A→B]} \\
\text{(Theorem 1)} & \;\text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\text{28} & \quad \ P\ G \;\Longrightarrow\; \Diamond \; \exists x \ G \ x \ & \ & \text{:27:Instanz(X:=G) } \\
\text{29} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{(A3):28:[Modus ponens]} \\
\text{(Korollar 1)} & \;\text{„Das Dasein GOTTES ist definitiv denkbar“} & \ & \text{„Es ist widerspruchsfrei möglich, dass es GOTT gibt“} \\
\end{align}</math>
</small>
|}
Anmerkung-1 ''':''' <span style="color:#00B000">(Der GÖDEL-Term <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, im Axiom-2 ist an sich überflüssig, da dieser hier als Prämisse :01: ohnehin ,angenommen‘ wird. Der Beweisgang kommt mit Axiom-2 auch ohne diesen GÖDEL-Term zum selben Ergebnis, und verkürzt sich damit sogar um zwei Schritte ''':''' Zeile 13 und Zeile 20 sind dann unnötig.)</span>
Der Beweisgang geht mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als Kalkül-Ressource, prinzipiell von der Existenz eines GOTTES aus. Mit der Prämisse :01: <span style="color:#00B000">(hier im 1. Beweisgang)</span> postuliert GÖDEL vorerst allgemein, dass es <span style="color:#FF6000">»''Vollkommenheit, d.h. positive Eigenschaften''«</span> in unserer Welt gibt ''':''' <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, ohne im Kalkül zu definieren, was darunter zu verstehen ist. Definiert wird dann <span style="color:#00B000">(im 2. Beweisgang)</span>, was eine <span style="color:#FF6000">»''wesentliche Eigenschaft''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(im Sinne von ,Transzendentalia‘)</span>; und mit Hilfe dieser Eigenschaft definiert GÖDEL <span style="color:#00B000">(im 3. Beweisgang)</span>, was eine <span style="color:#FF6000">»''notwendige Existenz''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, die er <span style="color:#00B000">(im selben Beweisgang)</span> axiomatisch mit den <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> gleich setzt ''':''' Axiom-5 ''':''' <span style="color:#4C58FF"> —‚'''PE'''<sub>not</sub>‘ —</span>. Erst im 2. Beweisgang wird mit Term :13:, nach einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, definitiv bewiesen <span style="color:#00B000">( ╞ )</span>, dass die, von GÖDEL, hier postulierten, <span style="color:#00B000">(allgemeinen)</span>, positiven Eigenschaften, <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, tatsächlich auch in GOTT <span style="color:#FF6000">»''positive Eigenschaften''«</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, sind; <span style="color:#00B000">(das sind die ultimativen ,Transzendentalia‘ in GOTT)</span>. Jetzt aber muss vorerst der ,Wunsch‘, bzw. die LEIBNIZ-Frage beantwortet werden ''':''' Ob, mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, <span style="color:#FF6000">»''GOTT''«</span> ,möglich‘ ist, der, nach traditioneller Auffassung, <span style="color:#FF6000">»''ein Wesen von äußerster Größe und Vollkommenheit'' <span style="color:#00B000">[ ist ]</span>, ''das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(nach LEIBNIZ; was GÖDEL mit Definition-1 ,abbildet‘)</span>. Wenn man also beweisen will, dass die Existenz eines solchen ''<span style="color:#FF6000">»GOTTES«</span>'' ,möglich‘ sein soll, dann muss man beweisen, dass dieses postulierte System der <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> möglich und formal ,widerspruchsfrei‘ ist. Das Ergebnis des 1. Beweisganges, das ,Theorem-1‘, <span style="color:#00B000">(,Erster Satz‘)</span>, fasst A. FUHRMANN zusammen als ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>. Wenn sie nicht konsistent wären, käme es zu unlösbaren Widersprüchen, <span style="color:#00B000">(Term :24:)</span>. Term :27: ,besagt‘ ''':''' <span style="color:#FF6000">»''Es ist definitiv, d.h. ohne Widerspruch möglich, dass es positive Eigenschaften gibt''«</span>; denn die Behauptung, es sei nicht möglich, dass es positive Eigenschaften, <span style="color:#00B000">(das sind die ,Transzendentalia‘)</span>, in unserer Welt gibt, führt zu einem Widerspruch, und ist daher falsch und ,unlogisch’. Einmal Axiom-1 und zweimal Axiom-2, <span style="color:#00B000">(das die Gleichwertigkeit aller positiven Eigenschaften nachdrücklich klarstellt)</span>, sichern hier die Konsistenz <span style="color:#FF6000">»''aller positiven Eigenschaften in der Welt'', <span style="color:#00B000">[ die ,Transzendentalien‘ ]</span>, ''und damit auch die, die in GOTT sind''«</span>. <span style="color:#00B000">(Der 2. Beweisgang bestätigt, dass es in GOTT tatsächlich positive Eigenschaften gibt.)</span> Die ,Gleichwertigkeit‘ aller Transzendentalia, <span style="color:#00B000">(ihre ,Äquivalenz‘)</span>, ist formal-syntaktisch daran erkennbar, dass die beiden Eigenschafts-Variablen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> im Axiom-2 für beliebige, unterschiedliche ,positive‘ Eigenschaften gegenseitig austauschbar, <span style="color:#00B000">(,konvertierbar‘)</span>, sind. Das heißt, dass beliebige, unterschiedliche ,positive‘ Eigenschaften, für die diese Variablen stehen, sich paarweise, wechselseitig ,implizieren‘, einschließen, und damit notwendig voneinander abhängen, d.h. koinzident ,eins‘ sind, konvertierbar, und somit gleichwertig sind; entsprechend dem Theorem von den Transzendentalia. Zu Term :29:, dem Korollar zu Theorem-1, notiert GÖDEL am 10. Feb. 1970, <span style="color:#00B000">(übersetzt von Joachim BROMAND)</span> ''':''' <span style="color:#FF6000">»''◇∃xG(x) besagt, dass das System aller positiver Eigenschaften kompatibel ist'',</span> <span style="color:#00B000">[ d.h. miteinander verträglich, weil ohne Widersprüche ].</span> <span style="color:#FF6000">''Dies ist ,wahr‘ auf Grund von Axiom-2,'' <span style="color:#00B000">[ weil alle positiven Eigenschaften, d.h. die Transzendentalien, koinzident gleichwertig und konvertierbar sind ]</span>.«</span> Darum ist es definitiv ,möglich‘, dass es diesen GOTT gibt, der <span style="color:#FF6000">»''alle Grade der Vollkommenheit in sich schließt''«</span> und <span style="color:#FF6000">»''über dem ,Größeres‘ nicht mehr gedacht werden kann''«</span>, und, in weiterer Konsequenz, ist der GOTT-Glaube deshalb ,notwendig‘ widerspruchsfrei und sinnvoll, nach Theorem-3 ''':''' <u>Wenn</u> es ,ohne Widerspruch‘ ''<span style="color:#FF6000">»möglich, bzw. denkbar«</span>'' ist, dass es ''<span style="color:#FF6000">»GOTT«</span>'' gibt, <u>dann</u> folgt daraus ''<span style="color:#FF6000">»notwendig«</span>'' ''':''' es ist auch ,widerspruchsfrei‘, wenn man als Voraussetzung ,annimmt‘, dass es ''<span style="color:#FF6000">»GOTT wirklich, für jede mögliche Welt«</span>'' gibt ''':''' Term :11: im 3. Beweisgang. Der Wenn-Satz ist hier mit Korollar-1 bewiesen; der Dann-Satz wird im 3. Beweisgang bewiesen <span style="color:#00B000">( ╞ )</span>, d.i. die Widerspruchsfreiheit und Sinnhaftigkeit des GOTT-Glaubens.
Die ontologische ,Identität‘, d.h. die ,Gleichsetzung‘, bzw. die ,Koinzidenz‘ von Strukturen, die in der Endlichkeit für uns verschieden sind, jedoch in dem unbegrenzt Unendlichen, GOTT, paarweise, perspektivisch in eins zusammenfallen, wie ,Sein‘ und ,Wesen‘, wie ,Ursache‘ und ,Wirkung‘ usw., und auch die Äquivalenz und Austauschbarkeit der Transzendentalien, haben im GÖDEL-Kalkül die logisch-syntaktische Form einer, aus sich, ,modal‘ notwendigen Implikation zwischen zwei verschiedenen, gegenseitig austauschbaren Eigenschafts-Variablen ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>. Dieses Term-Element stellt formal-syntaktisch die Gleichwertigkeit, <span style="color:#00B000">(Äquivalenz)</span>, bzw. die paarweise Koinzidenz aller positiven Eigenschaften und Zuordnungen in GOTT dar; sowohl hier im Axiom-2, als auch in der Definition-2 über die ,Wesenseigenschaften‘, im 2. Beweisgang, mit jeweils verschiedenen, frei umbenennbaren, Individuum-Variablen. Dieses Term-Element ,gilt‘ allgemein jedoch nur für positive Eigenschaften, alias ,Transzendentalia‘, und wird sofort <span style="color:#FF6000">„modal falsch“</span>, wenn für <span style="color:#4C58FF">— ‚'''X'''‘ —</span>, oder <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, Eigenschaften eingesetzt werden, die, — von Natur aus —, weder positiv noch negativ sind, wie z. B. ,rot‘ oder ,schwer‘. Die wechselseitige Austauschbarkeit der noch ,unbestimmten‘ Eigenschafts-Variablen, für beliebige positive Eigenschaften, ist formal äquivalent zur freien Umbenennung der noch ,unbestimmten‘ Individuum-Variablen ''':''' <span style="color:#4C58FF">[ FUB(x:=y) ]</span>. Der formale, gegenseitige, allgemeine Austausch der positiven Eigenschafts-Variablen, bzw. die formale Gleichsetzung beliebiger positiver Eigenschaften, kann, auf Grund der Äquivalenz aller Vollkommenheiten, bzw. ,Transzendentalia‘, auch dann noch durchgeführt werden, wenn eine, von zwei Eigenschafts-Variablen, durch eine Definition oder eine Schlussfolgerung ,bestimmt‘ worden ist, und dadurch zu einer positiven Eigenschafts-Konstante, d.h. zu einer ,bestimmten‘, positiven Eigenschaft geworden ist. Das ist z. B. bei einer instanziierenden Substitution der Fall ''':''' <span style="color:#4C58FF">[ Instanz(X:=..) ]</span>. Das ist eine spezifische Eigenheit der GÖDEL-Axiomatik, weil alle relevanten, positiven Eigenschaften und Zuordnungen in GOTT, als <span style="color:#FF6000">„ultimative Transzendentalia“</span>, immer auch miteinander kompatibel sind. Mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, wird formal die <span style="color:#FF6000">„Koinzidenz“</span> aller ,Transzententalia‘ in der Welt, und auch der ,Zusammenfall‘ aller Gegensätze in GOTT, abgebildet.
Da die Variable <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht, <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(im Korollar-1)</span>, ist die Eigenschaft ''':''' ''<span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'' ''':''' <span style="color:#4C58FF">(¬x=..)</span>, d.h. das <span style="color:#FF6000">„Ungleichsein“</span>, das <span style="color:#FF6000">„Anderssein“</span> GOTTES, <span style="color:#00B000">(Prämisse :03:)</span>, die entscheidende Voraussetzung und Norm für jeden Diskurs über GOTT ''':''' um der <span style="color:#FF6000">„Unvergleichlichkeit“</span>
GOTTES gerecht zu werden, darf GOTT niemals mit etwas aus der ''<span style="color:#FF6000">»zufälligen Struktur der Welt«</span>'' verglichen, d.h. gleich gesetzt werden. Der Term :18: <span style="color:#4C58FF">(x=x) ↔ W</span> erinnert an die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin‘''«</span>. <span style="color:#00B000">(In der mystischen Tradition, im ''<span style="font-family: Times;"><big>‚Dialog über die Vorsehung‘</big></span>'', dem Hauptwerk der Heiligen KATHARINA von Siena, Mystikerin und Lehrerin der Kirche, sagt GOTT-VATER zur KATHARINA ''':''' <span style="color:#FF6000">»''ICH BIN der IST'', <span style="color:#00B000">[ aus mir selbst ]</span>, ''du bist, die nicht ist'', <span style="color:#00B000">[ aus dir selbst ]</span>.«</span> Das ist eine wichtige, deutende Ergänzung, und die authentische <span style="color:#4C58FF">,theologische‘</span> Interpretation dieser Exodus Text-Stelle. Das ist der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES.)</span>
Zum Term :03: notiert A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Die Notation'' <span style="color:#4C58FF">(¬x=..)</span> ''für die Eigenschaft ''':''' <span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'', <span style="color:#00B000">[ d.h. <span style="color:#FF6000">„Ungleichheit“, „Anderssein“</span>, bzw. die Notation <span style="color:#4C58FF">(x=..)</span> für den Existenzmodus-Perfektion ''':''' <span style="color:#FF6000">„Gleichheit“, „Idendität“</span> ]</span>, ''ist suggestiv und informell und ersetzt hier einen formal korrekten Abstraktionsausdruck wie'' <span style="color:#4C58FF">λy.(¬x=y)</span>, <span style="color:#00B000">[ bzw. <span style="color:#4C58FF">λy.(x=y)</span> ]</span>. ''Für die formal korrektere Notation bedarf es der zusätzlichen Vereinbarung, dass der Ausdruck'' <span style="color:#4C58FF">λy.(¬x=y)</span> ''gleichbedeutend sei mit dem Ausdruck'' <span style="color:#4C58FF">¬λy.(x=y)</span>. ''Diese Vereinbarung ist harmlos, da wir aufgrund der Regel der λ–Konversion'' ''':''' <span style="color:#4C58FF">λy.Xy.x ↔ Xx</span>, <span style="color:#00B000">[ mit der <span style="color:#4C58FF">Instanz(X:=(¬x=..))</span> ]</span>, ''so schließen dürfen'' ''':''' <span style="color:#4C58FF">λy.(¬x=y).x ↔ ¬x=x ↔ <span style="color:#00B000">¬(x=x)</span> ↔ ¬λy.(x=y).x</span> .<span style="color:#FF6000">«</span> <ref>A. FUHRMANN a.a.O. Seite 7, Anmerkung 4 (von mir korrigiert und ergänzt)</ref>
In der Kalkül-Zeile 29 wird das Möglichkeits-Korollar-1 durch einen <span style="color:#4C58FF">[ Modus ponens ]</span> mit Axiom-3 von der Kalkül-Prämisse-Term :01: ,abgekoppelt‘, d.h. es ist nicht mehr vom Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span> logisch abhängig. Das Möglichkeits-Korollar-1 behält jedoch die bewiesene Widerspruchsfreiheit von Theorem-1, und ist damit nur mehr von Axiom-1 und Axiom-2 abhängig, was für das Theorem-ANSELMS am Schluss entscheidend ist. Erklärung zu Term :05: Das Ergebnis einer Logik-Operation zwischen Prämissen ist ,regulär‘ <span style="color:#00B000">(├ )</span> den Prämissen zuzurechnen.
Das Modale-Prinzip KRIPKE-Γ-Ɐx, <span style="color:#4C58FF">['''RK''']</span>, in Worten ''':''' <span style="color:#FF6000">»''Wenn mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''gilt, und daraus logisch folgt, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''auch die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''gilt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar'' ''':''' ''es ist wahr, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''aus der Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''logisch folgt''«</span>. Der Term <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span> steht formal-syndaktisch, allgemein für ,Transzendentalia‘, und ist für alle ,Nicht-Transzendentalia‘ <span style="color:#FF6000">„modal falsch“</span>.
====<div class="center"><span style="color:#660066">2. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 2, (,Basisbeweis‘)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe____________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.2)} & \quad \neg P\ X \;\Longrightarrow\;\ P\neg X\ & \ & \text{„Wenn X nicht positiv ist, dann ist die Negation ¬X positiv“} \\
\text{(Axiom 3)} & \quad \ P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{(Axiom 4)} & \quad \ P\ X \;\Longrightarrow\; \Box \; \ P\ X \ & \ & \text{„Positive Eigenschaften sind notwendig aus sich positiv“} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 2)} & \quad \ X_{ess}\ x \;\Leftrightarrow X\ x \wedge \forall Y \left(\ Y\ x \Rightarrow \Box \; \forall y (\ X\ y \Rightarrow \ Y\ y)\right) & \ & \text{„X ist genau dann eine wesentliche Eigenschaft von x, wenn x sie hat, und} \\
\text{ } & \quad & \text { } & \;\;\text{alle anderen Eigenschaften Y von x notwendig aus dieser Eigenschaft X folgen“} \\
\text{[RM]} &\quad \ A \;\Longrightarrow\;\ B\; \text{ ├ }\;\Box \; A \Longrightarrow\;\Box\; \ B\ & \ & \text{( :: Modales Prinzip)} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{(,G‘ :: „Göttlichkeit“ ↔ „GOTT“ ↔ „Dasein GOTTES“)} \\
\text{ } &\;\text{„Das Wesen GOTTES ist sein Dasein“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} &\quad \ G\ x \ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} &\quad \ Y\ x \ & \ & \text{ AE: „Angenommen, GOTT hat die Eigenschaften Y“} \\
\text{03} &\quad \neg P\ Y & \ & \text{ AE: „Angenommen, die Y in GOTT sind nicht positiv“} \\
\text{04} &\quad \neg P \ Y \Rightarrow \ P \neg Y\ & \ &\text{(A1.2):Instanz(X:=Y) :: (Substitution für Eigenschaften) } \\
\text{05} &\quad \ P \neg Y \ & \ & \text {:03:04:[Modus ponens] :: [A, A → B├ B] } \\
\text{06} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{07} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:06:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{08} &\quad \ P \neg Y \Rightarrow \neg Y \ x\ & \ &\text{:07:Instanz(X:=¬Y)} \\
\text{09} &\quad \neg Y \ x\ & \ &\text{:05:08:[Modus ponens]} \\
\text{10} &\quad \text{ ├ }\; (Y\ x \wedge \neg Y \ x) \;\Leftrightarrow\;\ F\ & \ & \text{:02:09:[Konjunktion] ⇒ Kontradiktion !} \\
\text{11} &\quad \neg P\ Y \; \Rightarrow \; (Y\ x \wedge \neg Y \ x )\ & \ &\text{:03:10:[├A├B ╞ A → B] :: ''KONDITIONALER BEWEIS''} \\
\text{12} &\quad \neg\neg P\ Y \ & \ &\text{:11:10:[Modus tollendo tollens] :: [A → B,¬B├ ¬A]} \\
\text{13} &\quad \text{ ├ }\; P\ Y \ & \ &\text{:12:NEG; bzw. :03:10:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS'' :AE:} \\
\text{14} &\quad \ P\ Y \;\Rightarrow\;\Box \; \ P\ Y \ & \ & \text{(A4):Instanz(X:=Y)} \\
\text{15} &\quad \Box \; \ P\ Y \ & \ & \text{:13:14:[Modus ponens]} \\
\text{16} &\quad \ G \ y \Rightarrow \ Y \ y\ & \ &\text{:01:02:[├A├B ╞ A→B]:FUB(x:=y)} \\
\text{17} &\quad \text{ ├ }\; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:16:[G(y) ├ ⱯyG(y)]} \\
\text{18} &\quad \Box \; \ P\ Y \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:13:17:[├A├B ╞ A→B]:[RM]} \\
\text{19} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:15:18:[Modus ponens]} \\
\text{20} &\quad \ Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:02:19:[├A├B ╞ A→B]} \\
\text{21} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x & \ &\text{:20:01:[Konjunktion] :: [A, B├ A ∧ B]} \\
\text{22} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ X \ y \Rightarrow \ Y \ y)) \wedge \ X \ x\;\Leftrightarrow\; X_{ess}\ x \ & \ &\text{(D2):KOMM(↔):KOMM(∧):[ⱯYA(Y) ├ A(Y)] wegen :13:} \\
\text{23} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x\;\Leftrightarrow\; G_{ess}\ x \ & \ &\text{:22:Instanz(X:=G)} \\
\text{24} & \quad \text{ ├ }\; G_{ess}\ x \ & \ &\text{:21:23:[Modus ponens]:AE: wegen :30:} \\
\text{25} &\quad \ G\ x \;\Rightarrow\; \ G_{ess}\ x \ & \ & \text{:01:24:[├A├B ╞ A→B] :: Theorem 2.1} \\
\text{26} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] } \\
\text{27} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:26:[ⱯXA(X) ├ A(X)]} \\
\text{28} &\quad \ P \ G \Rightarrow \ G \ x\ & \ &\text{:27:Instanz(X:=G)} \\
\text{29} &\quad \text{ ├ }\; G \ x\ & \ &\text{(A3):28:[Modus ponens]} \\
\text{30} &\quad \ G_{ess}\ x \;\Rightarrow \ G \ x\ & \ &\text{:24:29:[├A├B ╞ A→B] :: Theorem 2.2 } \\
\text{31} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{:25:30:[Konjunktion]:BIKONDITIONAL :: [(A→B) ∧ (B→A) ↔ (A↔B)] } \\
\text{(Theorem 2)} &\; \text{„Dasein, GOTT-Sein, ist das Wesen GOTTES“} & \ & \Longleftarrow\; \text{was zu beweisen war ! } \\
\text{32} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:19:Instanz(Y:=(x=..))} \\
\text{33} &\quad \ G\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:01:32:[├A├B ╞ A→B]} \\
\text{(Korollar 2)} & \;\text{„Es gibt notwendig höchstens einen GOTT“} & \ & \text{„Wenn es GOTT gibt, dann gibt es für jede mögliche Welt nur einen GOTT“} \\
\end{align}</math>
</small>
|}
<span style="color:#00B000"><small>(In den Kalkül-Zeilen 16, 18, 31 mussten zwei-, und in Zeile 22 drei Kalkül-Schritte, d.h. Logik-Operationen in eine Zeile zusammengezogen werden, weil der Parser dieser speziellen Mathematik-Funktion in Wikibooks jedes Mal wegen Puffer-Überlauf abstürzt, wenn zu den bestehenden Zeilen noch eine neue Zeile, oder ein Text-Element, zusätzlich eingefügt wird. Das vermindert etwas die Transparenz des Kalküls.)</small></span>
Anmerkung-2 ''':''' <span style="color:#00B000">(Dieser Beweisgang kommt auch ohne das ,unbestimmte‘ Konjunkt <span style="color:#4C58FF"> — ‚'''Xx'''‘ —</span> in der Definition-2 zum gleichen Ergebnis, und wird dadurch um eine Zeile verkürzt ''':''' Zeile 21 entfällt, und <span style="color:#4C58FF">[ KOMM(∧) ]</span> ist dann unnötig. Dieses Konjunkt wird hier ebenfalls schon in der Kalkül-Prämisse :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, als ,Annahme‘ gesetzt, vorentschieden und ,bestimmt‘ mit der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>. Es war also logisch korrekt, dass GÖDEL, in seiner Notiz vom 10. Feb. 1970 zum ontologischen Beweis, dieses Konjunkt weggelassen hat, was ihm von Kommentatoren als ein Flüchtigkeitsfehler angerechnet worden war. Der gesamte 2. Beweisgang bewegt sich im Geltungsbereich der Prämisse Term :01:, d.h. ist in jeder Zeile von der Annahme abhängig ''':''' die Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span> steht für den GOTT der Christen. In der Kalkül-Zeile 33 wird mit Korollar-2 diese Abhängigkeit, für den Term :32:, explizit dargestellt.)</span>
Der Beweisgang geht mit der Prämisse :01: prinzipiell, als ,modal‘ freigewählte Voraussetzung, von der Existenz eines GOTTES aus. Im 1. Beweisgang wurde bewiesen, dass die von GÖDEL ,postulierten‘ <span style="color:#FF6000">»''allgemeinen positiven Eigenschaften, Vollkommenheiten, Perfektionen'', <span style="color:#00B000">[ die sog. ,Transzendentalien‘ ]</span> ''konsistent''«</span>, d.i. widerspruchsfrei sind. Hier, in diesem Beweisgang wird nun die Prämisse vom 1. Beweisgang, <span style="color:#4C58FF"> — ‚'''PX'''‘ —</span>, im Bezug auf GOTT hinterfragt ''':''' Gibt es auch in GOTT so Etwas, wie <span style="color:#FF6000">»''Vollkommenheit, Positives, Perfektes''«</span> '''?''' Die ,Annahme‘ jedoch, dass es <span style="color:#FF6000">»''in GOTT keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span> <span style="color:#00B000">(keine Transzendentalien)</span> gibt, <span style="color:#00B000">(Prämisse Term :03:)</span>,<span style="color:#4C58FF"> — ‚'''¬PY'''‘ —</span>, d.h. dass die <span style="color:#00B000">(wesentlichen)</span> Eigenschaften in GOTT keine <span style="color:#FF6000">„Vollkommenheiten“</span> seien, führt aber zu einem unlösbaren Widerspruch, <span style="color:#00B000">(Term :10:)</span>. Mit Term :13:, als 1. Hauptergebnis, ist damit, — als ,neue‘ Prämisse, <span style="color:#00B000">(ersetzt Term :03:)</span> —, definitiv ,bewiesen‘ <span style="color:#00B000">( ╞ , d.h. es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, dass alle Eigenschaften, die hier mit <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> symbolisiert werden, <span style="color:#FF6000">„positive Eigenschaften“</span>, d.h. <span style="color:#FF6000">„Perfektionen“</span> sind, von denen das Kalkül ,annimmt‘, <span style="color:#00B000">(Prämissen Term :01:, Term :02: und speziell Term :16:)</span>, dass der GOTT der Christen sie besitzt. Alle ,Wesenseigenschaften‘ in GOTT ''':''' <span style="color:#4C58FF">— ‚'''Y'''<sub>ess</sub>‘ —</span>, die durch den Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —, </span> dargestellt werden, sind somit <span style="color:#FF6000">„Vollkommenheiten“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span><span style="color:#00B000">, (,ultimative Transzendentalien‘, aller ,Grade‘)</span>. Damit ist definitiv ‚bestätigt‘, <span style="color:#00B000">( ╞ , es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, was mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schon ‚angenommen‘ worden ist ''':''' <span style="color:#FF6000">»''GOTT ist perfekt; er hat alle positiven Eigenschaften''«</span>; und auch Definition-1 ist damit ,verifiziert‘ ''':''' <span style="color:#FF6000">»''GOTT ist genau deswegen GOTT, weil er, als GOTT, positive Eigenschaften aller Grade in sich schließt''«</span>; entsprechend dem Quelltext bei LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. <span style="color:#00B000">(Der ,Schlüsselbegriff‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> ist der ,Schlüssel‘ zur Erkenntnis, dass GOTT ,notwendig‘, sowohl ,wesentlich‘ für uns, als auch an sich ,grundlos‘, immer schon ,da‘ ist.)</span> Hier, <span style="color:#00B000">(im 2. Beweisgang)</span>, hat Axiom-1, <span style="color:#00B000">(im Term :04:)</span>, sicher gestellt, dass die Eigenschaften in GOTT, <span style="color:#00B000">(Definition-1; Term :06:)</span>, tatsächlich <span style="color:#FF6000">„ultimativ positiv, perfekt und vollkommen“</span> sind ''':''' <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>. Das GÖDEL-Axiom-1 bezieht seine ,Potenz‘ aus dem Prinzip vom ,auszuschließenden‘ Widerspruch ''':''' eine Eigenschaft kann nicht zugleich ,positiv‘ und ,nicht positiv‘ sein '''!'''
Formal lässt sich das 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' schon aus Term :23: in diesem Beweisgang mit der <span style="color:#4C58FF">[ Vereinfachung ] :: [ A∧B ├ B ]</span> ohne Weiteres ,regulär‘ ableiten, — analog zu den Vorgehensweisen bei A. FUHRMANN und G.J. WIRSCHING. <span style="color:#00B000">(Beide Aussagen dieser ,Konjunktion‘ sind ,gleichwertig‘ und wahr, daher partizipiert das Theorem-2 auch am Ergebnis der Widerspruchsfreiheit von Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dem 1. Hauptergebnis. Beide Aussagen im Term :23: interpretieren sich gegenseitig.)</span> Der hier gewählte, etwas längere Weg zum Ergebnis, soll die innere Struktur und Abhängigkeit der Ergebnisse von bestimmten Voraussetzungen offen legen, und ihren ,Zweck‘ verdeutlichen. Die beiden Hauptergebnisse im Basisbeweis gehen vom vorgefundenen und traditionell vorgegebenen Begriff von ,GOTT‘ aus, <span style="color:#00B000">(Term :06:, Term :16: und Term :26:)</span>. Das ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 1. Hauptergebnis, hier im 2. Beweisgang, Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span> ''':''' <span style="color:#FF6000">»''die Eigenschaften in GOTT sind vollkommen, d.h. sind die ultimativen Transzendentalia''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als auch die Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span>, für die Annahme ''':''' den ,GOTT der Christen‘, der deswegen GOTT ist, weil er alle Grade der Vollkommenheit in sich schließt. Und das ebenfalls ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 2. Hauptergebnis, hier im selben Beweisgang, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''das Wesen GOTTES ist sein eigenes Sein''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, als auch die Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, für die Wesenseigenschaft ''':''' ,notwendige Existenz‘, und widerlegt den Einwand KANTS, für den Spezialfall ''':''' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für ,GOTT‘. Zwei Axiome und zwei Definitionen von GOTT und seinen Vollkommenheiten werden durch die Ergebnisse im Basisbeweis des GÖDEL-Kalküls in unserer realen Welt als ,wahr‘, <span style="color:#00B000">(genauer als ,widerspruchsfrei‘)</span>, und, — im Rahmen des christlichen Glaubens —, als ,annehmbar‘ bestätigt. <span style="color:#00B000">(Anmerkung zu Term :24: ''':''' eine Prämisse ist regulär-,modal‘ immer ,frei‘ wählbar.)</span>
Zusammengefasst heißt das ''':''' die ,strittige‘ Begründung der ,methodologischen‘ Prämisse des GÖDEL-Kalküls ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#00B000">(Prämisse, Term :01:)</span>, weil <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#00B000">(Korollar-1)</span> ''':''' <span style="color:#FF6000">»''Das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den GOTT der Christen, für den es ohne Widerspruch denkbar ist, dass es ihn gibt''«</span>, <span style="color:#00B000">(ANSELMS Prinzip, trotz der ,Warnung‘ KANTS)</span>, ist ,wahr‘ und für uns ,annehmbar, denn es ist auch, auf Grund der Ergebnisse des 2. Beweisganges, in unserer realen Welt ,wahr‘ und ,annehmbar‘, weil schon als ,widerspruchsfrei‘ verifiziert ''':''' <span style="color:#FF6000">»''Der GOTT der Christen'' <span style="color:#00B000">(Term :01:)</span> '',existiert‘ für uns ,notwendig‘''«</span> ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, <span style="color:#00B000">(d.i. das ,regulär‘-mögliche Korollar sowohl im 2. als auch im 3. Beweisgang)</span>, denn dieser GOTT ist aus sich ,vollkommen‘ ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, und zu seiner ,Vollkommenheit‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> gehört auch notwendig sein ,Existieren‘ ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. <span style="color:#00B000">(Jeder dieser Terme ist im-, und durch den 2. Beweisgang, im Geltungsbereich der Prämisse Term :01:, als ,wahr‘ und ,annehmbar‘ bewiesen, bzw. verifiziert.)</span> Das ist der ,Kern‘ des ontologischen Arguments, und somit ist auch diese ,strittige‘ Begründung der Prämisse des GÖDEL-Kalküls mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. sie ist logisch ,richtig‘ und, im Kontext des christlichen Glaubens, vernünftig. Die Annahme des Gegenteils zu dieser Prämisse ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Es ist undenkbar, dass es diesen GOTT gibt''«</span>, führt jedoch, unabhängig von jeder Glaubensüberzeugung, zu einem Widerspruch — ist unlogisch und daher ,falsch‘, <span style="color:#00B000">(siehe Anhang ''':''' Widerlegung)</span>. Die Behauptung einer ,formalen Unentscheidbarkeit‘ zu den Annahmen über die Existenz GOTTES, ob oder nicht, <span style="color:#00B000">(d.h. ein ,methodologischer‘ Agnostizismus)</span>, ist gegen jede ,Logik‘; und ist auch ,falsch‘, d.h. der Agnostizismus ist einfach nur ein ,logischer Irrtum‘. Denn aus dem, im Kalkül abgeleiteten, Widerspruch aus der einen Annahme, und damit ihrer Unrichtigkeit, folgt notwendig die Richtigkeit der gegenteiligen Annahme. Damit ist eine klare Entscheidung getroffen.
Das Modale-Prinzip <span style="color:#4C58FF">['''RM''']</span> in Worten ''':''' <span style="color:#FF6000">»''Wenn es wahr ist, dass aus'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> ''ein'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> ''logisch folgt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar, dass, wenn'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist, auch'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist''«</span>. <span style="color:#00B000">(Das <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> in Term :18: ist als ,modal notwendig‘ durch den Term :15: verifiziert '''!''' )</span>
Mit dem 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#FF6000">»'',Dasein‘ ist das ,Wesen‘ GOTTES''«</span>, folgt die GÖDEL-Axiomatik der philosophisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition der ,Rede von GOTT‘ seit ARISTOTELES, und schließt sich damit formal-syntaktisch zugleich auch der religiösen Überzeugung der Christen an, die glauben, dass GOTT, als unser Vater, aus Liebe, in seinem Sohn, JESUS CHRISTUS, für uns immer schon <span style="color:#FF6000">»''da''«</span> ist, <span style="color:#00B000">(der Sohn ist koinzident ,eins‘ mit GOTT, dem Vater und dem GEIST)</span>, wirksam in und durch seine <span style="color:#4C58F0">„Kirche“</span>, im HEILIGEN GEIST, bis ans Ende der Zeit. Das ist das, <span style="color:#FF6000">»''was''«</span> GOTT eigentlich für uns ausmacht, — die Selbstmitteilung seines unergründlichen Wesens in den Sakramenten der <span style="color:#4C58F0">„Kirche“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin da für euch und für immer, als der ich ''<span style="color:#00B000">[ immer schon gewesen ]</span> ''bin''«</span>; <span style="color:#00B000">(d.i. das <span style="color:#4C58FF">,theologisch‘</span>-exegetische ,Axiom‘ der Christen, und eine <span style="color:#4C58FF">,theologisch‘</span> korrekte Explikation der ,regulären‘ Kalkül-Prämisse Term :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, jeweils im 2. und 3. Beweisgang)</span>. Das heißt aber nicht, dass der Autor des Kalküls sich mit diesem Glauben identifiziert hat, <span style="color:#00B000">(,hat‘ er auch nicht)</span>, oder dass der Leser des ontologischen Beweises von Kurt GÖDEL sich damit identifizieren muss, wenn er dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> anerkennt.
Zur erweiterten <span style="color:#4C58FF">„theologischen“</span> Explikation der Kalkül-Prämisse ''':''' Die <span style="color:#4C58F0">„Kirche“</span> ist das ,Meisterwerk‘ GOTTES ''':''' In ihr ist es GOTT gelungen, etwas Göttliches und Unzerstörbares in unsere korrupte Welt einzupflanzen ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Etwas Göttliches existiert notwendig, d.h. ,unzerstörbar‘ in unserer Welt''«</span>. Sie ist, durch die Menschwerdung des GOTTES Sohnes, JESUS CHRISTUS, dessen <span style="color:#4C58F0">„Leib“</span> die <span style="color:#4C58F0">„Kirche“</span> ist, untrennbar mit Menschen verbunden, die schon, von allem Anfang an, und jetzt immer noch, durch die Sünde korrumpiert sind. Mit ihr will und wird GOTT unsere Welt und die Menschheit, bis ans Ende der Zeit, von der Sünde und von deren Konsequenz, dem <span style="color:#00B000">(ewigen)</span> Tod <span style="color:#4C58FF">„erlösen“</span>, <span style="color:#00B000">(jedoch nicht ohne die Zustimmung des Menschen)</span>. Mit dieser Explikation wird die Tragweite des ontologischen Arguments ANSELMS, und damit auch die <span style="color:#4C58FF">„theologische“</span> Relevanz der GÖDEL-Axiomatik erkennbar. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT, <span style="color:#00B000">(Term :01:)</span>.
====<div class="center"><span style="color:#660066">3. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 3, (ANSELMS Theorem)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe___________________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 5)} & \quad P\ E_{not}\; \ & \text { } & \text{„Notwendige Existenz ist eine positive Eigenschaft“} \\
\text{ } & \text{( :: Das ist nur dann wahr, wenn ,Dasein‘ und ,Wesen‘ } & \ & \text{( :: dagegen KANT : ,Existenz‘ ist keine ,Eigenschaft‘,} \\
\text{ } & \;\;\text{in eins zusammenfallen ! ARISTOTELES : Theorem-2)}\ & \ & \;\;\text{,Sein‘ ist für alles, was existiert, kein ,reales Prädikat‘ ! )} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 3)} & \quad \ E_{not}\ x \;\Longleftrightarrow\;\ \forall X \left(\ X_{ess}\ x \Longrightarrow \Box \; \exists y \ X\ y \right) & \ & \text{„Notwendige Existenz ist genau dann eine Eigenschaft von x, wenn} \\
\text{ } & \quad & \ & \;\;\text{alle wesentl. Eigenschaften von x notwendig instanziiert sind“} \\
\text{(Korollar 1)} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{„Es ist widespruchsfrei möglich, dass es GOTT gibt“} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ &\text{„Dasein, GOTT-Sein, Existenz ist das Wesen, die Essenz GOTTES“} \\
\text{(Korollar 2)} &\quad \ G\ x \;\Longrightarrow\; \Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{„Wenn es GOTT gibt, dann gibt es notwendig nur einen GOTT“} \\
\text{(Theorem 3)} & \quad \Diamond \; \exists x \ G \ x \;\Longrightarrow\; \Box \; \exists x \ G \ x \ & \ & \text{( :: ANSELMS Prinzip)} \\
\text{ } & \text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{01} & \quad \ G \ x\ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} & \quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ & \text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{03} & \quad \ P \ X \Rightarrow \ X \ x\ & \ & \text{:02:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{04} & \quad \ P \ E_{not}\;\Rightarrow \ E_{not}\ x\ & \ & \text{:03:Instanz(X:= Enot) :: (Substitution für Eigenschaften)} \\
\text{05} & \quad \ E_{not}\ x\ & \ & \text{(A5):04:[Modus ponens] :: [A, A → B├ B]} \\
\text{06} & \quad \forall X \left(\ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y \right) & \ & \text{(D3):05:[Modus ponens]} \\
\text{07} & \quad \ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y & \ & \text{:06:[ⱯXA(X) ├ A(X)]} \\
\text{08} & \quad \ G_{ess}\ x \Rightarrow \Box \; \exists y \ G\ y & \ & \text{:07:Instanz(X:= G)} \\
\text{09} & \quad \ G_{ess}\ x \ & \ & \text{(Th2):01:[Modus ponens]} \\
\text{10} & \quad \text{ ├ }\;\Box \; \exists x \ G\ x & \ & \text{:08:09:[Modus ponens]:FUB(y:=x) :: (Freie-Um-Benennung der Var.)} \\
\text{ } & \text{„Es gibt GOTT wirklich, für jede mögliche Welt“} & \ & \Longleftarrow\; \text{1. Hauptergebnis !} \\
\text{11} & \quad \;\Diamond \exists x \ G \ x \;\Longrightarrow \; \Box \; \exists x \ G\ x & \ & \text{(K1):10:[├A├B ╞ A→B] :: ''KONDITIONALER BEWEIS''} \\
\text{(Theorem 3)} & \;\text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen war ! 2. Hauptergebnis ! } \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{12} & \quad \;\Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{(K2):01:[Modus ponens]} \\
\text{13} & \quad \;\Box \; (\exists x \ G\ x \wedge \; \forall y(\ G \ y \Longrightarrow \ (x = y)))\ & \ & \text{:10:12:[Konjunktion]:DIST(□∧)} \\
\text{(Korollar 3)} & \;\text{„Es gibt notwendig genau nur einen GOTT“} & \ & \text{„Es gibt für jede mögliche Welt nur den GOTT der Christen“} \\
\end{align}</math>
</small>
|}
Anmerkung-3 ''':''' <span style="color:#00B000">(Ein Theorem und zwei Korollare, aus den beiden vorhergehenden Beweisgängen, werden hier, im 3. Beweisgang, zu ,Axiomen‘, die das Theorem-ANSELMS und sein Korollar mit-verifizieren und bestätigen.)</span>
Dieser Beweisgang ist das Ziel aller Bemühungen. Hier wird der sog. ,ontologische Gottesbeweis‘ nach ANSELM von Canterbury formal-syntaktisch dargestellt und als logisch nachvollziehbar von GÖDEL bestätigt. Damit hat er aber auch klar gestellt, dass der ontologische Beweis ANSELMS kein Beweis für die ,Existenz‘ des GOTTES der Bibel sein kann, bzw. sein ,will‘ ''':''' Denn mit der Prämisse, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(Term :01:, wie auch schon im ,Basisbeweis‘, und ausformuliert hier in Term :02:, mit der Definition für GOTT)</span>, wird mit dem traditionellen, abendländischen ,GOTT-Glauben‘, der ,glaubt‘, dass der Gott der Christen tatsächlich existiert, — methodologisch als ,Annahme‘ —, der Beweisgang schon regulär und explizit eröffnet, aus dem sich dann, logisch korrekt, mit Hilfe der GÖDEL-Axiome und Definitionen, das ,Theorem ANSELMS‘ ergibt; <span style="color:#00B000">(hier jedoch, mit Günther J. WIRSCHING, ohne den Umweg bei GÖDEL über den <span style="color:#4C58FF">[ Modus Barbara ] :: [ A → B, B → C ├ A → C ] </span>, mit dem modalen Axiom-BECKER ''':''' <span style="color:#4C58FF">— ‚'''◇□A→□A'''‘ —</span>, als <span style="color:#4C58FF">‚B → C‘</span> im kategorischen Syllogismus, das André FUHRMANN recherchiert hat)</span>. GÖDEL verwendet zur Darstellung des sog. ,ontologischen Gottesbeweises‘ nach ANSELM die Struktur eines modal-logischen Kalküls. Ein modal-logisches Kalkül ist ein genau geregeltes Schema, in dem bei bestimmten ,Annahmen‘ <span style="color:#00B000">(Axiome, Definitionen, Prämissen)</span> etwas anderes als das Vorausgesetzte, auf Grund des Vorausgesetzten mit Notwendigkeit folgt. Entsprechend der ,Modalität‘ der sechs ,modal‘ notwendigen, d.h. transzendentalen Voraussetzungen, hier, für den 3. Beweisgang, die in den <span style="color:#00B000">(und durch die)</span> beiden vorhergehenden Beweisgängen schon als <span style="color:#FF6000">„modal wahr“</span>, bzw. als logisch annehmbar, verifiziert und/oder ,bewiesen‘ wurden, sind auch die beiden ,Schlusssätze‘ <span style="color:#00B000">(Theorem-3 und Korollar-3)</span> <span style="color:#FF6000">„modal wahr“</span>, bzw. logisch annehmbar '''!''' Die Wahl der Prämisse :01: dagegen ist nicht ,modal‘ notwendig, sondern beruht auf einer freien Entscheidung, und damit ist auch ihre Interpretation eine freie Entscheidung, mit der Voraussetzung, dass man das Kalkül mit Theoremen aus der <span style="color:#4C58FF">„christlichen Theologie“</span> evaluieren, und damit interpretieren will. Dazu berechtigt die Genese des Kalküls. Der Glaube an den GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, beruht immer auf einer freien Entscheidung. Das Kalkül, als solches, unabhängig von jeder Interpretation seiner Syntax, ist genau dann ,allgemein‘ <span style="color:#FF6000">»''mathematisch evident''«</span>, d.h. ,ist allgemein gültig‘, wenn es gültigen Logik-Regeln folgt. Die Bestimmung seiner Syntax jedoch, d.h. seine Interpretation, unterliegt hermeneutischen Kriterien, die nicht von Logik-Regeln abhängen, wie hier ''':''' <span style="color:#FF6000">»''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''«</span>, wie GÖDEL selbst hinzufügt. Mit der, — von GÖDEL eingeforderten —, ‚Unabhängigkeit‘ der Kalkül-Axiome von der zufälligen Struktur der Welt, wird implizit für das Kalkül auch festgelegt, dass <span style="color:#FF6000">„GOTT“</span> ‚unabhängig‘ von der zufälligen <span style="color:#00B000">(Raum-Zeit-)</span>Struktur unserer vergänglichen Welt, und daher ,zeitlos-ewig‘ ist, <span style="color:#00B000">(was <span style="color:#4C58FF">„theologisch“</span> korrekt ist)</span>, begründet durch Definition-1 und Axiom-3. Aus der zeitlosen Ewigkeit GOTTES folgt, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, denn bei Zeitlosigkeit gibt es keinen ,zeitlichen‘ und damit auch keinen ,ontologischen‘ Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘. Beides ist dann koinzident ,eins‘ ''':''' wie ,Wesen‘ und ,Dasein‘ in GOTT, bzw. wie ,Begriff‘ und ,Sein‘, oder ,Möglichkeit‘ und ,Wirklichkeit‘. <span style="color:#00B000">(Man vergleiche damit auch die ,postulierte‘ Einheit von ,Erkenntnisobjekt‘ und ,Erkenntnissubjekt‘ im ,Gott‘ des ARISTOTELES ''':''' im <span style="color:#FF6000">»<span style="color:#00B000">[ selbstbewussten ]</span> ''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“<span style="color:#00B000"> | </span>„noêseôs noêsis“</span> <small>(‚<span style="font-family: Times;"><big>''Metaphysik''</big></span>‘ XII 9, 1074b34)</small>, im Vollzug seiner Funktion als ,unbewegtes Bewegungsprinzip‘, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“<span style="color:#00B000"> | </span>„prôton kinoûn akinêton“</span> der Welt, das alles Übrige <span style="color:#FF6000">»''wie ein Geliebtes''«<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὡς ἐρώμενον</big></span>“</span> | <span style="color:#FF6000">„hôs erômenon“</span> bewegt; d.h. christlich ''':''' <span style="color:#FF6000">»''aus Liebe''«</span> ,entstehen‘ lässt.)</span>
Anmerkung-4 ''':''' Das <span style="color:#00B000">(im 2. Beweisgang)</span> schon bewiesene Theorem-2, d.i. die Koinzidenz von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, <span style="color:#00B000">(‚Existenz‘</span> und <span style="color:#00B000">‚Essenz‘)</span>, rechtfertigt sowohl Axiom-5 als auch die Definition-3, und widerlegt den Einwand KANTS. Somit ist deren Setzung <span style="color:#00B000">(hier, im 3. Beweisgang)</span> korrekt, und durch das Theorem-2 schon vorbestimmt und bestätigt, d.h. beide sind <span style="color:#FF6000">„modal wahr“</span> und ,logisch‘ annehmbar, da sie durch die Gültigkeit von Theorem-2 ,verifiziert‘ worden sind. Damit wird klar erkennbar, dass das Theorem-2 tatsächlich die Basis des GÖDEL-Kalküls ist. Und wenn damit Axiom-5 im GÖDEL-Kalkül ‚gerechtfertigt‘ ist, dann ist auch, <span style="color:#00B000">(als Voraussetzung dafür)</span>, das Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ — ''':''' </span> <span style="color:#FF6000">»''Positive Eigenschaften'', <span style="color:#00B000">[ ,Transzendentalia‘ ]</span>, ''sind notwendig aus sich'', <span style="color:#00B000">[ von Natur aus ]</span>, ''positiv''«</span>, im 2. Beweisgang erklärbar, in dem die ‚Positivität‘, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, einer Eigenschaft schon als ‚notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, charakterisiert worden ist, äquivalent zu Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, in dem die ‚Notwendigkeit‘, <span style="color:#4C58FF">— <sub>not</sub> —</span>, <span style="color:#00B000">(der Existenz <span style="color:#4C58FF">— ‚'''E'''‘ —</span>)</span>, dann als ‚positive‘ Eigenschaft, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ‚bestimmt‘ wird; <span style="color:#00B000">(unter der speziellen Voraussetzung, dass <span style="color:#FF6000">„Existieren“</span> definitiv als eine <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT ,instanziiert‘ ist; vgl. Definition-3. Eine ,bestimmte‘ Eigenschaft ist genau dann ,instanziiert‘, wenn sie an einem Träger real ,existiert‘. Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, besagt, dass die, von GÖDEL ,postulierte‘, und im Basis-Theorem-2 verifizierte, <span style="color:#FF6000">„notwendige Existenz“</span> zu den ,ultimativen‘ Transzendentalia in GOTT gehört. Genauer ''':''' Sie ist die ,Summe‘ aller Transzendentalia.)</span> Zum Axiom-4, <span style="color:#00B000">(bzw. zum Term :14:, im 2. Beweisgang)</span>, erklärt GÖDEL in seinen Notizen zum Kalkül ''':''' <span style="color:#FF6000">»''da es'' <span style="color:#00B000">[ das Notwendigsein, <span style="color:#4C58FF">— '''□''' —</span> ]</span> ''aus der Natur der'' <span style="color:#00B000">[ positiven ]</span> ''Eigenschaft folgt'', <span style="color:#00B000">[ deren Positivität, im selben Beweisgang, mit Term :13: vorher schon ,bewiesen‘ (╞ ) worden ist ]</span>«</span>. Die GÖDEL-Erklärung zum Axiom-4 entspricht der Modal-Regel zur sog. ,Nezessisierung‘ in der KRIPKE-Logik nach GÖDEL. <span style="color:#4C58FF">[ Nezessisierungsregel ] '''::''' [ ├ A →├ □ A ]</span> ''':''' <span style="color:#FF6000">»''Angenommen'', <span style="color:#4C58FF">‚'''A'''‘</span> ''ist in einem Kalkül eine Prämisse, oder darin regulär'' <span style="color:#4C58FF">(├ )</span> ''abgeleitet, dann folgt in diesem Kalkül regulär'' <span style="color:#4C58FF">(├ )</span>, ''dass dieses'' <span style="color:#4C58FF">‚'''A'''‘</span> ''auch ,modal‘ notwendig'' <span style="color:#4C58FF">— ,□‘ —</span> ''ist''«</span>. GÖDEL hat jedoch diese modale Notwendigkeit nur in der ,Natur‘ der positiven Eigenschaften, alias ,Transzendentalia‘, gesehen, und mit den Aussagen im Axiom-4 expliziert ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt, nur dann sind die Axiome wahr''«</span>. Ob dieselbe modale Notwendigkeit auch auf Aussagen über Eigenschaften, wie ,rot‘ oder ,schwer‘, die weder positiv noch negativ sind, zutrifft, ist nicht erwiesen. Hier kann nur von modaler ,Kontingenz‘ gesprochen werden, die universal, alles Seiende innerhalb der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> betrifft. Somit sind die Aussagen <span style="color:#4C58FF">— ‚'''A'''‘ —</span> in der GÖDEL-Regel, nur auf Aussagen über ,positive‘ Eigenschaften eingeschränkt, und nicht allgemein gültig. Die <span style="color:#4C58FF">[ Nezessisierungsregel ]</span> ist nur für <span style="color:#FF6000">„Transzendentalia“ „modal wahr“</span>, und für ,Nicht-Transzendentalia‘ immer <span style="color:#FF6000">„modal falsch“</span>.
Der unbegrenzt Unendliche, GOTT, — im Glauben der Christen —, ist deswegen ,notwendig für uns da‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, weil er als GOTT ,vollkommen‘, ,perfekt‘ und absolut ,positiv‘, d.h. absolut ,gut allein‘ ist, ohne jede Negativität ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>; <span style="color:#00B000">(was auch schon im 2. Beweisgang mit Term :13: verifiziert wurde)</span>. Und wenn GOTT ,vollkommen‘, ,perfekt‘, ,positiv‘, und absolut ,gut‘ ist, dann ist er das auch ,notwendig aus sich‘ ''':''' <span style="color:#4C58FF">— ‚'''PG → □PG'''‘ — ::</span> <span style="color:#00B000">(als Zusatz-Korollar im 2. Beweisgang mit Axiom-4 und der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>)</span>, d.h. ,aus seinem Wesen‘. Das ist gerade das, ,was‘ GOTT als GOTT ausmacht ''':''' sein ,Wesen‘, bzw. seine <span style="color:#FF6000">„Natur“</span>. Zusammen mit der Definition-1 für GOTT, <span style="color:#00B000">(und der Definition-2 ''':''' Alle Wesenseigenschaften hängen notwendig gleichwertig aus sich zusammen)</span>, ist dieses, aus der <span style="color:#FF6000">„Natur“</span> GOTTES sich ergebende, ‚Notwendigsein‘, <span style="color:#4C58FF">— '''□''' —</span>, aller ‚positiven‘ Eigenschaften im Axiom-4, und ihr logischer Zusammenhang, d.i. die Koinzidenz aller ,Vollkommenheiten‘ und ,Zuschreibungen‘ im Unendlichen, GOTT, ihr ,Zusammenfallen in eins‘, die entscheidende Voraussetzung, aus der sich dann für GÖDEL <span style="color:#00B000">(im 2. Beweisgang)</span> auch der logische Zusammenhang, bzw. die ontologische Identität, <span style="color:#00B000">(die Koinzidenz)</span>, von <span style="color:#FF6000">„Dasein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, im Basis-Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> mit Notwendigkeit ergibt. Damit hat GÖDEL ein altes <span style="color:#4C58FF">„theologisches“</span> Theorem der Vergessenheit entrissen. Das Theorem-2 ist dann, in weiterer Folge, die ,modal‘ notwendige, d.h. die transzendentale Voraussetzung auch für den Konsequenz-Teil im Theorem ANSELMS, <span style="color:#00B000">(Term :09: hier im 3. Beweisgang)</span>. <span style="color:#FF6000">„Positive Eigenschaften“<span style="color:#00B000"> | </span>„Vollkommenheiten“</span> sind ,immer‘ auch <span style="color:#FF6000">„notwendige Eigenschaften“</span>, daher ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. Das ,Dasein‘, die <span style="color:#FF6000">„Existenz“</span> ist ,immer‘ etwas <span style="color:#FF6000">„Positives“</span>, speziell in GOTT, dem Schöpfer jeder ,Existenz‘, bzw. allen ,Seins‘. Axiom-4 begründet im GÖDEL-Kalkül das Basis-Theorem-2, <span style="color:#00B000">(wie auch das Korollar-3 von der exklusiven Einzigartigkeit GOTTES)</span>, und ,verankert‘ diese Theoreme damit zugleich in der <span style="color:#4C58FF">,theologisch‘</span>-philosophischen Tradition der ,Rede von GOTT‘ bei ARISTOTELES, — AVICENNA, — ANSELM, — DESCARTES, — LEIBNIZ, — HEGEL, — und bei GÖDEL mit äußerster ,logischer‘ Klarheit.
Anmerkung-5 ''':''' Der ‚Schlüsselbegriff‘ in diesem Kalkül ''':''' <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Vollkommenheit“<span style="color:#00B000"> | </span>„Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, dominiert alle Axiome des GÖDEL-Kalküls, jedoch ohne inhaltlich genauer ‚bestimmt‘ worden zu sein. Für <span style="color:#4C58FF">— ‚'''P'''‘ — </span> gibt es keine explizite Definition '''!''' <span style="color:#00B000">(Das Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, besagt nur, dass die ,postulierten‘, positiven Eigenschaften, die <span style="color:#FF6000">„Transzendentalia“</span>, formal miteinander verträglich, d.h. ‚widerspruchsfrei‘ sind, wegen Axiom-2. Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, besagt, dass positive Eigenschaften ,gleichwertig‘ sind, d.h. gleich ,wahr‘ sind, weil sie ,notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, aus sich, alle paarweise mit- und voneinander ,impliziert‘ sind, sich gegenseitig ,einschließen‘, und damit eine Einheit bilden, d.h. in GOTT ,eins‘ sind. Axiom-2 ist somit zugleich eine ,indirekte‘ Definition für ,positive‘ Eigenschaften ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, besagt ''':''' Weil die ,gleichwertigen‘, positiven Eigenschaften sich gegenseitig implizieren, und damit notwendig von einander abhängen, d.h. koinzident in GOTT ,eins‘ sind, — wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht —, dann sind sie somit auch die ,wesentlichen‘ Eigenschaften, die <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, in GOTT, der, wesentlich und exklusiv, notwendig ,Einer‘ ist. Die Definition-2 ist nur dann <span style="color:#FF6000">„modal wahr“</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit positive Eigenschaften, d.h. mit <span style="color:#FF6000">„Transzendentalien“</span>, besetzt werden. Diese Definition ist jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn ihre Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind. Fußnote zu Definition-2 in der GÖDEL-Notiz ''':''' <span style="color:#FF6000">»''any two essences of x are nec. equivalent''«</span>. Die paarweise, notwendige Äquivalenz von zwei beliebigen Wesenseigenschaften der Individuum-Variable <span style="color:#4C58FF">‚'''x'''‘</span>, wird hier, spezifisch für GOTT, d.h. wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT, dem ,Einen‘, steht, zur <span style="color:#FF6000">„Koinzidenz“</span>, — zum paarweise ,Zusammenfallen aller Gegensätze in Einem‘ —, dem inneren Zusammenhang aller seiner <span style="color:#FF6000">„ultimativen“</span> Vollkommenheiten, d.h. aller <span style="color:#FF6000">„Transzendentalia“</span> und Zuschreibungen, in dem unbegrenzt Unendlichen, GOTT, den schon der Philosoph und Kardinal NIKOLAUS von Cues als <span style="font-family: Times;"><big>,coincidentia oppositorum‘</big></span> verstanden hat.)</span>
In den entscheidenden ‚Schlusssätzen‘ des Kalküls ist der ‚Schlüsselbegriff‘ verschwunden. Hier ist nur mehr von GOTT, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, die Rede ''':''' Korollar-1, <span style="color:#FF6000">»''Es ist definitiv denkbar, dass es GOTT gibt''«</span>, Theorem-2, <span style="color:#FF6000">»''Dasein, GOTT-Sein, Göttlichkeit ist das Wesen GOTTES''«</span>, Theorem-3, <span style="color:#FF6000">»''Weil GOTT definitiv denkbar, d.h. widerspruchsfrei möglich ist, darum ist auch der Glaube an GOTT widerspruchsfrei, logisch richtig und mathematisch evident, der annimmt, dass es GOTT, mit Notwendigkeit, wirklich gibt''«</span>, <span style="color:#00B000">(nach ANSELM von Canterbury, und was spezifisch das <span style="color:#FF6000">»</span>''Privilegium der Gottheit allein''<span style="color:#FF6000">«</span> ist, nach LEIBNIZ)</span>, und Korollar-3, <span style="color:#FF6000">»''Es gibt notwendig aus sich, d.i. unverursacht, nur einen GOTT''«</span>. Das GÖDEL-Kalkül ist zu diesen Erkenntnissen gekommen, ohne die Eigenschaften, bzw. die ‚Vollkommenheiten‘ GOTTES, d.h. wer oder was GOTT ‚an sich‘ selbst ist, genauer bestimmen zu müssen, <span style="color:#00B000">(was ,für uns‘ ohnehin ,unmöglich‘ ist)</span>; außer im Theorem-2, in dem das <span style="color:#FF6000">„Dasein“</span> GOTTES als die ‚für uns‘ bestimmende und wichtigste <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT erkannt worden ist, — immer vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. Der GOTT des GÖDEL-Kalküls ist nicht mehr der an Raum und Zeit gebundene ‚Gott‘ des ARISTOTELES, sondern der von Raum und Zeit <span style="color:#FF6000">»''unabhängige''«</span> GOTT der Bibel bei ANSELM und bei LEIBNIZ. Das GÖDEL-Kalkül, <span style="color:#00B000">(wie ja auch der sog. ‚ontologische Gottesbeweis‘ ANSELMS)</span>, kann jedoch, — bei aller ‚Coolness‘ —, keinen GOTT-Glauben ‚erzeugen‘, sondern setzt vielmehr die Existenz GOTTES notwendig als gegeben schon voraus. Das Kalkül des Logiker GÖDEL beweist aber, dass der traditionelle ‚GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. logisch ,richtig‘ und <span style="color:#FF6000">»''mathematisch evident''«</span> ist, weil der ‚Nicht-GOTT-Glaube‘, <span style="color:#FF6000">»''die atheistische Weltanschauung''«</span>, im Möglichkeitsbeweis notwendig zu unlösbaren Widersprüchen führt, und somit logisch ,falsch‘ ist. <span style="color:#00B000">(Die ,Logik‘ hat aber, — bekanntlich —, bei allen wichtigen, persönlichen Entscheidungen immer nur eine untergeordnete Rolle '''!''' )</span>
Anmerkung-6 ''':''' Das erste, ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitete, Hauptergebnis im 3. Beweisgang, Term :10: <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' der Glaube, dass GOTT ,notwendig‘ existiert, ist die logische Konsequenz aus der Prämisse, Term :1: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>. Dieses erste Hauptergebnis hat also den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist daher davon ,abhängig‘, d.h. Term :10: ist der Ausdruck einer ,Glaubensüberzeugung‘. Das zweite Hauptergebnis im 3. Beweisgang, das Theorem ANSELMS ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, dagegen, ist die Darstellung der Abhängigkeit des ersten Hauptergebnisses von dem, vorher schon bewiesenen, ,Axiom‘ von der ,möglichen‘ Existenz GOTTES ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang. Dem geht folgende Beobachtung voraus ''':''' Der Term ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, hat in seiner syntaktischen Stellung hier, im Theorem-3, nicht mehr den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist damit, in seiner Position als Konsequenz-Teil im Theorem ANSELMS, auch nicht mehr davon syntaktisch abhängig, sondern stützt sich formal-syntaktisch nur auf die behauptete Möglichkeit GOTTES; daher muss diese ,angenommene‘ Möglichkeit noch bewiesen <span style="color:#00B000">( ╞ )</span> werden. Dazu die Feststellung LEIBNIZ‘, der diesen Zusammenhang, und seinen Mangel, erkannt hat ''':'''
::Das Theorem ANSELMS ist <span style="color:#FF6000">» ''ein unvollständiger Beweis, der etwas voraussetzt, was man noch hätte beweisen'' <span style="color:#00B000">( ╞ )</span> ''sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' «</span>.
Diesen <span style="color:#FF6000">»''unvollständigen Beweis''«</span> hat GÖDEL im 1. Beweisgang mit dem ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleiteten, und widerspruchfreien Möglichkeits-Korollar-1, vervollständigt, und damit hat er mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span> bewiesen ''':''' <span style="color:#FF6000">»''Diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens''«</span> enthält <span style="color:#FF6000">»''keinen Widerspruch''«</span> '''!''' Das Korollar-1 ist nur vom logischen Axiom-1 und von der mathematischen Äquivalenz der Perfektionen, <span style="color:#00B000">(der Transzendentalien)</span>, im Axiom-2 ,abhängig‘, und nicht mehr von der ,methodologischen‘ Kalkül-Prämisse, dem traditionellen GOTT-Glauben. Damit hat das Glaubens-Theorem ANSELMS die gesuchte <span style="color:#FF6000">»''mathematische Evidenz''«</span> erreicht, unabhängig von jeder Glaubensüberzeugung. Entscheidend dafür ist der mathematisch-logische Beweis GÖDELS, dass der Nicht-GOTT-Glaube zu einem Widerspruch führt.
Zusammenfassung ''':'''
Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>, ist die logische Konsequenz aus der Prämisse im 1. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, den, — <u>modal-frei</u> — gewählten, ,angenommenen‘ positiven Eigenschaften, bzw. ,Transzendentalia‘.
Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' <span style="color:#FF6000">»''GOTT-Sein ist das Wesen GOTTES''«</span>, ist die logische Konsequenz aus der Prämisse im 2. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, dem, — <u>modal-frei</u> — gewählten, ,angenommenen‘ GOTT-Glauben der Christen.
Im Unterschied dazu ist im 3. Beweisgang, das Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' der Glaube, dass es einen GOTT notwendig gibt ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, die logische Konsequenz aus dem, — <u>modal-notwendig</u> — als widerspruchsfrei ,bewiesenen‘, Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, im 1. Beweisgang, <span style="color:#00B000">(auch im Beweisgang ,Widerlegung‘ im Anhang)</span>, und damit ist das Glaubens-Theorem-3, als ganzes, ,widerspruchsfrei‘. Das Theorem ANSELMS ist, mit Korollar-1, nur vom logischen Axiom-1 der Widerspruchsfreiheit, und der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften, <span style="color:#00B000">(aller Transzendentalia)</span>, im Axiom-2, abhängig. Damit ist die Bedingung für die geforderte, spezielle <span style="color:#FF6000">»''mathematische Evidenz''«</span>, und auch für die Widerspruchsfreiheit im Glaubens-Theorem ANSELMS erfüllt; unabhängig von jeder Glaubensüberzeugung. Weil es <span style="color:#FF6000">„modal wahr“</span> ist, dass die Transzendentalien, bzw. die Vollkommenheiten ontologisch, — dem Sein nach —‚ alle <span style="color:#00B000">(zueinander)</span> widerspruchsfrei, und alle <span style="color:#00B000">(miteinander)</span> gleichwertig sind, ist es auch <span style="color:#FF6000">„modal wahr“</span>, dass es möglich ist, dass GOTT, — dem Sein nach —‚ da ist, <span style="color:#00B000">(d.h. existiert)</span>, der die unbegrenzte Summe aller ultimativen Transzendentalia, bzw. der unendlichen Vollkommenheiten allen Grades ist, wie es der ,christliche Glaube‘ des Erzbischofs ANSELM und seiner Anvertrauten ,annimmt‘.
====<div class="center"><span style="color:#660066">Widerlegung</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDEL-Kalkül : der Möglichkeitsbeweis als Widerlegung des Nicht-GOTT-Glaubens</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe_____________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist X nicht positiv“} \\
\text{(Axiom 2)} & \quad \Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaft Y in allen x, die aus der Eigenschaft X in allen x} \\
\text{ } & \quad & \ & \; \; \text{mit modaler Notwendigkeit folgt, ist eine positive Eigenschaft“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Korollar-1)} &\quad \Diamond \; \exists x \ G \ x \ & \ & \; \; \text{( „das —,x‘— steht für den GOTT, —,G‘—, der Christen“ )} \\
\text{ } & \text{„Es ist möglich, dass es den GOTT der Christen gibt“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad \; \neg \Diamond \; \exists x \ G \ x \ & \ & \text{ AE: „Es ist unmöglich, dass es diesen GOTT gibt“ (dezidierter Atheismus)} \\
\text{02} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{03} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{04} & \quad \neg\neg \Box \neg \exists x \ G \ x \ & \ & \text{:01:[ ◇A ↔ ¬□¬A ] :: (Modalregel) } \\
\text{05} & \quad \neg\neg \Box \neg\neg \forall x \neg \ G \ x \ & \ & \text{:04:[ ∃xA ↔ ¬Ɐx¬A ] :: (Quantorenregel) } \\
\text{06} & \quad \text{ ├ }\; \Box \; \forall x \neg G \ x \ & \ & \text{:05:NEG :: [ ¬¬A↔A ] :: (Gesetz der Aussagenlogik) } \\
\text{07} & \quad \Box \; \forall x \neg G \ x \Leftrightarrow\ W & \ & \text{:01:06:[ (:01:↔W) → (├:06:↔W) ] :: (Kalkülregel) } \\
\text{08} & \quad \Box \; \forall x \ G \ x \Leftrightarrow\ F & \ & \text{:07:[ (¬A↔W)↔(A↔F) ] :: (Regel für Wahrheitswerte)} \\
\text{ } & \text{„Jeder GOTT-Glaube ist notwendig falsch ! “} & \ & \Longleftarrow\; \text{die logische Konsequenz aus der Prämisse :01: !} \\
\text{09} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:02:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{10} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (\neg x = x)) & \text { } & \text{:08:09:[ (:08:↔F) → (:09:↔F) ] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{11} & \quad \Box \; \forall x (\ G \ x \Rightarrow \; (\neg x = x)) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=(¬x= ..)) } \\
\text{12} & \quad \ P (\neg x = .. ) & \ & \text{:10:11:[ Modus ponens ] :: [ A→B, A ├ B ]} \\
\text{13} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{14} & \quad \neg P (\ x = .. )\ & \ & \text{:12:13:[ Modus ponens ] :: (log. Schlussregel)}\\
\text{15} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:03:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{16} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) & \ & \text{:08:15:[ (:08:↔F) → (:15:↔W) ] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{17} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=( x= ..))} \\
\text{18} & \quad \ P (\ x = .. )\ & \ & \text{:16:17:[ Modus ponens ]}\\
\text{19} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ &
\text{:14:18:[ Konjunktion ] ⇒ Kontradiktion !}\\
\text{20} & \quad \neg \Diamond \; \exists x \ G \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:01:19:[ ├A├B╞ A→B ] :: ''KONDITIONALER BEWEIS''}\\
\text{ } & {\color{RedOrange}\text{Der Atheismus führt zu einem logischen Widerspruch ! }} & \ & \Longleftarrow\; \text{was mit Term :20: bewiesen ist !} \\
\text{21} & \quad \neg\neg \Diamond \; \exists x \ G \ x & \ & \text{:20:19:[ Modus tollendo tollens ] :: [ A→B,¬B ├ ¬A ]}\\
\text{22} & \quad \; \Diamond \; \exists x \ G \ x & \ & \text{:21:NEG }\\
\text{(Korollar-1)} & \;\text{„Es ist definitiv möglich, dass es diesen GOTT gibt“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\end{align}</math>
</small>
|}
Anmerkung-7 ''':''' <span style="color:#00B000">( Dieser Beweisgang ist praktisch identisch mit dem 1. Beweisgang, jedoch gestrafft und präzisiert nach G.J.WIRSCHING. Diese Widerlegung des Nicht-GOTT-Glaubens beginnt sofort mit dem Korollar-1 <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> aus dem 1. Beweisgang, als in Frage gestelltes ,Theorem‘, und beweist, ohne das Axiom-3 <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, und ohne die GÖDEL-Prämisse <span style="color:#4C58FF">— ,'''PX'''‘ —</span>, in einem Zwischenergebnis, die innere Widersprüchlichkeit und damit auch die Unhaltbarkeit der atheistischen Glaubens-Annahme, aus rein logischen ,Gründen‘, bzw. Axiomen. )</span>
Dieser Beweisgang geht von der Existenz GOTTES, <span style="color:#4C58FF">— ,'''G'''‘ —</span>, als Glaubens-Annahme, aus, wobei aber die Möglichkeit seiner Existenz, und damit die Sinnhaftigkeit des Glaubens an GOTT, durch die Prämisse :01: in Frage gestellt wird, und daher im Kalkül überprüft werden muss. Denn mit der Behauptung der Existenz GOTTES allein ist es nicht getan. Es muss auch seine ,Möglichkeit‘, d.h. die Sinnhaftigkeit des Glaubens an GOTT aufgewiesen werden. LEIBNIZ hat als erster, <span style="color:#00B000">(nach ANSELM)</span>, dieses Problem gesehen, und GÖDEL hat dafür die Lösung gefunden. Dieser Beweisgang, <span style="color:#00B000">(analog zum Möglichkeitsbeweis von Günther J. WIRSCHING konzipiert)</span>, setzt in den Axiomen, genau wie im 1. Beweisgang, die Existenz von etwas <span style="color:#FF6000">„Positiven“, „Perfekten“, „Vollkommenen“</span>, <span style="color:#4C58FF">— ,'''P'''‘ —</span>, <span style="color:#00B000">(d.h. die Transzendentalien)</span>, allgemein für die Welt voraus, <span style="color:#00B000">(was im Axiom-3 ''':''' <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, auch GOTT ultimativ zugeordnet wird ''':''' <span style="color:#FF6000">»''GOTT ist absolut positiv, perfekt und vollkommen''«</span>)</span>; das dann im 2. Beweisgang mit Term :13: als widerspruchsfrei, <span style="color:#00B000">(als ,wahr‘ und ,annehmbar‘ im Kontext des christlichen Glaubens)</span>, schon ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> worden ist. Die Existenz von ,Transzendentalien‘ in der Welt, ist ein, mit Beispielen belegbares, allgemeines Faktum; ihre Existenz auch in GOTT ist mit dem Term :13: des 2. Beweisganges bewiesen, die jedoch im Unendlichen, GOTT, als Transzendentalia, auch in ,ultimativer‘ Form vorliegen. Axiom-1 ,besagt‘, dass Eigenschaften nicht zugleich, vollkommen und nicht vollkommen, sein können. Axiom-2 ,besagt‘, dass, allgemein, alle Vollkommenheiten, <span style="color:#00B000">(alle Transzendentalien)</span>, gleichwertig, <span style="color:#00B000">(mathematisch äquivalent)</span>, sind. <span style="color:#00B000">(Axiom-2 wird hier um das GÖDEL-Konjunkt <span style="color:#4C58FF">— ,'''PX'''‘ —</span> verkürzt dargestellt. Damit ist auch Axiom-3 für diesen Beweisgang unnötig geworden, ohne dass sich wegen dieser Kürzung am Ergebnis etwas ändert. Axiom-2 wird jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn seine Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind, die keine ,Transzendentalia‘ sind.)</span> Die Eigenschaft <span style="color:#4C58FF">— (¬x=..) —</span> ,besagt‘, dass GOTT <span style="color:#FF6000">„unvergleichlich“</span> ist, wenn <span style="color:#4C58FF">,'''x'''‘</span> für GOTT steht. <span style="color:#00B000">(Der informelle Term, <span style="color:#4C58FF">— (¬x=..) —</span>, ersetzt hier, wie bei A. FUHRMANN, den formal korrekten Abstraktionsausdruck ''':''' <span style="color:#4C58FF">— λy.(¬x=y) —</span>, aus dem Lambda-Kalkül.)</span> Der Term :16: <span style="color:#4C58FF">— (x=x) ↔ W —</span> steht für die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚IST‘'' <span style="color:#00B000">(aus mir selbst)</span>«</span>, der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES. Der GOTT der abendländischen, christlichen Tradition wird mit <span style="color:#4C58FF">— ,'''G'''‘ —</span> bezeichnet ''':''' d.i. der <span style="color:#FF6000">„GOTT der Christen“</span>, entsprechend der ,methodologischen‘ Prämisse und der ,Genese‘ des Kalküls, syntaktisch formalisiert in der Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn es alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>, nach der Vorgabe von LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Mit Korollar-1 hat dieser Beweisgang dasselbe Endergebnis, wie der 1. Beweisgang. Der Beweis, dass der dezidierte Atheismus zu einem logischen Widerspruch führt, und damit falsch ist, ist ein Zwischenergebnis in diesem Beweisgang, und begründet mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, und unabhängig von jeder Glaubensüberzeugung, den, von LEIBNIZ gesuchten, Möglichkeitsbeweis für die Existenz GOTTES im Argument des Erzbischofs, und bestätigt damit die Sinnhaftigkeit des GOTT-Glaubens. Einmal Axiom-1 und zweimal Axiom-2 sichern hier das Ergebnis des Kalküls ''':''' das Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>''':''' <span style="color:#FF6000">»''Es ist definitiv möglich, dass es den GOTT der Christen gibt''«</span>. Diese zwei Axiome sind die einzigen, und modal-notwendigen, d.h. die transzendentalen Voraussetzungen und Bedingungen für das Endergebnis ''':''' der Widerspruchsfreiheit und Sinnhaftigkeit des Glaubens der Christen an GOTT; <span style="color:#00B000">(dasselbe gilt natürlich auch für die <span style="color:#4C58FF">„theologische“</span> Weltanschauung jeder monotheïstischen Religion '''!''' Dem Erzbischof ANSELM ging es damals nur um seinen Glauben an GOTT.)</span>.
Die Logik-Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso sequitur quotlibet, etiam verum“</big></span></span>, <span style="color:#00B000">(‚Aus Falschem folgt irgendetwas, auch Wahres‘)</span>, ist der scholastische Ausdruck für die ‚Implikation‘ <span style="color:#00B000">(Folgerung)</span> von Aussagen, die nur dann falsch, <span style="color:#4C58FF">— F —</span> ist, wenn das Antezedens wahr, <span style="color:#4C58FF">— W —</span>, und die Konsequenz falsch, <span style="color:#4C58FF">— F —</span> ist. Andernfalls ist sie immer wahr, <span style="color:#4C58FF">— W —</span>, auch wenn die Voraussetzung falsch, <span style="color:#4C58FF">— F —</span> ist ''':''' ‚Modern‘ darstellbar durch die ‚Wahrheitswertetafel‘ für die ‚materiale Implikation‘, <span style="color:#4C58FF">— ,(A → B)‘ —</span> <span style="color:#FF6000">„wenn A, dann B“</span>. Damit ist auch der <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ] </span> verstehbar; <span style="color:#00B000">(vgl. die vierte Zeile der ‚materialen Implikation‘)</span>. Der positive hypothetische Syllogismus ''':''' <span style="color:#4C58FF">[ Modus ponendo ponens ] :: [ A → B, A ├ B ] </span> ist aus der ersten Zeile ablesbar.
Die folgende Tabelle gibt für jeden ,Wahrheitswert‘ der Aussagen <math>A</math> und <math>B</math> das Resultat einiger zweiwertiger Verknüpfungen an ''':'''
{|class="wikitable hintergrundfarbe2" style="text-align:center;"
|-
!colspan="2"|''Belegung''!!Konjunktion!!Disjunktion!!materiale<br /> Implikation!!Äquivalenz<br /> Bikonditional!!kopulative<br /> Konjunktion
|-
!<math>A</math>
!<math>B</math>
!<math>A</math> und <math>B</math>
!<math>A</math> oder <math>B</math>
!wenn <math>A</math> dann <math>B</math>
!sowohl <math>A</math> als auch <math>B</math>
!entweder <math>A</math> oder <math>B</math>
|-
!W!!W
|W||W||W||W||F
|-
!W!!F
|F||W||F||F||W
|-
!F!!W
|F||W||W||F||W
|-
!F!!F
|F||F||W||W||F
|}
<span style="color:#00B000">(Eine ‚Konjunktion‘ ist nur dann ,wahr‘, wenn beide Aussagen einer ‚Konjunktion‘ wahr sind. Eine ‚kopulative Konjunktion‘ ist nur dann ,wahr‘, wenn entweder die eine, oder die andere Aussage der ‚kopulativen Konjunktion‘ wahr ist. Es besteht also eine Wenn-Dann-Verbindung zwischen beiden Aussagen — eine ,Kopplung‘. Das ist die logische Grundlage von Axiom-1 im GÖDEL-Formalismus)</span>
Um das Widersprüchliche der ,Annahme‘ nachzuweisen, dass positive Eigenschaften ,nicht konsistent‘ seien, <span style="color:#00B000">(im 1. Beweisgang)</span>, bzw. um das Unlogische und Sinnwidrige der ,Annahme‘ klarzustellen, es sei ,unmöglich‘, dass es einen GOTT gibt, <span style="color:#00B000">(hier, in der Widerlegung)</span>, verwendet das GÖDEL-Kalkül den Gegensatz ''':''' wahr, <span style="color:#4C58FF">— W —</span>, falsch, <span style="color:#4C58FF">— F —</span>, zwischen der dritten und vierten Zeile der Wahrheitswertetafel, für zwei ,wahre‘ <span style="color:#4C58FF">— W —</span> ,materiale Implikationen‘, in denen die Voraussetzung jeweils falsch, <span style="color:#4C58FF">— F —</span>, ist, entsprechend der Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso, <span style="color:#4C58FF">— F —</span>, sequitur quotlibet, <span style="color:#4C58FF">— F —</span>, etiam verum, <span style="color:#4C58FF">— W —</span>“</big></span></span>, jeweils mit der Hilfe von Axiom-1 und Axiom-2, in einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>; hier unabhängig von jeder Glaubensüberzeugung. Im Gegensatz dazu, wird, <span style="color:#00B000">(im 2. Beweisgang)</span>, aus dem Glauben an GOTT, auch mit einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, speziell mit Axiom-1, das Widersprüchliche in der ,Annahme‘ nachgewiesen, es gäbe in GOTT <span style="color:#FF6000">»''keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span>, d.h. keine ,Transzendentalia‘. In dieser <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, im 2. Beweisgang, wird vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span> ''':''' es gibt den GOTT der Christen, <span style="color:#00B000">(als Prämisse :01:)</span>, der ,unvergleichlich‘ und ,einzigartig‘ ist, und in dem auch alle ,Transzendentalia‘ <span style="color:#FF6000">„koinzident“</span> ,eins‘ sind, entsprechend Axiom-2.
Für KANT entsteht ein Widerspruch in den Prädikaten eines Satzes.
::<span style="color:#FF6000">»</span> ''Wenn ich das Prädicat in einem identischen Urtheile aufhebe'', <span style="color:#00B000">[ durch eine Negation ]</span>, ''und behalte das Subject, so entspringt ein Widerspruch''. <span style="color:#00B000">[ Wenn ich sage ''':''' ,''GOTT ist nicht allmächtig''‘, entsteht ein Widerspruch zur richtigen Aussage ''':''' ,''GOTT ist allmächtig''‘. ]</span> … ''Wenn ihr aber sagt ''':''' ,GOTT ist nicht‘, so ist weder die Allmacht, noch irgendein anderes seiner Prädicate gegeben; denn sie sind alle zusammt dem Subjecte aufgehoben'', <span style="color:#00B000">[ negiert ]</span>, ''und es zeigt sich in diesem Gedanken nicht der mindeste Widerspruch.'' <span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 398f; https://www.korpora.org/kant/aa03/398.html</ref>
Es ist richtig, wie KANT sagt, der Widerspruch entsteht nicht in dem Gedanken ''':''' <span style="color:#FF6000">»</span>''GOTT ist nicht''<span style="color:#FF6000">«</span>. GÖDEL zeigt daher, dass der Widerspruch erst dann entsteht, wenn von der Annahme ausgegangen wird ''':''' ''<span style="color:#FF6000">»</span>Es ist unmöglich, dass GOTT ist''<span style="color:#FF6000">«</span>. Daraus folgt dann ,regulär‘, mit Hilfe von Axiom-1 und Axiom-2, <span style="color:#00B000">(d.h. mit den Theoremen von den Transzendentalien)</span>, die logische ,Möglichkeit‘ GOTTES, unabhängig von jeder Glaubensüberzeugung. Wie LEIBNIZ klar erkannt hat, muss zuerst, aus dem Widerspruch des Gegenteils, die logische ,Möglichkeit‘, <span style="color:#00B000">(die Konsistenz)</span>, der Existenz GOTTES bewiesen werden ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, bevor daraus die reale ,Notwendigkeit‘ GOTTES abgeleitet werden kann ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, dessen ,Existenz‘ jedoch, aus dem ,Glauben‘, im Voraus, schon angenommen worden ist. Dieser Sachverhalt ist das ausschließliche Spezifikum GOTTES, <span style="color:#00B000">(das <span style="color:#FF6000">»''Privilegium der Gottheit allein''«</span>)</span>, und gilt nur bei GOTT, als dem Unvergleichlichen und Einzigartigen. Dieses ,Spezifikum‘ wird im Theorem ANSELMS abgebildet ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, auf Grund von Axiom-2, das den inneren Zusammenhang, die Koinzidenz auch von ,Möglichkeit‘ und ,Notwendigkeit‘ im Unendlichen, GOTT, erkennen lässt. Bis Zeile 10, im 3. Beweisgang, reicht der Geltungsbereich der ,modal‘-frei gewählten Kalkül-Prämisse :01:, der ,methodologische‘ GOTT-Glaube. In Zeile 11 liegt der ,Schwerpunkt‘ des ontologischen Beweises dann aber am, — modal als notwendig — ,bewiesenen‘ Widerspruch des Gegenteils zum GOTT-Glauben, <span style="color:#00B000"> (formal-syntaktisch dargestellt als widerspruchfreies Antezedens, <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang)</span>, und nicht mehr am ,angenommenen‘ GOTT-Glauben der Kalkül-Voraussetzung, <span style="color:#00B000">(nun dargestellt als Konsequenz <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> im Theorem ANSELMS)</span>. Das Möglichkeits-Korollar-1 muss jetzt immer, wie folgt, gelesen werden ''':''' <span style="color:#FF6000">»''Es ist <u>widerspruchfrei</u> möglich, dass GOTT ist''«</span>. Damit hat er, — angeregt durch LEIBNIZ, und mit ihm —, die fast einhellig akzeptierte Fehldeutung des ontologisch-<span style="color:#4C58FF">„theologischen“</span> Arguments ANSELMS für GOTT durch gewichtige philosophische, <span style="color:#00B000">(KANT<ref>GOTT ist absolut einzigartig und unvergleichlich. KANT macht GOTT jedoch zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, indem er die Existenz, bzw. das ,Sein‘ GOTTES mit dem ,Sein der Dinge‘ gleich setzt. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! KANT verkennt damit die Einzigartigkeit und Besonderheit GOTTES. Das ,Sein‘ der Dinge ist, — wie KANT sagt —, kein ,reales Prädikat’, d.h. Existenz ist keine Eigenschaft. Jedoch in GOTT ist ,Sein‘ ein ,reales Prädikat‘, d.h. Existieren ist ,real‘ die Wesenseigenschaft GOTTES, denn GOTT ist der, der für uns, — aus Liebe —, immer schon ,da‘ ist ''':''' in der ,Hypostatischen Union‘, sowohl als GOTT von Ewigkeit zu Ewigkeit, als auch als Mensch in unserer Zeitlichkeit. Das ist das, was GOTT für uns ausmacht —, sein Wesen.</ref>)</span>, und <span style="color:#4C58FF">„theologische“</span>, <span style="color:#00B000">(THOMAS<ref>GOTT ist absolut einzigartig und unvergleichlich. THOMAS unterscheidet die ,Natur GOTTES‘ nicht von der ,Natur der Dinge‘, indem er die ,Natur‘ des GOTTES ANSELMS irrtümlich mit der ,Natur‘ der Dinge gleich setzt. Damit reiht er GOTT unter die vielen Dinge unserer Welt ein, indem er für den GOTT ANSELMS annimmt ''':''' GOTT ,esse in rerum natura‘, d.h. wörtlich, dass der GOTT ANSELMS in der ,Natur‘ der Dinge existiert, <span style="color:#00B000">(was ANSELM nie gesagt hat)</span>. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! Die ,zeitlose-überzeitliche‘ Wirklichkeit, (Natur), GOTTES ist völlig verschieden und unabhängig von der zufälligen Wirklichkeit, (die ,Natur‘), unserer ,raum-zeitlichen‘ Welt. Daher ist sie mit dieser auch nicht vergleichbar. Thomas verkennt damit die Einzigartigkeit und Besonderheit GOTTES.</ref>)</span>, Autoritäten zurechtgerückt, welche die Einzigartigkeit und Unvergleichlichkeit des Unendlichen, GOTT, bei ihrer Beurteilung des Theorem ANSELMS nicht berücksichtigt, sondern den Unendlichen, <span style="color:#00B000">(irrtümlich)</span>, unter die endlichen Dinge unserer Welt eingereiht haben. GÖDEL hat mit dem bewiesenen Widerspruch des Gegenteils zum GOTT-Glauben, den Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Theorem ANSELMS geliefert, was, nach LEIBNIZ, für die Akzeptanz dieses Theorems noch gefehlt hat. Das Theorem ANSELMS besagt universell ''':''' Die <span style="color:#FF6000">»''theologische Weltanschauung''«</span> der Juden, Christen und Muslime, <span style="color:#00B000">(und des ägyptischen Pharaos ECHNATON und seiner Frau NOFRETETE)</span>, die ,annehmen‘, dass es mit ,Notwendigkeit‘ <span style="color:#4C58FF">— ‚'''□'''‘ —</span> <span style="color:#00B000">(nur)</span> einen GOTT gibt, ist logisch richtig und <span style="color:#FF6000">»''mathematisch evident''«</span>, weil es <u>ohne Widerspruch</u> ,denkbar‘ <span style="color:#4C58FF">— ‚'''◇'''‘ —</span> ist, dass es GOTT gibt ''':''' Nicht mehr und nicht weniger, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>.
Es geht hier bei GÖDEL nicht um Theoriefindung oder ähnliches. GÖDEL ist kein ,spekulierender‘ Theoretiker. GÖDEL ist Logiker und Mathematiker. Was er sagt, ist mathematisch wahr und logisch richtig. Wenn er sagt, dass die Aussage ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ — »''wahr''«</span> ist ''':''' <span style="color:#FF6000">»''es ist möglich, dass es Gott gibt'' ''':''' ''das ist ,wahr‘ wegen Axiom-2 (und Axiom-1)''«</span>, dann spricht er hier von der mathematischen Wahrheit. Logischerweise ist dann die konträre Aussage ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ — »''falsch''«</span> ''':''' <span style="color:#FF6000">»''es ist nicht möglich, dass es einen Gott gibt''«</span>, und zwar mathematisch falsch, weil sich aus dieser Aussage ein Widerspruch ergibt. Jeder, der die mathematische Logik GÖDELS lesen kann, kann das sehen und verstehen ''':''' Das Zwischenergebnis, <span style="color:#00B000">(Term :20:)</span>, in dieser Kalkül-Ableitung, die logische Konsequenz aus der Annahme des dezidierten Atheismus, es sei unmöglich, dass es GOTT gibt, ist der faktische, nachprüfbare, und für jeden Menschen sichtbare Beweis dafür, dass diese Annahme in einen Widerspruch mündet, und damit falsch und unlogisch ist. Das bedeutet, es ist eine Tatsache, bzw. es ist ein allgemein gültiges Faktum unser Welt, dass der Atheismus, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, wirklich falsch und unsinnig ist, und daher, mit Recht, als ,Unsinn‘ bezeichnet werden darf '''!''' Das ist nicht bloß als eine Theoriefindung, oder als eine Interpretation eines Autors zu verstehen. Das ist vielmehr genau so wahr und <span style="color:#FF6000">»''mathematisch evident''«</span>, wie, dass zwei mal zwei vier ergibt, und wirklich genau so logisch richtig, wie, dass die Erde sich um die Sonne dreht. Das ist gerade das Überraschende und Unerwartete am Gödel-Kalkül. Es geht hier nicht mehr um Theoriefindung oder Interpretationen, denen man zustimmen kann oder nicht. Es geht hier <span style="color:#FF6000">»''rein verstandesmäßig''«</span> um mathematisch-logische Fakten. Damit steht GÖDEL, in seiner Bedeutung, in gewisser Weise, neben KOPERNIKUS, weil seine Kalkül-Ergebnisse, wie die Berechnungs-Ergebnisse dieses Pioniers der damaligen Zeitenwende, heute, in unserem Äon, ebenfalls mit eingefleischte Vorurteile aufräumen, ohne aber, dass GÖDEL für sich selbst, im Glauben, logisch konsequent gewesen wäre. <span style="color:#00B000">(Er ist sich der Tragweite und der Konsequenzen seiner <span style="color:#4C58FF">„axiomatischen Theologie“</span> anscheinend nicht bewusst gewesen, wenn er sagt ''':''' Man sei heute noch <span style="color:#FF6000">»''weit davon entfernt, das theologische Weltbild wissenschaftlich begründen zu können''«</span>, nachdem sein Kalkül das <span style="color:#FF6000">„atheistische Weltbild“</span> fundamental ins Wanken gebracht und als irrationalen ,Unsinn‘ entlarvt hat. Sein Kalkül ,beweist‘ ( ╞ ) indirekt, dass das <span style="color:#FF6000">„theologische Weltbild“</span>, im Beweisgang ,Widerlegung‘, aus dem Widerspruch des Gegenteils, mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span>, offensichtlich doch, wissenschaftlich begründet werden kann)</span>.
----
Kurt GÖDEL ist auch deswegen ein Ausnahmelogiker.
----
===<div class="center"><span style="color:#660066">Epilog für Skeptiker</span></div>===
Wenn man das GÖDEL-Argument genau liest, dann ist nur die Annahme ''':''' <span style="color:#FF6000"> „es ist möglich, dass es GOTT gibt“</span> bewiesen, weil aus der Annahme ''':''' <span style="color:#FF6000">„es ist unmöglich, dass es GOTT gibt“</span> ein logischer Widerspruch ableitbar ist. Die Aussage ''':''' <span style="color:#FF6000">„es gibt GOTT“</span> ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Menschen, der dann aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann ''':''' <span style="color:#FF6000">»''es gibt GOTT wirklich''«</span>, wenn er will ''':''' <span style="color:#FF6000">»''Es stimmt also, was ich glaube '''!''''' «</span> Das ist das Argument ANSELMS, der ein christlicher Amtsträger war, und der daher von dieser Grundannahme auch ausgeht. Solange in den Voraussetzungen des Möglichkeitsbeweises im GÖDEL-Kalkül kein Widerspruch nachweisbar ist, und solange in der logischen Durchführung dieses Beweises keine schweren Mängel festgestellt werden können, ist das Ergebnis des Möglichkeitsbeweises, wie GÖDEL ihn durchgeführt hat, korrekt, und die Folgerungen daraus, logisch richtig, dass es sich hier um <span style="color:#FF6000">»''mathematische Evidenz''«</span> handelt, <span style="color:#00B000">(z. B. wie 2 x 2 = 4)</span>. Aber niemand ist gezwungen, aus der Möglichkeit, dass es GOTT gibt, daraus zu schließen, dass es GOTT auch mit Notwendigkeit gibt, wie das im Argument ANSELMS geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit LEIBNIZ, der selbst an GOTT geglaubt hat, mit Bestimmtheit sagen ''':''' <span style="color:#FF6000">»''gesetzt, dass GOTT möglich ist, so ist er, was das Privilegium der Gottheit allein ist''«</span>, weil GÖDEL mit seinem Kalkül den noch ausstehenden Beweis der Widerspruchsfreiheit dafür geliefert hat.
Wenn Du den 3. Beweisgang des GÖDEL-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument ANSELMS, der identisch ist mit dem Term in der Zeile 10, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, immer noch formallogisch abhängig ist von der methodologischen Glaubens-Prämisse, Term :01:, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den Gott der Christen''«</span>. Diese Abhängigkeit ist bis zur Zeile 10 offensichtlich und logisch korrekt. <span style="color:#00B000">(Man könnte nach dieser Zeile, ohne Weiteres, ,regulär‘ die <span style="color:#FF6000">„logische Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A→B ]</span> mit Term :01: und Term :10: als ein mögliches Korollar bilden ''':''' <span style="color:#4C58FF">— ‚'''Gx→□∃xGx'''‘ — </span>)</span>. Das bedeutet, der Konsequenz-Teil im Theorem ANSELMS, der in diesem ,regulär‘-möglichen Korollar an zweiter Stelle steht, ist damit in seiner Formal-Struktur offensichtlich ,regulär‘ von der Glaubens-Prämisse, Term :01:, abhängig, d.h. er ist der Ausdruck einer Glaubensüberzeugung. Im Theorem ANSELMS steht er jetzt, in der Zeile 11, als Konsequenz-Teil auch an zweiter Stelle, hat aber nicht mehr seine Glaubens-Prämisse als notwendige Bedingung an erster Stelle vor sich, wie im ,regulär‘-möglichen Korollar. Jetzt steht eine neue und andere Voraussetzung als Begründung vor ihm. Der Schwerpunkt des Argument ANSELMS liegt damit am Begründungs-Teil des ANSELM-Theorems, der jetzt die erste Stelle im Theorem einnimmt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist möglich, dass es GOTT gibt''«</span>, der erst dadurch entstanden ist, und davon abhängig ist, weil sein Gegenteil ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist unmöglich, dass es GOTT gibt''«</span>, zu einem Widerspruch geführt hat. Dieser Begründungs-Teil, das Antezedens, im Argument ANSELMS, ist daher nicht mehr von der methodologischen Glaubens-Prämisse, Term :01:, abhängig, sondern nur vom Axiom-1, der Widerspruchsfreiheit, und von der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften im Axiom-2, die im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, die Widerspruchsfreiheit der Möglichkeit des GOTT-Glaubens mit Notwendigkeit herbeigeführt haben. Daraus ergibt sich eine logische Verschiebung in der Argumentationskette, denn dieser Begründungs-Teil, der jetzt die Widerspruchsfreiheit für den Konsequenz-Teil liefert, ist selbst unabhängig und frei von jeder Glaubensüberzeugung. Weil widerspruchsfrei und <span style="color:#FF6000">»''mathematisch evident''«</span>, muss er als logische Begründung für die Widerspruchsfreiheit und als Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Konsequenz-Teils gelesen werden, und damit bestätigt er die Widerspruchsfreiheit und Sinnhaftigkeit der Glaubensüberzeugung eines gläubigen Menschen, <span style="color:#00B000">(was auch das Ziel ANSELMS war)</span>. Das heißt also ''':''' der Glaube dieses Menschen ist widerspruchsfrei und sinnvoll, und enthält keinen Zirkelschluss, weil sein Gegenteil, der Nicht-GOTT-Glaube, zu einem Widerspruch führt; <span style="color:#00B000">(das hat GÖDEL mit seinem Kalkül-System bewiesen, dessen Argumentationskette mit einem Computer-Programm, dem sog. ,Theorembeweiser‘, überprüft worden ist, und als <span style="color:#FF6000">»''nachweisbar korrekt''«</span> befunden wurde)</span>. Das Theorem ANSELMS beweist, nach GÖDEL, dass der Glaube an GOTT, mit <span style="color:#FF6000">»''mathematische Evidenz''«</span> notwendig widerspruchsfrei und sinnvoll ist, weil der Nicht-GOTT-Glaube notwendig zu einem Widerspruch führt. <u>Das Theorem beweist jedoch nicht, dass die Existenz GOTTES notwendig ist</u>, <span style="color:#00B000">(wie es fast immer fälschlich gelesen wurde und wird)</span>, sondern, das Theorem ANSELMS geht davon aus, als nicht hinterfragtes Faktum, dass GOTT notwendig, schon immer existiert, und beweist, mit dem GÖDEL-Kalkül, dass diese Glaubens-Annahme widerspruchsfrei und sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL abschließend sagt. GOTT hat es ja auch nicht ,nötig‘, bewiesen zu werden. Für den Erzbischof ANSELM war die Existenz GOTTES, überall und jederzeit, die ungefragte und für ihn die selbstverständlichste Voraussetzung aller seiner Bemühungen, in seinem Leben, und in seinem Beruf als christlicher Amtsträger, und auch als Theologe in den philosophischen Überlegungen über seinen Glauben. Mit diesen Überlegungen hat er, mit GÖDEL, bewiesen ''':''' Glaube ist nicht irrational, kein Sprung ins Unbekannte, sondern eine freie, vernünftige Entscheidung. Glaube ist rational und vertrauenswürdig.
Zusammengefasst heißt das Ergebnis dieser Bemühungen ANSELMS ''':''' Wenn Du an GOTT glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist auch logisch in der <u>bewiesenen Möglichkeit</u>, dass es GOTT geben kann, begründet, und damit ist er widerspruchsfrei, sinnvoll und kein Zirkelschluss. Dein Glaube an GOTT beruht jedoch, nach wie vor und in erster Linie, auf Deiner freien Entscheidung für GOTT, und nicht auf dem Zwang einer ,logischen‘ Argumentation. Wenn Du nicht an GOTT glauben willst, dann <u>musst Du, und sollst Du, auch nicht deswegen</u> an GOTT glauben, weil der Nicht-GOTT-Glaube zu einem Widerspruch führt, und damit falsch und unlogisch ist. Denn der Glaube an GOTT muss immer eine freie und Deine ganz persönliche Entscheidung für GOTT sein und bleiben. Niemand darf zum Glauben an GOTT gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Warum '''?''' Weil GOTT die Liebe ist '''!''' Und die Liebe duldet keinen Zwang '''!'''
Zum Abschluss, und für eine bessere Verständlichkeit dieser Studie, hat die KI, der ich diese Studie für die Erstellung eines Podcast übergeben habe, eine, — sogar für Kinder —, verständliche Metapher kreiert. Sie sagt, man stelle sich vor ''':''' Es sei irgendwo ein ,Schatz’ vergraben, und es gäbe auch eine ,Schatzkarte’ für diesen ,Schatz’. Kurt GÖDEL ist nun gekommen, und hat mit seinem Kalkül bewiesen, dass diese ,Schatzkarte’ korrekt ist und fehlerfrei. Ob aber jemand, mit Hilfe dieser ,Schatzkarte’ auf ,Schatzsuche’ gehen will oder nicht ''':''' das ist und bleibt jedem selbst überlassen, und ist immer eine freie, und ganz persönliche Entscheidung. Damit hat die KI erstaunlich treffend, sowohl die Bedeutung, als auch die reale Funktion des GOTT-Glaubens in der Lebens-Wirklichkeit unserer Welt und Zeit charakterisiert, in Übereinstimmung mit der Gleichniserzählung JESU vom ,Schatz im Acker’; <small><span style="color:#00B000">( vgl. {{Bibel | Matthäus-Evangelium |13|44|EU}} )</span></small>. Der ,Schatz’ ist die <span style="color:#FF6000">„<span style="font-family: Times;"><big>Βασιλεία του Θεού</big></span>“</span><span style="color:#00B000"> | ,Basileía tou Theoú’</span>, d.h. das <span style="color:#CC66FF">»''Königtum GOTTES''«</span>, oder auch das <span style="color:#CC66FF">»''Himmelreich''«</span>. Die ,Schatzkarte’ ist der Glaube an GOTT. Die ,Schatzsuche’ ist der Weg des Glaubens in der Nachfolge JESU, der uns den Weg zeigt zum Ziel, zur Erfüllung aller unserer Sehnsüchte und Wünsche.
----
----
;Fußnoten
<references />
punkq3c7k4wl7bzsd622e0y8glw54wy
1090681
1090676
2026-09-11T06:12:17Z
Santiago
19191
/* Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘ */ Farbänderung
1090681
wikitext
text/x-wiki
[[Kategorie: Buch]]
{{Regal|ort=Philosophie}}
{{Vorlage:StatusBuch|9}}
==<div class="center"><span style="color:#660066">'''Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘'''</span></div>==
<span style="font-family: Times;"><big><div class="center">לַמְנַצֵּ֗חַ לְדָ֫וִ֥ד אָ֘מַ֤ר נָבָ֣ל בְּ֭לִבּוֹ אֵ֣ין אֱלֹהִ֑ים הִֽשְׁחִ֗יתוּ הִֽתְעִ֥יבוּ עֲלִילָ֗ה אֵ֣ין עֹֽשֵׂה־טֽוֹב׃
(Psalm 14,1)</div></big></span>
----
===<div class="center"><span style="color:#660066">Vorwort</span></div>===
Zur Orientierung ''':''' Die Diskussion um GOTT läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser ANSELM gesagt ''':''' <span style="color:#FF6000">»''Ich glaube an GOTT'' … <span style="color:#00B000">[ sonst wäre er sicher
nicht Erzbischof von Canterbury geworden ]</span> … ''aber ich möchte auch wissen und verstehen, ob das stimmt und sinnvoll ist, was ich da glaube '''!''''' «</span> Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Professor und Philosoph aus Königsberg, Immanuel KANT, hat das, was ANSELM da aufgeschrieben hat, gelesen, <span style="color:#00B000">(vermittelt durch CARTESIUS)</span>, und das dann den <span style="color:#FF6000">„ontologischen Gottesbeweis“</span> genannt, <span style="color:#00B000">(obwohl es in Wirklichkeit gar kein Gottesbeweis ist; genauer ''':''' es ist kein Beweis für die Existenz GOTTES)</span>, und dieser große KANT hat dann großartig bewiesen, das, was ANSELM da aufgeschrieben hat, sei falsch. Es sei <span style="color:#FF6000">„ja gar kein“</span> Gottesbeweis '''!''' <span style="color:#00B000">( Naja, was denn sonst '''?''' )</span> Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichbaren GOTT mit hundert Talern in seinem Vermögenszustande verglichen hat. <span style="color:#00B000">(Das ist aber eine andere Geschichte.)</span> Hundert Taler und GOTT haben ,an sich‘ nichts gemeinsam, außer, wenn KANT ,wirklich‘ hundert Taler hat, und GOTT auch ,wirklich‘ existiert, <span style="color:#00B000">(wie ANSELM und gläubige Menschen glauben)</span>, dann gibt es GOTT und die Taler eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit KANT läuft die ganze Diskussion um GOTT immer nur als Diskussion um den <span style="color:#00B000">(von KANT)</span> so genannten <span style="color:#FF6000">„ontologischen, <span style="color:#00B000">[ kosmologischen, teleologischen etc. ]</span> Gottesbeweis“</span> —, obwohl es niemals einen Beweis für die Existenz GOTTES geben kann und niemals geben wird. <span style="color:#00B000">(Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich versucht zu sagen, weil keiner dieser sog. Beweise für die Existenz eines GOTTES stringent ist.)</span> Beweisen kann man die Existenz von Naturgesetzen. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie dann mit Mehrheitenbeschlüsse verändern. Wenn GOTT ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz GOTTES wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. GOTT ist <span style="color:#FF6000">„Person“</span>, — für Christgläubige ''':''' <span style="color:#FF6000">„ein GOTT in drei Personen“</span>. Und GOTT ist <span style="color:#FF6000">„Geist“</span>. Das besagt, dass GOTT nicht mit materiellen Dingen aus unserer Welt verglichen werden darf; <span style="color:#00B000">(was sowohl THOMAS von Aquin als auch Immanuel KANT doch getan haben)</span>. Und ganz wesentlich ''':''' der Zugang zu GOTT läuft nicht über den Beweis, sondern immer nur über den Glauben. Wer an GOTT glauben will, dem antwortet GOTT auf seine Weise — nämlich <span style="color:#FF6000">„geistig“</span> bzw. <span style="color:#FF6000">„geistlich“</span>. Wer nicht an GOTT glauben will, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Glaube ist immer eine freie Entscheidung des Menschen für GOTT. Niemand darf gezwungen werden. Wenn es einen Beweis für GOTT gäbe, wäre jeder vernünftige Mensch gezwungen, an GOTT zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Existenzbeweis für GOTT '''!!!''' ... Daher darf man das Kalkül des Logiker GÖDEL, <span style="color:#00B000">(und damit auch das Theorem ANSELMS)</span>, nicht als einen Existenzbeweis für GOTT lesen. Sowohl ANSELM als auch GÖDEL setzen die Existenz GOTTES notwendig als gegeben schon voraus. Das GÖDEL-System, und auch das Theorem ANSELMS, sind bloß die logische Bestätigung der Widerspruchsfreiheit der Glaubensüberzeugung eines Menschen, der sich schon entschieden hat, an GOTT zu glauben; und nicht der Grund für seine Entscheidung. Alle sogenannten ,Gottesbeweise‘, sind in Wirklichkeit nichts anderes, als nachträgliche Evaluierungen eines GOTT-Glaubens, bzw. ,Wege‘, <span style="color:#00B000">(bei THOMAS von Aquin)</span>, die aufzeigen, dass der GOTT-Glaube widerspruchsfrei, sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL sagt. GOTT hat es nicht nötig, ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> zu werden.
===<div class="center"><span style="color:#660066">Einleitung</span></div>===
Eine Studie zum GÖDEL-Kalkül. Der Logiker Kurt GÖDEL <span style="color:#00B000">(1906-1978)</span> hat mit diesem Kalkül eine moderne Rekonstruktion des, <span style="color:#00B000">(von KANT)</span>, so genannten ‚ontologischen Gottesbeweises‘ nach ANSELM von Canterbury auf modal-logischer Basis vorgelegt. Damit hat er die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt, d.h. sie soll für jeden Menschen nachvollziehbar sein, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie er sagt. GÖDEL ,nimmt‘ als Logiker, angeregt durch den Philosophen und Mathematiker Gottfried Wilhelm LEIBNIZ, rein theoretisch, fürs Erste, einmal ‚an‘, <span style="color:#00B000">(als Prämisse, d.i. der Term :01: im 3. Beweisgang zum Theorem ANSELMS im Anhang)</span>, dass es GOTT gibt ''':''' d.i. ein sog. ,methodologischer GOTT-Glaube‘, und untersucht die logischen Konsequenzen. Dabei zeigt sich, beim genaueren Hinsehen, dass der ‚Nicht-GOTT-Glaube‘, der ‚dezidierte‘ Atheismus, <span style="color:#00B000">(im Beweisgang ,Widerlegung‘ im Anhang)</span>, überraschender Weise, zu einem Widerspruch führt, und damit logisch ,falsch‘ ist. Jedoch, GÖDEL kann und will mit seinem Kalkül keinen ,GOTT-Glauben‘ ,erzeugen‘, d.h. das GÖDEL-Kalkül ist kein <span style="color:#FF6000">„Existenz-Beweis"</span> für den GOTT der Bibel, sondern, es setzt die Existenz eines GOTTES, einfach als gegeben, schon voraus. GÖDEL beweist dann mit seinem System, dass der traditionelle abendländische ,GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, <span style="color:#00B000">(d.i. die Kalkül-Prämisse, und das, daraus ,regulär‘ (├ ) abgeleitete, Theorem ANSELMS)</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> <span style="color:#00B000">(d.h. logisch ,richtig‘)</span> ist, im Gegensatz zum ,Nicht-GOTT-Glauben‘, der davon ausgeht, dass es keinen GOTT gibt. GÖDEL beweist mit seinem System ''':''' der traditionelle GOTT-Glaube ist, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, widerspruchfrei und wahr. <span style="color:#00B000">(Der Beweis aus dem Widerspruch des Gegenteils ist ein ,indirekter Beweis‘ und kein ,Zirkelbeweis‘ '''!''' )</span> GÖDEL blieb bis zu seinem Tod ohne ein dezidiertes religiöses Bekenntnis. <span style="color:#00B000">(Das Leben ist nicht immer ,logisch‘.)</span>
Entsprechend der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> ist GOTT der Größte, <span style="color:#FF6000">»''über dem nichts Größeres mehr gedacht werden kann''«</span>, <span style="color:#00B000">(ANSELM)</span>; bzw. <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>, und der für uns immer schon ,da‘ ist. Das ist die methodologische Prämisse des GÖDEL-Kalküls. Davon ausgehend, zeigen seine Axiome und Definitionen, dass es zu einem Widerspruch führt, falls man ,annimmt‘, es sei nicht möglich, dass es <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> gibt. Aus dem Widerspruch des Gegenteils wird von GÖDEL, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, dann ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> ''':''' es ist doch möglich, dass es <span style="color:#FF6000">„GOTT“</span> wirklich gibt. Somit ist der Glaube an <span style="color:#FF6000">„GOTT“</span>, — weil widerspruchsfrei —, mit den Worten GÖDELS ''':''' <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span>.
Immanuel KANT <span style="color:#00B000">(1724-1804)</span> scheint diesen Fall vorausgesehen zu haben, dass versucht werden könnte, die ,Möglichkeit‘ GOTTES aus einem Widerspruch zu ,beweisen‘ ''':'''
::<span style="color:#FF6000">»</span> <span style="color:#00B000">[ Angenommen, es gibt ]</span> ''doch einen und zwar nur diesen '''Einen''' Begriff'' <span style="color:#00B000">[ ,GOTT‘, so dass ]</span> ''das Nichtsein oder das Aufheben seines Gegenstandes'' <span style="color:#00B000">[ GOTT ]</span>, ''in ,sich selbst‘ widersprechend sei; und dieses ist der Begriff des allerrealsten Wesens. Es hat, sagt ihr, alle Realität'', <span style="color:#00B000">[ bzw. alle Vollkommenheit ]</span>, ''und ihr seid berechtigt, ein solches Wesen als ,möglich‘ anzunehmen'' ... <span style="color:#00B000">[ denn das GÖDEL-Kalkül ,beweist‘ ( ╞ ) in der ,Widerlegung‘ im Anhang, wie auch im 1. Beweisgang, aus einem Widerspruch, dass die Existenz GOTTES definitiv logisch ,möglich‘ ist. ]</span> … ''obgleich der sich nicht widersprechende'', <span style="color:#00B000">[ ,mögliche‘ ]</span>, ''Begriff'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''noch lange nicht die'' <span style="color:#00B000">[ reale ]</span> ''Möglichkeit des Gegenstandes'', <span style="color:#00B000">[ GOTT ]</span>, ''beweiset. … Das ist eine Warnung, von der Möglichkeit der Begriffe (logische)'', <span style="color:#4C58FF">— '''◇''' —</span>, ''nicht sofort auf die Möglichkeit der Dinge (reale)'', <span style="color:#4C58FF">— '''□''' —</span>, ''zu schließen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 399; https://www.korpora.org/kant/aa03/399.html</ref>. <span style="color:#00B000">[ Trotz dieser Warnung, wird dieser Schluss dennoch im Theorem ANSELMS vollzogen, bzw. mit GÖDEL im 3. Beweisgang ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> '''!''' ]</span>. <span style="color:#FF6000">«</span>
Warum das <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist, und inwieweit KANT sich irrt, wird in dieser Studie gezeigt.
===<div class="center"><span style="color:#660066">Der Schlüsselbegriff im Kalkül</span></div>===
Der ‚Schlüsselbegriff‘ in diesem Kalkül ist <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Perfektion“, „Vollkommenheit“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Für diesen wichtigen Begriff gibt es aber im Kalkül selbst keine explizite Definition, sondern er wird nur durch seine Verwendung innerhalb des Kalküls indirekt ‚definiert‘. <span style="color:#00B000">(Das heißt ''':''' <span style="color:#4C58FF"> — ‚'''P'''‘ — </span> bezeichnet ein System von ,Eigenschaften‘, die ,positiv‘, bzw. ,vollkommen‘ | ,perfekt‘ | genannt werden, von denen im Kalkül wohl beweisbar ist, dass sie sich gegenseitig ,nicht widersprechen‘, weil sie im System als solche ,gleichwertig‘, bzw. gleich ,wahr‘ sind, jedoch ohne sie erschöpfend aufzählen zu können, oder auch nur sagen zu können, was sie alle im einzelnen bedeuten, außer, dass sie kompatibel sind.)</span> Mit der Wahl dieses Schlüsselbegriffes hat GÖDEL eine wesentliche Vorentscheidung für die Ergebnisse des Kalküls getroffen '''!''' In seinen Notizen zum ‚ontologischen Beweis‘ vom 10. Februar 1970 gibt GÖDEL, — für die nachträgliche Interpretation dieses Begriffes <span style="color:#00B000">(und auch für das Kalkül selbst)</span> —, die richtungsweisende Erklärung ''':'''
::<span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne...''«</span>
::Und er fügt in Klammer hinzu ''':'''
::<span style="color:#FF6000">»...''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span><ref>GÖDEL, Kurt, ''<span style="font-family: Times;"><big>‚Ontological proof‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Collected Works‘</big></span>'', vol. III, ed. S.FEFERMAN et al., Oxford (U.P.), 1995; 403–404.</ref>
GÖDEL-Axiom-1 ''':''' <span style="color:#4C58FF">— ‚('''PX <small><math>{ \color{Blue} \dot\lor}</math></small> P¬X''')‘ ↔<span style="color:#00B000"> ‚('''¬PX ↔ P¬X''')‘</span> — </span> ''':''' <span style="color:#FF6000"> »''Entweder die Eigenschaft'' <span style="color:#4C58FF">‚'''X'''‘</span> ''oder ihre Negation'' <span style="color:#4C58FF">‚'''¬X'''‘</span> ''ist positiv''«</span>. Hier ist der Hauptkritikpunkt, dass es Eigenschaften gibt, die ,an sich‘ weder positiv noch negativ sind. Beispiele wären ''':''' ‚rothaarig‘ oder ‚schwerwiegend‘; solche Eigenschaften können aber ,für mich‘ entweder positiv oder negativ sein, abhängig von meiner Betrachtungsweise und subjektiven Vorlieben. Diese Eigenschaften, wie ‚rothaarig‘ an sich, oder meine positiv-negativen ‚Betrachtungsweisen‘, sind jedoch der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> entnommen und treffen nicht den <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Er orientierte sich an LEIBNIZ, welcher im Bezug zum ‚ontologischen Beweis‘ definiert ''':'''
::<span style="color:#FF6000">»''Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''nenne ich jede einfache Eigenschaft, die sowohl positiv als auch absolut ist, oder dasjenige, was sie ausdrückt, ohne jede Begrenzung ausdrückt''.«</span><ref>Zitiert nach Thomas GAWLICK, in ''<span style="font-family: Times;"><big>‚Was sind und was sollen mathematische Gottesbeweise ?‘</big></span>'', Predigt vom 8.1.2012 in der Kreuzkirche zu Hannover. https://web.archive.org/web/20130524164359/http://www.idmp.uni-hannover.de/fileadmin/institut/IDMP-Studium-Mathematik/downloads/Gawlick/Predigt_Gawlick_Gottesbeweise.pdf</ref>
Die Seins-Eigentümlichkeiten <span style="color:#00B000">(Daseinsmodi, Perfektionen)</span> wie ‚wahr‘, ‚gut‘, ‚edel‘ usw. entsprechen dem <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Das sind Beispiele für ‚absolut‘ positive Begriffe aus der Lehre der Seinsanalogie ''':''' <span style="font-family: Times;"><big>‚verissimum‘, ‚optimum‘, ‚nobilissimum‘</big></span>, usw., die, an sich, <span style="color:#FF6000">»''ohne jede Begrenzung gelten''«</span>; zu finden in der <span style="font-family: Times;"><big>‚Via quarta‘</big></span>, bei THOMAS von Aquin, über die <span style="color:#FF6000">„analoge"</span> Abstufung im ‚Sein‘ der Dinge. Diese <span style="color:#FF6000">„analoge"</span> ‚Abstufung‘ ist dann die faktische Begrenztheit <span style="color:#00B000">(d.h. Unvollkommenheit)</span> im <span style="color:#FF6000">»''zufälligen''«</span> ‚Sein‘ der Dinge —. Die <span style="color:#FF6000">„positiven Eigenschaften“</span> GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, wie Wahrheit, Einheit, Gutheit, <span style="color:#00B000">(von ,Güte‘)</span>, Schönheit, Adel, <span style="color:#00B000">(von ,edel‘)</span>, Gleichheit, Andersheit, Wirklichkeit, ,Sein‘ im Sinne von Etwas-sein, etc. werden <span style="color:#FF6000">„Perfektionen“</span>, oder auch <span style="color:#FF6000">„Transzendentalia“</span> genannt, <span style="color:#00B000">(von lateinisch ''':''' <span style="font-family: Times;"><big>transcendere</big></span>, <span style="color:#FF6000">„übersteigen“</span>)</span>. In der mittelalterlichen Scholastik sind Transzendentalien die Grundbegriffe, die allem Seienden als <span style="color:#FF6000">„Modus“</span>, <span style="color:#00B000">(d.h. ,Eigentümlichkeit‘, als allgemeine Seinsweisen)</span>, zukommen. Wegen ihrer Allgemeinheit ,übersteigen‘ sie die besonderen Seinsweisen, welche ARISTOTELES die ,Kategorien‘ nannte. Ontologisch betrachtet, werden die Transzendentalien als das allem Seienden Gemeinsame aufgefasst, da sie von allem ausgesagt werden können. Von der KI werden sie, nicht unpassend, als <span style="color:#FF6000">„ultimative Eigenschaften des Seins“</span> bezeichnet, die <span style="color:#FF6000">„jenseits der materiellen Welt existieren“</span>, <span style="color:#00B000">(da sie ,ultimativ‘ nur von GOTT, als den unbegrenzt Vollkommenen, ausgesagt werden können, die jedoch, auch von allen übrigen Seienden, wegen deren seinsmäßigen Unvollkommenheit und Begrenztheit, abgestuft, d.h. <span style="color:#FF6000">„analog"</span>, ausgesagt werden)</span>. Diese Transzendentalien sind ,inakzident‘, das heißt, sie entstehen nicht aus anderen Begriffen, sondern sind erste, unteilbare Bestimmungen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> des Denkens und des Seins, die allen Seienden ''':''' <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span>, unabhängig von ihren speziellen Eigenschaften, als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(bzw. Unvollkommenheiten)</span>, mit ,modaler‘ Notwendigkeit, <span style="color:#4C58FF">— ‚□‘ —</span>, <span style="color:#FF6000">„analogisch"</span> zukommen, d.h. sie sind in allen Seienden, seinsmäßig abgestuft und abgegrenzt, ,relativ‘ zum unbegrenzt Unendlichen ihrer selbst, und <span style="color:#FF6000">»''dasjenige, was sie ausdrücken, drücken sie ohne jede Begrenzung aus''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>; und damit stehen sie ontologisch in einer <span style="color:#FF6000">„analogen"</span> ,Beziehung‘ zu GOTT, dem absolut Vollkommenen und unbegrenzt Unendlichen. In der Erkenntnisordnung wirken sie als die ersten Begriffe des menschlichen Verstehens, die eine Basis für alle weiteren wissenschaftlichen Erkenntnisse bilden. In der Seinsordnung sind die Transzendentalien ontologisch eins, gleichwertig, <span style="color:#00B000">(,mathematisch äquivalent‘)</span>, und daher konvertierbar, d.h. austauschbar, <span style="color:#00B000">(vgl. z. B. den scholastischen ,Merksatz‘ ''':''' <span style="font-family: Times;"><big>,ens et verum convertuntur‘</big></span>)</span>. Damit sind sie auch von einander abhängig, was GÖDEL sowohl im Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, für positive Eigenschaften, als auch in der Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, für die Wesenseigenschaften, syntaktisch formalisiert hat mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, weil sie sich gegenseitig, — mit ,modaler‘ Notwendigkeit —, gleichwertig ,implizieren‘, d.h. einschließen, <span style="color:#00B000">(im Axiom-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span>, und in der Definition-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''y'''‘ — </span>)</span>. Man kann die Transzendentalia, <span style="color:#00B000">(wie GÖDEL)</span>, auch ,Wesenseigenschaften‘ ''':''' <span style="color:#4C58FF"> — ‚'''X'''<sub>ess</sub>‘ —</span>, nennen, weil sie allem Seienden <span style="color:#FF6000">„wesentlich analog"</span> zukommen. Weil Transzendentalien miteinander austauschbar sind, sind sie auch widerspruchsfrei, was GÖDEL mit Axiom-1 syntaktisch darstellt. Die Gültigkeit und Wahrheit, d.h. die mathematisch-logische Evidenz von Axiom-1 und Axiom-2, beruht auf der ontologischen Allgemeinheit und Gültigkeit der Transzendentalia, die GÖDEL mit Definition-2, in sein Kalkül explizit eingeführt und als Wesenseigenschaften ,bestimmt‘ hat. <span style="color:#00B000">(Definitionen werden formal-syntaktisch durch das Äquivalenzzeichen <span style="color:#4C58FF">,'''↔'''‘</span> angezeigt, gelesen als <span style="color:#FF6000">„...ist genau dann ... wenn...“</span>)</span> Die GÖDEL-Axiome und -Definitionen werden jedoch sofort <span style="color:#FF6000">„modal falsch"</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit ,Nicht-Transzendentalia‘, wie z. B. ,rot‘ oder ,schwer‘, belegt werden. <span style="color:#00B000">(Dieser ,Sachverhalt‘ wird von Kritikern des GÖDEL-Systems, — zu vorschnell —, verwendet, um ihre Behauptungen zu ,belegen‘, das GÖDEL-Kalkül und seine Konsequenzen seien ,falsch‘.)</span>
Zum Überblick ''':''' <span style="color:#FF6000">„Transzendentalia“</span> sind universale, alles Seiende charakterisierende Begriffe, die über kategoriale Einteilungen hinausgehen, und sowohl in der klassischen Scholastik, als auch in der modernen Philosophie, <span style="color:#00B000">(KANT, Uwe MEIXNER<ref>vgl. die ,transzendentalen‘ Bedingungen möglicher Erkenntnisse bei KANT; und auch in der ,Axiomatischen Ontologie‘ bei Uwe MEIXNER</ref>)</span>, als Grundlage der Metaphysik und Erkenntnistheorie dienen. Sie sind die <span style="color:#FF6000">„ersten Begriffe des Seins“</span>, die jedem Ding als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(Perfektionen)</span>, inhärent sind, <span style="color:#FF6000">„analogisch"</span> abgestuft, auf einen ,ultimativ‘-unbegrenzten Bezugspunkt ausgerichtet, und die sich im Denken, <span style="color:#00B000">(für uns als wahr)</span>, und in der moralischen Wertung, <span style="color:#00B000">(für uns als gut und edel)</span>, manifestieren, relativ zum ,ultimativ‘-unbegrenzten Bezugspunkt ihrer selbst. Die faktische, zusätzliche Unvollkommenheit, die sich generell in der notwendigen, und unausweichlichen Vergänglichkeit aller Dinge zeigt, ist einem ontologischen Defekt ,geschuldet‘, der stark zeitabhängig ist, d.h. der einen Anfang und ein Ende hat.
Das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''Notwendige Existenz ist eine positive Eigenschaft''«</span>, ist immer falsch, wenn es auf etwas aus der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> angewendet wird, wie z. B. auf einen <span style="color:#FF6000">„Tsunami“</span>, dessen ‚Existenz‘ für uns nicht ‚positiv‘ ist. KANT hat schon festgestellt ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Das gilt für alles, was <span style="color:#FF6000">„existiert“</span>. Das Axiom-5 hat nur dann seine Gültigkeit, ist nur dann ,wahr‘, wenn <span style="color:#FF6000">„Dasein“</span> <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span> <span style="color:#00B000">(Essenz)</span> in eins zusammenfallen. Bei allen Dingen, die ‚da‘ sind, ist ihr ‚Da-Sein‘ ontologisch immer verschieden zu dem ‚was‘ sie sind ''':''' zu ihrem ,Was-Sein‘. In der philosophischen Tradition, seit ARISTOTELES, wird die ontologische Identität, d.i. die Koinzidenz, der innere Zusammenhang von ‚Sein‘ und ‚Wesen‘ allein nur dem <span style="color:#FF6000">„selbst ‚unbewegten‘ Erstbewegenden“</span> zugeschrieben, dem <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“</span><span style="color:#00B000"> | ,prôton kinoûn akinêton‘</span>, von dem ARISTOTELES etwas später sagt ''':''' <span style="color:#FF6000">»''denn dies ist der Gott''«</span> und dann hinzufügt ''':''' <span style="color:#FF6000">»''so sagen wir ja''«</span>; d.h. das ist eine Interpretation aus dem Glaubenskontext des ARISTOTELES. Er war ein Gott-gläubiger Grieche. Wer an GOTT glaubt, kann das nachvollziehen. GÖDEL musste dieses Axiom-5 postulieren, sonst wäre sein Kalkül nicht aufgegangen, ohne dass er deswegen schon an GOTT glauben müsste. Er hat für sein Kalkül das ontologische Theorem von der Identität von ‚Sein‘ und ‚Wesen‘ im ‚unbewegten Erstbeweger‘ des ARISTOTELES benutzt, ohne diese Herkunft explizit referenziert zu haben. <span style="color:#00B000">(Gilt auch für Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit, das GOTT-Sein, das ‚Dasein‘ GOTTES, ist eine positive Wesenseigenschaft, eine Perfektion; d.h. ist das ‚Wesen‘ GOTTES ''':''' GOTT ist perfekt''«</span>)</span>. Die ontologische Identität von Sein und Wesen, Existenz und Essenz, wie auch die Koinzidenz von Möglichkeit und Wirklichkeit, von Ursache und Wirkung, sowie auch die ontologische Einheit von <span style="color:#00B000">(Erkenntnis-)</span>Subjekt und <span style="color:#00B000">(Erkenntnis-)</span>Objekt im <span style="color:#FF6000">»''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“</span><span style="color:#00B000"> | ,noêseôs noêsis‘ <small>(<span style="font-family: Times;"><big>,''Metaphysik''‘</big></span> XII 9, 1074b34)</small></span>, und der innere Zusammenhang der <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, gilt nur in der <span style="color:#FF6000">„unverursachten Letztursache"</span>, auf die ARISTOTELES bei seiner Prinzipienforschung gestoßen ist.
Es gibt verschiedene Versuche, die GÖDEL-Axiome durch sog. ,Modelle‘, relativ zu einfacheren ,Welten‘, zu verifizieren, um damit ihre relative Konsistenz nachzuweisen. Für GÖDEL aber <span style="color:#FF6000">»''sind die Axiome nur dann'' <span style="color:#00B000">[ in unserer ,realen‘ Welt ]</span> ''wahr'' <span style="color:#00B000">[ und annehmbar ]</span>«</span>, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt'' <span style="color:#00B000">[ d.h. jeder auch nur ,möglichen‘ Welt ]</span> ''sind''«</span>. Diese Bedingung verweist jede Verifikation und jede Interpretation der Axiome auf das ,Nicht-Zufällige‘, das ,Notwendige‘, ,Absolute‘, in dem die Axiome und Definitionen des GÖDEL-Kalküls erst dadurch ihren Sinn und ihre Bedeutung bekommen, wenn sie vom ,Absoluten‘ und ,Unendlichen‘ her erklärt und verstanden werden. Damit insistiert GÖDEL auf eine genuin <span style="color:#4C58FF">,theologische‘</span> Interpretation seines Kalküls, mit der <span style="color:#4C58FF">„Theologie“</span> zum Begriff GOTT, dem unbegrenzt Unendlichen, als Verifikationskriterium. Das entspricht auch der ,methodologischen‘ Prämisse seines Kalküls. Die wichtigsten Axiome und Definitionen im GÖDEL-Kalkül sind jedoch bloße ,Annahmen‘, deren Evidenz, sowohl die ,mathematische‘ als auch die <span style="color:#4C58FF">,theologische‘</span>, erst evaluiert, d.h. ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> werden muss. Das bedeutet ''':''' die logische Verifikation der Axiome und Definitionen von GOTT und seinen Vollkommenheiten kann nur Kalkül-intern durch den Aufweis ihrer Widerspruchsfreiheit erfolgen, d.i. <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span>. Logisch evaluierte und verifizierte Axiome und Definitionen sind die ,modal‘ notwendigen, d.h. die ,transzendentalen‘ Voraussetzungen für die Ergebnisse eines Kalküls, damit seine Theoreme und Korollare in unserer ,realen‘ Welt als logisch ,wahr‘ und damit für uns auch als ,annehmbar‘ gelten können, während die Prämissen eines Kalküls, <span style="color:#00B000">(die Argument Einführung, <span style="color:#4C58FF">— '''AE:''' —</span> )</span>, nicht notwendige, und somit ,modal‘ frei gewählte ,Annahmen‘ sind. Jedoch aus diesen ,modal‘ frei gewählten, ,möglichen‘ <span style="color:#00B000">( <span style="color:#4C58FF">'''◇'''</span> )</span> Prämissen folgen mit Hilfe der ,bewiesenen‘ <span style="color:#00B000">( ╞ )</span> Axiome und Definitionen die Ergebnisse mit ,modaler‘ Notwendigkeit <span style="color:#00B000">( <span style="color:#4C58FF">'''□'''</span> )</span>.
Die Logik des GÖDEL-Systems ist eine ,Prädikatenlogik‘ zweiter Stufe, in der die Quantoren nicht nur Individuum-Variable, sondern auch Eigenschafts-Variable, <span style="color:#00B000">(als noch ,unbestimmte‘ Prädikate im Allgemeinen)</span>, binden können. Die formale Struktur des GÖDEL-Kalküls besteht aus fünf Axiomen und drei Definitionen, mit deren Hilfe in drei Beweisgängen drei Theoreme und mehrere Korollare aus seiner ,methodologischen‘ Prämisse ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitet werden können, wobei die beiden ersten Beweisgänge, mit ihren Ergebnissen, den dritten vorbereiten, in dem es dann um das Theorem ANSELMS geht. Die Prämisse des GÖDEL-Kalküls in allen Beweisgängen ist der traditionelle ,GOTT-Glaube‘, in der Formulierung speziell nach LEIBNIZ. Ein Axiom, eine Definition, zwei Theoreme und alle Korollare im GÖDEL-Kalkül sind Aussagen über <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>. Alle fünf Axiome, eine Definition und ein Theorem, <span style="color:#00B000">(und das Korollar aus Axiom-4)</span>, sind auch Aussagen über die Eigenschaft <span style="color:#FF6000">„Vollkommenheit“, „Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, die in der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> als die Wesenseigenschaft GOTTES gilt ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist vollkommen''«</span> bzw. <span style="color:#FF6000">»''GOTT ist das Vollkommenste der Wesen''«</span>, <span style="color:#00B000">(DESCARTES)</span>. Zwei Definitionen sind Aussagen über die allgemeinen Wesenseigenschaften aller Seienden, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, die Transzendentalien, die, als notwendige Existenz, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, auch GOTT zugeordnet werden, mit der Besonderheit bei GOTT, dass sowohl alle Eigenschaften, als auch alle anderen Zuordnungen, wie Sein und Wesen, wie Ursache und Wirkung, usw., im Unendlichen, GOTT, <span style="color:#FF6000">„koinzident“</span> sind, d.h. in GOTT paarweise perspektivisch in ,eins‘ zusammenfallen, und die auch, als Transzendentalia, konvertierbar, d.h. austauschbar sind. Diese Sachverhalte machen deutlich, dass eine spezifische ,Verifikation‘ und sachgerechte ,Evaluierung‘ der GÖDEL-Axiomatik nur genuin <span style="color:#4C58FF">,theologisch‘</span> erfolgen kann. Die Evaluierung der <span style="color:#FF6000">»''mathematischen Evidenz''«</span> des GÖDEL-Systems, im Allgemeinen, muss jedoch entsprechend der Maßstäbe einer modalen Prädikatenlogik zweiter Stufe durchgeführt werden.
Das GÖDEL-Kalkül unterscheidet <span style="color:#00B000">(in Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>)</span> formal-syntaktisch zwischen der Eigenschaft ,Existenz‘, <span style="color:#4C58FF"> — ‚'''E'''‘ —</span>, die nur GOTT zugeordnet werden kann, und dem Existenz-Operator, <span style="color:#4C58FF">— ‚'''∃'''‘ —</span>, der auch allem Übrigen, das nicht GOTT ist, zugeordnet wird. Es gibt hier auch den formal-syntaktischen Unterschied zwischen der, <span style="color:#00B000">(von mir notierten, jedoch von GÖDEL schon intendierten und angesprochenen)</span>, speziellen ,Notwendigkeit‘, <span style="color:#4C58FF"> — <sub>not</sub> —</span>, die nur der Existenz GOTTES zugeordnet ist, und der modalen ,Notwendigkeit‘, <span style="color:#4C58FF">— ‚'''□'''‘ —</span>, die auf Verschiedenes bezogen werden kann. Diese Unterschiede sind Hinweise, dass GÖDEL in seiner Kalkül-Logik und -Syntax, die Außerordentlichkeit und Eigenständigkeit GOTTES berücksichtigt, der, als Schöpfer der Welt, prinzipiell und absolut <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span> ist, die erst durch GOTT auch das ist, was sie ist.
===<div class="center"><span style="color:#660066">Die Genese des Kalküls</span></div>===
Wie kommt GÖDEL zu seinem Kalkül '''?''' Sein Gewährsmann war Gottfried Wilhelm LEIBNIZ, <span style="color:#00B000">(1646-1716)</span>, den er sehr schätzte. Die rekonstruierbare Genese seines Kalküls findet man in LEIBNIZ ''':''' ''<span style="font-family: Times;"><big>‚Neue Abhandlungen über den menschlichen Verstand‘</big></span>'', <span style="color:#00B000">(1704)</span>‚ ''<span style="font-family: Times;"><big>Viertes Buch, Kapitel X ''':''' ‚Von unserer Erkenntnis des Daseins Gottes‘</big></span>'', Seite 475f.
Hier der <span style="color:#00B000">[ kommentierte ]</span> Textausschnitt zum sog. ontologischen ‚Gottesbeweis‘''':'''
::<span style="color:#FF6000">»</span>''Folgendes etwa ist der Gang seines'' <span style="color:#00B000">[ d.h. ANSELMS, Erzbischof von Canterbury; 1033-1109, ]</span> ''Beweises ''':''' GOTT ist das Größte'', <span style="color:#00B000">[ ANSELM spricht vom biblischen GOTT des Glaubens, als ''':''' <span style="color:#FF6000">»''den, über dem ,Größeres‘'' | <span style="font-family: Times;"><big>‚maius‘</big></span> | ''nicht mehr gedacht werden kann''«</span> ]</span>, ''oder, wie DESCARTES es ausdrückt ''':''' das Vollkommenste der Wesen oder auch ein Wesen von äußerster Größe und Vollkommenheit'' ''':''' <span style="color:#00B000"> [ GÖDEL ''':''' </span><span style="color:#4C58FF">‚'''P'''‘</span> <span style="color:#00B000">:= ‚Perfektion‘, ‚positive Eigenschaft‘ ]</span>, ''das alle Grade derselben in sich schließt.''<span style="color:#00B000"> [ GÖDEL-Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>. Definition-1 bildet die traditionelle Vorstellung von GOTT ab. ]</span> ''Dies also ist der Begriff GOTTES.'' <span style="color:#00B000">[ Der Term <span style="color:#4C58FF">— ,'''G'''‘ —</span> steht hier für den biblischen ‚Begriff‘ <span style="color:#FF6000">„GOTT“</span> als ,Individuumname‘ '''!''' ]</span> ''Sehen wir nun, wie aus diesem Begriff das ‚Dasein’ folgt.''<span style="color:#00B000"> [ GÖDEL ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist notwendig aus sich ‚da‘''«</span> ''':''' Term :10:, 1. Hauptergebnis im 3. Beweisgang. ]</span> ''Es ist etwas <u>mehr</u>, ‚da‘ zu sein, als nicht ‚da‘ zu sein, oder auch das ‚Dasein‘ fügt der Größe oder der Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''einen Grad hinzu, und wie DESCARTES es ausspricht, das ‚Dasein‘ ist selbst eine Vollkommenheit.''<span style="color:#FF6000">«</span>
<span style="color:#00B000">(Diesen Ausspruch DESCARTES übernimmt GÖDEL im Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''notwendige Existenz''</span> [ alias ‚Dasein GOTTES’ ] <span style="color:#FF6000">''ist eine positive Eigenschaft''</span> [ alias Vollkommenheit ]<span style="color:#FF6000">«</span>. Dem widerspricht KANT ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>. Das Axiom-5 ist daher nur dann ‚wahr‘, wenn ‚Wirklichsein‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια οὖσα</big></span>“</span> | ‚enérgeia oúsa‘ | d.h. ‚Dasein‘ und ‚Wesen‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ | — genauer ''':''' ‚Wesenseigenschaften’ —, ontologisch ,eins‘ sind, d.h. wenn <span style="color:#FF6000">„Existieren“</span> immer schon die <span style="color:#FF6000">„Wesenseigenschaft“</span> GOTTES ist. Was nach ARISTOTELES nur im <span style="color:#FF6000">„unbewegten Erstbeweger“</span> der Fall ist; bzw. mit LEIBNIZ ''':''' <span style="color:#FF6000">»''was das Privilegium der Gottheit allein ist''«</span> '''!''' Aus der ,methodologischen‘ ,Annahme‘ im 2. Beweisgang GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den GOTT der Christen''«</span>, und mit Hilfe von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, bzw. <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, mit Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind notwendig aus sich, — von Natur aus —, positiv''«</span>, mit Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span> ''':''' <span style="color:#FF6000">»''Zum Wesen gehören notwendig auch alle Konsequenzen aus einer Wesenseigenschaft''«</span>, und mit Axiom-1 und der Definition für GOTT, folgt nach einigen logischen Umformungen das GÖDEL-Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist genau dann der GOTT der Christen, wenn das Wesen dieses GOTTES sein eigenes Sein ist''«</span>. Dasein und Wesen sind im Unendlichen, GOTT <span style="color:#FF6000">„koinzident“</span> ,eins‘, übereinstimmend mit dem Theorem des ARISTOTELES. Mit diesem, im Kalkül <u>ohne</u> Axiom-5 ,regulär‘ (├ ) abgeleiteten Theorem, widerlegt er KANT für den individuellen Spezialfall <span style="color:#4C58FF">‚'''G'''‘</span> := <span style="color:#FF6000">„GOTT“</span>. Nachprüfbar im Anhang ''':''' im ‚ontologischen‘ Beweis für das Basis-Theorem-2. Somit ist Axiom-5 ,wahr‘, und KANT, der <span style="color:#FF6000">»''eine Abneigung gegen das Gebet hatte''«</span> und auch <span style="color:#FF6000">»''nie zu den sonntäglichen Kirchgängern zählte''«</span><ref>Uwe SCHULTZ ''':''' ‚''<span style="font-family: Times;"><big>Immanuel Kant</big></span>''‘, Rowohlt Monographie 50659, Seite 12</ref>, hat sich hier, im Bezug auf GOTT, geirrt. <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, war für KANT nie eine ernstzunehmende Option. Die <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, die natürlich immer auch verbunden sein muss mit der täglichen ,Erfahrung‘ einer Glaubens-Praxis, im Gebet und in den Gottesdienst-Feiern des <span style="color:#4C58FF">„Theologen“</span>, und die daraus entsteht, ist eine ziemlich ,ausgereifte‘ Disziplin. Es haben sich, durch Jahrhunderte hindurch, viele gläubige und auch gescheite Menschen, schon im Judentum, und dann im Christentum, und ebenfalls im Islam, darum bemüht.)</span>
:: <span style="color:#FF6000">»</span>''Darum ist dieser Grad von Größe und Vollkommenheit oder auch diese Vollkommenheit, welche im ‚Dasein‘ besteht, in diesem höchsten, durchaus großen, ganz vollkommenen Wesen, denn sonst würde ihm ein Grad fehlen, was gegen seine Definition wäre. Und folglich ist dies höchste Wesen ‚da‘. Die Scholastiker, ohne selbst ihren'' <span style="font-family: Times;"><big>doctor angelicus</big></span> <span style="color:#00B000">[ := THOMAS von Aquin ]</span> ''auszunehmen, haben diesen Beweis verachtet'', <span style="color:#00B000">[ wie später auch Immanuel KANT ]</span>, ''und ihn als einen Paralogismus'' <span style="color:#00B000">[ := Fehlschluss ]</span> ''betrachtet, worin sie sehr unrecht gehabt haben; und DESCARTES, welcher die scholastische Philosophie im Kolleg der Jesuiten zu La Flèche lange genug studiert hatte, hat sehr recht gehabt, ihn wieder zu Ehren zu bringen. Es ist nicht ein Paralogismus, sondern ein unvollständiger Beweis'', <span style="color:#00B000">[ den GÖDEL vervollständigt hat ]</span>, ''der etwas voraussetzt, was man noch hätte beweisen sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' <span style="color:#00B000">[ '''::''' <span style="color:#4C58FF">— '''◇''' —</span> '''::''' ,möglich‘, ,konsistent‘, ,denkbar‘; GÖDEL beweist im 1. Beweisgang aus Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, <span style="color:#FF6000">»''positive Eigenschaften'', <span style="color:#00B000">[ die allgemeinen Transzendentalien ]</span>, ''sind widerspruchsfrei''«</span>, mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, folgt Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist widerspruchsfrei möglich''«</span> ]</span>. ''Und es ist schon etwas, dass man durch diese Bemerkung beweist ''':''' gesetzt, dass GOTT'' <span style="color:#00B000">['' <span style="color:#FF6000">»widerspruchsfrei«</span> '']</span> '',möglich‘ ist, so ‚ist‘ er'' <span style="color:#00B000">[ ,notwendig‘ '''::''' <span style="color:#4C58FF">— '''□''' —</span> '''::''' für jede mögliche Welt auch wirklich aus sich ‚da‘ ]</span>, ''was das Privilegium der Gottheit allein ist'' ''':''' <span style="color:#00B000">[ Im 3. Beweisgang, Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' ‚ANSELMS Prinzip‘ ''':''' <span style="color:#FF6000">»''Weil GOTT widerspruchsfrei ,möglich‘ ist, darum ist auch der Glaube widerspruchsfrei, der annimmt, dass GOTT aus sich ,notwendig‘ da ist''«</span>; mit Korollar-3 ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ —</span>, <span style="color:#FF6000">»''Es gibt notwendig nur einen einzigen GOTT''«</span>. Damit ist auch der Monotheïsmus bewiesen. ]</span> ''Man hat recht, die Möglichkeit eines jeden Wesens anzunehmen und vor allem die GOTTES, bis ein anderer das Gegenteil beweist''. <span style="color:#00B000">[ Das Gegenteil besagt, dass GOTT ,unmöglich‘ ist. Hier setzt der Möglichkeitsbeweis im GÖDEL-Kalkül an, und beweist, dass diese Aussage zu einem Widerspruch führt. ]</span> ''Somit gibt dieser metaphysische Beweis schon einen moralischen zwingenden Schluss ab, wonach wir dem gegenwärtigen Stande unserer Erkenntnisse zufolge urteilen müssen, dass GOTT ‚da‘ sei, und demgemäß handeln.'' <span style="color:#00B000">[ Aber nicht logisch zwingend '''!''' Denn die Interpretation <span style="color:#4C58FF">— ‚'''G'''‘ —</span> mit dem GOTT der Bibel, als ,methodologische‘ Kalkül-Prämisse, ist nicht zwingend, jedoch ,modal‘ möglich, <span style="color:#4C58FF">— '''◇''' —</span>, und im christlichen Glaubenskontext sinnvoll, was mit einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls gezeigt werden kann. Damit wäre dann auch die Frage beantwortet, ob das GÖDEL-System sich plausibel als eine Theorie von GOTT und seinen Eigenschaften interpretieren lässt, bzw. als eine <span style="color:#FF6000">»''axiomatische''«</span> <span style="color:#4C58FF">„Theologie“</span>, wie sie André FUHRMANN apostrophiert. Das <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ist der ,Individuumname‘ für den GOTT der Bibel, — ,GOTT‘ groß geschrieben —, im monotheïstischen, christlichen Glaubenskontext, den auch LEIBNIZ teilt. Dann steht der ,Name‘ auch synonym für das ,existierende‘ Individuum, d.h. für dessen ,Existenz‘. ]</span> ''Es wäre aber doch zu wünschen, dass gescheite Männer'' <span style="color:#00B000">[ sic ! ]</span> ''den Beweis mit der Strenge einer mathematischen Evidenz vollendeten'', <span style="color:#00B000">[ was GÖDEL veranlasst hat, seine Version eines ‚ontologischen Beweises’ zu kreieren, dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> man heute mit Computerprogrammen<ref>siehe Fußnote 12</ref> schon nachgewiesen hat ]</span> ... <span style="color:#FF6000">«</span>.
Für GÖDEL war dieser Text eine intellektuelle Herausforderung, und er hat sie angenommen. Das war für GÖDEL sicher keine Glaubensangelegenheit. GOTT hat es ja auch nicht nötig, ‚bewiesen‘ zu werden. Wer <span style="color:#4C58FF">— ‚'''G'''‘ —</span> z. B. mit dem sog. ‚Urknall‘ gleich setzt, macht die <span style="color:#FF6000">»''zufällige Struktur der Welt''«</span> im ‚Urknall‘, <span style="color:#00B000">(pantheistisch)</span> zu einem ,Gott‘, was GÖDEL dezidiert für sein Kalkül ausgeschlossen haben wollte.
Kurt GÖDEL schreibt 1961 in einem Brief, in Anlehnung an den obigen Text ''':'''
::<span style="color:#FF6000">»...''ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig ''<span style="color:#00B000">[ sic '''!''' ]</span>, ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', <span style="color:#00B000">[ dass es GOTT gibt ]</span>, ''mit allen bekannten Tatsachen'', <span style="color:#00B000">[ z. B. mit den Maßstäben einer modernen Logik ]</span>, ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker LEIBNIZ versucht''.«</span><ref>Zitiert nach SCHIMANOVICH-GALIDESCU, M.-E. ''':''' ‚''<span style="font-family: Times;"><big>Princeton–Wien 1946–1966. Briefe an die Mutter</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kurt Gödel – Leben und Werk</big></span>''‘, Hg. B.BULDT et alia, Wien (HÖLDER–PICHLER–TEMSKY), 2001, Band 1</ref>
===<div class="center"><span style="color:#660066">Die Interpretation des Kalküls</span></div>===
Wenn man sich das GÖDEL-Kalkül ansieht, wie es heute formalisiert vorliegt, stellt sich die Frage ''':''' <span style="color:#FF6000">„Lässt sich dieses System plausibel als eine Theorie von GOTT <span style="color:#00B000">(als eine ‚Rede von GOTT’ := <span style="color:#4C58FF">,Theologie’</span>)</span> und seiner Eigenschaften verstehen '''?''' “ — „Ist hier eine genuin <span style="color:#4C58FF">,theologische’</span> Interpretation möglich '''?''' “</span> Seine Herkunft aus der intellektuellen Auseinandersetzung des Logikers GÖDEL mit dem GOTT-gläubigen Philosophen LEIBNIZ und dem christlichen Theologen und Erzbischof ANSELM rechtfertigt diese Frage. Die <span style="color:#FF6000">„mathematische Evidenz“</span> des GÖDEL-Formalismus, <span style="color:#00B000">(im Anhang nachgestellt)</span>, ist allgemein anerkannt, <span style="color:#00B000">(Vorbehalte dagegen gibt es nur bei der Interpretation seiner Syntax, d.h. ob die Axiome und Definitionen, wie GÖDEL sie konzipiert hat, bzw. ob die Theoreme und Korollare, die aus diesen Axiomen ,regulär’ (├ ) abgeleitet werden, auch in unserer realen Welt ,wahr’ und ,annehmbar’ sind)</span>. Die <span style="color:#FF6000">„theologische Evidenz“</span> des GÖDEL-Systems wird durch eine ,Verankerung’ der Axiome und Definitionen in den <span style="color:#4C58FF">,theologisch’</span>-philosophischen Diskurs über GOTT evaluiert, der schon seit zweieinhalbtausend Jahren läuft. In diesen zweieinhalbtausend Jahren hat sich, — gegen ARISTOTELES und die antike Philosophie —, die Erkenntnis durchgesetzt, dass GOTT <span style="color:#FF6000">»''unabhängig''«</span> von der <span style="color:#FF6000">»''zufälligen''«</span> Raum-Zeit-Struktur unserer vergänglichen Welt ist. In meiner Darstellung des GÖDEL-Kalküls folge ich, <span style="color:#00B000">(im Unterschied zum Autographen GÖDELS, vom 10. Feb 1970)</span>, in der Axiom-Formulierung und -Nummerierung, in der Syntax, und in der Beweis-Struktur, der Arbeit von André FUHRMANN ''':''' ''<span style="font-family: Times;"><big>‚Existenz und Notwendigkeit. Kurt Gödels axiomatische Theologie‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Logik in der Philosophie‘</big></span>'' Hg. SCHROEDER-HEISTER, SPOHN und OLSSON, 2005, Synchron, Heidelberg, Seite 349–374. <span style="color:#00B000">(Die tiefer gestellte Notation der spezifischen ,Eigenschaft‘ einer Eigenschaft ist meine Ergänzung zur formalen Syntax, z. B. ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>'''x'''‘ — </span>, angeregt durch die indizierende Schreibweise GÖDELS ''':''' <span style="color:#4C58FF">— ,'''G''' Ess. '''x'''’ —</span>.)</span> Die Erkenntnisse zur Straffung und Präzisierung der GÖDEL-Syntax, <span style="color:#00B000">(besonders im Möglichkeitsbeweis)</span>, stammen aus der Arbeit von Günther J. WIRSCHING ''':''' ,''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, im Web <ref>https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf</ref>. <span style="color:#00B000">(Auch der Hinweis auf AVICENNA kommt von WIRSCHING.)</span> Die Zitate von THOMAS von Aquin´s Stellungnahme zum Theorem ANSELMS, und von Georg Wilhelm Friedrich HEGEL zur Immanuel KANTS Ablehnung des Theorem ANSELMS, befinden sich in Franz SCHUPP, ,<span style="font-family: Times;"><big>''Geschichte der Philosophie im Überblick''</big></span>‘, Band 2 ‚<span style="font-family: Times;"><big>''Christliche Antike, Mittelalter''</big></span>‘, Hamburg 2003, Seite 168 und Seite 170.
Meines Erachtens ist der entscheidende Ansatzpunkt einer <span style="color:#4C58FF">„theologischen“</span> Interpretation das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>.
‚Frei‘ nach KANT ‚formuliere‘ ich ‚kurz‘ ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Hier die Positionen KANTS zum Thema ‚Existenz‘ und ‚Eigenschaften‘ ''':'''
::<span style="color:#FF6000">»</span>''… unbeschadet der wirklichen Existenz äußerer Dinge'', <span style="color:#00B000">[ kann man ]</span> ''von einer Menge ihrer Prädikate'', <span style="color:#00B000">[ d.h. Eigenschaften ],</span> ''sagen'' … ''':''' ''sie gehöreten nicht zu diesen ‚Dingen an sich selbst‘, sondern nur zu ihren Erscheinungen, und hätten außer unserer Vorstellung'' <span style="color:#00B000">[ ihrer, als ,wirklich‘ gedachten Erscheinung, ]</span> ''keine eigene Existenz, … weil ich finde, dass … '''alle Eigenschaften, die die Anschauung eines Körpers ausmachen''', bloß zu seiner Erscheinung gehören; denn die Existenz des Dinges, was erscheint, wird dadurch nicht … aufgehoben, sondern nur gezeigt, dass wir es'', <span style="color:#00B000">[ das Ding ]</span>, ''wie es ‚an sich selbst‘ sei'', <span style="color:#00B000">[ d.h. existiert ]</span>, ''durch Sinne gar nicht erkennen können''.<span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Prolegomena zu einer jeden künftigen Metaphysik, die als Wissenschaft wird auftreten können</big></span>''‘, Seite 289; https://www.korpora.org/kant/aa04/289.html</ref> <span style="color:#00B000"><small>(Hervorhebung durch KANT.)</small> [ Seine Prädikate, d.h. Eigenschaften, jedoch können wir mit unseren Sinnen ,anschauen‘, aber nur in Kombination mit unserer Vorstellung ihrer, als ,wirklich‘ gedachten Erscheinung, vermittelt durch den sog. ,transzendentalen Schematismus‘ unserer Einbildungskraft ''':'''</span> <span style="color:#FF6000">»</span>''Eine verborgene Kunst in den Tiefen der menschlichen Seele''<span style="color:#FF6000">«</span>, <span style="color:#00B000">jedoch auch eines der ,dunkelsten‘ Kapitel in der K.d.r.V., bedingt durch KANTS Konzept von ,Wirklichkeit‘, bzw. ,Sein‘. ]</span>
Mit anderen Worten, man kann die ‚Existenz‘, bzw. das ‚Sein‘ der Dinge, <span style="color:#00B000">(das ‚Ding an sich’ bei KANT)</span>, nicht unter dem Mikroskop finden. Die ‚Existenz‘ bzw. das ‚Sein‘ ist keine sinnlich registrierbare ‚Eigenschaft‘ z. B. des rekonstruierten ‚Stadt-Schlosses‘ in Berlin. <span style="color:#00B000">(‚Sein‘ ist kein reales ‚Prädikat‘.)</span> Dafür haben wir andere Fähigkeiten ''':''' Ich kann seine ‚Existenz‘ mit meinem Verstand einsehen, weil auch ich selbst ‚existiere‘. Seine ‚Ansicht‘, wie ‚gefällig‘ es ist, und auch weitere ‚Eigenschaften‘, die mir auffallen, kann ich mit einem Handy-Foto dokumentieren. Diese ‚Eigenschaften‘ sind nicht die Ursache, dass das ‚Berliner Schloss‘ existiert. Wohl aber die Rekonstruktion dieses Schlosses ist die ‚Ursache‘, dass es ,existiert‘, und jetzt so aussieht. Insofern ist ‚Existenz‘ keine ‚Eigenschaft‘, sondern die ‚Existenz‘ des Dinges ist die Voraussetzung, der ‚Grund‘, dass ich die ‚Eigenschaften‘ des Dinges mit meinen Sinnen feststellen kann.
In einer Auseinandersetzung mit CARTESIUS schreibt KANT, philosophisch ‚tiefgründig‘ und logisch ‚exakt‘, über dessen <span style="color:#FF6000"><span style="font-family: Times;"><big>„Cogito, ergo sum“</big></span></span> ''':'''
::<span style="color:#FF6000">»</span>''Das ‚Ich denke‘ ist ein empirischer Satz, und hält den Satz ‚Ich existiere‘ in sich. Ich kann aber nicht sagen ''':''' ‚Alles, was denkt, existiert‘; denn da würde die Eigenschaft des Denkens'', <span style="color:#00B000">[ eine essentielle Eigenschaft ]</span>, ''alle Wesen, die sie besitzen, zu notwendigen'' <span style="color:#00B000">[ d.h. notwendig existierenden ]</span> ''Wesen machen''. <span style="color:#00B000">[ Was allein nur von GOTT ausgesagt werden kann; mit AVICENNA, als anerkannter ARISTOTELES-Kommentator ''':''' <span style="color:#FF6000">»''GOTT ist das einzige Sein, bei dem Essenz'' <span style="color:#00B000">[ ‚Wesenseigenschaften‘ ]</span> ''und Existenz'' <span style="color:#00B000">[ ‚Dasein‘ ]</span> ''nicht zu trennen sind und das daher notwendig an sich da ist''«, <span style="color:#00B000">— konform mit GÖDEL ''':'''</span> »''notwendige Existenz ist eine positive'' <span style="color:#00B000">[ essentielle ]</span> ''Eigenschaft''«</span> ].</span> ''Daher kann meine Existenz auch nicht aus dem Satz, ‚Ich denke‘, als'' <span style="color:#00B000">[ logisch ]</span> ''gefolgert angesehen werden, wie CARTESIUS dafür hielt (weil sonst der Obersatz : ‚Alles, was denkt, existiert‘, vorausgehen müsste), sondern ist mit ihm identisch.'' <span style="color:#00B000">[ Eine einfache Schlussfolgerung ''':''' meine ‚Existenz‘ ist auch nicht von meiner ‚Eigenschaft‘ Denken ‚verursacht‘. ,Existenz‘ ist nicht bloß ein ,Gedanke‘ von mir. ]</span><span style="color:#FF6000">«</span> <span style="color:#00B000">(Aus der Anmerkung 41 zu den ‚''<span style="font-family: Times;"><big>Paralogismen der reinen Vernunft</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 275,<ref>https://korpora.org/kant/aa03/275.html</ref> mit meinem Einschub des AVICENNA-Zitat aus Wikipedia.<ref>{{w|Avicenna#Metaphysik}}</ref>)</span>
Mit anderen Worten ''':''' <span style="color:#FF6000">„Die Eigenschaft, dass ich denken kann, ist nicht die Ursache meiner ‚Existenz‘“</span>, sondern, <span style="color:#FF6000">„Die Liebe meiner Eltern und ihre Entscheidung füreinander ist die Ursache meiner ‚Existenz‘. Daher ‚bin’ ich. Und weil ich ein Mensch ‚bin‘, kann ich denken.“</span> Auch mit diesen Anmerkungen ist leicht einsehbar, dass ‚Existenz‘ keine ‚Eigenschaft‘ ist — außer bei GOTT. In GOTT ist ‚Dasein‘ die ‚Wesenseigenschaft‘ GOTTES, d.h. ‚Dasein‘ und ‚Wesen‘ sind in GOTT untrennbar verbunden; sind <span style="color:#FF6000">„koinzident“</span> ‚eins‘. Das ist die Einzigartigkeit im Wesen GOTTES, dass GOTT immer schon ‚da‘ ist. Die Frage nach dem ‚Wesen‘ GOTTES lautet ''':''' <span style="color:#FF6000">„Was bist du ? “</span>/<span style="color:#CC66FF">„Wer bist Du ? “</span> Antwort, Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'' <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Weil GOTT für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, hat GOTT es nicht nötig, ‚bewiesen‘ zu werden. <span style="color:#00B000">(In der Mathematik ist ein ‚Satz‘ erst dann ‚wahr‘ und ‚existent‘, wenn er bewiesen ist. Bei GOTT ist es jedoch nicht so ''':''' GOTTES ‚Existenz‘ ist nicht erst dann ‚wahr‘, wenn seine ‚Existenz‘ von uns ‚bewiesen‘ ist. Sein ‚Dasein‘ ist jedem unserer ‚Beweisversuche‘ immer schon voraus. Der Zugang zu GOTT ist nicht der ,Beweis‘, sondern der ,Glaube‘. Wer an GOTT glauben ,will‘, dem antwortet GOTT. Wer nicht an GOTT glauben ,will‘, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Die Glaubens-Entscheidung hat jedoch für jeden Menschen eine existenzielle Konsequenz ''':''' <span style="color:#CC66FF">»''Wer glaubt und sich taufen lässt, wird gerettet; wer aber nicht glaubt'', <span style="color:#00B000">[ und diese Entscheidung auch im Augenblick der ,Wahrheit‘, im Tod, in der sog. ,Endentscheidung‘, nicht widerruft ]</span>, ''wird verurteilt werden''«,</span> <small>({{Bibel | Markus Evangelium |16|16|EU}})</small>. Das Urteil lautet ''':''' <span style="color:#CC66FF">»''zweiter Tod ''':''' der Feuersee''«</span>, <small>({{Bibel | Offenbarung |20|14f|EU}})</small>, ohne Berufungsmöglichkeit. <span style="color:#CC66FF">»''Ohne Glauben aber ist es unmöglich, Gott zu gefallen; denn wer zu Gott kommen will, muss glauben, dass er ist und dass er denen, die ihn suchen, ihren Lohn geben wird''«.</span> <small>({{Bibel | Hebräer Brief |11|6|LUT}})</small>)</span>
Das GÖDEL-Axiom-5 ist m.E. der entscheidende Ansatzpunkt einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation der GÖDEL-Axiomatik.
===<div class="center"><span style="color:#660066">Das Kalkül ist kein Existenz-Beweis für GOTT</span></div>===
Die allgemeine <span style="color:#FF6000">»''mathematische Evidenz''«</span> des GÖDEL-Formalismus, d.h. seine ‚Schlusskraft‘, ist von kompetenten Leuten<ref>„GÖDELS Argumentationskette ist nachweisbar korrekt – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO nun gezeigt;“ vgl. https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html</ref> schon festgestellt worden, <span style="color:#00B000">(im Anhang ‚nachrechenbar‘ mit den Regeln und Gesetzen einer modalen Prädikatenlogik 2. Stufe)</span>. Das GÖDEL-Kalkül ist jedoch kein ‚moderner‘<span style="color:#FF6000">„Existenz-Beweis“</span> für GOTT, wofür es gehalten oder meistens bezweifelt wird, sondern setzt, <span style="color:#00B000">(theoretisch methodisch)</span>, den <span style="color:#FF6000">„Glauben an die Existenz GOTTES“</span> schon voraus, ohne ihn zu hinterfragen. Das <span style="color:#FF6000">„Dasein“</span> bzw. die <span style="color:#FF6000">„Existenz“</span> GOTTES wird mit der Definition-1 für <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, bzw. mit dem Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, im Kalkül ‚definitorisch‘ bzw. ‚axiomatisch‘ als Kalkül-,Annahme‘, als <span style="color:#FF6000">„Prämisse“</span>, eingeführt, unter der Voraussetzung, dass die ‚Eigenschaft‘ <span style="color:#4C58FF">‚'''G'''‘ := </span><span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(Essenz)</span> und das <span style="color:#FF6000">„Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> <span style="color:#00B000">(Existenz)</span>, ontologisch ‚identisch‘, genauer ''':''' <span style="color:#FF6000">„koinzident“</span> sind, was GÖDEL im Axiom-5 definitiv für sein System vorschreibt ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>. Das <span style="color:#FF6000">„Dasein GOTTES“</span> ist faktisch äquivalent zur <span style="color:#FF6000">„notwendigen Existenz als GOTT“</span>; und <span style="color:#FF6000">„Göttlichkeit“</span> ist die <span style="color:#FF6000">„positive Eigenschaft in GOTT“</span>. Beides ist nach Axiom-5 ‚identisch‘, d.h. dem ‚Sein nach‘ dasselbe, und daher konvertierbar. Beide, <span style="color:#00B000">(sowohl die Essenz, als auch die Existenz GOTTES)</span>, werden daher auch mit demselben Term ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span> im Kalkül dargestellt. Der traditionelle, christliche ,GOTT-Glaube‘ wird zugleich mit diesem Term <span style="color:#4C58FF">‚'''G'''‘ := </span> <span style="color:#FF6000">„GOTT“ <span style="color:#00B000">|</span> „göttlich“</span>, im 2. Beweisgang, dem Basisbeweis, und im 3. Beweisgang für das Theorem ANSELMS, jeweils als ,methodologische‘ Prämisse :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> regulär <span style="color:#00B000">( ├ )</span> und explizit eingeführt ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht für den GOTT'' <span style="color:#4C58FF">‚'''G'''‘</span> ''der Christen''«</span>. Das ist die ,modal‘-frei gewählte, <span style="color:#4C58FF">„theologische“</span> Kalkül-,Annahme‘, <span style="color:#00B000">(als ,Argument-Einführung‘ := <span style="color:#4C58FF">‚'''AE:'''‘</span> )</span>, und wird dann mit Definition-1 näher ,bestimmt‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ — </span> ''':''' <span style="color:#FF6000"> »''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht genau dann für ‚GOTT‘'' <span style="color:#00B000">|</span> ''‚göttlich‘'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle positiven Eigenschaften, bzw. Vollkommenheiten'', <span style="color:#4C58FF">‚'''PX'''‘</span>, ''hat''«</span>, entsprechend dem ‚Quelltext‘ bei LEIBNIZ. <span style="color:#00B000">(Das ,postulierte‘ Axiom-3 ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, wird standardmäßig gelesen als <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, hat aber auch die alternative Leseart ''':''' <span style="color:#FF6000">»''GOTT ist perfekt d.h. vollkommen''«</span>, was <span style="color:#4C58FF">„theologisch“</span> auch richtig ist; mit <span style="color:#4C58FF">‚'''P'''‘ </span> := <span style="color:#FF6000">„Perfektion“/„Vollkommenheit“</span> ist dann die Summe aller <span style="color:#FF6000">„positiven Eigenschaften“</span>.)</span> Mit Axiom-3, — in dieser <span style="color:#4C58FF">„theologischen“</span> Leseart —, ist der ‚Wenn-Satz‘ in Definition-1 ‚aufgelöst‘ ''':''' <span style="color:#FF6000">»''GOTT hat alle positiven Eigenschaften, weil er ‚perfekt‘ ist''«</span>.
In Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, wird die ,für uns‘ <span style="color:#FF6000">„notwendige Existenz“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —, </span> durch die ,aus sich‘ <span style="color:#FF6000">„notwendig“</span> <span style="color:#4C58FF">— '''□''' —</span> instanziierten <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(als zu den Transzendentalia gehörig)</span>, bestimmt. Das GÖDEL-Kalkül setzt sowohl in Definition-3 als auch im Axiom-5 das Theorem des ARISTOTELES von der ontologischen ‚Identität‘, d.i. die Koinzidenz von <span style="color:#FF6000">„Dasein“</span>, <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#00B000">(Essenz)</span> im prinzipiell <span style="color:#FF6000">„unbewegten Erstbewegenden“</span> voraus. Ohne diese Annahme bzw. ohne Axiom-5, würde das GÖDEL-Kalkül nicht ‚funktionieren‘. Das GÖDEL-Theorem-2.1 ''':''' <span style="color:#4C58FF">— ‚'''Gx→G'''<sub>ess</sub>'''x'''‘ —</span>, kann unter dieser Voraussetzung dann, <span style="color:#4C58FF">„theologisch“</span> richtig und eindeutig, so gelesen werden ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für GOTT'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''als Individuum steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span>, ''das Wesen'', <span style="color:#4C58FF">—<sub>ess</sub>—, </span> <span style="color:#00B000">(,Essenz‘)</span>, ''GOTTES'' <span style="color:#4C58FF">‚'''x'''‘</span>«</span><ref>vgl. z.B. THOMAS von Aquin ''':''' ,''<span style="font-family: Times;"><big>De Ente et Essentia</big></span>''’, Kapitel 5 ''':''' „Deus, cuius essentia est ipsummet suum esse“ ''':''' „GOTT, dessen Wesen sein eigenes Sein ist“.</ref>, statt der <span style="color:#4C58FF">„theologisch“</span> unrichtigen Lesearten in der Wikipedia ''':''' <span style="color:#FF6000">»''Göttlich ist eine essentielle Eigenschaft jedes göttlichen Wesens''«</span><ref>{{w|Gottesbeweis#Kurt_Gödel|Gottesbeweis 2.1.2, Theorem 2}}; Version vom 10.09.2025</ref>, oder bei Christoph BENZMÜLLER et alia, im sog. ,Theorembeweiser‘ ''':''' <span style="color:#FF6000">»''Gottähnlich zu sein ist eine Essenz von jeder gottähnlichen Entität''«</span><ref>[https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html ‚Gödels „Gottesbeweis“ bestätigt’, Theorem 2]</ref>, mit der suggestiven Annahme, es gäbe polytheïstisch, mehrere ,göttliche Wesen‘, bzw. ,gottähnliche Entitäten‘, was der monotheïstischen, abendländischen Tradition, bzw. dem <span style="color:#4C58FF">„theologischen“</span> Theorem von der ,Unvergleichlichkeit‘ und ,Einzigartigkeit‘ GOTTES widerspricht, das im GÖDEL-Kalkül mit Korollar-3 bestätigt wird. <span style="color:#00B000">(Die Interpretation <span style="color:#4C58FF">‚'''G'''‘ :=</span> <span style="color:#FF6000">„GOTT“</span>, als ,Individuumname‘, ist synonym zum <span style="color:#FF6000">„Dasein <span style="color:#00B000">(Existenz)</span> GOTTES“</span>, und äquivalent zur ‚positiven Eigenschaft‘ <span style="color:#FF6000">„Göttlichkeit“</span>, alias <span style="color:#FF6000">„göttlich zu sein“</span> = <span style="color:#FF6000">„GOTT zu sein“</span> = <span style="color:#FF6000">„GOTT-Sein“</span>; und mit dem GÖDEL-Term ''':''' <span style="color:#4C58FF">‚'''G'''<sub>ess</sub>‘ :=</span> <span style="color:#FF6000">„das Wesen <span style="color:#00B000">(Essenz)</span> GOTTES“</span>.)</span>
<div class="center"><span style="color:#FF6000"><span style="color:#4C58FF">‚'''G'''‘ :=</span> „'''G'''öttlichkeit“ <span style="color:#4C58FF">↔</span> „'''G'''OTT“ <span style="color:#4C58FF">↔</span> „'''G'''OTT-Sein“</span> </div>
Die Rechtfertigung für diese <span style="color:#4C58FF">„theologische“</span> Dreifach-Äquivalenz für <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, im GÖDEL-Kalkül, gibt Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''die positive <u>Eigenschaft</u>'', <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ''Göttlichkeit'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''äquivalent zu GOTT als Individuum-Name'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''ist auch äquivalent zum Dasein GOTTES'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''gleichbedeutend mit notwendiger <u>Existenz</u>'', <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>'', dem <u>Sein</u> GOTTES für uns''«</span>. Hier hat GÖDEL explizit <span style="color:#FF6000">„Eigenschaft“</span> mit <span style="color:#FF6000">„Existenz“</span> bzw. <span style="color:#FF6000">„Sein“</span> gleichgesetzt; <span style="color:#00B000">(was jedoch nach KANT für alles, was in unserer Welt ‚existiert‘, bzw. für alles, was zur <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> gehört, wie GÖDEL selbst sagt, in jedem Fall ‚unstatthaft‘ ist ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>)</span>. Jedoch wegen dieser ‚Gleichsetzung‘, die einzig und allein, der aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition entsprechend, singulär nur in GOTT ‚statthaft‘ ist, kann jetzt die ‚positive Eigenschaft‘ <span style="color:#00B000">(Essenz)</span> <span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(ontologisch korrekt)</span> gelesen werden als <span style="color:#FF6000">„das, was GOTT zu dem macht, ‚was‘ GOTT an sich selbst ist“</span>, nämlich zu seinem <span style="color:#FF6000">„GOTT-Sein“</span> <span style="color:#00B000">(Existenz)</span>, zu seinem <span style="color:#FF6000">„Dasein als GOTT“</span>; zur Tatsache, dass <span style="color:#FF6000">„GOTT GOTT ist“</span>, d.h. dass <span style="color:#FF6000">„GOTT als GOTT ‚da‘ ist“</span>. Das ist, <span style="color:#00B000">(und da folgt ARISTOTELES seinem Lehrer PLATO)</span>, nach traditioneller Auslegung, die übliche, ontologische Funktion des ‚Wesens‘<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ |</span> eines Seienden ''':''' es ‚macht‘ das Seiende zu dem, ‚was‘ es ist; es ist die ‚Ursache‘ dafür, dass das Seiende, das ‚ist‘, ‚was‘ es ist | ‚Was-Sein‘ — ‚Wesen‘. <span style="color:#00B000">(ARISTOTELES lokalisiert jedoch das ,Wesen‘ im Seienden, im Gegensatz zu PLATO, der das ,Wesen‘, — ,getrennt‘ vom Seienden —, in den allgemeinen ,Ideen‘ lokalisiert.)</span>
Da aber in ‚Gott‘, <span style="color:#00B000">(dem <span style="color:#FF6000">„unbewegten, ‚unverursachten‘ Erstbeweger“</span>)</span>, Prozesshaftes, ‚Ursächliches‘ auszuschließen ist, ist die übliche prozesshafte, ‚ursächliche‘ Funktion von <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span><span style="color:#00B000"> | ‚ousía‘ |</span> ,Wesen‘ im <span style="color:#FF6000">„Erstbewegenden“</span> nach ARISTOTELES, sozusagen, schon ‚zum Abschluss‘ gekommen, schon ‚verwirklicht‘, — <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐν-έργεια οὖσα</big></span>“</span><span style="color:#00B000"> | ‚en-érgeia oúsa‘</span> —, schon ‚ins-Werk‘ gesetzt; <span style="color:#00B000">(<span style="color:#FF6000">„<span style="font-family: Times;"><big>τὸ ἔργον</big></span>“</span> | ‚to érgon‘ | ‚das Werk‘; <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια</big></span>“</span> | ‚enérgeia‘ | ,Wirksamkeit‘, ,Wirklichkeit‘, ,Aktualität‘, ,Energie‘; und <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὖσα</big></span>“</span> | ,oúsa‘ | feminin Nominativ Singular von <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὤν</big></span>“</span> | ‚ón‘ | ‚seiend‘)</span>. Sein ,Wesen‘ ist im ,Dasein‘ vollendet, ist ,wirkliches, verwirklichendes Sein‘, ‚seiende Aktualität‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>actus purus</big></span>“</span> ''':''' sein Wesen ist ‚reine Tätigkeit‘, ,reine verwirklichende Gegenwärtigkeit‘, d.h. ,existent‘, ohne jede prozesshafte ‚Potenzialität‘. Aus der wichtigen und richtigen Erkenntnis, dass GOTT <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer Welt''«</span> ist, folgt mit der ontologischen Identität von ,Dasein‘ und ,Wesen‘ in GOTT ''':''' Der zeitlos ewige GOTT ist <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''immer schon da''«</span>, m.a.W. ist <span style="color:#FF6000">„zeitlos-ursprungslos“</span>. Insofern ist <span style="color:#FF6000">„Göttlichkeit“</span> die <span style="color:#FF6000">„Wesenseigenschaft“</span>, die im <span style="color:#FF6000">„Dasein GOTTES“</span> d.h. in <span style="color:#FF6000">„GOTT“</span>, schon ihr ‚Ziel‘, ihre Vollendung, — <span style="color:#FF6000">„Perfektion“</span>, Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, erreicht hat. GOTT ist <span style="color:#FF6000">»''vollkommen''«</span> und darum auch <span style="color:#FF6000">»''notwendig für uns immer schon ‚da‘''«</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ — </span>. GOTT ist in seinem ‚zeitlosen Wesen‘ <span style="color:#FF6000">„unverursacht“</span>, da er <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''vollkommen''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''□PG'''‘ —</span>, <span style="color:#00B000">(eine Instanz von Axiom-4)</span>. <span style="color:#FF6000">„Vollkommenheit“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ist die <span style="color:#FF6000">„Wesenseigenschaft“</span>, bzw. das <span style="color:#FF6000">„Wesen GOTTES“</span> ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>. <span style="color:#FF6000">»''GOTT ist ,der‘ Vollkommenste''«</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, d.h. <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist die unbegrenzte Summe der unendlichen Vollkommenheiten''«</span>. Und zur absoluten <span style="color:#FF6000">„Vollkommenheit“</span> gehört <span style="color:#FF6000">„notwendig“</span> auch das <span style="color:#FF6000">„Existieren“</span> ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span>. <span style="color:#FF6000">„Notwendige Existenz“</span> gehört zu den ,ultimativen‘ Transzendentalia in GOTT, was GÖDEL mit Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, syntaktisch formalisiert hat, wenn sowohl das <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, als auch alle <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span> im Kalkül, für den Dreifaltigen GOTT der Christen stehen, was dann im Korollar-3, mit der Identität, <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, bzw. der Koinzidenz beider Individuum-Variablen, explizit gezeigt wird.
Entscheidend für diese Interpretation des GÖDEL-Systems ist ''':''' nur unter der ,modal‘ notwendigen Voraussetzung der ontologischen ‚Identität‘ von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, Theorem-2 ''':''' <span style="color:#4C58FF"> — '''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>, bzw. der ‚Gleichsetzung‘, <span style="color:#00B000">(Koinzidenz)</span>, von <span style="color:#FF6000">„notwendiger Existenz“</span> mit den ‚positiven‘ Wesenseigenschaften, der <span style="color:#FF6000">„Essenz“</span> in GOTT, Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, ‚funktioniert‘ die GÖDEL-Axiomatik '''!''' Diese ‚Identität‘, bzw. ,Koinzidenz‘ wird in ARISTOTELES, ‚''<span style="font-family: Times;"><big>Metaphysik</big></span>''‘, Buch XII 7, in einem Indizienbeweis erbracht, der mit der Methode der philosophischen Induktion zum Ergebnis kommt ''':'''
::<span style="color:#FF6000">» … ''es muss'' <span style="color:#00B000">[ notwendig ]</span> ''etwas geben, das, ohne selbst ‚bewegt‘'' <span style="color:#00B000">[ </span>''worden''<span style="color:#00B000"> ]</span> ''zu sein'', <span style="color:#00B000">[ ‚unentstanden‘ ]</span>, ''alles Übrige wie ein Geliebtes ‚bewegt‘'' <span style="color:#00B000">[ ‚entstehen lässt‘ ]</span>«</span>, das darum selbst ‚zugleich‘ <span style="color:#FF6000">„<span style="font-family: Times;"><big>αἴδιον καί οὐσία καί ἐνέργεια οὖσα</big></span>“ <span style="color:#00B000">| ,aídion kai ousía kai enérgeia oúsa‘ |</span> »<span style="color:#00B000">[ zeitlich-]</span>''ewig, sowohl <u>Wesen</u>'', <span style="color:#00B000">[ etwas Konkretes, Essentielles ]</span>, ''als auch seiende Wirksamkeit — ''<span style="color:#00B000">[ </span>„<span style="font-family: Times;"><big>actus purus</big></span>“, „reine Tätigkeit“<span style="color:#00B000"> ]</span> ''— verwirklichendes, wirkliches <u>Sein</u> ist'', <span style="color:#00B000">[ ein Existierendes, das alles Übrige ,zur Existenz‘ bringen kann ]</span> «</span>, bzw. <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὀρεκτόν καί νοητόν</big></span>“ <span style="color:#00B000"> | ,orektón kai noêtón‘ | </span>»''das ersehnt und erkennbar ist''.«</span> <span style="color:#00B000">(''<span style="font-family: Times;"><big>vgl. ,Metaphysik</big></span>''‘ XII 7, 1072a,23 – 1072b,4)</span>
Was <span style="color:#FF6000">»''alles Übrige''«</span> ,zur Existenz‘ bringen kann, bzw. ,verwirklichen‘ kann, ohne selbst ,entstanden‘ zu sein, muß auch selbst, als etwas Konkretes, Essentielles, immer schon ,existieren‘, bzw. ,wirklich sein‘. Die, daraus abgeleitete, und damit ,erkannte‘, ontologische ‚Identität‘, — ,Koinzidenz‘ —, von ‚Wesen‘ und ‚Sein‘, <span style="color:#00B000">(Ziel aller Sehnsucht und jedes Erkenntnisstrebens)</span>, <span style="color:#FF6000">»''ist das Privilegium der Gottheit allein''«</span> ''':''' mit Gottfried Wilhelm LEIBNIZ interpretiert, entsprechend einer adäquaten, aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition. Dieses induktive, ‚ontologisch‘ a-posteriori Ergebnis aus der ‚Prinzipienforschung‘ des ARISTOTELES ist die metaphysische und logische Voraussetzung, dass GÖDEL seine Axiomatik im Kalkül des sog. ‚ontologischen Gottesbeweises‘ a-priori des ANSELM von Canterbury, und nach LEIBNIZ, deduktiv korrekt formulieren konnte; <span style="color:#00B000">(vgl. 3. Beweisgang)</span>.
Angenommen, die Variable <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für den <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, der Christen, <span style="color:#00B000">(siehe Anhang, Term :01: im 2. Beweisgang)</span>, dann ist, — auf Grund von diesem Beweisgang —, in unserer Welt ,wahr‘ und evident ''':''' sowohl die ‚positive Eigenschaft‘ <span style="color:#FF6000">»''Göttlichkeit''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als auch das faktische <span style="color:#FF6000">»''‚Da‘-Sein'' <span style="color:#00B000">[ Existenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ‚benennen‘, ontologisch ident, denselben Sachverhalt ''':''' nämlich das, was wir das <span style="color:#FF6000">»''Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>, nennen. <span style="color:#FF6000">»''Göttlichkeit'', bzw. ''GOTT-‚Sein‘ ist das Wesen GOTTES''«</span>, <span style="color:#00B000">(Theorem-2.1)</span>, und dann umgedreht und äquivalent ''':''' <span style="color:#FF6000">»''Das Wesen GOTTES ist sein ‚Da‘-Sein als GOTT'', bzw. ''seine Göttlichkeit''«</span>, <span style="color:#00B000">(Theorem-2.2)</span>, m.a.W. ''':''' <span style="color:#FF6000">»''GOTT ist wesentlich ‚grundlos‘'' <span style="color:#00B000">[ d.h. </span> ''notwendig aus sich''<span style="color:#00B000"> ]</span> ''‚da‘''«</span>. Das ist das Einzigartige im <span style="color:#FF6000">»''Wesen GOTTES''«</span> ''':''' GOTT ist ohne zeitlichen Anfang, zeitlos-ewig, für uns immer schon ‚da‘, und das ‚ist‘ sein <span style="color:#FF6000">»''Wesen''«</span>; vorausgesetzt, ,angenommen‘, man glaubt an GOTT ''':''' Term :01:. <span style="color:#00B000">(Der schon von GÖDEL indizierte Term <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ — </span> ,expliziert‘ nur eine der drei Lesearten, die der Term <span style="color:#4C58FF"> — ‚'''G'''‘ — „theologisch“</span> ,impliziert‘.)</span> Theorem-2 hat somit die syntaktische Form einer Definition ''':'''
<div class="center"><span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span></div>
Somit kann GOTT ‚explizit‘ <span style="color:#00B000">(aus einer bewiesenen Kalkül-Definition)</span> <span style="color:#4C58FF">„theologisch“</span> genauer ‚bestimmt‘ werden ''':''' <span style="color:#FF6000">»''GOTT ist gerade deswegen GOTT, weil sein überzeitlich-ewiges und an sich ‚grundloses‘'' <span style="color:#00B000">[ aber für uns notwendiges ]</span> ''Dasein'' <span style="color:#00B000">[ Existenz ]</span> ''als GOTT, ontologisch, — dem Sein nach —, identisch ist mit seinem persönlichen und für uns liebevollen Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''als GOTT; diese Identität von Dasein und Wesen gilt einzig und allein nur bei GOTT.''«</span> Die philosophische Frage nach dem <span style="color:#FF6000">„Wesen GOTTES“</span> lautet, <span style="color:#00B000">(auf die Person bezogen)</span> ''':''' <span style="color:#FF6000">„Was bist du ? “</span> Sie ist äquivalent zur <span style="color:#4C58FF">,theologisch’</span>-biblischen Frage des MOSE ''':''' <span style="color:#CC66FF">„Wer bist Du ? “</span> Die bekannte Antwort des GOTTES-JHWH aus ‚Exodus 3,14‘, im Dornbusch, thematisiert das persönliche, für uns liebevolle und für immer notwendige <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'', <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Mit diesem Zitat aus der Bibel ist die GÖDEL-Axiomatik, sozusagen, <span style="color:#4C58FF">„theologisch“</span> ‚verifiziert‘. Sie hat einerseits im Theorem-2 ihren philosophischen ‚Abschluss’ erreicht, und andererseits damit formal-syntaktisch den ‚Anschluss‘ an eine allgemeine Basis-Glaubensaussage gefunden, die ‚an sich‘ für jeden CHRIST-gläubigen Menschen ‚selbstverständlich‘ ist. Was in der Metaphysik des ARISTOTELES das Ergebnis einer philosophischen ,Induktion‘ a-posteriori ist ''':''' <span style="color:#FF6000">„,Dasein‘ ist das ,Wesen‘ GOTTES“</span>, — <span style="color:#00B000">(das mit Theorem-2, auch ein Ergebnis der deduktiven GÖDEL-Axiomatik a-priori ist ''':''' die Beweisgrundlage für den Konsequenz-Teil im Theorem AMSELMS)</span>, — das ist in der Bibel die Grundüberzeugung jedes Menschen, der an GOTT glaubt ''':''' GOTT ist für uns immer schon <span style="color:#FF6000">„da“</span>, weil er uns liebt. Das ist das, <span style="color:#FF6000">„was“</span> GOTT für uns als GOTT ausmacht, — sein Wesen ''':''' <span style="color:#CC66FF">»''Wir haben die Liebe, die GOTT zu uns hat, erkannt und gläubig angenommen. GOTT ist Liebe, und wer in der Liebe bleibt, bleibt in GOTT und GOTT bleibt in ihm''«</span>, <small>({{Bibel | 1. Johannesbrief |4|16|EU}})</small>.
Das eigentliche Ergebnis der GÖDEL-Axiomatik ist somit die ‚triviale‘ Erkenntnis, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, vorausgesetzt <span style="color:#00B000">(‚angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#CC66FF">»''Ehe die Berge geboren wurden, ehe die Erde entstand und das Weltall erschaffen wurden, bist du, o GOTT, von Ewigkeit zu Ewigkeit''«</span>, <small>({{Bibel | Psalm |90|2|LUT}})</small>. <span style="color:#00B000">(Der Glaube an die Zeitlosigkeit GOTTES ist mit der ‚Annahme‘ von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, und der ‚Annahme‘ der Definition-1 für <span style="color:#4C58FF"> ‚'''Gx'''‘ := </span> den <span style="color:#FF6000">„GOTT der Christen“</span>, im Kalkül ‚implizit‘ schon eingeführt, da die Axiome und Definitionen, — nach GÖDEL —, nur dann <span style="color:#FF6000">»''wahr''«</span> sind, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen''</span> [ Raum-Zeit-]<span style="color:#FF6000">''Struktur''«</span> unserer Welt sind. Das ,impliziert‘ auch, dass der GOTT von Axiom-3 und Definition-1 ebenfalls <span style="color:#FF6000">»''unabhängig''«</span> von Raum und Zeit, d.h. zeitlos-ewig ist '''!''' )</span>
Wer an den GOTT der Bibel glaubt, kann sich von der ‚Vernünftigkeit‘ seines Glaubens mit Hilfe des sog. ,ontologischen‘ Gottesbeweises nach ANSELM von Canterbury, mit Kurt GÖDEL <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, überzeugen. <span style="color:#00B000">(Das war auch die Absicht ANSEMS '''!''' )</span> Die Annahme, es sei ‚unmöglich‘, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span>, <span style="color:#00B000">(dezidierter Atheismus)</span>, führt im GÖDEL-Kalkül formal zu einem logischen Widerspruch; vgl. z. B. ‚''<span style="font-family: Times;"><big>Gödels Möglichkeitsbeweis</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, Seite 17, von Günther J. WIRSCHING; (https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf), d.h. es ist also nicht ‚unmöglich‘, dass es GOTT gibt. Der GOTT-Glaube ist mit den Maßstäben einer modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> und darum ,vernünftig‘. Damit steht fest ''':''' das GÖDEL-Kalkül ist kein moderner ‚Existenz-Beweis‘ für den GOTT der Bibel, sondern es setzt, <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, ,methodologisch‘, den Glauben an die Existenz eines zeitlos-ewigen GOTTES voraus, der, — <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer '' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> —, für uns immer schon ‚da‘ ist. Wenn aber einmal als fix ‚angenommen‘ worden ist, <span style="color:#00B000">(als Prämisse)</span>, dass es wahr ist, dass GOTT ‚existiert‘, dann ist natürlich die ‚Annahme‘, dass GOTT ‚nicht existiert‘, falsch. Aber sie ist auch ,unlogisch‘ und ,unsinnig‘, weil die Annahme ''':''' <span style="color:#FF6000">»''Es ist unmöglich, dass es einen GOTT gibt''«</span>, offensichtlich und eindeutig zu einem Widerspruch führt; was z. B. Günther J. WIRSCHING mit seiner Version des <span style="color:#00B000">(nicht umkehrbaren)</span> ‚Möglichkeitsbeweises‘ für ,GOTT‘, explizit vorexerziert hat; <span style="color:#00B000">( nachgestellt im Anhang ''':''' GÖDELS ‚Möglichkeitsbeweis‘ als ,Widerlegung‘ eines Nicht-GOTT-Glaubens; in Entsprechung zu Psalm 14,1 und Psalm 53,2 ''':''' <span style="color:#CC66FF">»''Der'' <span style="color:#00B000">[ ,unvernünftige‘ ]</span> ''Tor sagt in seinem Herzen ''':''' Es gibt keinen Gott. Sie handeln verderbt, handeln abscheulich; da ist keiner, der Gutes tut''«</span>. Historischer Hintergrund zu diesem Psalm-Text ''':''' Die Zerstörung des Tempels in Jerusalem 586 v.Ch. durch die Truppen des NEBUKADNEZAR II.)</span> Der Logiker GÖDEL hat in seinem System zum ,ontologischen Beweis‘ keine ‚formale Unentscheidbarkeit‘ <span style="color:#00B000">(Agnostizismus)</span> feststellen können, wie auf einem anderen Feld seiner Forschungsarbeiten.
Das GÖDEL-Konsequenz-Teil von der ‚Notwendigkeit‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, <span style="color:#00B000">(die ‚Konsequenz’ aus dem ‚widerspruchsfreien‘ Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —,</span>)</span> im ‚Theorem ANSELMS‘, ist <span style="color:#00B000">(im 3. Beweisgang, Term :10:)</span> dann auch eine weitere Explikation des Basis-Theorems-2 des Kalküls ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span>, über die ‚ontologische Identität‘ vom <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, mit seinem <span style="color:#FF6000">„Wesen“</span> ''':''' <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, nach einem <span style="color:#4C58FF">[ Modus ponens ]</span>, dargestellt mit Term :09:.
<span style="color:#00B000">(Die ontologische Identität von Dasein und Wesen in GOTT, ist die, für uns, <span style="color:#FF6000">„notwendige Präsenz <span style="color:#00B000">[ das Sein, <span style="color:#4C58FF">— ‚'''E'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, die äquivalent, bzw. koinzident ist zur <span style="color:#FF6000">„Vollkommenheit <span style="color:#00B000">[ das Wesen, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>. Diese Identität von Sein und Wesen in GOTT ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub> —</span>, bedeutet <span style="color:#4C58FF">,theologisch‘</span> konkret ''':''' die, für uns, notwendige Gegenwärtigkeit GOTTES, [ sein Dasein ], ist verwirklicht worden in der liebevollen [ Wesens-]Zuwendung GOTTES zu uns Menschen, in seiner Kindwerdung in Bethlehem, durch die Jungfrau MARIA ''':''' GOTTES Wesen ist ,Sein-mit-uns‘ ''':''' <span style="color:#CC66FF">»''sein Name'', <span style="color:#00B000">[ sein Wesen ]</span>, ''ist IMMANUEL, das heiß übersetzt ''':''' GOTT-ist-mit-uns''«, <small>({{Bibel | Matthäus Evangelium |1|23|EU}})</small></span>, der unsere Not-,wenden‘-wird, d.h. der uns und die Welt von der Korruption der Sünde und des Todes <span style="color:#4C58FF">,erlösen‘</span> will und wird; jedoch nicht ohne uns. Die <span style="color:#4C58FF">„Menschwerdung“</span> GOTTES in JESUS CHRISTUS, die <span style="color:#4C58FF">„Hypostatische Union“</span>, bzw. diese außergewöhnliche und einzigartige <span style="color:#FF6000">„Koinzidenz“</span> von GOTT und Mensch, ist der wirkliche und historische Beginn der <span style="color:#4C58FF">„Erlösung“</span> des Menschen und der Welt; vergegenwärtigt für jede Generation der Menschen in und durch die <span style="color:#4C58FF">„Kirche“</span> JESU CHRISTI.)</span>
Die, von GÖDEL im 1. Beweisgang, als Prämissen schon vorausgesetzten und ,angenommenen‘ Perfektionen, bzw. Vollkommenheiten, <span style="color:#00B000">(das sind die allgemeinen ,Transzendentalia‘ für alles Nicht-Göttliche in der Welt)</span>, werden im ersten Teil des 2. Beweisganges, mit Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dann auch als <span style="color:#FF6000">„positive Wesenseigenschaften“</span>, <span style="color:#00B000">(als die ultimativen ,Transzendentalia‘)</span>, in GOTT ‚definitiv‘ <span style="color:#00B000">( ╞ )</span> bestätigt; <span style="color:#00B000">(siehe Anhang, 2. Beweisgang, Anmerkung-2)</span>.
Im 3. Beweisgang ist das Basis-Theorem-2 die ,modal‘ notwendige, bzw. transzendentale, Voraussetzung, sowohl für das <span style="color:#FF6000">„an sich notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, im Term :10:, als auch für die <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, in den Ressourcen dieses Beweisganges ''':''' in der Definition-3, und im Axiom-5; <span style="color:#00B000">(das <span style="color:#4C58FF">— ‚'''E'''‘ —</span> wird nur GOTT zugeordnet; vgl. auch Anhang, 3. Beweisgang, Anmerkung-4)</span>. Dieses Basis-Theorem-2 ist auch zugleich die Antwort auf die Frage nach dem ‚Ursprung‘ GOTTES ''':''' GOTT ist <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> ‚da‘, von <span style="color:#CC66FF">„Ewigkeit zu Ewigkeit“</span>, denn es ‚ist‘ sein <span style="color:#FF6000">„Wesen“</span>, <span style="color:#00B000">(überzeitlich-ewig)</span> für uns immer schon ‚da‘ zu sein. Weitere ‚Einzelheiten‘ über Wesen und Eigenschaften GOTTES gehören in die Mystik, bzw. in die <span style="color:#4C58FF">„Theologie“</span>.
===<div class="center"><span style="color:#660066">Die Bedeutung des Kalküls</span></div>===
<div class="center">Immanuel KANT und Kurt GÖDEL im ‚Dialog‘</div>
KANT sagt ''':'''
::<span style="color:#FF6000">»</span>'''''Sein''' ist offenbar kein reales Prädikat''. ... ''Es ist bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Position'' <span style="color:#00B000">[ latinisiert, deutsch für ''':''' ,Setzung‘ ]</span> ''eines Dinges ... Nehme ich nun das Subjekt (Gott) mit allen seinen Prädikaten'' <span style="color:#00B000">[ d.h. Eigenschaften ]</span> ''(worunter auch die Allmacht gehört) zusammen, und sage ''':''' ‚'''Gott ist'''‘'', <span style="color:#00B000">[ ,GOTT existiert wirklich‘ ]</span>, ''oder ‚es ist ein Gott‘, so <u>setze</u> ich kein neues Prädikat'' <span style="color:#00B000">[ keine neue Eigenschaft ]</span> ''zum ‚Begriffe‘ von Gott ''':''''' <span style="color:#00B000">[ <span style="color:#0000FF; background-color:#FFFF00">‚Sein’ ist kein ‚reales Prädikat’ in GOTT</span>; ‚Existenz‘ ist in GOTT keine ‚Eigenschaft‘ ],</span> ... ''es kann daher zu dem Begriffe'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''der bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Möglichkeit ausdrückt, darum, dass ich dessen Gegenstand'', <span style="color:#00B000">[ GOTT ]</span>, ''als schlechthin gegeben (durch den Ausdruck ''':''' er ist'', <span style="color:#00B000">[ GOTT ist wirklich ]</span>'' ) <u>denke</u>, nichts weiter hinzukommen.'' <span style="color:#00B000">[ Beides ist ,bloß gedacht‘ '''!''' ]</span> ''Und so enthält das Wirkliche nichts mehr als das bloß Mögliche. Hundert ‚wirkliche‘ Taler enthalten nicht das mindeste <u>mehr</u>, als hundert ‚mögliche‘. Denn, da diese den'' <span style="color:#00B000">[ gedachten ]</span>'' ‚Begriff‘, jene aber den Gegenstand und dessen'' <span style="color:#00B000">[ gedachte ]</span>'' Position an sich selbst bedeuten, so würde, im Fall dieser'', <span style="color:#00B000">[ die 100, als ,wirklich‘ bloß gedachten Taler ]</span>, ''<u>mehr</u> enthielte als jener,'' <span style="color:#00B000">[ als ihr ‚gedachter‘ Begriff im Verstand, wie ΑNSELM von Canterbury für GOTT, als ‚wirklich‘ Existierenden, argumentierte, …''so würde'' ]</span> ''mein ‚Begriff‘'' <span style="color:#00B000">[ die 100 im Verstand ‚gedachten‘ Taler ]</span> ''nicht den ganzen Gegenstand ausdrücken, und also auch <u>nicht der angemessene Begriff</u> von ihm sein. Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben'', <span style="color:#00B000">[ als bei 100 bloß ‚gedachten‘ Talern ]</span> ... <span style="color:#FF6000">«</span> <span style="color:#00B000"><ref>‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 401; https://www.korpora.org/kant/aa03/401.html</ref></span>.
GÖDEL würde darauf <span style="color:#00B000">(korrespondierend zur aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition von der Identität von Sein und Wesen in GOTT)</span> antworten ''':'''
::<span style="color:#FF6000">»</span>Die <span style="color:#FF6000">„100 Taler“</span> sind der <span style="color:#FF6000">»''zufälligen Struktur der'' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> entnommen, und sind daher nicht mit GOTT vergleichbar, der, <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer Welt, <span style="color:#FF6000">„über“</span> dieser Welt steht. Einzig und allein nur von GOTT gilt ''':''' Der mit Dingen aus unserer Welt ,nicht vergleichbare‘ GOTT, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#FF6000">„existiert notwendig für uns“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, und <span style="color:#FF6000">„notwendiges Existieren, <u>Sein</u>“</span> ,ist‘ eine <span style="color:#FF6000">„positive <u>Wesen</u>seigenschaft“</span> in GOTT, <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, weil GOTT aus sich <span style="color:#FF6000">„vollkommen“ <span style="color:#00B000">|</span> „perfekt“</span> ist, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#0000FF; background-color:#FFFF00">‚Sein‘ ist in GOTT ein ‚reales Prädikat‘</span>; <span style="color:#00B000">(notwendige ‚Existenz’ ist eine positive ‚Wesenseigenschaft’ in GOTT)</span>, und nur bei GOTT '''!''' Zum zeitlos-ewigen GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(als methodologische Kalkül-Prämisse)</span>, kann man sagen ''':''' Weil es, wegen Axiom-1 und Axiom-2, <span style="color:#FF6000">„widerspruchsfrei möglich"</span> ist, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, darum ist GOTT auch das ‚einzige‘ <span style="color:#FF6000">„Wesen“</span>, <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, von dem ein Christ sagen kann, dass es <span style="color:#FF6000">„notwendig aus sich“</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, d.h. <span style="color:#FF6000">„grundlos“ <span style="color:#00B000">|</span> „unverursacht“</span>, für uns immer schon ‚da’ ist, und immer ,da’ sein wird; und zusätzlich gilt ''':''' Es gibt für jede mögliche Welt ‚nur‘ diesen einen GOTT ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ — </span><span style="color:#00B000">(Monotheïsmus, Korollar-3)</span>; vorausgesetzt, man geht von der ,Existenz’ dieses GOTTES aus, wobei diese Annahme für GÖDEL <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist.<span style="color:#FF6000">«</span>
Eine Beobachtung ''':''' KANT sagt, gleichsam als ,krönenden‘ Abschluss seiner Widerlegung des, — von ihm so genannten —, ,ontologischen Gottesbeweises‘ ''':''' <span style="color:#FF6000">»</span>''Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben, (d.i. ihrer Möglichkeit).''<span style="color:#FF6000">«</span> Diese Feststellung KANTS entspricht jedoch genau der Argumentation ANSELMS ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span>, d.h. GOTT ,existiert auch in Wirklichkeit‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was <u>mehr</u> ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ein bloßer Begriff ,im Verstand zu sein‘. Der ,Mehr-Wert‘ ergibt sich in beiden Fällen, sowohl bei den Talern als auch bei GOTT, aus der ,Wirklichkeit‘ ihrer Existenz, im Gegensatz zur bloßen, <span style="color:#00B000">(im Begriff gedachten)</span>, ,Möglichkeit‘ ihrer Existenz, so dass, in jedem Fall, der ,Begriff‘ im Verstand ohne Abstriche <span style="color:#FF6000">»</span>''den ganzen Gegenstand ausdrückt''<span style="color:#FF6000">«</span>, und von diesem auch <span style="color:#FF6000">»</span>''der angemessene Begriff''<span style="color:#FF6000">«</span> ist. Alles andere wäre eine ,Lüge‘. Mit dieser ,Beobachtung‘ ist das implizit ,Widersprüchliche‘ in KANTS Argumentation aufgedeckt ''':''' Das Wirkliche in KANTS Vermögenszustande enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, konträr zu seiner vorigen Behauptung ''':''' <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#FF6000">«</span> enthalte <span style="color:#FF6000">»'',nichts mehr‘</span> als das bloß Mögliche''<span style="color:#FF6000">«</span>. Diese Behauptung ist offensichtlich falsch. Das ist somit ein indirekter Beweis und damit eine Bestätigung für die analoge Argumentation ANSELMS aus dem Wiederspruch des Gegenteils, am Beispiel KANTS <span style="color:#FF6000">»</span>''Vermögenzustandes bei hundert wirklichen Talern''<span style="color:#FF6000">«</span>, in dem in Wirklichkeit <span style="color:#FF6000">,doch mehr‘</span> ist, <span style="color:#FF6000">»</span>''als bei dem bloßen Begriffe derselben''<span style="color:#FF6000">«</span>.
<span style="color:#00B000">(Diese ,Beobachtung‘ ist zugleich auch das entscheidende Indiz dafür, dass das systembedingte Konzept KANTS von der ,Existenz‘, bzw. vom ,Sein‘ eines jeden Gegenstandes, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.i. als seine ,Setzung‘ bloß im- und durch den Verstand, ,falsch‘ ist, — d.h. im Klartext ''':''' für KANT ist das ,Sein‘ eines Gegenstandes bloß ein ,Gedanke‘ in uns, wenn er meint, dass uns ein Gegenstand erst dann wirklich ,gegeben‘ sei, wenn wir uns den</span> <span style="color:#FF6000">»</span>''Gegenstand als schlechthin gegeben (durch den Ausdruck : <u>er ist</u>) <u>denken</u>''<span style="color:#FF6000">«</span>, <span style="color:#00B000">was nur dem Irrtum einer falschen System-Konzeption geschuldet sein kann. Auf Grund dieser Konzeption ist das</span> <span style="color:#FF6000">»</span>''Ding, wie es an sich selbst ist''<span style="color:#FF6000">«</span>, <span style="color:#00B000">für KANT systembedingt weder ,anschaubar‘, noch ,erkennbar‘. Diese falsche Konzeption über die ,Existenz‘, bzw. das ,Sein‘ eines Dinges, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">ist für KANT letztendlich auch die Beweisgrundlage und Voraussetzung für seine Ablehnung des ontologischen Argumentes für GOTT im Theorem ANSELMS. Wenn das ,wirkliche‘ Sein eines Dinges nichts anderes ist, als</span> <span style="color:#FF6000">»</span>''dessen'' <span style="color:#00B000">[ bloß gedachte ]</span> ''Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.h. als seine ,mögliche‘ Setzung bloß im- und durch den Verstand, — das ist das, als ,wirklich‘ bloß nur ,gedachte‘ Ding —, dann</span> <span style="color:#FF6000">»</span>''enthält''<span style="color:#FF6000">«</span> <span style="color:#00B000">natürlich</span> <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#00B000">, [ als die bloß gedachte Existenz ],</span> ''nichts mehr als das bloß Mögliche''<span style="color:#00B000">, [ als der gedachte Begriff ]<span style="color:#FF6000">«</span>, was offensichtlich unhaltbar ist. <span style="color:#4C58FF">[ Modus tollendo tollens ] </span> ''':''' Wenn die Konsequenz einer Wenn-Dann-Folgerung ,falsch‘ ist, dann ist auch ihre Voraussetzung, das System-Konzept KANTS, ,falsch‘ ''':''' d.i. seine ,Kopernikanische Wende‘ für die Metaphysik, soweit sie KANTS ,Sein’-Konzept betrifft. Korrekt und ,wahr‘ ist in jedem Fall ''':''' Das Wirkliche enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, und die Dinge ,existieren‘ schon immer unabhängig von unserem Denken. ,Existenz‘, das ,Sein‘, ist <span style="color:#FF6000">,doch mehr‘</span>, als bloß ein ,Gedanke‘ von uns.)</span>
Somit ist die Argumentation KANTS gegen den ontologischen Beweis ANSELMS für GOTT ,falsch‘ und unhaltbar, weil sie auf der ,falschen‘ Voraussetzung beruht ''':''' die ,Existenz‘, bzw. das ,Sein‘ eines jeden ,Gegenstandes‘, — wie z. B. auch die Existenz bei GOTT —, sei bloß dessen gedachte ,Position‘ an sich selbst, d.h. bloß seine ,Setzung‘ im- und durch den Verstand. Damit ,macht‘ er GOTT außerdem zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, und verkennt so, — wie vor ihm THOMAS von Aquin —, auch die Einzigartigkeit und Exklusivität GOTTES im Theorem ANSELMS.
<div class="center">Die <span style="color:#FF6000">„Rede von GOTT“</span> in der philosophischen Tradition</div>
Wenn man die philosophische Tradition der <span style="color:#FF6000">„Rede von GOTT“</span> im Lichte der Ergebnisse der <span style="color:#4C58FF">„axiomatischen Theologie“</span> GÖDELS liest, dann stellt sie sich am Beispiel bei ARISTOTELES, — AVICENNA, — ANSELM, und bei GÖDEL wie folgt dar ''':'''
<span style="color:#FF6000">»''Das Erstbewegende,'' (<span style="font-family: Times;"><big>,πρῶτον κινοῦν‘</big></span>), ''das, ohne selbst ‚bewegt‘ zu sein'', (<span style="font-family: Times;"><big>,ἀκίνητον‘</big></span> <span style="color:#00B000">| ''unverursacht, ,entstehungslos‘'' |</span> ), ''alles Übrige wie ein Geliebtes ‚bewegt‘'', (<span style="font-family: Times;"><big>,κινεῖ δὴ ὡς ἐρώμενον‘</big></span> <span style="color:#00B000"> | ''-verursacht, ,entstehen‘ lässt'' |</span> ), ''ist sowohl'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚Wesen‘'', (<span style="font-family: Times;"><big>,ἀΐδιον καί οὐσία‘</big></span> <span style="color:#00B000">| ''‚Substanz‘'' |</span> ), ''als auch'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚wirksames, verwirklichendes Sein‘'', (<span style="font-family: Times;"><big>‚ἀΐδιον καί ἐνέργεια οὖσα‘ = ‚actus purus‘</big></span><span style="color:#00B000"> | '',reine Tätigkeit‘'' |</span> ), … ''ersehnt'', (<span style="font-family: Times;"><big>,ὀρεκτόν‘</big></span>), ''und erkennbar'', (<span style="font-family: Times;"><big>,νοητόν‘</big></span>), ... ''denn dies ist der ‚Gott‘'', (<span style="font-family: Times;"><big>,τοῦτο γὰρ ὁ θεός‘</big></span>), <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, ''der'' <span style="color:#00B000">[ zeitlich-]</span>''Ewige'', (<span style="font-family: Times;"><big>,ἀΐδιον‘</big></span>), — ''der Unvergleichliche'', (<span style="font-family: Times;"><big>,ἄριστον‘</big></span> <span style="color:#00B000">| ''‚der Beste‘'' |</span> ), — ''der Lebendige'', (<span style="font-family: Times;"><big>,ζῷον‘</big></span> <span style="color:#00B000">| ,''das Leben selbst‘'' |</span> ), — ... ''so sagen wir ja'', (<span style="font-family: Times;"><big>,φαμὲν δὴ‘</big></span>), — ...«</span> ''':''' <span style="color:#00B000">(ARISTOTELES — Grieche)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als ,Individuumname‘, ist synonym mit <span style="color:#FF6000">„göttliches ‚Da-Sein’“</span>, das sowohl <span style="color:#FF6000">„aus sich vollkommen“</span>, als auch <span style="color:#FF6000">„notwendig für uns“</span> ‚da‘ ist; <span style="color:#00B000">(das ist das, an sich, vollkommene ‚Was-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, das zugleich, für uns, das notwendige ‚Da-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> — ist)</span>; <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span>. Das ist der <u>angemessene Begriff</u> von GOTT, und gilt ‚nur‘ von GOTT. Weil GOTT <span style="color:#FF6000">„vollkommen“</span> ist, ist <span style="color:#FF6000">„Da-Sein“ <span style="color:#00B000">|</span> „GOTT-Sein“ <span style="color:#00B000">|</span> „Göttlichkeit“</span> das <span style="color:#FF6000">„Wesen“</span> GOTTES ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>. Im Unendlichen, GOTT, sind <span style="color:#FF6000">„Essenz“</span> und <span style="color:#FF6000">„Existenz“</span> koinzident ,eins‘, und daher untrennbar, und <span style="color:#FF6000">»''darum ist GOTT das einzige ‚Sein’, das notwendig an sich ‚da‘ ist''«</span> ''':''' <span style="color:#00B000">(ABU ALI SINA alias AVICENNA — Muslim)</span>.
Der <span style="color:#00B000">(gedachte)</span> ‚Eigenschafts-Begriff‘ <span style="color:#FF6000">„Vollkommenheit (die Größe) GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#00B000">(‚Perfektion‘, die unbegrenzte Summe aller ‚positiven Eigenschaften‘ in GOTT)</span> schließt koinzident die ‚Eigenschaft’ <span style="color:#FF6000">„notwendige Existenz für uns“</span> mit ein ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>. GOTT wäre nicht <span style="color:#FF6000">„vollkommen“</span>, wenn er nicht auch real für uns ‚da‘ wäre, wenn er nicht ,immer schon’ <span style="color:#FF6000">„existierte“</span>. ‚Sein’ ist <u>mehr</u> als ‚Nicht-Sein’. ,Sein’, bzw. ,Existenz’ gehört in GOTT zu den ,Transzendentalia’. Das sind die <span style="color:#00B000">(ultimativen)</span> ,Wesenseigenschaften’ in GOTT. Der unbegrenzt Unendliche, GOTT, ist daher das <span style="color:#FF6000">»''vollkommenste Wesen, über das nichts ,Größeres‘ d.h. Vollkommeneres <u>mehr</u> ‚gedacht‘ werden kann''«</span> ''':''' <span style="color:#00B000">(ANSELM von Canterbury — Christ)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„Perfektion GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schließt koinzident das <span style="color:#FF6000">„notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> —, für uns mit ein, ohne einen zeitlichen Anfang und ohne ein zeitliches Ende. Das ist die ‚zeitlos-ewige‘, an sich absolute, und <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#00B000">(Das ist ein ,regulär‘-mögliches Korollar im 2. Beweisgang aus Term :16: ''':''' <span style="color:#4C58FF">— ‚'''Gy→Yy'''‘ —</span>, mit der <span style="color:#4C58FF">[ Instanz(Y:=E<sub>not</sub>) ]</span>, und der <span style="color:#4C58FF">[ FUB(y:=x) ]</span>; und auch ein ,regulär‘-mögliches Korollar im 3. Beweisgang ''':''' entsprechend der <span style="color:#FF6000">„logischen Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A → B ]</span> von Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> und Term :05: <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span> aus diesem Beweisgang. In Worten ''':''' <span style="color:#FF6000">»</span>''Angenommen, '' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> ''steht für den GOTT der Christen'' ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ — </span>, ''dann existiert dieser GOTT'', <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, ''für uns notwendig'', <span style="color:#4C58FF">— <sub>not</sub> —</span> <span style="color:#FF6000">«</span>.)</span> Der Unendliche, GOTT, ist <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer ‚vergänglichen‘, ,endlichen‘ Welt, welche prinzipiell vom dreidimensionalen Raum und von der unwiederbringlich ‚vergehenden‘ Zeit geprägt ist. Der ,GOTT der Christen‘ ist <span style="color:#FF6000">»''unabhängig''«</span> von dieser <span style="color:#FF6600">„vergehenden Raum-Zeit“, — »''jenes rätselhafte und anscheinend in sich widersprüchliche Etwas''« <span style="color:#00B000">(GÖDEL)<ref>Kurt GÖDEL, ‚''<span style="font-family: Times;"><big>Eine Bemerkung über die Beziehungen zwischen der Relativitätstheorie und der idealistischen Philosophie‘</big></span>'', in P.A.SCHILPP (Hg.): ‚''<span style="font-family: Times;"><big>Albert Einstein, Philosoph und Naturforscher‘</big></span>'', Seite 406</ref></span> —</span>. Ohne ‚Zeit‘ gibt es keinen zeitlichen Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘, <span style="color:#00B000">(beides ist zeitlos ,eins‘)</span>, und so ist der zeitlos-ewige GOTT, der <span style="color:#FF6000">»''notwendig aus sich ,existiert‘'' «</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ — </span>, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> für uns immer schon ‚da‘ ''':''' <span style="color:#00B000">(GÖDEL — ohne religiöses Bekenntnis)</span>.
Mit dem GÖDEL-Kalkül ist die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt worden, und ist somit für jeden Menschen nachvollziehbar, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie obige Beispiele zeigen.
'''Resümee :'''
Das GÖDEL-Kalkül zeigt mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, was notwendig folgt, wenn die Axiome ‚wahr‘ sind, <span style="color:#00B000">(die Axiome bilden formal-syntaktisch <span style="color:#FF6000">»''die theologische Weltanschauung''«</span> ab)</span>, unter der Voraussetzung, dass die Axiome <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>'' Struktur''«</span> unserer Welt sind. Die ,Verifikation‘ der Axiome und Definitionen von GOTT und seiner Vollkommenheiten gelingt GÖDEL, — entsprechend seiner Unabhängigkeits-Bedingung —, durch den Aufweis ihrer Widerspruchsfreiheit ''':''' sie sind somit ,wahr‘ und, — im Kontext einer <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> —, auch ,annehmbar‘ in unserer ,realen‘ Welt ''':''' <span style="color:#00B000">(siehe Anhang, 2. Beweisgang und Anmerkung-2)</span>. Er vermeidet damit den Fehler, der immer wieder im Diskurs über Gottesbeweise gemacht wird ''':''' GOTT mit seinen Geschöpfen zu vergleichen. Diese logisch-philosophische Rede von GOTT <span style="color:#00B000">(<span style="color:#FF6000">»''ohne sich auf den Glauben an irgendeine Religion zu stützen''«</span>)</span> hat eine <u>mehr</u> als zweitausendjährige Tradition hinter sich. Der <span style="color:#FF6000">„100-Taler-Gott“</span> des Philosophen KANT, hat heute, nachdem der Logiker und Systemtheoretiker GÖDEL sein System vorgelegt hat, an ‚Strahlkraft‘ verloren.
Kurt GÖDEL ''':'''
::<span style="color:#FF6000">» ''Die theologische Weltanschauung'', <span style="color:#00B000">[ dass GOTT für uns immer schon ‚da‘ ist ]</span>, ''ist rein verstandesmäßig mit allen bekannten Tatsachen durchaus vereinbar'';«</span> <span style="color:#00B000">[ d.h. sie ist das ,Resultat‘ der, — vom Glauben geleiteten —, ‚theoretischen Vernunft‘, alias ‚reinen Vernunft‘, und nicht bloß das ‚Postulat‘ einer ‚praktischen Vernunft‘, wie KANT meint ]. <span style="color:#FF6000">»''Der'' <span style="color:#00B000">[ christliche ]</span> ''Glaube ist die ‚Pupille‘ im ‚Auge‘ unseres Verstandes.''«</span> (Heilige KATHARINA von Siena, Lehrerin der Kirche, Patronin Europas<ref>vgl. <span style="font-family: Times;"><big>''Gebet 7 ‚Für die neuen Kardinäle‘, Rom, 21. Dezember 1378,''</big></span> aus <span style="font-family: Times;"><big>''Caterina von Siena ,Die Gebete‘.''</big></span> Kleinhain 2019, online: https://caterina.at/werke/gebete/gebete-detailansicht/gebet-7.html</ref> )</span>
Der sonst so rationale KANT, hier doch etwas emotionell, <span style="color:#00B000">(als wolle er die Ergebnisse im GÖDEL-Kalkül nicht wahr haben, die belegen, dass er sich bei GOTT geirrt, und die Funktion des christlichen Glaubens für die Philosophie falsch eingeschätzt hat)</span> ''':'''
::<span style="color:#FF6000">»</span> ''Es war etwas ganz Unnatürliches und eine bloße Neuerung des Schulwitzes, aus einer ganz willkürlich entworfenen Idee das Dasein des ihr entsprechenden Gegenstandes selbst ausklauben zu wollen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 403. https://www.korpora.org/kant/aa03/403.html</ref>.<span style="color:#FF6000">«</span>
Für KANT, für die Scholastiker, <span style="color:#00B000">(und auch für uns)</span>, ist es natürlich ‚logisch‘, dass aus einem als ‚möglich’ gedachten Begriff, <span style="color:#FF6000">»</span>''aus einer ganz willkürlich entworfenen Idee''<span style="color:#FF6000">«</span>, keine Existenzaussage abgeleitet werden kann. <span style="color:#00B000">(Aus dem bloß gedachten Begriff ,goldene Berge‘ folgt natürlich nicht, dass es solche in Wirklichkeit auch gibt.)</span> In der philosophisch-<span style="color:#4C58FF">,theologischen’</span> Tradition, die von ARISTOTELES herkommt, ist der Begriff <span style="color:#FF6000">»''GOTT''«</span> jedoch von allen anderen Begriffen so verschieden, so dass für GOTT diese Logik KANTS nicht mehr gilt. GOTT ist ,unvergleichlich‘ und ,einzigartig‘.
Dazu der Kommentar von HEGEL ''':'''
::<span style="color:#FF6000">»''Wenn KANT sagt, man könne aus dem Begriff'' <span style="color:#00B000">[ ‚GOTT‘ ]</span> ''die Realität nicht ,herausklauben‘, so ist da der Begriff als endlich gefasst''.« <span style="color:#00B000">[ In der Endlichkeit unserer Welt trifft die Logik KANTS zu, dass dem ‚Begriff‘ nicht ,notwendig‘ das ‚Sein‘ folgt, denn es gibt in ihr die ,Lüge‘, die das ,Wirklich-Sein‘ im Begriff bloß behauptet, ohne dass es ,in Wirklichkeit‘ zutrifft, was sie behauptet. Es gilt hier nach KANT ''':''' »''Sein ist kein reales Prädikat''«. Somit ist ]</span> »''...der Begriff ohne'' <span style="color:#00B000">[ reales ]</span> ''Sein ein Einseitiges und Unwahres, und ebenso das Sein, in dem kein Begriff ist'', <span style="color:#00B000">[ ist ]</span> ''das begrifflose Sein,'' <span style="color:#00B000">[ d.i. das relative ,Noch-Nicht-Begriffene‘ ]</span>.'' Dieser Gegensatz, der in die Endlichkeit fällt'' <span style="color:#00B000">[ im Endlichen zutrifft ]</span>, ''kann bei dem Unendlichen, GOTT, gar nicht statthaben''<ref>Georg Wilhelm Friedrich HEGEL, ‚<span style="font-family: Times;"><big>''Ausführungen des ontologischen Beweises''</big></span>‘ in den ‚<span style="font-family: Times;"><big>''Vorlesungen über die Philosophie der Religion vom Jahr 1831''</big></span>‘ . Hamburg 1966, Seiten 175 bzw. 174</ref>; <span style="color:#00B000">[ denn ,Begriff‘, bzw. ,Denken‘ und ,Sein‘ sind in dem Unendlichen, GOTT, untrennbar und real immer dasselbe. Auf Grund dieser ontologischen Identität ,personifiziert‘ und ,repräsentiert‘ GOTT die ,Wahrheit‘ ''':''' GOTT ist die ,Wahrheit‘. In GOTT, dem <span style="color:#FF6000">„Schöpfer der Welt“</span>, folgt dem ,Begriff‘ immer ,notwendig‘ das ,Sein‘ ''':''' <span style="color:#CC66FF">»''GOTT sprach ''':''' Es werde ,Licht‘. Und es wurde Licht''«, <small>{{Bibel | Genesis |1|3|EU}}</small>;</span> oder auch ''':''' <span style="color:#CC66FF">»''Der Herr sprach, und sogleich geschah es; er gebot, und alles war da''«,</span> <small>{{Bibel | Psalm |33|9|EU}}</small>.]</span>«</span>
Das Entscheidende bei der <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls ist, dass der <span style="color:#00B000">(Begriff)</span> GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, nicht auf die Ebene seiner ,endlichen‘ Geschöpfe und unserer Welt gestellt wird, <span style="color:#00B000">(d.i. das ‚Universum‘ im ,Urknall‘, die ‚100-Taler‘, ein ‚Tsunami‘, auch ,einfache Modelle‘ von unserer Welt, etc.)</span>, und damit verglichen wird, sondern, dass der GOTT der Christen in seiner Einzigartigkeit und Besonderheit als <span style="color:#FF6000">»''der Unendliche''«</span> belassen und als <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer vergänglichen Welt, — als <span style="color:#FF6000">»''der Unvergleichliche''«</span> —, verstanden wird. <span style="color:#00B000">(Alle Kritiken des sog. ,ontologischen‘ Gottesbeweises übersehen die Einzigartigkeit und Besonderheit des <span style="color:#FF6000">»''Unendlichen''«</span>, und/oder wollen diese nicht ,wahr‘ haben.)</span> Auch THOMAS von Aquin ,verortet‘ den GOTT ANSELMS, — in seiner Kritik an dessen Theorem —, irrtümlich unter die ,Dinge‘ der uns umgebenden ,Natur‘, wenn er sagt ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse in rerum natura</big></span>“</span>, d.h. wörtlich, dass der GOTT ANSELMS <span style="color:#FF6000">»</span>''in der Natur der Dinge'' <span style="color:#00B000">(unserer Welt)</span> ''existiert''<span style="color:#FF6000">«</span>, und verkennt somit, — wie nach ihm auch KANT —, die ,Unvergleichlichkeit‘ GOTTES, <span style="color:#00B000">(vgl. STh I q.2 a.1 ad 2<ref>„Deus … illud quo maius cogitari non potest; non tamen propter hoc sequitur quod intelligat id quod significatur per nomen, esse in rerum natura; sed in apprehensione intellectus tantum.“ ——— »''GOTT ist'' (nach ANSELM) ''der, über den Größeres nicht mehr gedacht werden kann. Aber nicht deswegen, weil er'', (der Narr von Psalm 14.1, den ANSELM zitiert), ''das versteht, was durch diesen Namen,'' (d.h. mit dem Begriff ,GOTT‘, als der ,Größte‘, im Theorem ANSELMS), ''bezeichnet wird, folgt daraus'', (wie ANSELM meint), ''dass er auch versteht, dass er'', (der GOTT ANSELMS), ''auch in der ,Natur‘ der Dinge'' (unserer Welt) ''existiert''; <span style="color:#00B000">[ was ANSELM so nie gesagt hat ]</span>. ''Daraus folgt nur, dass er'', (als ,GOTT‘), ''bloß in der Auffassung seines Verstandes'', (d.h. nur im Denken des Narren als ,Begriff‘), ''existiert.''« ——— Hier ,verortet‘ THOMAS einerseits den unendlichen GOTT, von dem das Theorem ANSELMS spricht, irrtümlich unter die endlichen Dinge der uns umgebenden ,Natur‘, was sachlich dem theologischen Theorem der Unvergleichlichkeit GOTTES widerspricht, der nicht unter die Dinge unserer Welt eingereiht werden darf. Anderseits verliert er dadurch auch den ,Blick‘ für die Außerordentlichkeit und Besonderheit GOTTES, dessen Natur völlig verschieden und unabhängig von der ,Natur‘ unserer raum-zeitlichen Welt ist. GÖDEL beweist jedoch, mit ANSELM, weil es notwendig, ohne Widerspruch, (»''bloß in der Auffassung unseres Verstandes''«), möglich ist, dass GOTT existiert, ist es korrekt, daraus auch mit Notwendigkeit zu folgern, dass der Glaube des Erzbischofs ANSELM, und der Glaube seiner Anvertrauten, von der Wirklichkeit GOTTES, widerspruchsfrei, logisch richtig, und damit sinnvoll ist; denn Möglichkeit und Wirklichkeit sind in GOTT koinzident ,eins‘. Das ist das Privilegium GOTTES allein, der einzigartig und unvergleichlich ist. Damit zeigt er auf, dass THOMAS die Unvergleichlichkeit und Einzigartigkeit GOTTES in seinem Vorhalt nicht bedacht hat; und außerdem ANSELM missverstanden hat.</ref>)</span>; jedenfalls hier in der Auseinandersetzung mit ANSELM. Dagegen spricht ANSELM im ,''<span style="font-family: Times;"><big>Proslogion</big></span>''‘, Seite 85f, nur von einem <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span> GOTTES, d.h. dass GOTT ,auch in Wirklichkeit existiert‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was ,größer‘, bzw. ,mehr‘ ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ,im Verstand zu sein‘; wobei die ,zeitlose-überzeitliche‘ Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES jedoch völlig verschieden und <span style="color:#FF6000">»''unabhängig von der zufälligen''«</span> Wirklichkeit <span style="color:#00B000">(die ,Natur‘)</span> der ,raum-zeitlichen‘ Welt der Dinge ist. Daher ist sie mit dieser auch nicht vergleichbar. GOTT ist <span style="color:#FF6000">„vollkommen“</span> und alle <span style="color:#FF6000">„Vollkommenheiten“</span> in GOTT, <span style="color:#00B000">(die ultimativen ,Transzendentalia‘)</span>, sind koinzident ,eins‘, — ,fallen <span style="color:#FF6000">„notwendig“</span> perspektivisch in eins zusammen‘, und sind daher konvertierbar. Darum ist auch die Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES ,einzigartig‘ und ,unvergleichlich‘.
Mit Korollar-3 ist die Exklusivität und Außerordentlichkeit GOTTES definitiv im Kalkül ,bewiesen‘ <span style="color:#00B000">( ╞ )</span>. Der abendländische Monotheïsmus ist somit eine ,logische‘ Konsequenz aus den GÖDEL-Axiomen. <span style="color:#00B000">(Das <span style="color:#4C58FF">„theologische“</span> Theorem von der ,Einzigartigkeit‘ und Exklusivität GOTTES, d.h. hier im Kontext ''':''' die exklusive Einheit von GOTT und Mensch in JESUS CHRISTUS; von Vater, Sohn und Geist im <span style="color:#4C58FF">„Dreifaltigen“</span>; von Essenz und Existenz, von Begriff und Sein, von Ursache und Wirkung, von Subjekt und Objekt, von Möglichkeit und Wirklichkeit, und die unbegrenzte Summeneinheit und Koinzidenz der unendlichen Transzendentalien in GOTT, ist, — mit HEGEL —, die Voraussetzung und Bedingung jeder Philosophie ''':''' <span style="color:#FF6000">»''Die Einheit muss am Anfang der Philosophie stehen''«</span>; und ist zugleich auch ihr gesuchtes und bewiesenes Endergebnis und Ziel ''':''' <span style="color:#FF6000">»''Diese Einheit muss auch das Resultat der Philosophie sein''«</span><ref>https://hegel-system.de/de/gottesbeweis.htm#hegels-kritik-an-kant</ref>, was hier im GÖDEL-Kalkül ,logisch‘ mit Korollar-3 verifiziert wird ''':''' <span style="color:#4C58FF">— ‚'''□(∃xGx ∧ ∀y(Gy→x=y))'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist exklusiv einzigartig''«</span>.)</span>
Die Einzigartigkeit GOTTES bedingt die Koinzidenz, den inneren Zusammenhang aller seiner Vollkommenheiten und Zuschreibungen, <span style="color:#00B000">(Axiom-2)</span>, d.h. ihr paarweise, perspektivisches ,Zusammenfallen in eins‘ im Unendlichen, GOTT. ——— Aus der Notwendigkeit aller positiven Eigenschaften und Zuschreibungen, <span style="color:#00B000">(d.h. aus den, an sich, notwendigen, ultimativen Transzendentalien, Axiom-4)</span>, die in GOTT paarweise, als ,Wesenseigenschaften‘ koinzident ,eins‘ sind, <span style="color:#00B000">(Definition-2)</span>, ist die Einzigkeit GOTTES für uns erschließbar, <span style="color:#00B000">(Korollar-3)</span>. Axiom-4 ist die erste, ,modal‘ <span style="color:#FF6000">„notwendige“</span>, d.h. die transzendentale Voraussetzung für Korollar-3.
Wenn im Korollar-3 das <span style="color:#4C58FF">— ‚'''x'''‘ —</span> z. B. für GOTT, dem ,Vater‘ der Christen, und das <span style="color:#4C58FF">— ‚'''y'''‘ —</span> für GOTT, dem ,Sohn‘, d.h. für ,JESUS CHRISTUS‘ steht, oder für den ,HEILIGEN GEIST‘, <span style="color:#00B000">(den ,Dreifaltigen GOTT‘ der Christenheit)</span>; oder auch für die Gottesbezeichnung ,GOTT-ADONAI‘ der Juden, oder für die Gottesbezeichnung ,ALLAH‘ der Muslime steht, dann weist dieses Korollar, für <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span>, mit der ,ontologischen Identität‘ ''':''' <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, auf die ,Koinzidenz‘ des <span style="color:#4C58FF">„Dreifaltigen“</span>, und auf die <span style="color:#4C58FF">„Hypostatische Union“</span> der Naturen von GOTT und Mensch in JESUS CHRISTUS,
bzw. auch auf den inneren Zusammenhang der drei Buch-Religionen hin.
===<div class="center"><span style="color:#660066">Anhang : das GÖDEL-Kalkül</span></div>===
In der ,Legende zum GÖDEL-Kalkül‘ wird an einige Basics erinnert, und diese für die operative Praxis im anstehenden Kalkül, mit Hilfe von logischen Meta-Terme, adaptiert. Zusätzliche, notwendige Regeln und Gesetze werden dann ,benannt‘, wenn sie in der Kalkül-Durchführung auftreten.
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">Legende zum GÖDEL-Kalkül</span></div>
|-
|
<small>
<math>\begin{align}
{\color{blue}\text{ ◇}} \text{ :: konsistent ↔ widerspruchsfrei ↔ möglich ↔ denkbar, } & {\color{blue}\text{ □}} \text{ :: notwendig ↔ wirklich, für jede mögliche Welt ↔ exklusiv} \\
\text{logischer Meta-Term ::} {\color{blue}\text{ [ A ├ B ]}} \text{ ::} & \text{ „aus A folgt im Kalkül ,regulär‘ (├ ) B.“} \\
\text{ A, B sind Aussagen über Eigenschaften, (A ist keine Eigenschaft);} & \text{ die Aussage, z.B. in der Kalkül-Zeile 10, wird als ,Term :10:‘ bezeichnet} \\
{\color{blue}\text{ AE}} \text{ ::} & \text{ Argument Einführung, Prämisse, Postulat } \\
{\color{blue}\text{ Xx}} \text{ ::} & \text{ „X ist eine Eigenschaft der Individuum-Variable x.“ } \\
{\color{blue}\text{ ¬PX}} \text{ ::} & \text{ „X ist keine positive Eigenschaft, ist keine Perfektion, ist nicht vollkommen.“ } \\
{\color{blue}\text{ Instanz(X := Y)}} \text{ ::} & \text{ Substitution der Eigenschaft X durch die ,bestimmte‘ Eigenschaft Y } \\
\text{ (Eine ,Instanz‘ ist ein Exemplar aus einer Menge gleichartiger Dinge;} & \text{ hier die ,bestimmte‘ Eigenschaft Y, als Ersatz für das unbestimmte X.) } \\
{\color{blue}\text{ FUB(x := y)}} \text{ ::} & \text{ Freie-Um-Benennung der Individuum-Variable x in y } \\
\text{ ,modal‘-frei gewählte Kalkül-Prämisse ::} {\color{blue}\text{ Gx}} \text{ ::} & \text{ „Die Variable x steht für den GOTT der Christen.“ } \\
{\color{blue}\text{ [ G(y) ├ ⱯyG(y) ]}} \text{ ::} & \text{ All-Operator-Einführung der Variable y für GOTT } \\
\text{ „Angenommen, die Variable y steht für GOTT, dann } & \text{folgt ,regulär‘ (├ ), dass auch jedes y im Kalkül für GOTT steht.“}\\
{\color{blue}\text{[ ⱯXA(X) ├ A(X) ]}} \text{ ::} & \text{ All-Operator-Beseitigung für die substituierte Eigenschaft X } \\
\text{ „Wenn X durch eine ,bestimmte‘ Eigenschaft ,instanziiert‘ ist oder } & \text{wird, dann kann der All-Operator von X ,regulär‘ (├ ) beseitigt werden.}\\
{\color{blue}\text{ KOMM(↔)}} \text{ ::} & \;{\color{blue}\text{[ (A↔ B) ↔ (B ↔ A) ]}} \text{ :: Kommutativgesetz für ( ↔ )}\\
{\color{blue}\text{ DIST(□∧)}} \text{ ::} & \;{\color{blue}\text{[ (□A ∧ □B) ↔ □(A ∧ B) ]}} \text{ :: Distributivgesetz für (□∧ )} \\
\text{ (hypothetischer Syllogismus, häufige logische Schlussregel) ::} & \;{\color{blue}\text{[ A → B, A ├ B ]}} \text{ :: (Modus ponendo ponens) :: Abtrennregel.} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn A wahr ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch B wahr ist.“} \\
\text{ (negativer hypothetischer Syllogismus) ::} & \;{\color{blue}\text{[ A → B, ¬B ├ ¬A ]}} \text{ :: (Modus tollendo tollens)} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn B falsch ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch A falsch ist.“} \\
\text{''KONDITIONALER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ A ├ B ╞ A → B ]}} \text{ :: (logische Implikation)} \\
\text{ „Angenommen, A ist ,regulär‘ Axiom oder Prämisse, und B ist im } & \text{Kalkül ,regulär‘ abgeleitet, dann ist ,bewiesen‘ ( ╞ ) : A impliziert B, ist wahr.“} \\
\text{''INDIREKTER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ ¬A → F ╞ A ]}} \text{ :: (Reductio ad absurdum)} \\
\text{ „Wenn im Kalkül aus ¬A ,regulär‘ eine Kontradiktion } & \text{F folgt, dann ist A ,bewiesen‘ ( ╞ ) : A ist ,wahr‘.“} \\
\end{align}</math>
</small>
|}
A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Eine Prädikatenlogik zweiter Stufe ist eine Logik, in der die Quantoren auch Eigenschaftsausdrücke <span style="color:#00B000">(<span style="color:#FF6000">„Prädikate”</span>)</span> binden können''. <span style="color:#00B000">[ Die ,Prädikate‘ werden in einem Kalkül dieser Logik durch Definitionen ,bestimmt‘ ]</span>. ''Wir werden uns im folgenden recht frei einer dafür geeigneten formalen Sprache bedienen. Äußere Quantoren werden meist weggelassen und wir schreiben kurz'' <span style="color:#4C58FF">— ‚'''Xx'''‘ — </span> ''bzw.'' <span style="color:#4C58FF">— ‚'''PX'''‘ — </span> ''um auszudrücken, dass das Individuum'' <span style="color:#4C58FF">— ‚'''x'''‘ — </span> ''die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''hat, bzw. dass die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''die höherstufige Eigenschaft'' <span style="color:#4C58FF">— ‚'''P'''‘ — </span> ''<span style="color:#00B000">(für <span style="color:#FF6000">„positiv”</span>)</span> hat;'' <span style="color:#00B000"> [ wobei die Eigenschaft <span style="color:#4C58FF">— ‚'''P'''‘ — </span> als einzige im Kalkül ,unbestimmt‘ bleibt ]</span>. <span style="color:#FF6000">«</span><ref>A. FUHRMANN ‚''<span style="font-family: Times;"><big>‚G‘ wie Gödel. Kurt Gödels axiomatische Theologie</big></span>''‘, Seite 6, Anmerkung 3. Konform mit seinem Artikel in ‚''<span style="font-family: Times;"><big>Logik in der Philosophie</big></span>''‘ hg. v. P. SCHROEDER-HEISTER, W. SPOHN und E. OLSSON. 2005, Synchron, Heidelberg.</ref>
Der All-Quantor für Eigenschaften, hier im GÖDEL-Kalkül der ,modalen‘ Prädikatenlogik zweiter Stufe, bindet die ,unbestimmte‘ Eigenschafts-Variable <span style="color:#4C58FF">— ‚'''X'''‘ —</span> ausschließlich nur in den Definitionen im 2. und 3. Beweisgang . <span style="color:#00B000"> (Im ersten Beweisgang gibt es keine Definition.)</span> Dieser All-Quantor wird dann jedes Mal in der Beweis-Durchführung durch die Substitution ''':''' <span style="color:#4C58FF"> [ Instanz(X:= ..) ]</span> mit ,bestimmte‘ Eigenschafts-Konstanten wie <span style="color:#4C58FF">— (X:= G) —</span>, bzw. <span style="color:#4C58FF">— (X:= ¬Y) —</span>, oder <span style="color:#4C58FF">— (X:= E<sub>not</sub>) —</span> ,regulär‘ <span style="color:#00B000">(├ )</span> beseitigt ''':''' <span style="color:#4C58FF"> [ ⱯXA(X) ├ A(X) ]</span>; wobei die Eigenschafts-Konstante im Kalkül entweder als Zwischenergebnis ,regulär‘ abgeleitet, <span style="color:#00B000">(,errechnet‘)</span>, oder mit einer Definition schon ,bestimmt‘ worden ist.
Die spezifische ‚Eigenschaft‘ einer Eigenschaft wird hier, in der formalen Syntax der ,modalen‘ Prädikatenlogik zweiter Stufe, als eine tiefer gestellte Abkürzung <span style="color:#00B000">(als Index)</span> an ihre Trägereigenschaft angehängt, wie z. B. ‚wesentlich‘, bzw. ‚essentiell‘ durch <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, oder ‚notwendig‘ durch <span style="color:#4C58FF"> — <sub>not</sub> —</span>. In der Definition-3 steht der Term ''':''' <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span>, um auszudrücken, dass das Individuum <span style="color:#4C58FF">— ‚'''x'''‘ —</span> notwendig <span style="color:#4C58FF">— <sub>not</sub> —</span> die Eigenschaft ''':''' <span style="color:#4C58FF">— ‚'''E'''‘ —</span>, für ,Existenz‘, hat, d.h. <span style="color:#FF6000">»''das <span style="color:#4C58FF">‚'''x'''‘</span> existiert notwendig''«</span>. Der schon von GÖDEL indizierte Term ''':''' <span style="color:#4C58FF">—‚'''G'''<sub>ess</sub>'''x'''‘ —</span> kann gelesen werden als ''':''' <span style="color:#FF6000">»''Das Individuum <span style="color:#4C58FF">‚'''x'''‘</span> hat die Wesenseigenschaft, <span style="color:#4C58FF"> — <sub>ess</sub> — </span> ''':''' GOTT zu sein, <span style="color:#4C58FF">‚'''G'''‘ </span>''«</span>, statt der ,an sich‘ konformen, aber <span style="color:#4C58FF">„theologisch“</span> etwas ungenauen Formulierung ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist wesentlich göttlich''«</span>; oder mit der Voraussetzung ''':''' <span style="color:#4C58FF">— ‚'''Gx'''→'''G'''<sub>ess</sub>'''x'''‘ — </span> deutlicher und <span style="color:#4C58FF">„theologisch“</span> korrekt ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für den GOTT der Christen'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span> ''das Wesen dieses GOTTES'', <span style="color:#4C58FF">— <sub>ess</sub>‚'''x'''‘ —</span>, <span style="color:#00B000">(,Essenz‘)</span>«</span>; wobei, — entsprechend der ,methodologischen‘ Prämisse des Kalküls <span style="color:#00B000">(<span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> ''':''' das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den ,GOTT der Christen‘)</span> —, bei der Interpretation der Terme dieses besonderen Kalküls, die <span style="color:#4C58FF">„christliche Theologie”</span> für den Begriff <span style="color:#FF6000">„GOTT”</span>, Korrektur und die leitende Instanz ist. Dabei muss die Dreifach-Äquivalenz von <span style="color:#4C58FF"><span style="color:#4C58FF">— ‚'''G'''‘ — </span></span>berücksichtigt werden. Welche der drei Äquivalenzen, bzw. Lesearten von <span style="color:#4C58FF">— ‚'''G'''‘ — </span> bei einem bestimmten Term im Kalkül zulässig ist, muss <span style="color:#4C58FF">„theologisch”</span> überprüft und evaluiert werden. Bei manchen können sogar alle drei Lesearten <span style="color:#4C58FF">„theologisch”</span> zulässig sein.
Warum es in der modalen Prädikatenlogik zweiter Stufe, im GÖDEL-System, ,Definitionen‘ gibt, erklärt GÖDEL formal-syntaktisch ''':''' <span style="color:#FF6000">»''Definitionen dienen ja nur der kürzeren Schreibwelse und sind daher prinzipiell überflüssig.''«</span> <span style="color:#00B000">(Aus der Anmerkung 6 in seinem Hauptwerk ''':''' ,''<span style="font-family: Times;"><big>Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I</big></span>''‘.)</span> Für die <span style="color:#4C58FF">„theologische”</span> Interpretation und Hermeneutik seines Kalküls, sind die ,Definitionen‘ im GÖDEL-System jedoch wesentlich, und letztlich entscheidend. Erst dadurch wird sein Axiomensystem zur <span style="color:#4C58FF">„axiomatischen Theologie”</span>. GÖDEL gibt selbst den hermeneutischen Hinweis dazu, wenn er über den höherstufigen Eigenschaftsbegriff <span style="color:#FF6000">»''positiv''«</span> sagt, der nur ,indirekt‘ definiert wird, jedoch mit seinem gesamten Axiomensystem ''':''' <span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne, (unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span> Die Deutung dieses ,höherstufigen‘ Begriffs als ein anderes Wort für <span style="color:#FF6000">„Transzendentalia“</span> ergibt sich aus der <span style="color:#4C58FF">„theologischen”</span> Evaluierung, d.h. der Einordnung des GÖDEL-Systems in die ,laufende‘ <span style="color:#FF6000">„Rede von GOTT“</span>, seit Menschen, sich über den Sinn der Welt und unseres Lebens in ihr, Gedanken machen. GOTT, der ,transzendent‘, — unabhängig —, zur Welt ist, ist Thema im Theorem ANSELMS, um das es ja im GÖDEL-Kalkül geht. Eine <span style="color:#4C58FF">„theologische”</span> Hermeneutik des GÖDEL-Systems ist daher legitim, die, als ein Bemühen um ein überzeugendes Verstehen, aus dem <span style="color:#4C58FF">„theologischen”</span> Vorwissen vieler Generationen schöpft.
Um philosophische, und sogar <span style="color:#4C58FF">„theologische”</span> Theoreme exakt zu formulieren, und untersuchen zu können, hat der Ausnahmelogiker GÖDEL, im 20. Jahrhundert, ein Tor aufgestoßen, das uns ermöglichen kann, <span style="color:#FF6000">»''mathematisch evident''«</span>, und logisch objektiv nachprüfbar, in diesen Disziplinen zu argumentieren. Mit seiner modalen Prädikatenlogik zweiter Stufe, hat GÖDEL dem alten Wunsch eines Raimundus LULLUS, eines Gottfried Wilhelm LEIBNIZ, eines Immanuel KANT, und anderer, nach einer nachprüfbaren ,Universalsprache‘ in den Geisteswissenschaften, entsprochen; analog zur Mathematik, als Universalsprache in den Naturwissenschaften. Der sog. ,Theorembeweiser‘ der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO, mit Hilfe eines Computers, im 21. Jahrhundert, ist die kongeniale und logische Folge aus diesem Quanten-Schritt GÖDELS.
In der folgenden Neu-Kalkülisierung, wird jeder einzelne operative Logik-Schritt des Kalküls in der '''linken Spalte''' nummeriert und als Term-Ergebnis angezeigt, und in der '''rechten Spalte''' werden die dafür benötigten Term-Komponenten und die dabei angewendeten Logik-Regeln und -Gesetze, mit Meta-Terme, dokumentiert. Am Anfang stehen die Ressourcen und das angestrebte Ziel des Beweisganges, <span style="color:#00B000">(das Theorem)</span>. Die GÖDEL Axiome und Definitionen, die Theoreme und Korollare, die Zwischenergebnisse, das Endergebnis, und die logischen Meta-Terme, <span style="color:#00B000">[ in eckigen Klammern ]</span>, werden kontextabhängig, <span style="color:#00B000">(durch ''„Benennungen“'')</span>, interpretiert, <span style="color:#00B000">(angezeigt durch ,Interpretationspunkte‘ — '''::''' —, falls nötig)</span>. Der jeweilige Beweisgang wird in den Anmerkungen ausführlich und umfassend kommentiert. Die Kalkül-Prämissen, <span style="color:#00B000">(<span style="color:#4C58FF">'''AE:'''</span> Argument Einführung)</span>, sind der modal-frei gewählte Einstieg in das Kalkül. Sie dokumentieren, zusammen mit dem angestrebten Beweis-Ziel, eine bestimmte Problemlage in einem externen Diskurs, der mit dem modalen Logik-System hier, formal-syntaktisch überprüft, und gegebenenfalls, verifiziert oder falsifiziert werden soll. Korollare sind einfache, logische Folgerungen aus dem jeweiligen Beweisgang. Theoreme und Korollare sind ,modal‘ gleichwertig.
====<div class="center"><span style="color:#660066">1. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 1, (Möglichkeitsbeweis)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe__________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist die Eigenschaft X nicht positiv“} \\
\text{(Axiom 2)} & \quad (P\ X \wedge \;\Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x)) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaften Y, die aus einer positiven Eigenschaft X modal} \\
\text{ } & \quad & \ & \; \; \text{notwendig folgen, sind auch positive Eigenschaften“} \\
\text{(Axiom 3)} & \quad P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Theorem 1)} &\quad P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{ (◇ :: „möglich“ ↔ „konsistent“ ↔ „denkbar“; □ :: „notwendig“) } \\
\text{ } & \text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad P\ X \ & \ & \text{ AE: „Angenommen, es gibt positive Eigenschaften, Perfektionen“} \\
\text{02} & \quad P\ X \;\Rightarrow\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{ AE: „Angenommen, positive Eigenschaften sind nicht konsistent“} \\
\text{03} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{04} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{05} & \quad \text{ ├ }\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{:01:02:[Modus ponendo ponens] :: [A, A → B├ B] :AE:} \\
\text{06} & \quad \neg\neg \Box \neg \exists x \ X \ x \ & \ & \text{:05:[ ◇A ↔ ¬□¬A] :: (Modalregel)} \\
\text{07} & \quad \neg\neg \Box \neg\neg \forall x \neg X \ x \ & \ & \text{:06:[∃xA ↔ ¬Ɐx¬A] :: (Quantoren Regel)} \\
\text{08} & \quad \text{ ├ }\; \Box \; \forall x \neg X \ x \ & \ & \text{:07:NEG :: [¬¬A↔A] :: (Gesetz der Aussagenlogik)} \\
\text{09} & \quad \Box \; \forall x \neg X \ x \Leftrightarrow\ W & \ & \text{:02:08:[(:02:↔W) → (├:08:↔W)] :: (Kalkülregel)} \\
\text{10} & \quad \Box \; \forall x \ X \ x \Leftrightarrow\ F & \ & \text{:09:[(¬A↔W)↔(A↔F)] :: (Regel für Wahrheitswerte)} \\
\text{11} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:03:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{12} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \text{ } & \text{:10:11:[(:10:↔F) → (:11:↔F)] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{13} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \ & \text{:01:12:[Konjunktion] :: [A, B ├ A∧B]} \\
\text{14} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow \; (\neg x = x))) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(Y:=( ¬x= ..)) :: (Substitution für Eigenschaften)} \\
\text{15} & \quad \ P (\neg x = .. ) & \ & \text{:13:14:[Modus ponens] :: (logische Schlussregel)} \\
\text{16} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{17} & \quad \neg P (\ x = .. )\ & \ & \text{:15:16:[Modus ponens]}\\
\text{18} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:04:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{19} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \text{ } & \text{:10:18:[(:10:↔F) → (:18:↔W)] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{20} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \ & \text{:01:19:[Konjunktion] } \\
\text{21} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x))) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(Y:=(x=..))} \\
\text{22} & \quad \ P (\ x = .. )\ & \ & \text{:20:21:[Modus ponens]}\\
\text{23} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ & \text{:17:22:[Konjunktion] ⇒ Kontradiktion !}\\
\text{24} & \quad \neg \Diamond \; \exists x \ X \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:05:23:[├A├B╞ A→B] :: ''KONDITIONALER BEWEIS''}\\
\text{25} & \quad \neg\neg \Diamond \; \exists x \ X \ x & \ & \text{:24:23:[Modus tollendo tollens] :: [A→B,¬B ├ ¬A]}\\
\text{26} & \quad \text{ ├ }\; \Diamond \; \exists x \ X \ x & \ & \text{:25:NEG; bzw. :05:23:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS''}\\
\text{27} & \quad \ P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{:01:26:[├A├B ╞ A→B]} \\
\text{(Theorem 1)} & \;\text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\text{28} & \quad \ P\ G \;\Longrightarrow\; \Diamond \; \exists x \ G \ x \ & \ & \text{:27:Instanz(X:=G) } \\
\text{29} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{(A3):28:[Modus ponens]} \\
\text{(Korollar 1)} & \;\text{„Das Dasein GOTTES ist definitiv denkbar“} & \ & \text{„Es ist widerspruchsfrei möglich, dass es GOTT gibt“} \\
\end{align}</math>
</small>
|}
Anmerkung-1 ''':''' <span style="color:#00B000">(Der GÖDEL-Term <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, im Axiom-2 ist an sich überflüssig, da dieser hier als Prämisse :01: ohnehin ,angenommen‘ wird. Der Beweisgang kommt mit Axiom-2 auch ohne diesen GÖDEL-Term zum selben Ergebnis, und verkürzt sich damit sogar um zwei Schritte ''':''' Zeile 13 und Zeile 20 sind dann unnötig.)</span>
Der Beweisgang geht mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als Kalkül-Ressource, prinzipiell von der Existenz eines GOTTES aus. Mit der Prämisse :01: <span style="color:#00B000">(hier im 1. Beweisgang)</span> postuliert GÖDEL vorerst allgemein, dass es <span style="color:#FF6000">»''Vollkommenheit, d.h. positive Eigenschaften''«</span> in unserer Welt gibt ''':''' <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, ohne im Kalkül zu definieren, was darunter zu verstehen ist. Definiert wird dann <span style="color:#00B000">(im 2. Beweisgang)</span>, was eine <span style="color:#FF6000">»''wesentliche Eigenschaft''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(im Sinne von ,Transzendentalia‘)</span>; und mit Hilfe dieser Eigenschaft definiert GÖDEL <span style="color:#00B000">(im 3. Beweisgang)</span>, was eine <span style="color:#FF6000">»''notwendige Existenz''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, die er <span style="color:#00B000">(im selben Beweisgang)</span> axiomatisch mit den <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> gleich setzt ''':''' Axiom-5 ''':''' <span style="color:#4C58FF"> —‚'''PE'''<sub>not</sub>‘ —</span>. Erst im 2. Beweisgang wird mit Term :13:, nach einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, definitiv bewiesen <span style="color:#00B000">( ╞ )</span>, dass die, von GÖDEL, hier postulierten, <span style="color:#00B000">(allgemeinen)</span>, positiven Eigenschaften, <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, tatsächlich auch in GOTT <span style="color:#FF6000">»''positive Eigenschaften''«</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, sind; <span style="color:#00B000">(das sind die ultimativen ,Transzendentalia‘ in GOTT)</span>. Jetzt aber muss vorerst der ,Wunsch‘, bzw. die LEIBNIZ-Frage beantwortet werden ''':''' Ob, mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, <span style="color:#FF6000">»''GOTT''«</span> ,möglich‘ ist, der, nach traditioneller Auffassung, <span style="color:#FF6000">»''ein Wesen von äußerster Größe und Vollkommenheit'' <span style="color:#00B000">[ ist ]</span>, ''das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(nach LEIBNIZ; was GÖDEL mit Definition-1 ,abbildet‘)</span>. Wenn man also beweisen will, dass die Existenz eines solchen ''<span style="color:#FF6000">»GOTTES«</span>'' ,möglich‘ sein soll, dann muss man beweisen, dass dieses postulierte System der <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> möglich und formal ,widerspruchsfrei‘ ist. Das Ergebnis des 1. Beweisganges, das ,Theorem-1‘, <span style="color:#00B000">(,Erster Satz‘)</span>, fasst A. FUHRMANN zusammen als ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>. Wenn sie nicht konsistent wären, käme es zu unlösbaren Widersprüchen, <span style="color:#00B000">(Term :24:)</span>. Term :27: ,besagt‘ ''':''' <span style="color:#FF6000">»''Es ist definitiv, d.h. ohne Widerspruch möglich, dass es positive Eigenschaften gibt''«</span>; denn die Behauptung, es sei nicht möglich, dass es positive Eigenschaften, <span style="color:#00B000">(das sind die ,Transzendentalia‘)</span>, in unserer Welt gibt, führt zu einem Widerspruch, und ist daher falsch und ,unlogisch’. Einmal Axiom-1 und zweimal Axiom-2, <span style="color:#00B000">(das die Gleichwertigkeit aller positiven Eigenschaften nachdrücklich klarstellt)</span>, sichern hier die Konsistenz <span style="color:#FF6000">»''aller positiven Eigenschaften in der Welt'', <span style="color:#00B000">[ die ,Transzendentalien‘ ]</span>, ''und damit auch die, die in GOTT sind''«</span>. <span style="color:#00B000">(Der 2. Beweisgang bestätigt, dass es in GOTT tatsächlich positive Eigenschaften gibt.)</span> Die ,Gleichwertigkeit‘ aller Transzendentalia, <span style="color:#00B000">(ihre ,Äquivalenz‘)</span>, ist formal-syntaktisch daran erkennbar, dass die beiden Eigenschafts-Variablen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> im Axiom-2 für beliebige, unterschiedliche ,positive‘ Eigenschaften gegenseitig austauschbar, <span style="color:#00B000">(,konvertierbar‘)</span>, sind. Das heißt, dass beliebige, unterschiedliche ,positive‘ Eigenschaften, für die diese Variablen stehen, sich paarweise, wechselseitig ,implizieren‘, einschließen, und damit notwendig voneinander abhängen, d.h. koinzident ,eins‘ sind, konvertierbar, und somit gleichwertig sind; entsprechend dem Theorem von den Transzendentalia. Zu Term :29:, dem Korollar zu Theorem-1, notiert GÖDEL am 10. Feb. 1970, <span style="color:#00B000">(übersetzt von Joachim BROMAND)</span> ''':''' <span style="color:#FF6000">»''◇∃xG(x) besagt, dass das System aller positiver Eigenschaften kompatibel ist'',</span> <span style="color:#00B000">[ d.h. miteinander verträglich, weil ohne Widersprüche ].</span> <span style="color:#FF6000">''Dies ist ,wahr‘ auf Grund von Axiom-2,'' <span style="color:#00B000">[ weil alle positiven Eigenschaften, d.h. die Transzendentalien, koinzident gleichwertig und konvertierbar sind ]</span>.«</span> Darum ist es definitiv ,möglich‘, dass es diesen GOTT gibt, der <span style="color:#FF6000">»''alle Grade der Vollkommenheit in sich schließt''«</span> und <span style="color:#FF6000">»''über dem ,Größeres‘ nicht mehr gedacht werden kann''«</span>, und, in weiterer Konsequenz, ist der GOTT-Glaube deshalb ,notwendig‘ widerspruchsfrei und sinnvoll, nach Theorem-3 ''':''' <u>Wenn</u> es ,ohne Widerspruch‘ ''<span style="color:#FF6000">»möglich, bzw. denkbar«</span>'' ist, dass es ''<span style="color:#FF6000">»GOTT«</span>'' gibt, <u>dann</u> folgt daraus ''<span style="color:#FF6000">»notwendig«</span>'' ''':''' es ist auch ,widerspruchsfrei‘, wenn man als Voraussetzung ,annimmt‘, dass es ''<span style="color:#FF6000">»GOTT wirklich, für jede mögliche Welt«</span>'' gibt ''':''' Term :11: im 3. Beweisgang. Der Wenn-Satz ist hier mit Korollar-1 bewiesen; der Dann-Satz wird im 3. Beweisgang bewiesen <span style="color:#00B000">( ╞ )</span>, d.i. die Widerspruchsfreiheit und Sinnhaftigkeit des GOTT-Glaubens.
Die ontologische ,Identität‘, d.h. die ,Gleichsetzung‘, bzw. die ,Koinzidenz‘ von Strukturen, die in der Endlichkeit für uns verschieden sind, jedoch in dem unbegrenzt Unendlichen, GOTT, paarweise, perspektivisch in eins zusammenfallen, wie ,Sein‘ und ,Wesen‘, wie ,Ursache‘ und ,Wirkung‘ usw., und auch die Äquivalenz und Austauschbarkeit der Transzendentalien, haben im GÖDEL-Kalkül die logisch-syntaktische Form einer, aus sich, ,modal‘ notwendigen Implikation zwischen zwei verschiedenen, gegenseitig austauschbaren Eigenschafts-Variablen ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>. Dieses Term-Element stellt formal-syntaktisch die Gleichwertigkeit, <span style="color:#00B000">(Äquivalenz)</span>, bzw. die paarweise Koinzidenz aller positiven Eigenschaften und Zuordnungen in GOTT dar; sowohl hier im Axiom-2, als auch in der Definition-2 über die ,Wesenseigenschaften‘, im 2. Beweisgang, mit jeweils verschiedenen, frei umbenennbaren, Individuum-Variablen. Dieses Term-Element ,gilt‘ allgemein jedoch nur für positive Eigenschaften, alias ,Transzendentalia‘, und wird sofort <span style="color:#FF6000">„modal falsch“</span>, wenn für <span style="color:#4C58FF">— ‚'''X'''‘ —</span>, oder <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, Eigenschaften eingesetzt werden, die, — von Natur aus —, weder positiv noch negativ sind, wie z. B. ,rot‘ oder ,schwer‘. Die wechselseitige Austauschbarkeit der noch ,unbestimmten‘ Eigenschafts-Variablen, für beliebige positive Eigenschaften, ist formal äquivalent zur freien Umbenennung der noch ,unbestimmten‘ Individuum-Variablen ''':''' <span style="color:#4C58FF">[ FUB(x:=y) ]</span>. Der formale, gegenseitige, allgemeine Austausch der positiven Eigenschafts-Variablen, bzw. die formale Gleichsetzung beliebiger positiver Eigenschaften, kann, auf Grund der Äquivalenz aller Vollkommenheiten, bzw. ,Transzendentalia‘, auch dann noch durchgeführt werden, wenn eine, von zwei Eigenschafts-Variablen, durch eine Definition oder eine Schlussfolgerung ,bestimmt‘ worden ist, und dadurch zu einer positiven Eigenschafts-Konstante, d.h. zu einer ,bestimmten‘, positiven Eigenschaft geworden ist. Das ist z. B. bei einer instanziierenden Substitution der Fall ''':''' <span style="color:#4C58FF">[ Instanz(X:=..) ]</span>. Das ist eine spezifische Eigenheit der GÖDEL-Axiomatik, weil alle relevanten, positiven Eigenschaften und Zuordnungen in GOTT, als <span style="color:#FF6000">„ultimative Transzendentalia“</span>, immer auch miteinander kompatibel sind. Mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, wird formal die <span style="color:#FF6000">„Koinzidenz“</span> aller ,Transzententalia‘ in der Welt, und auch der ,Zusammenfall‘ aller Gegensätze in GOTT, abgebildet.
Da die Variable <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht, <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(im Korollar-1)</span>, ist die Eigenschaft ''':''' ''<span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'' ''':''' <span style="color:#4C58FF">(¬x=..)</span>, d.h. das <span style="color:#FF6000">„Ungleichsein“</span>, das <span style="color:#FF6000">„Anderssein“</span> GOTTES, <span style="color:#00B000">(Prämisse :03:)</span>, die entscheidende Voraussetzung und Norm für jeden Diskurs über GOTT ''':''' um der <span style="color:#FF6000">„Unvergleichlichkeit“</span>
GOTTES gerecht zu werden, darf GOTT niemals mit etwas aus der ''<span style="color:#FF6000">»zufälligen Struktur der Welt«</span>'' verglichen, d.h. gleich gesetzt werden. Der Term :18: <span style="color:#4C58FF">(x=x) ↔ W</span> erinnert an die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin‘''«</span>. <span style="color:#00B000">(In der mystischen Tradition, im ''<span style="font-family: Times;"><big>‚Dialog über die Vorsehung‘</big></span>'', dem Hauptwerk der Heiligen KATHARINA von Siena, Mystikerin und Lehrerin der Kirche, sagt GOTT-VATER zur KATHARINA ''':''' <span style="color:#FF6000">»''ICH BIN der IST'', <span style="color:#00B000">[ aus mir selbst ]</span>, ''du bist, die nicht ist'', <span style="color:#00B000">[ aus dir selbst ]</span>.«</span> Das ist eine wichtige, deutende Ergänzung, und die authentische <span style="color:#4C58FF">,theologische‘</span> Interpretation dieser Exodus Text-Stelle. Das ist der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES.)</span>
Zum Term :03: notiert A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Die Notation'' <span style="color:#4C58FF">(¬x=..)</span> ''für die Eigenschaft ''':''' <span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'', <span style="color:#00B000">[ d.h. <span style="color:#FF6000">„Ungleichheit“, „Anderssein“</span>, bzw. die Notation <span style="color:#4C58FF">(x=..)</span> für den Existenzmodus-Perfektion ''':''' <span style="color:#FF6000">„Gleichheit“, „Idendität“</span> ]</span>, ''ist suggestiv und informell und ersetzt hier einen formal korrekten Abstraktionsausdruck wie'' <span style="color:#4C58FF">λy.(¬x=y)</span>, <span style="color:#00B000">[ bzw. <span style="color:#4C58FF">λy.(x=y)</span> ]</span>. ''Für die formal korrektere Notation bedarf es der zusätzlichen Vereinbarung, dass der Ausdruck'' <span style="color:#4C58FF">λy.(¬x=y)</span> ''gleichbedeutend sei mit dem Ausdruck'' <span style="color:#4C58FF">¬λy.(x=y)</span>. ''Diese Vereinbarung ist harmlos, da wir aufgrund der Regel der λ–Konversion'' ''':''' <span style="color:#4C58FF">λy.Xy.x ↔ Xx</span>, <span style="color:#00B000">[ mit der <span style="color:#4C58FF">Instanz(X:=(¬x=..))</span> ]</span>, ''so schließen dürfen'' ''':''' <span style="color:#4C58FF">λy.(¬x=y).x ↔ ¬x=x ↔ <span style="color:#00B000">¬(x=x)</span> ↔ ¬λy.(x=y).x</span> .<span style="color:#FF6000">«</span> <ref>A. FUHRMANN a.a.O. Seite 7, Anmerkung 4 (von mir korrigiert und ergänzt)</ref>
In der Kalkül-Zeile 29 wird das Möglichkeits-Korollar-1 durch einen <span style="color:#4C58FF">[ Modus ponens ]</span> mit Axiom-3 von der Kalkül-Prämisse-Term :01: ,abgekoppelt‘, d.h. es ist nicht mehr vom Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span> logisch abhängig. Das Möglichkeits-Korollar-1 behält jedoch die bewiesene Widerspruchsfreiheit von Theorem-1, und ist damit nur mehr von Axiom-1 und Axiom-2 abhängig, was für das Theorem-ANSELMS am Schluss entscheidend ist. Erklärung zu Term :05: Das Ergebnis einer Logik-Operation zwischen Prämissen ist ,regulär‘ <span style="color:#00B000">(├ )</span> den Prämissen zuzurechnen.
Das Modale-Prinzip KRIPKE-Γ-Ɐx, <span style="color:#4C58FF">['''RK''']</span>, in Worten ''':''' <span style="color:#FF6000">»''Wenn mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''gilt, und daraus logisch folgt, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''auch die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''gilt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar'' ''':''' ''es ist wahr, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''aus der Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''logisch folgt''«</span>. Der Term <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span> steht formal-syndaktisch, allgemein für ,Transzendentalia‘, und ist für alle ,Nicht-Transzendentalia‘ <span style="color:#FF6000">„modal falsch“</span>.
====<div class="center"><span style="color:#660066">2. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 2, (,Basisbeweis‘)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe____________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.2)} & \quad \neg P\ X \;\Longrightarrow\;\ P\neg X\ & \ & \text{„Wenn X nicht positiv ist, dann ist die Negation ¬X positiv“} \\
\text{(Axiom 3)} & \quad \ P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{(Axiom 4)} & \quad \ P\ X \;\Longrightarrow\; \Box \; \ P\ X \ & \ & \text{„Positive Eigenschaften sind notwendig aus sich positiv“} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 2)} & \quad \ X_{ess}\ x \;\Leftrightarrow X\ x \wedge \forall Y \left(\ Y\ x \Rightarrow \Box \; \forall y (\ X\ y \Rightarrow \ Y\ y)\right) & \ & \text{„X ist genau dann eine wesentliche Eigenschaft von x, wenn x sie hat, und} \\
\text{ } & \quad & \text { } & \;\;\text{alle anderen Eigenschaften Y von x notwendig aus dieser Eigenschaft X folgen“} \\
\text{[RM]} &\quad \ A \;\Longrightarrow\;\ B\; \text{ ├ }\;\Box \; A \Longrightarrow\;\Box\; \ B\ & \ & \text{( :: Modales Prinzip)} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{(,G‘ :: „Göttlichkeit“ ↔ „GOTT“ ↔ „Dasein GOTTES“)} \\
\text{ } &\;\text{„Das Wesen GOTTES ist sein Dasein“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} &\quad \ G\ x \ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} &\quad \ Y\ x \ & \ & \text{ AE: „Angenommen, GOTT hat die Eigenschaften Y“} \\
\text{03} &\quad \neg P\ Y & \ & \text{ AE: „Angenommen, die Y in GOTT sind nicht positiv“} \\
\text{04} &\quad \neg P \ Y \Rightarrow \ P \neg Y\ & \ &\text{(A1.2):Instanz(X:=Y) :: (Substitution für Eigenschaften) } \\
\text{05} &\quad \ P \neg Y \ & \ & \text {:03:04:[Modus ponens] :: [A, A → B├ B] } \\
\text{06} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{07} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:06:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{08} &\quad \ P \neg Y \Rightarrow \neg Y \ x\ & \ &\text{:07:Instanz(X:=¬Y)} \\
\text{09} &\quad \neg Y \ x\ & \ &\text{:05:08:[Modus ponens]} \\
\text{10} &\quad \text{ ├ }\; (Y\ x \wedge \neg Y \ x) \;\Leftrightarrow\;\ F\ & \ & \text{:02:09:[Konjunktion] ⇒ Kontradiktion !} \\
\text{11} &\quad \neg P\ Y \; \Rightarrow \; (Y\ x \wedge \neg Y \ x )\ & \ &\text{:03:10:[├A├B ╞ A → B] :: ''KONDITIONALER BEWEIS''} \\
\text{12} &\quad \neg\neg P\ Y \ & \ &\text{:11:10:[Modus tollendo tollens] :: [A → B,¬B├ ¬A]} \\
\text{13} &\quad \text{ ├ }\; P\ Y \ & \ &\text{:12:NEG; bzw. :03:10:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS'' :AE:} \\
\text{14} &\quad \ P\ Y \;\Rightarrow\;\Box \; \ P\ Y \ & \ & \text{(A4):Instanz(X:=Y)} \\
\text{15} &\quad \Box \; \ P\ Y \ & \ & \text{:13:14:[Modus ponens]} \\
\text{16} &\quad \ G \ y \Rightarrow \ Y \ y\ & \ &\text{:01:02:[├A├B ╞ A→B]:FUB(x:=y)} \\
\text{17} &\quad \text{ ├ }\; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:16:[G(y) ├ ⱯyG(y)]} \\
\text{18} &\quad \Box \; \ P\ Y \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:13:17:[├A├B ╞ A→B]:[RM]} \\
\text{19} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:15:18:[Modus ponens]} \\
\text{20} &\quad \ Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:02:19:[├A├B ╞ A→B]} \\
\text{21} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x & \ &\text{:20:01:[Konjunktion] :: [A, B├ A ∧ B]} \\
\text{22} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ X \ y \Rightarrow \ Y \ y)) \wedge \ X \ x\;\Leftrightarrow\; X_{ess}\ x \ & \ &\text{(D2):KOMM(↔):KOMM(∧):[ⱯYA(Y) ├ A(Y)] wegen :13:} \\
\text{23} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x\;\Leftrightarrow\; G_{ess}\ x \ & \ &\text{:22:Instanz(X:=G)} \\
\text{24} & \quad \text{ ├ }\; G_{ess}\ x \ & \ &\text{:21:23:[Modus ponens]:AE: wegen :30:} \\
\text{25} &\quad \ G\ x \;\Rightarrow\; \ G_{ess}\ x \ & \ & \text{:01:24:[├A├B ╞ A→B] :: Theorem 2.1} \\
\text{26} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] } \\
\text{27} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:26:[ⱯXA(X) ├ A(X)]} \\
\text{28} &\quad \ P \ G \Rightarrow \ G \ x\ & \ &\text{:27:Instanz(X:=G)} \\
\text{29} &\quad \text{ ├ }\; G \ x\ & \ &\text{(A3):28:[Modus ponens]} \\
\text{30} &\quad \ G_{ess}\ x \;\Rightarrow \ G \ x\ & \ &\text{:24:29:[├A├B ╞ A→B] :: Theorem 2.2 } \\
\text{31} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{:25:30:[Konjunktion]:BIKONDITIONAL :: [(A→B) ∧ (B→A) ↔ (A↔B)] } \\
\text{(Theorem 2)} &\; \text{„Dasein, GOTT-Sein, ist das Wesen GOTTES“} & \ & \Longleftarrow\; \text{was zu beweisen war ! } \\
\text{32} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:19:Instanz(Y:=(x=..))} \\
\text{33} &\quad \ G\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:01:32:[├A├B ╞ A→B]} \\
\text{(Korollar 2)} & \;\text{„Es gibt notwendig höchstens einen GOTT“} & \ & \text{„Wenn es GOTT gibt, dann gibt es für jede mögliche Welt nur einen GOTT“} \\
\end{align}</math>
</small>
|}
<span style="color:#00B000"><small>(In den Kalkül-Zeilen 16, 18, 31 mussten zwei-, und in Zeile 22 drei Kalkül-Schritte, d.h. Logik-Operationen in eine Zeile zusammengezogen werden, weil der Parser dieser speziellen Mathematik-Funktion in Wikibooks jedes Mal wegen Puffer-Überlauf abstürzt, wenn zu den bestehenden Zeilen noch eine neue Zeile, oder ein Text-Element, zusätzlich eingefügt wird. Das vermindert etwas die Transparenz des Kalküls.)</small></span>
Anmerkung-2 ''':''' <span style="color:#00B000">(Dieser Beweisgang kommt auch ohne das ,unbestimmte‘ Konjunkt <span style="color:#4C58FF"> — ‚'''Xx'''‘ —</span> in der Definition-2 zum gleichen Ergebnis, und wird dadurch um eine Zeile verkürzt ''':''' Zeile 21 entfällt, und <span style="color:#4C58FF">[ KOMM(∧) ]</span> ist dann unnötig. Dieses Konjunkt wird hier ebenfalls schon in der Kalkül-Prämisse :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, als ,Annahme‘ gesetzt, vorentschieden und ,bestimmt‘ mit der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>. Es war also logisch korrekt, dass GÖDEL, in seiner Notiz vom 10. Feb. 1970 zum ontologischen Beweis, dieses Konjunkt weggelassen hat, was ihm von Kommentatoren als ein Flüchtigkeitsfehler angerechnet worden war. Der gesamte 2. Beweisgang bewegt sich im Geltungsbereich der Prämisse Term :01:, d.h. ist in jeder Zeile von der Annahme abhängig ''':''' die Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span> steht für den GOTT der Christen. In der Kalkül-Zeile 33 wird mit Korollar-2 diese Abhängigkeit, für den Term :32:, explizit dargestellt.)</span>
Der Beweisgang geht mit der Prämisse :01: prinzipiell, als ,modal‘ freigewählte Voraussetzung, von der Existenz eines GOTTES aus. Im 1. Beweisgang wurde bewiesen, dass die von GÖDEL ,postulierten‘ <span style="color:#FF6000">»''allgemeinen positiven Eigenschaften, Vollkommenheiten, Perfektionen'', <span style="color:#00B000">[ die sog. ,Transzendentalien‘ ]</span> ''konsistent''«</span>, d.i. widerspruchsfrei sind. Hier, in diesem Beweisgang wird nun die Prämisse vom 1. Beweisgang, <span style="color:#4C58FF"> — ‚'''PX'''‘ —</span>, im Bezug auf GOTT hinterfragt ''':''' Gibt es auch in GOTT so Etwas, wie <span style="color:#FF6000">»''Vollkommenheit, Positives, Perfektes''«</span> '''?''' Die ,Annahme‘ jedoch, dass es <span style="color:#FF6000">»''in GOTT keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span> <span style="color:#00B000">(keine Transzendentalien)</span> gibt, <span style="color:#00B000">(Prämisse Term :03:)</span>,<span style="color:#4C58FF"> — ‚'''¬PY'''‘ —</span>, d.h. dass die <span style="color:#00B000">(wesentlichen)</span> Eigenschaften in GOTT keine <span style="color:#FF6000">„Vollkommenheiten“</span> seien, führt aber zu einem unlösbaren Widerspruch, <span style="color:#00B000">(Term :10:)</span>. Mit Term :13:, als 1. Hauptergebnis, ist damit, — als ,neue‘ Prämisse, <span style="color:#00B000">(ersetzt Term :03:)</span> —, definitiv ,bewiesen‘ <span style="color:#00B000">( ╞ , d.h. es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, dass alle Eigenschaften, die hier mit <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> symbolisiert werden, <span style="color:#FF6000">„positive Eigenschaften“</span>, d.h. <span style="color:#FF6000">„Perfektionen“</span> sind, von denen das Kalkül ,annimmt‘, <span style="color:#00B000">(Prämissen Term :01:, Term :02: und speziell Term :16:)</span>, dass der GOTT der Christen sie besitzt. Alle ,Wesenseigenschaften‘ in GOTT ''':''' <span style="color:#4C58FF">— ‚'''Y'''<sub>ess</sub>‘ —</span>, die durch den Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —, </span> dargestellt werden, sind somit <span style="color:#FF6000">„Vollkommenheiten“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span><span style="color:#00B000">, (,ultimative Transzendentalien‘, aller ,Grade‘)</span>. Damit ist definitiv ‚bestätigt‘, <span style="color:#00B000">( ╞ , es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, was mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schon ‚angenommen‘ worden ist ''':''' <span style="color:#FF6000">»''GOTT ist perfekt; er hat alle positiven Eigenschaften''«</span>; und auch Definition-1 ist damit ,verifiziert‘ ''':''' <span style="color:#FF6000">»''GOTT ist genau deswegen GOTT, weil er, als GOTT, positive Eigenschaften aller Grade in sich schließt''«</span>; entsprechend dem Quelltext bei LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. <span style="color:#00B000">(Der ,Schlüsselbegriff‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> ist der ,Schlüssel‘ zur Erkenntnis, dass GOTT ,notwendig‘, sowohl ,wesentlich‘ für uns, als auch an sich ,grundlos‘, immer schon ,da‘ ist.)</span> Hier, <span style="color:#00B000">(im 2. Beweisgang)</span>, hat Axiom-1, <span style="color:#00B000">(im Term :04:)</span>, sicher gestellt, dass die Eigenschaften in GOTT, <span style="color:#00B000">(Definition-1; Term :06:)</span>, tatsächlich <span style="color:#FF6000">„ultimativ positiv, perfekt und vollkommen“</span> sind ''':''' <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>. Das GÖDEL-Axiom-1 bezieht seine ,Potenz‘ aus dem Prinzip vom ,auszuschließenden‘ Widerspruch ''':''' eine Eigenschaft kann nicht zugleich ,positiv‘ und ,nicht positiv‘ sein '''!'''
Formal lässt sich das 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' schon aus Term :23: in diesem Beweisgang mit der <span style="color:#4C58FF">[ Vereinfachung ] :: [ A∧B ├ B ]</span> ohne Weiteres ,regulär‘ ableiten, — analog zu den Vorgehensweisen bei A. FUHRMANN und G.J. WIRSCHING. <span style="color:#00B000">(Beide Aussagen dieser ,Konjunktion‘ sind ,gleichwertig‘ und wahr, daher partizipiert das Theorem-2 auch am Ergebnis der Widerspruchsfreiheit von Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dem 1. Hauptergebnis. Beide Aussagen im Term :23: interpretieren sich gegenseitig.)</span> Der hier gewählte, etwas längere Weg zum Ergebnis, soll die innere Struktur und Abhängigkeit der Ergebnisse von bestimmten Voraussetzungen offen legen, und ihren ,Zweck‘ verdeutlichen. Die beiden Hauptergebnisse im Basisbeweis gehen vom vorgefundenen und traditionell vorgegebenen Begriff von ,GOTT‘ aus, <span style="color:#00B000">(Term :06:, Term :16: und Term :26:)</span>. Das ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 1. Hauptergebnis, hier im 2. Beweisgang, Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span> ''':''' <span style="color:#FF6000">»''die Eigenschaften in GOTT sind vollkommen, d.h. sind die ultimativen Transzendentalia''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als auch die Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span>, für die Annahme ''':''' den ,GOTT der Christen‘, der deswegen GOTT ist, weil er alle Grade der Vollkommenheit in sich schließt. Und das ebenfalls ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 2. Hauptergebnis, hier im selben Beweisgang, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''das Wesen GOTTES ist sein eigenes Sein''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, als auch die Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, für die Wesenseigenschaft ''':''' ,notwendige Existenz‘, und widerlegt den Einwand KANTS, für den Spezialfall ''':''' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für ,GOTT‘. Zwei Axiome und zwei Definitionen von GOTT und seinen Vollkommenheiten werden durch die Ergebnisse im Basisbeweis des GÖDEL-Kalküls in unserer realen Welt als ,wahr‘, <span style="color:#00B000">(genauer als ,widerspruchsfrei‘)</span>, und, — im Rahmen des christlichen Glaubens —, als ,annehmbar‘ bestätigt. <span style="color:#00B000">(Anmerkung zu Term :24: ''':''' eine Prämisse ist regulär-,modal‘ immer ,frei‘ wählbar.)</span>
Zusammengefasst heißt das ''':''' die ,strittige‘ Begründung der ,methodologischen‘ Prämisse des GÖDEL-Kalküls ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#00B000">(Prämisse, Term :01:)</span>, weil <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#00B000">(Korollar-1)</span> ''':''' <span style="color:#FF6000">»''Das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den GOTT der Christen, für den es ohne Widerspruch denkbar ist, dass es ihn gibt''«</span>, <span style="color:#00B000">(ANSELMS Prinzip, trotz der ,Warnung‘ KANTS)</span>, ist ,wahr‘ und für uns ,annehmbar, denn es ist auch, auf Grund der Ergebnisse des 2. Beweisganges, in unserer realen Welt ,wahr‘ und ,annehmbar‘, weil schon als ,widerspruchsfrei‘ verifiziert ''':''' <span style="color:#FF6000">»''Der GOTT der Christen'' <span style="color:#00B000">(Term :01:)</span> '',existiert‘ für uns ,notwendig‘''«</span> ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, <span style="color:#00B000">(d.i. das ,regulär‘-mögliche Korollar sowohl im 2. als auch im 3. Beweisgang)</span>, denn dieser GOTT ist aus sich ,vollkommen‘ ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, und zu seiner ,Vollkommenheit‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> gehört auch notwendig sein ,Existieren‘ ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. <span style="color:#00B000">(Jeder dieser Terme ist im-, und durch den 2. Beweisgang, im Geltungsbereich der Prämisse Term :01:, als ,wahr‘ und ,annehmbar‘ bewiesen, bzw. verifiziert.)</span> Das ist der ,Kern‘ des ontologischen Arguments, und somit ist auch diese ,strittige‘ Begründung der Prämisse des GÖDEL-Kalküls mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. sie ist logisch ,richtig‘ und, im Kontext des christlichen Glaubens, vernünftig. Die Annahme des Gegenteils zu dieser Prämisse ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Es ist undenkbar, dass es diesen GOTT gibt''«</span>, führt jedoch, unabhängig von jeder Glaubensüberzeugung, zu einem Widerspruch — ist unlogisch und daher ,falsch‘, <span style="color:#00B000">(siehe Anhang ''':''' Widerlegung)</span>. Die Behauptung einer ,formalen Unentscheidbarkeit‘ zu den Annahmen über die Existenz GOTTES, ob oder nicht, <span style="color:#00B000">(d.h. ein ,methodologischer‘ Agnostizismus)</span>, ist gegen jede ,Logik‘; und ist auch ,falsch‘, d.h. der Agnostizismus ist einfach nur ein ,logischer Irrtum‘. Denn aus dem, im Kalkül abgeleiteten, Widerspruch aus der einen Annahme, und damit ihrer Unrichtigkeit, folgt notwendig die Richtigkeit der gegenteiligen Annahme. Damit ist eine klare Entscheidung getroffen.
Das Modale-Prinzip <span style="color:#4C58FF">['''RM''']</span> in Worten ''':''' <span style="color:#FF6000">»''Wenn es wahr ist, dass aus'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> ''ein'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> ''logisch folgt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar, dass, wenn'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist, auch'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist''«</span>. <span style="color:#00B000">(Das <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> in Term :18: ist als ,modal notwendig‘ durch den Term :15: verifiziert '''!''' )</span>
Mit dem 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#FF6000">»'',Dasein‘ ist das ,Wesen‘ GOTTES''«</span>, folgt die GÖDEL-Axiomatik der philosophisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition der ,Rede von GOTT‘ seit ARISTOTELES, und schließt sich damit formal-syntaktisch zugleich auch der religiösen Überzeugung der Christen an, die glauben, dass GOTT, als unser Vater, aus Liebe, in seinem Sohn, JESUS CHRISTUS, für uns immer schon <span style="color:#FF6000">»''da''«</span> ist, <span style="color:#00B000">(der Sohn ist koinzident ,eins‘ mit GOTT, dem Vater und dem GEIST)</span>, wirksam in und durch seine <span style="color:#4C58F0">„Kirche“</span>, im HEILIGEN GEIST, bis ans Ende der Zeit. Das ist das, <span style="color:#FF6000">»''was''«</span> GOTT eigentlich für uns ausmacht, — die Selbstmitteilung seines unergründlichen Wesens in den Sakramenten der <span style="color:#4C58F0">„Kirche“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin da für euch und für immer, als der ich ''<span style="color:#00B000">[ immer schon gewesen ]</span> ''bin''«</span>; <span style="color:#00B000">(d.i. das <span style="color:#4C58FF">,theologisch‘</span>-exegetische ,Axiom‘ der Christen, und eine <span style="color:#4C58FF">,theologisch‘</span> korrekte Explikation der ,regulären‘ Kalkül-Prämisse Term :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, jeweils im 2. und 3. Beweisgang)</span>. Das heißt aber nicht, dass der Autor des Kalküls sich mit diesem Glauben identifiziert hat, <span style="color:#00B000">(,hat‘ er auch nicht)</span>, oder dass der Leser des ontologischen Beweises von Kurt GÖDEL sich damit identifizieren muss, wenn er dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> anerkennt.
Zur erweiterten <span style="color:#4C58FF">„theologischen“</span> Explikation der Kalkül-Prämisse ''':''' Die <span style="color:#4C58F0">„Kirche“</span> ist das ,Meisterwerk‘ GOTTES ''':''' In ihr ist es GOTT gelungen, etwas Göttliches und Unzerstörbares in unsere korrupte Welt einzupflanzen ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Etwas Göttliches existiert notwendig, d.h. ,unzerstörbar‘ in unserer Welt''«</span>. Sie ist, durch die Menschwerdung des GOTTES Sohnes, JESUS CHRISTUS, dessen <span style="color:#4C58F0">„Leib“</span> die <span style="color:#4C58F0">„Kirche“</span> ist, untrennbar mit Menschen verbunden, die schon, von allem Anfang an, und jetzt immer noch, durch die Sünde korrumpiert sind. Mit ihr will und wird GOTT unsere Welt und die Menschheit, bis ans Ende der Zeit, von der Sünde und von deren Konsequenz, dem <span style="color:#00B000">(ewigen)</span> Tod <span style="color:#4C58FF">„erlösen“</span>, <span style="color:#00B000">(jedoch nicht ohne die Zustimmung des Menschen)</span>. Mit dieser Explikation wird die Tragweite des ontologischen Arguments ANSELMS, und damit auch die <span style="color:#4C58FF">„theologische“</span> Relevanz der GÖDEL-Axiomatik erkennbar. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT, <span style="color:#00B000">(Term :01:)</span>.
====<div class="center"><span style="color:#660066">3. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 3, (ANSELMS Theorem)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe___________________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 5)} & \quad P\ E_{not}\; \ & \text { } & \text{„Notwendige Existenz ist eine positive Eigenschaft“} \\
\text{ } & \text{( :: Das ist nur dann wahr, wenn ,Dasein‘ und ,Wesen‘ } & \ & \text{( :: dagegen KANT : ,Existenz‘ ist keine ,Eigenschaft‘,} \\
\text{ } & \;\;\text{in eins zusammenfallen ! ARISTOTELES : Theorem-2)}\ & \ & \;\;\text{,Sein‘ ist für alles, was existiert, kein ,reales Prädikat‘ ! )} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 3)} & \quad \ E_{not}\ x \;\Longleftrightarrow\;\ \forall X \left(\ X_{ess}\ x \Longrightarrow \Box \; \exists y \ X\ y \right) & \ & \text{„Notwendige Existenz ist genau dann eine Eigenschaft von x, wenn} \\
\text{ } & \quad & \ & \;\;\text{alle wesentl. Eigenschaften von x notwendig instanziiert sind“} \\
\text{(Korollar 1)} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{„Es ist widespruchsfrei möglich, dass es GOTT gibt“} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ &\text{„Dasein, GOTT-Sein, Existenz ist das Wesen, die Essenz GOTTES“} \\
\text{(Korollar 2)} &\quad \ G\ x \;\Longrightarrow\; \Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{„Wenn es GOTT gibt, dann gibt es notwendig nur einen GOTT“} \\
\text{(Theorem 3)} & \quad \Diamond \; \exists x \ G \ x \;\Longrightarrow\; \Box \; \exists x \ G \ x \ & \ & \text{( :: ANSELMS Prinzip)} \\
\text{ } & \text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{01} & \quad \ G \ x\ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} & \quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ & \text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{03} & \quad \ P \ X \Rightarrow \ X \ x\ & \ & \text{:02:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{04} & \quad \ P \ E_{not}\;\Rightarrow \ E_{not}\ x\ & \ & \text{:03:Instanz(X:= Enot) :: (Substitution für Eigenschaften)} \\
\text{05} & \quad \ E_{not}\ x\ & \ & \text{(A5):04:[Modus ponens] :: [A, A → B├ B]} \\
\text{06} & \quad \forall X \left(\ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y \right) & \ & \text{(D3):05:[Modus ponens]} \\
\text{07} & \quad \ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y & \ & \text{:06:[ⱯXA(X) ├ A(X)]} \\
\text{08} & \quad \ G_{ess}\ x \Rightarrow \Box \; \exists y \ G\ y & \ & \text{:07:Instanz(X:= G)} \\
\text{09} & \quad \ G_{ess}\ x \ & \ & \text{(Th2):01:[Modus ponens]} \\
\text{10} & \quad \text{ ├ }\;\Box \; \exists x \ G\ x & \ & \text{:08:09:[Modus ponens]:FUB(y:=x) :: (Freie-Um-Benennung der Var.)} \\
\text{ } & \text{„Es gibt GOTT wirklich, für jede mögliche Welt“} & \ & \Longleftarrow\; \text{1. Hauptergebnis !} \\
\text{11} & \quad \;\Diamond \exists x \ G \ x \;\Longrightarrow \; \Box \; \exists x \ G\ x & \ & \text{(K1):10:[├A├B ╞ A→B] :: ''KONDITIONALER BEWEIS''} \\
\text{(Theorem 3)} & \;\text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen war ! 2. Hauptergebnis ! } \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{12} & \quad \;\Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{(K2):01:[Modus ponens]} \\
\text{13} & \quad \;\Box \; (\exists x \ G\ x \wedge \; \forall y(\ G \ y \Longrightarrow \ (x = y)))\ & \ & \text{:10:12:[Konjunktion]:DIST(□∧)} \\
\text{(Korollar 3)} & \;\text{„Es gibt notwendig genau nur einen GOTT“} & \ & \text{„Es gibt für jede mögliche Welt nur den GOTT der Christen“} \\
\end{align}</math>
</small>
|}
Anmerkung-3 ''':''' <span style="color:#00B000">(Ein Theorem und zwei Korollare, aus den beiden vorhergehenden Beweisgängen, werden hier, im 3. Beweisgang, zu ,Axiomen‘, die das Theorem-ANSELMS und sein Korollar mit-verifizieren und bestätigen.)</span>
Dieser Beweisgang ist das Ziel aller Bemühungen. Hier wird der sog. ,ontologische Gottesbeweis‘ nach ANSELM von Canterbury formal-syntaktisch dargestellt und als logisch nachvollziehbar von GÖDEL bestätigt. Damit hat er aber auch klar gestellt, dass der ontologische Beweis ANSELMS kein Beweis für die ,Existenz‘ des GOTTES der Bibel sein kann, bzw. sein ,will‘ ''':''' Denn mit der Prämisse, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(Term :01:, wie auch schon im ,Basisbeweis‘, und ausformuliert hier in Term :02:, mit der Definition für GOTT)</span>, wird mit dem traditionellen, abendländischen ,GOTT-Glauben‘, der ,glaubt‘, dass der Gott der Christen tatsächlich existiert, — methodologisch als ,Annahme‘ —, der Beweisgang schon regulär und explizit eröffnet, aus dem sich dann, logisch korrekt, mit Hilfe der GÖDEL-Axiome und Definitionen, das ,Theorem ANSELMS‘ ergibt; <span style="color:#00B000">(hier jedoch, mit Günther J. WIRSCHING, ohne den Umweg bei GÖDEL über den <span style="color:#4C58FF">[ Modus Barbara ] :: [ A → B, B → C ├ A → C ] </span>, mit dem modalen Axiom-BECKER ''':''' <span style="color:#4C58FF">— ‚'''◇□A→□A'''‘ —</span>, als <span style="color:#4C58FF">‚B → C‘</span> im kategorischen Syllogismus, das André FUHRMANN recherchiert hat)</span>. GÖDEL verwendet zur Darstellung des sog. ,ontologischen Gottesbeweises‘ nach ANSELM die Struktur eines modal-logischen Kalküls. Ein modal-logisches Kalkül ist ein genau geregeltes Schema, in dem bei bestimmten ,Annahmen‘ <span style="color:#00B000">(Axiome, Definitionen, Prämissen)</span> etwas anderes als das Vorausgesetzte, auf Grund des Vorausgesetzten mit Notwendigkeit folgt. Entsprechend der ,Modalität‘ der sechs ,modal‘ notwendigen, d.h. transzendentalen Voraussetzungen, hier, für den 3. Beweisgang, die in den <span style="color:#00B000">(und durch die)</span> beiden vorhergehenden Beweisgängen schon als <span style="color:#FF6000">„modal wahr“</span>, bzw. als logisch annehmbar, verifiziert und/oder ,bewiesen‘ wurden, sind auch die beiden ,Schlusssätze‘ <span style="color:#00B000">(Theorem-3 und Korollar-3)</span> <span style="color:#FF6000">„modal wahr“</span>, bzw. logisch annehmbar '''!''' Die Wahl der Prämisse :01: dagegen ist nicht ,modal‘ notwendig, sondern beruht auf einer freien Entscheidung, und damit ist auch ihre Interpretation eine freie Entscheidung, mit der Voraussetzung, dass man das Kalkül mit Theoremen aus der <span style="color:#4C58FF">„christlichen Theologie“</span> evaluieren, und damit interpretieren will. Dazu berechtigt die Genese des Kalküls. Der Glaube an den GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, beruht immer auf einer freien Entscheidung. Das Kalkül, als solches, unabhängig von jeder Interpretation seiner Syntax, ist genau dann ,allgemein‘ <span style="color:#FF6000">»''mathematisch evident''«</span>, d.h. ,ist allgemein gültig‘, wenn es gültigen Logik-Regeln folgt. Die Bestimmung seiner Syntax jedoch, d.h. seine Interpretation, unterliegt hermeneutischen Kriterien, die nicht von Logik-Regeln abhängen, wie hier ''':''' <span style="color:#FF6000">»''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''«</span>, wie GÖDEL selbst hinzufügt. Mit der, — von GÖDEL eingeforderten —, ‚Unabhängigkeit‘ der Kalkül-Axiome von der zufälligen Struktur der Welt, wird implizit für das Kalkül auch festgelegt, dass <span style="color:#FF6000">„GOTT“</span> ‚unabhängig‘ von der zufälligen <span style="color:#00B000">(Raum-Zeit-)</span>Struktur unserer vergänglichen Welt, und daher ,zeitlos-ewig‘ ist, <span style="color:#00B000">(was <span style="color:#4C58FF">„theologisch“</span> korrekt ist)</span>, begründet durch Definition-1 und Axiom-3. Aus der zeitlosen Ewigkeit GOTTES folgt, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, denn bei Zeitlosigkeit gibt es keinen ,zeitlichen‘ und damit auch keinen ,ontologischen‘ Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘. Beides ist dann koinzident ,eins‘ ''':''' wie ,Wesen‘ und ,Dasein‘ in GOTT, bzw. wie ,Begriff‘ und ,Sein‘, oder ,Möglichkeit‘ und ,Wirklichkeit‘. <span style="color:#00B000">(Man vergleiche damit auch die ,postulierte‘ Einheit von ,Erkenntnisobjekt‘ und ,Erkenntnissubjekt‘ im ,Gott‘ des ARISTOTELES ''':''' im <span style="color:#FF6000">»<span style="color:#00B000">[ selbstbewussten ]</span> ''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“<span style="color:#00B000"> | </span>„noêseôs noêsis“</span> <small>(‚<span style="font-family: Times;"><big>''Metaphysik''</big></span>‘ XII 9, 1074b34)</small>, im Vollzug seiner Funktion als ,unbewegtes Bewegungsprinzip‘, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“<span style="color:#00B000"> | </span>„prôton kinoûn akinêton“</span> der Welt, das alles Übrige <span style="color:#FF6000">»''wie ein Geliebtes''«<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὡς ἐρώμενον</big></span>“</span> | <span style="color:#FF6000">„hôs erômenon“</span> bewegt; d.h. christlich ''':''' <span style="color:#FF6000">»''aus Liebe''«</span> ,entstehen‘ lässt.)</span>
Anmerkung-4 ''':''' Das <span style="color:#00B000">(im 2. Beweisgang)</span> schon bewiesene Theorem-2, d.i. die Koinzidenz von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, <span style="color:#00B000">(‚Existenz‘</span> und <span style="color:#00B000">‚Essenz‘)</span>, rechtfertigt sowohl Axiom-5 als auch die Definition-3, und widerlegt den Einwand KANTS. Somit ist deren Setzung <span style="color:#00B000">(hier, im 3. Beweisgang)</span> korrekt, und durch das Theorem-2 schon vorbestimmt und bestätigt, d.h. beide sind <span style="color:#FF6000">„modal wahr“</span> und ,logisch‘ annehmbar, da sie durch die Gültigkeit von Theorem-2 ,verifiziert‘ worden sind. Damit wird klar erkennbar, dass das Theorem-2 tatsächlich die Basis des GÖDEL-Kalküls ist. Und wenn damit Axiom-5 im GÖDEL-Kalkül ‚gerechtfertigt‘ ist, dann ist auch, <span style="color:#00B000">(als Voraussetzung dafür)</span>, das Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ — ''':''' </span> <span style="color:#FF6000">»''Positive Eigenschaften'', <span style="color:#00B000">[ ,Transzendentalia‘ ]</span>, ''sind notwendig aus sich'', <span style="color:#00B000">[ von Natur aus ]</span>, ''positiv''«</span>, im 2. Beweisgang erklärbar, in dem die ‚Positivität‘, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, einer Eigenschaft schon als ‚notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, charakterisiert worden ist, äquivalent zu Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, in dem die ‚Notwendigkeit‘, <span style="color:#4C58FF">— <sub>not</sub> —</span>, <span style="color:#00B000">(der Existenz <span style="color:#4C58FF">— ‚'''E'''‘ —</span>)</span>, dann als ‚positive‘ Eigenschaft, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ‚bestimmt‘ wird; <span style="color:#00B000">(unter der speziellen Voraussetzung, dass <span style="color:#FF6000">„Existieren“</span> definitiv als eine <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT ,instanziiert‘ ist; vgl. Definition-3. Eine ,bestimmte‘ Eigenschaft ist genau dann ,instanziiert‘, wenn sie an einem Träger real ,existiert‘. Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, besagt, dass die, von GÖDEL ,postulierte‘, und im Basis-Theorem-2 verifizierte, <span style="color:#FF6000">„notwendige Existenz“</span> zu den ,ultimativen‘ Transzendentalia in GOTT gehört. Genauer ''':''' Sie ist die ,Summe‘ aller Transzendentalia.)</span> Zum Axiom-4, <span style="color:#00B000">(bzw. zum Term :14:, im 2. Beweisgang)</span>, erklärt GÖDEL in seinen Notizen zum Kalkül ''':''' <span style="color:#FF6000">»''da es'' <span style="color:#00B000">[ das Notwendigsein, <span style="color:#4C58FF">— '''□''' —</span> ]</span> ''aus der Natur der'' <span style="color:#00B000">[ positiven ]</span> ''Eigenschaft folgt'', <span style="color:#00B000">[ deren Positivität, im selben Beweisgang, mit Term :13: vorher schon ,bewiesen‘ (╞ ) worden ist ]</span>«</span>. Die GÖDEL-Erklärung zum Axiom-4 entspricht der Modal-Regel zur sog. ,Nezessisierung‘ in der KRIPKE-Logik nach GÖDEL. <span style="color:#4C58FF">[ Nezessisierungsregel ] '''::''' [ ├ A →├ □ A ]</span> ''':''' <span style="color:#FF6000">»''Angenommen'', <span style="color:#4C58FF">‚'''A'''‘</span> ''ist in einem Kalkül eine Prämisse, oder darin regulär'' <span style="color:#4C58FF">(├ )</span> ''abgeleitet, dann folgt in diesem Kalkül regulär'' <span style="color:#4C58FF">(├ )</span>, ''dass dieses'' <span style="color:#4C58FF">‚'''A'''‘</span> ''auch ,modal‘ notwendig'' <span style="color:#4C58FF">— ,□‘ —</span> ''ist''«</span>. GÖDEL hat jedoch diese modale Notwendigkeit nur in der ,Natur‘ der positiven Eigenschaften, alias ,Transzendentalia‘, gesehen, und mit den Aussagen im Axiom-4 expliziert ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt, nur dann sind die Axiome wahr''«</span>. Ob dieselbe modale Notwendigkeit auch auf Aussagen über Eigenschaften, wie ,rot‘ oder ,schwer‘, die weder positiv noch negativ sind, zutrifft, ist nicht erwiesen. Hier kann nur von modaler ,Kontingenz‘ gesprochen werden, die universal, alles Seiende innerhalb der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> betrifft. Somit sind die Aussagen <span style="color:#4C58FF">— ‚'''A'''‘ —</span> in der GÖDEL-Regel, nur auf Aussagen über ,positive‘ Eigenschaften eingeschränkt, und nicht allgemein gültig. Die <span style="color:#4C58FF">[ Nezessisierungsregel ]</span> ist nur für <span style="color:#FF6000">„Transzendentalia“ „modal wahr“</span>, und für ,Nicht-Transzendentalia‘ immer <span style="color:#FF6000">„modal falsch“</span>.
Der unbegrenzt Unendliche, GOTT, — im Glauben der Christen —, ist deswegen ,notwendig für uns da‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, weil er als GOTT ,vollkommen‘, ,perfekt‘ und absolut ,positiv‘, d.h. absolut ,gut allein‘ ist, ohne jede Negativität ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>; <span style="color:#00B000">(was auch schon im 2. Beweisgang mit Term :13: verifiziert wurde)</span>. Und wenn GOTT ,vollkommen‘, ,perfekt‘, ,positiv‘, und absolut ,gut‘ ist, dann ist er das auch ,notwendig aus sich‘ ''':''' <span style="color:#4C58FF">— ‚'''PG → □PG'''‘ — ::</span> <span style="color:#00B000">(als Zusatz-Korollar im 2. Beweisgang mit Axiom-4 und der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>)</span>, d.h. ,aus seinem Wesen‘. Das ist gerade das, ,was‘ GOTT als GOTT ausmacht ''':''' sein ,Wesen‘, bzw. seine <span style="color:#FF6000">„Natur“</span>. Zusammen mit der Definition-1 für GOTT, <span style="color:#00B000">(und der Definition-2 ''':''' Alle Wesenseigenschaften hängen notwendig gleichwertig aus sich zusammen)</span>, ist dieses, aus der <span style="color:#FF6000">„Natur“</span> GOTTES sich ergebende, ‚Notwendigsein‘, <span style="color:#4C58FF">— '''□''' —</span>, aller ‚positiven‘ Eigenschaften im Axiom-4, und ihr logischer Zusammenhang, d.i. die Koinzidenz aller ,Vollkommenheiten‘ und ,Zuschreibungen‘ im Unendlichen, GOTT, ihr ,Zusammenfallen in eins‘, die entscheidende Voraussetzung, aus der sich dann für GÖDEL <span style="color:#00B000">(im 2. Beweisgang)</span> auch der logische Zusammenhang, bzw. die ontologische Identität, <span style="color:#00B000">(die Koinzidenz)</span>, von <span style="color:#FF6000">„Dasein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, im Basis-Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> mit Notwendigkeit ergibt. Damit hat GÖDEL ein altes <span style="color:#4C58FF">„theologisches“</span> Theorem der Vergessenheit entrissen. Das Theorem-2 ist dann, in weiterer Folge, die ,modal‘ notwendige, d.h. die transzendentale Voraussetzung auch für den Konsequenz-Teil im Theorem ANSELMS, <span style="color:#00B000">(Term :09: hier im 3. Beweisgang)</span>. <span style="color:#FF6000">„Positive Eigenschaften“<span style="color:#00B000"> | </span>„Vollkommenheiten“</span> sind ,immer‘ auch <span style="color:#FF6000">„notwendige Eigenschaften“</span>, daher ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. Das ,Dasein‘, die <span style="color:#FF6000">„Existenz“</span> ist ,immer‘ etwas <span style="color:#FF6000">„Positives“</span>, speziell in GOTT, dem Schöpfer jeder ,Existenz‘, bzw. allen ,Seins‘. Axiom-4 begründet im GÖDEL-Kalkül das Basis-Theorem-2, <span style="color:#00B000">(wie auch das Korollar-3 von der exklusiven Einzigartigkeit GOTTES)</span>, und ,verankert‘ diese Theoreme damit zugleich in der <span style="color:#4C58FF">,theologisch‘</span>-philosophischen Tradition der ,Rede von GOTT‘ bei ARISTOTELES, — AVICENNA, — ANSELM, — DESCARTES, — LEIBNIZ, — HEGEL, — und bei GÖDEL mit äußerster ,logischer‘ Klarheit.
Anmerkung-5 ''':''' Der ‚Schlüsselbegriff‘ in diesem Kalkül ''':''' <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Vollkommenheit“<span style="color:#00B000"> | </span>„Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, dominiert alle Axiome des GÖDEL-Kalküls, jedoch ohne inhaltlich genauer ‚bestimmt‘ worden zu sein. Für <span style="color:#4C58FF">— ‚'''P'''‘ — </span> gibt es keine explizite Definition '''!''' <span style="color:#00B000">(Das Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, besagt nur, dass die ,postulierten‘, positiven Eigenschaften, die <span style="color:#FF6000">„Transzendentalia“</span>, formal miteinander verträglich, d.h. ‚widerspruchsfrei‘ sind, wegen Axiom-2. Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, besagt, dass positive Eigenschaften ,gleichwertig‘ sind, d.h. gleich ,wahr‘ sind, weil sie ,notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, aus sich, alle paarweise mit- und voneinander ,impliziert‘ sind, sich gegenseitig ,einschließen‘, und damit eine Einheit bilden, d.h. in GOTT ,eins‘ sind. Axiom-2 ist somit zugleich eine ,indirekte‘ Definition für ,positive‘ Eigenschaften ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, besagt ''':''' Weil die ,gleichwertigen‘, positiven Eigenschaften sich gegenseitig implizieren, und damit notwendig von einander abhängen, d.h. koinzident in GOTT ,eins‘ sind, — wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht —, dann sind sie somit auch die ,wesentlichen‘ Eigenschaften, die <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, in GOTT, der, wesentlich und exklusiv, notwendig ,Einer‘ ist. Die Definition-2 ist nur dann <span style="color:#FF6000">„modal wahr“</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit positive Eigenschaften, d.h. mit <span style="color:#FF6000">„Transzendentalien“</span>, besetzt werden. Diese Definition ist jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn ihre Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind. Fußnote zu Definition-2 in der GÖDEL-Notiz ''':''' <span style="color:#FF6000">»''any two essences of x are nec. equivalent''«</span>. Die paarweise, notwendige Äquivalenz von zwei beliebigen Wesenseigenschaften der Individuum-Variable <span style="color:#4C58FF">‚'''x'''‘</span>, wird hier, spezifisch für GOTT, d.h. wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT, dem ,Einen‘, steht, zur <span style="color:#FF6000">„Koinzidenz“</span>, — zum paarweise ,Zusammenfallen aller Gegensätze in Einem‘ —, dem inneren Zusammenhang aller seiner <span style="color:#FF6000">„ultimativen“</span> Vollkommenheiten, d.h. aller <span style="color:#FF6000">„Transzendentalia“</span> und Zuschreibungen, in dem unbegrenzt Unendlichen, GOTT, den schon der Philosoph und Kardinal NIKOLAUS von Cues als <span style="font-family: Times;"><big>,coincidentia oppositorum‘</big></span> verstanden hat.)</span>
In den entscheidenden ‚Schlusssätzen‘ des Kalküls ist der ‚Schlüsselbegriff‘ verschwunden. Hier ist nur mehr von GOTT, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, die Rede ''':''' Korollar-1, <span style="color:#FF6000">»''Es ist definitiv denkbar, dass es GOTT gibt''«</span>, Theorem-2, <span style="color:#FF6000">»''Dasein, GOTT-Sein, Göttlichkeit ist das Wesen GOTTES''«</span>, Theorem-3, <span style="color:#FF6000">»''Weil GOTT definitiv denkbar, d.h. widerspruchsfrei möglich ist, darum ist auch der Glaube an GOTT widerspruchsfrei, logisch richtig und mathematisch evident, der annimmt, dass es GOTT, mit Notwendigkeit, wirklich gibt''«</span>, <span style="color:#00B000">(nach ANSELM von Canterbury, und was spezifisch das <span style="color:#FF6000">»</span>''Privilegium der Gottheit allein''<span style="color:#FF6000">«</span> ist, nach LEIBNIZ)</span>, und Korollar-3, <span style="color:#FF6000">»''Es gibt notwendig aus sich, d.i. unverursacht, nur einen GOTT''«</span>. Das GÖDEL-Kalkül ist zu diesen Erkenntnissen gekommen, ohne die Eigenschaften, bzw. die ‚Vollkommenheiten‘ GOTTES, d.h. wer oder was GOTT ‚an sich‘ selbst ist, genauer bestimmen zu müssen, <span style="color:#00B000">(was ,für uns‘ ohnehin ,unmöglich‘ ist)</span>; außer im Theorem-2, in dem das <span style="color:#FF6000">„Dasein“</span> GOTTES als die ‚für uns‘ bestimmende und wichtigste <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT erkannt worden ist, — immer vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. Der GOTT des GÖDEL-Kalküls ist nicht mehr der an Raum und Zeit gebundene ‚Gott‘ des ARISTOTELES, sondern der von Raum und Zeit <span style="color:#FF6000">»''unabhängige''«</span> GOTT der Bibel bei ANSELM und bei LEIBNIZ. Das GÖDEL-Kalkül, <span style="color:#00B000">(wie ja auch der sog. ‚ontologische Gottesbeweis‘ ANSELMS)</span>, kann jedoch, — bei aller ‚Coolness‘ —, keinen GOTT-Glauben ‚erzeugen‘, sondern setzt vielmehr die Existenz GOTTES notwendig als gegeben schon voraus. Das Kalkül des Logiker GÖDEL beweist aber, dass der traditionelle ‚GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. logisch ,richtig‘ und <span style="color:#FF6000">»''mathematisch evident''«</span> ist, weil der ‚Nicht-GOTT-Glaube‘, <span style="color:#FF6000">»''die atheistische Weltanschauung''«</span>, im Möglichkeitsbeweis notwendig zu unlösbaren Widersprüchen führt, und somit logisch ,falsch‘ ist. <span style="color:#00B000">(Die ,Logik‘ hat aber, — bekanntlich —, bei allen wichtigen, persönlichen Entscheidungen immer nur eine untergeordnete Rolle '''!''' )</span>
Anmerkung-6 ''':''' Das erste, ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitete, Hauptergebnis im 3. Beweisgang, Term :10: <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' der Glaube, dass GOTT ,notwendig‘ existiert, ist die logische Konsequenz aus der Prämisse, Term :1: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>. Dieses erste Hauptergebnis hat also den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist daher davon ,abhängig‘, d.h. Term :10: ist der Ausdruck einer ,Glaubensüberzeugung‘. Das zweite Hauptergebnis im 3. Beweisgang, das Theorem ANSELMS ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, dagegen, ist die Darstellung der Abhängigkeit des ersten Hauptergebnisses von dem, vorher schon bewiesenen, ,Axiom‘ von der ,möglichen‘ Existenz GOTTES ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang. Dem geht folgende Beobachtung voraus ''':''' Der Term ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, hat in seiner syntaktischen Stellung hier, im Theorem-3, nicht mehr den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist damit, in seiner Position als Konsequenz-Teil im Theorem ANSELMS, auch nicht mehr davon syntaktisch abhängig, sondern stützt sich formal-syntaktisch nur auf die behauptete Möglichkeit GOTTES; daher muss diese ,angenommene‘ Möglichkeit noch bewiesen <span style="color:#00B000">( ╞ )</span> werden. Dazu die Feststellung LEIBNIZ‘, der diesen Zusammenhang, und seinen Mangel, erkannt hat ''':'''
::Das Theorem ANSELMS ist <span style="color:#FF6000">» ''ein unvollständiger Beweis, der etwas voraussetzt, was man noch hätte beweisen'' <span style="color:#00B000">( ╞ )</span> ''sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' «</span>.
Diesen <span style="color:#FF6000">»''unvollständigen Beweis''«</span> hat GÖDEL im 1. Beweisgang mit dem ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleiteten, und widerspruchfreien Möglichkeits-Korollar-1, vervollständigt, und damit hat er mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span> bewiesen ''':''' <span style="color:#FF6000">»''Diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens''«</span> enthält <span style="color:#FF6000">»''keinen Widerspruch''«</span> '''!''' Das Korollar-1 ist nur vom logischen Axiom-1 und von der mathematischen Äquivalenz der Perfektionen, <span style="color:#00B000">(der Transzendentalien)</span>, im Axiom-2 ,abhängig‘, und nicht mehr von der ,methodologischen‘ Kalkül-Prämisse, dem traditionellen GOTT-Glauben. Damit hat das Glaubens-Theorem ANSELMS die gesuchte <span style="color:#FF6000">»''mathematische Evidenz''«</span> erreicht, unabhängig von jeder Glaubensüberzeugung. Entscheidend dafür ist der mathematisch-logische Beweis GÖDELS, dass der Nicht-GOTT-Glaube zu einem Widerspruch führt.
Zusammenfassung ''':'''
Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>, ist die logische Konsequenz aus der Prämisse im 1. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, den, — <u>modal-frei</u> — gewählten, ,angenommenen‘ positiven Eigenschaften, bzw. ,Transzendentalia‘.
Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' <span style="color:#FF6000">»''GOTT-Sein ist das Wesen GOTTES''«</span>, ist die logische Konsequenz aus der Prämisse im 2. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, dem, — <u>modal-frei</u> — gewählten, ,angenommenen‘ GOTT-Glauben der Christen.
Im Unterschied dazu ist im 3. Beweisgang, das Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' der Glaube, dass es einen GOTT notwendig gibt ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, die logische Konsequenz aus dem, — <u>modal-notwendig</u> — als widerspruchsfrei ,bewiesenen‘, Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, im 1. Beweisgang, <span style="color:#00B000">(auch im Beweisgang ,Widerlegung‘ im Anhang)</span>, und damit ist das Glaubens-Theorem-3, als ganzes, ,widerspruchsfrei‘. Das Theorem ANSELMS ist, mit Korollar-1, nur vom logischen Axiom-1 der Widerspruchsfreiheit, und der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften, <span style="color:#00B000">(aller Transzendentalia)</span>, im Axiom-2, abhängig. Damit ist die Bedingung für die geforderte, spezielle <span style="color:#FF6000">»''mathematische Evidenz''«</span>, und auch für die Widerspruchsfreiheit im Glaubens-Theorem ANSELMS erfüllt; unabhängig von jeder Glaubensüberzeugung. Weil es <span style="color:#FF6000">„modal wahr“</span> ist, dass die Transzendentalien, bzw. die Vollkommenheiten ontologisch, — dem Sein nach —‚ alle <span style="color:#00B000">(zueinander)</span> widerspruchsfrei, und alle <span style="color:#00B000">(miteinander)</span> gleichwertig sind, ist es auch <span style="color:#FF6000">„modal wahr“</span>, dass es möglich ist, dass GOTT, — dem Sein nach —‚ da ist, <span style="color:#00B000">(d.h. existiert)</span>, der die unbegrenzte Summe aller ultimativen Transzendentalia, bzw. der unendlichen Vollkommenheiten allen Grades ist, wie es der ,christliche Glaube‘ des Erzbischofs ANSELM und seiner Anvertrauten ,annimmt‘.
====<div class="center"><span style="color:#660066">Widerlegung</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDEL-Kalkül : der Möglichkeitsbeweis als Widerlegung des Nicht-GOTT-Glaubens</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe_____________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist X nicht positiv“} \\
\text{(Axiom 2)} & \quad \Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaft Y in allen x, die aus der Eigenschaft X in allen x} \\
\text{ } & \quad & \ & \; \; \text{mit modaler Notwendigkeit folgt, ist eine positive Eigenschaft“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Korollar-1)} &\quad \Diamond \; \exists x \ G \ x \ & \ & \; \; \text{( „das —,x‘— steht für den GOTT, —,G‘—, der Christen“ )} \\
\text{ } & \text{„Es ist möglich, dass es den GOTT der Christen gibt“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad \; \neg \Diamond \; \exists x \ G \ x \ & \ & \text{ AE: „Es ist unmöglich, dass es diesen GOTT gibt“ (dezidierter Atheismus)} \\
\text{02} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{03} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{04} & \quad \neg\neg \Box \neg \exists x \ G \ x \ & \ & \text{:01:[ ◇A ↔ ¬□¬A ] :: (Modalregel) } \\
\text{05} & \quad \neg\neg \Box \neg\neg \forall x \neg \ G \ x \ & \ & \text{:04:[ ∃xA ↔ ¬Ɐx¬A ] :: (Quantorenregel) } \\
\text{06} & \quad \text{ ├ }\; \Box \; \forall x \neg G \ x \ & \ & \text{:05:NEG :: [ ¬¬A↔A ] :: (Gesetz der Aussagenlogik) } \\
\text{07} & \quad \Box \; \forall x \neg G \ x \Leftrightarrow\ W & \ & \text{:01:06:[ (:01:↔W) → (├:06:↔W) ] :: (Kalkülregel) } \\
\text{08} & \quad \Box \; \forall x \ G \ x \Leftrightarrow\ F & \ & \text{:07:[ (¬A↔W)↔(A↔F) ] :: (Regel für Wahrheitswerte)} \\
\text{ } & \text{„Jeder GOTT-Glaube ist notwendig falsch ! “} & \ & \Longleftarrow\; \text{die logische Konsequenz aus der Prämisse :01: !} \\
\text{09} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:02:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{10} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (\neg x = x)) & \text { } & \text{:08:09:[ (:08:↔F) → (:09:↔F) ] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{11} & \quad \Box \; \forall x (\ G \ x \Rightarrow \; (\neg x = x)) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=(¬x= ..)) } \\
\text{12} & \quad \ P (\neg x = .. ) & \ & \text{:10:11:[ Modus ponens ] :: [ A→B, A ├ B ]} \\
\text{13} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{14} & \quad \neg P (\ x = .. )\ & \ & \text{:12:13:[ Modus ponens ] :: (log. Schlussregel)}\\
\text{15} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:03:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{16} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) & \ & \text{:08:15:[ (:08:↔F) → (:15:↔W) ] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{17} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=( x= ..))} \\
\text{18} & \quad \ P (\ x = .. )\ & \ & \text{:16:17:[ Modus ponens ]}\\
\text{19} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ &
\text{:14:18:[ Konjunktion ] ⇒ Kontradiktion !}\\
\text{20} & \quad \neg \Diamond \; \exists x \ G \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:01:19:[ ├A├B╞ A→B ] :: ''KONDITIONALER BEWEIS''}\\
\text{ } & {\color{RedOrange}\text{Der Atheismus führt zu einem logischen Widerspruch ! }} & \ & \Longleftarrow\; \text{was mit Term :20: bewiesen ist !} \\
\text{21} & \quad \neg\neg \Diamond \; \exists x \ G \ x & \ & \text{:20:19:[ Modus tollendo tollens ] :: [ A→B,¬B ├ ¬A ]}\\
\text{22} & \quad \; \Diamond \; \exists x \ G \ x & \ & \text{:21:NEG }\\
\text{(Korollar-1)} & \;\text{„Es ist definitiv möglich, dass es diesen GOTT gibt“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\end{align}</math>
</small>
|}
Anmerkung-7 ''':''' <span style="color:#00B000">( Dieser Beweisgang ist praktisch identisch mit dem 1. Beweisgang, jedoch gestrafft und präzisiert nach G.J.WIRSCHING. Diese Widerlegung des Nicht-GOTT-Glaubens beginnt sofort mit dem Korollar-1 <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> aus dem 1. Beweisgang, als in Frage gestelltes ,Theorem‘, und beweist, ohne das Axiom-3 <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, und ohne die GÖDEL-Prämisse <span style="color:#4C58FF">— ,'''PX'''‘ —</span>, in einem Zwischenergebnis, die innere Widersprüchlichkeit und damit auch die Unhaltbarkeit der atheistischen Glaubens-Annahme, aus rein logischen ,Gründen‘, bzw. Axiomen. )</span>
Dieser Beweisgang geht von der Existenz GOTTES, <span style="color:#4C58FF">— ,'''G'''‘ —</span>, als Glaubens-Annahme, aus, wobei aber die Möglichkeit seiner Existenz, und damit die Sinnhaftigkeit des Glaubens an GOTT, durch die Prämisse :01: in Frage gestellt wird, und daher im Kalkül überprüft werden muss. Denn mit der Behauptung der Existenz GOTTES allein ist es nicht getan. Es muss auch seine ,Möglichkeit‘, d.h. die Sinnhaftigkeit des Glaubens an GOTT aufgewiesen werden. LEIBNIZ hat als erster, <span style="color:#00B000">(nach ANSELM)</span>, dieses Problem gesehen, und GÖDEL hat dafür die Lösung gefunden. Dieser Beweisgang, <span style="color:#00B000">(analog zum Möglichkeitsbeweis von Günther J. WIRSCHING konzipiert)</span>, setzt in den Axiomen, genau wie im 1. Beweisgang, die Existenz von etwas <span style="color:#FF6000">„Positiven“, „Perfekten“, „Vollkommenen“</span>, <span style="color:#4C58FF">— ,'''P'''‘ —</span>, <span style="color:#00B000">(d.h. die Transzendentalien)</span>, allgemein für die Welt voraus, <span style="color:#00B000">(was im Axiom-3 ''':''' <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, auch GOTT ultimativ zugeordnet wird ''':''' <span style="color:#FF6000">»''GOTT ist absolut positiv, perfekt und vollkommen''«</span>)</span>; das dann im 2. Beweisgang mit Term :13: als widerspruchsfrei, <span style="color:#00B000">(als ,wahr‘ und ,annehmbar‘ im Kontext des christlichen Glaubens)</span>, schon ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> worden ist. Die Existenz von ,Transzendentalien‘ in der Welt, ist ein, mit Beispielen belegbares, allgemeines Faktum; ihre Existenz auch in GOTT ist mit dem Term :13: des 2. Beweisganges bewiesen, die jedoch im Unendlichen, GOTT, als Transzendentalia, auch in ,ultimativer‘ Form vorliegen. Axiom-1 ,besagt‘, dass Eigenschaften nicht zugleich, vollkommen und nicht vollkommen, sein können. Axiom-2 ,besagt‘, dass, allgemein, alle Vollkommenheiten, <span style="color:#00B000">(alle Transzendentalien)</span>, gleichwertig, <span style="color:#00B000">(mathematisch äquivalent)</span>, sind. <span style="color:#00B000">(Axiom-2 wird hier um das GÖDEL-Konjunkt <span style="color:#4C58FF">— ,'''PX'''‘ —</span> verkürzt dargestellt. Damit ist auch Axiom-3 für diesen Beweisgang unnötig geworden, ohne dass sich wegen dieser Kürzung am Ergebnis etwas ändert. Axiom-2 wird jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn seine Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind, die keine ,Transzendentalia‘ sind.)</span> Die Eigenschaft <span style="color:#4C58FF">— (¬x=..) —</span> ,besagt‘, dass GOTT <span style="color:#FF6000">„unvergleichlich“</span> ist, wenn <span style="color:#4C58FF">,'''x'''‘</span> für GOTT steht. <span style="color:#00B000">(Der informelle Term, <span style="color:#4C58FF">— (¬x=..) —</span>, ersetzt hier, wie bei A. FUHRMANN, den formal korrekten Abstraktionsausdruck ''':''' <span style="color:#4C58FF">— λy.(¬x=y) —</span>, aus dem Lambda-Kalkül.)</span> Der Term :16: <span style="color:#4C58FF">— (x=x) ↔ W —</span> steht für die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚IST‘'' <span style="color:#00B000">(aus mir selbst)</span>«</span>, der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES. Der GOTT der abendländischen, christlichen Tradition wird mit <span style="color:#4C58FF">— ,'''G'''‘ —</span> bezeichnet ''':''' d.i. der <span style="color:#FF6000">„GOTT der Christen“</span>, entsprechend der ,methodologischen‘ Prämisse und der ,Genese‘ des Kalküls, syntaktisch formalisiert in der Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn es alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>, nach der Vorgabe von LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Mit Korollar-1 hat dieser Beweisgang dasselbe Endergebnis, wie der 1. Beweisgang. Der Beweis, dass der dezidierte Atheismus zu einem logischen Widerspruch führt, und damit falsch ist, ist ein Zwischenergebnis in diesem Beweisgang, und begründet mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, und unabhängig von jeder Glaubensüberzeugung, den, von LEIBNIZ gesuchten, Möglichkeitsbeweis für die Existenz GOTTES im Argument des Erzbischofs, und bestätigt damit die Sinnhaftigkeit des GOTT-Glaubens. Einmal Axiom-1 und zweimal Axiom-2 sichern hier das Ergebnis des Kalküls ''':''' das Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>''':''' <span style="color:#FF6000">»''Es ist definitiv möglich, dass es den GOTT der Christen gibt''«</span>. Diese zwei Axiome sind die einzigen, und modal-notwendigen, d.h. die transzendentalen Voraussetzungen und Bedingungen für das Endergebnis ''':''' der Widerspruchsfreiheit und Sinnhaftigkeit des Glaubens der Christen an GOTT; <span style="color:#00B000">(dasselbe gilt natürlich auch für die <span style="color:#4C58FF">„theologische“</span> Weltanschauung jeder monotheïstischen Religion '''!''' Dem Erzbischof ANSELM ging es damals nur um seinen Glauben an GOTT.)</span>.
Die Logik-Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso sequitur quotlibet, etiam verum“</big></span></span>, <span style="color:#00B000">(‚Aus Falschem folgt irgendetwas, auch Wahres‘)</span>, ist der scholastische Ausdruck für die ‚Implikation‘ <span style="color:#00B000">(Folgerung)</span> von Aussagen, die nur dann falsch, <span style="color:#4C58FF">— F —</span> ist, wenn das Antezedens wahr, <span style="color:#4C58FF">— W —</span>, und die Konsequenz falsch, <span style="color:#4C58FF">— F —</span> ist. Andernfalls ist sie immer wahr, <span style="color:#4C58FF">— W —</span>, auch wenn die Voraussetzung falsch, <span style="color:#4C58FF">— F —</span> ist ''':''' ‚Modern‘ darstellbar durch die ‚Wahrheitswertetafel‘ für die ‚materiale Implikation‘, <span style="color:#4C58FF">— ,(A → B)‘ —</span> <span style="color:#FF6000">„wenn A, dann B“</span>. Damit ist auch der <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ] </span> verstehbar; <span style="color:#00B000">(vgl. die vierte Zeile der ‚materialen Implikation‘)</span>. Der positive hypothetische Syllogismus ''':''' <span style="color:#4C58FF">[ Modus ponendo ponens ] :: [ A → B, A ├ B ] </span> ist aus der ersten Zeile ablesbar.
Die folgende Tabelle gibt für jeden ,Wahrheitswert‘ der Aussagen <math>A</math> und <math>B</math> das Resultat einiger zweiwertiger Verknüpfungen an ''':'''
{|class="wikitable hintergrundfarbe2" style="text-align:center;"
|-
!colspan="2"|''Belegung''!!Konjunktion!!Disjunktion!!materiale<br /> Implikation!!Äquivalenz<br /> Bikonditional!!kopulative<br /> Konjunktion
|-
!<math>A</math>
!<math>B</math>
!<math>A</math> und <math>B</math>
!<math>A</math> oder <math>B</math>
!wenn <math>A</math> dann <math>B</math>
!sowohl <math>A</math> als auch <math>B</math>
!entweder <math>A</math> oder <math>B</math>
|-
!W!!W
|W||W||W||W||F
|-
!W!!F
|F||W||F||F||W
|-
!F!!W
|F||W||W||F||W
|-
!F!!F
|F||F||W||W||F
|}
<span style="color:#00B000">(Eine ‚Konjunktion‘ ist nur dann ,wahr‘, wenn beide Aussagen einer ‚Konjunktion‘ wahr sind. Eine ‚kopulative Konjunktion‘ ist nur dann ,wahr‘, wenn entweder die eine, oder die andere Aussage der ‚kopulativen Konjunktion‘ wahr ist. Es besteht also eine Wenn-Dann-Verbindung zwischen beiden Aussagen — eine ,Kopplung‘. Das ist die logische Grundlage von Axiom-1 im GÖDEL-Formalismus)</span>
Um das Widersprüchliche der ,Annahme‘ nachzuweisen, dass positive Eigenschaften ,nicht konsistent‘ seien, <span style="color:#00B000">(im 1. Beweisgang)</span>, bzw. um das Unlogische und Sinnwidrige der ,Annahme‘ klarzustellen, es sei ,unmöglich‘, dass es einen GOTT gibt, <span style="color:#00B000">(hier, in der Widerlegung)</span>, verwendet das GÖDEL-Kalkül den Gegensatz ''':''' wahr, <span style="color:#4C58FF">— W —</span>, falsch, <span style="color:#4C58FF">— F —</span>, zwischen der dritten und vierten Zeile der Wahrheitswertetafel, für zwei ,wahre‘ <span style="color:#4C58FF">— W —</span> ,materiale Implikationen‘, in denen die Voraussetzung jeweils falsch, <span style="color:#4C58FF">— F —</span>, ist, entsprechend der Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso, <span style="color:#4C58FF">— F —</span>, sequitur quotlibet, <span style="color:#4C58FF">— F —</span>, etiam verum, <span style="color:#4C58FF">— W —</span>“</big></span></span>, jeweils mit der Hilfe von Axiom-1 und Axiom-2, in einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>; hier unabhängig von jeder Glaubensüberzeugung. Im Gegensatz dazu, wird, <span style="color:#00B000">(im 2. Beweisgang)</span>, aus dem Glauben an GOTT, auch mit einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, speziell mit Axiom-1, das Widersprüchliche in der ,Annahme‘ nachgewiesen, es gäbe in GOTT <span style="color:#FF6000">»''keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span>, d.h. keine ,Transzendentalia‘. In dieser <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, im 2. Beweisgang, wird vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span> ''':''' es gibt den GOTT der Christen, <span style="color:#00B000">(als Prämisse :01:)</span>, der ,unvergleichlich‘ und ,einzigartig‘ ist, und in dem auch alle ,Transzendentalia‘ <span style="color:#FF6000">„koinzident“</span> ,eins‘ sind, entsprechend Axiom-2.
Für KANT entsteht ein Widerspruch in den Prädikaten eines Satzes.
::<span style="color:#FF6000">»</span> ''Wenn ich das Prädicat in einem identischen Urtheile aufhebe'', <span style="color:#00B000">[ durch eine Negation ]</span>, ''und behalte das Subject, so entspringt ein Widerspruch''. <span style="color:#00B000">[ Wenn ich sage ''':''' ,''GOTT ist nicht allmächtig''‘, entsteht ein Widerspruch zur richtigen Aussage ''':''' ,''GOTT ist allmächtig''‘. ]</span> … ''Wenn ihr aber sagt ''':''' ,GOTT ist nicht‘, so ist weder die Allmacht, noch irgendein anderes seiner Prädicate gegeben; denn sie sind alle zusammt dem Subjecte aufgehoben'', <span style="color:#00B000">[ negiert ]</span>, ''und es zeigt sich in diesem Gedanken nicht der mindeste Widerspruch.'' <span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 398f; https://www.korpora.org/kant/aa03/398.html</ref>
Es ist richtig, wie KANT sagt, der Widerspruch entsteht nicht in dem Gedanken ''':''' <span style="color:#FF6000">»</span>''GOTT ist nicht''<span style="color:#FF6000">«</span>. GÖDEL zeigt daher, dass der Widerspruch erst dann entsteht, wenn von der Annahme ausgegangen wird ''':''' ''<span style="color:#FF6000">»</span>Es ist unmöglich, dass GOTT ist''<span style="color:#FF6000">«</span>. Daraus folgt dann ,regulär‘, mit Hilfe von Axiom-1 und Axiom-2, <span style="color:#00B000">(d.h. mit den Theoremen von den Transzendentalien)</span>, die logische ,Möglichkeit‘ GOTTES, unabhängig von jeder Glaubensüberzeugung. Wie LEIBNIZ klar erkannt hat, muss zuerst, aus dem Widerspruch des Gegenteils, die logische ,Möglichkeit‘, <span style="color:#00B000">(die Konsistenz)</span>, der Existenz GOTTES bewiesen werden ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, bevor daraus die reale ,Notwendigkeit‘ GOTTES abgeleitet werden kann ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, dessen ,Existenz‘ jedoch, aus dem ,Glauben‘, im Voraus, schon angenommen worden ist. Dieser Sachverhalt ist das ausschließliche Spezifikum GOTTES, <span style="color:#00B000">(das <span style="color:#FF6000">»''Privilegium der Gottheit allein''«</span>)</span>, und gilt nur bei GOTT, als dem Unvergleichlichen und Einzigartigen. Dieses ,Spezifikum‘ wird im Theorem ANSELMS abgebildet ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, auf Grund von Axiom-2, das den inneren Zusammenhang, die Koinzidenz auch von ,Möglichkeit‘ und ,Notwendigkeit‘ im Unendlichen, GOTT, erkennen lässt. Bis Zeile 10, im 3. Beweisgang, reicht der Geltungsbereich der ,modal‘-frei gewählten Kalkül-Prämisse :01:, der ,methodologische‘ GOTT-Glaube. In Zeile 11 liegt der ,Schwerpunkt‘ des ontologischen Beweises dann aber am, — modal als notwendig — ,bewiesenen‘ Widerspruch des Gegenteils zum GOTT-Glauben, <span style="color:#00B000"> (formal-syntaktisch dargestellt als widerspruchfreies Antezedens, <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang)</span>, und nicht mehr am ,angenommenen‘ GOTT-Glauben der Kalkül-Voraussetzung, <span style="color:#00B000">(nun dargestellt als Konsequenz <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> im Theorem ANSELMS)</span>. Das Möglichkeits-Korollar-1 muss jetzt immer, wie folgt, gelesen werden ''':''' <span style="color:#FF6000">»''Es ist <u>widerspruchfrei</u> möglich, dass GOTT ist''«</span>. Damit hat er, — angeregt durch LEIBNIZ, und mit ihm —, die fast einhellig akzeptierte Fehldeutung des ontologisch-<span style="color:#4C58FF">„theologischen“</span> Arguments ANSELMS für GOTT durch gewichtige philosophische, <span style="color:#00B000">(KANT<ref>GOTT ist absolut einzigartig und unvergleichlich. KANT macht GOTT jedoch zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, indem er die Existenz, bzw. das ,Sein‘ GOTTES mit dem ,Sein der Dinge‘ gleich setzt. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! KANT verkennt damit die Einzigartigkeit und Besonderheit GOTTES. Das ,Sein‘ der Dinge ist, — wie KANT sagt —, kein ,reales Prädikat’, d.h. Existenz ist keine Eigenschaft. Jedoch in GOTT ist ,Sein‘ ein ,reales Prädikat‘, d.h. Existieren ist ,real‘ die Wesenseigenschaft GOTTES, denn GOTT ist der, der für uns, — aus Liebe —, immer schon ,da‘ ist ''':''' in der ,Hypostatischen Union‘, sowohl als GOTT von Ewigkeit zu Ewigkeit, als auch als Mensch in unserer Zeitlichkeit. Das ist das, was GOTT für uns ausmacht —, sein Wesen.</ref>)</span>, und <span style="color:#4C58FF">„theologische“</span>, <span style="color:#00B000">(THOMAS<ref>GOTT ist absolut einzigartig und unvergleichlich. THOMAS unterscheidet die ,Natur GOTTES‘ nicht von der ,Natur der Dinge‘, indem er die ,Natur‘ des GOTTES ANSELMS irrtümlich mit der ,Natur‘ der Dinge gleich setzt. Damit reiht er GOTT unter die vielen Dinge unserer Welt ein, indem er für den GOTT ANSELMS annimmt ''':''' GOTT ,esse in rerum natura‘, d.h. wörtlich, dass der GOTT ANSELMS in der ,Natur‘ der Dinge existiert, <span style="color:#00B000">(was ANSELM nie gesagt hat)</span>. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! Die ,zeitlose-überzeitliche‘ Wirklichkeit, (Natur), GOTTES ist völlig verschieden und unabhängig von der zufälligen Wirklichkeit, (die ,Natur‘), unserer ,raum-zeitlichen‘ Welt. Daher ist sie mit dieser auch nicht vergleichbar. Thomas verkennt damit die Einzigartigkeit und Besonderheit GOTTES.</ref>)</span>, Autoritäten zurechtgerückt, welche die Einzigartigkeit und Unvergleichlichkeit des Unendlichen, GOTT, bei ihrer Beurteilung des Theorem ANSELMS nicht berücksichtigt, sondern den Unendlichen, <span style="color:#00B000">(irrtümlich)</span>, unter die endlichen Dinge unserer Welt eingereiht haben. GÖDEL hat mit dem bewiesenen Widerspruch des Gegenteils zum GOTT-Glauben, den Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Theorem ANSELMS geliefert, was, nach LEIBNIZ, für die Akzeptanz dieses Theorems noch gefehlt hat. Das Theorem ANSELMS besagt universell ''':''' Die <span style="color:#FF6000">»''theologische Weltanschauung''«</span> der Juden, Christen und Muslime, <span style="color:#00B000">(und des ägyptischen Pharaos ECHNATON und seiner Frau NOFRETETE)</span>, die ,annehmen‘, dass es mit ,Notwendigkeit‘ <span style="color:#4C58FF">— ‚'''□'''‘ —</span> <span style="color:#00B000">(nur)</span> einen GOTT gibt, ist logisch richtig und <span style="color:#FF6000">»''mathematisch evident''«</span>, weil es <u>ohne Widerspruch</u> ,denkbar‘ <span style="color:#4C58FF">— ‚'''◇'''‘ —</span> ist, dass es GOTT gibt ''':''' Nicht mehr und nicht weniger, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>.
Es geht hier bei GÖDEL nicht um Theoriefindung oder ähnliches. GÖDEL ist kein ,spekulierender‘ Theoretiker. GÖDEL ist Logiker und Mathematiker. Was er sagt, ist mathematisch wahr und logisch richtig. Wenn er sagt, dass die Aussage ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ — »''wahr''«</span> ist ''':''' <span style="color:#FF6000">»''es ist möglich, dass es Gott gibt'' ''':''' ''das ist ,wahr‘ wegen Axiom-2 (und Axiom-1)''«</span>, dann spricht er hier von der mathematischen Wahrheit. Logischerweise ist dann die konträre Aussage ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ — »''falsch''«</span> ''':''' <span style="color:#FF6000">»''es ist nicht möglich, dass es einen Gott gibt''«</span>, und zwar mathematisch falsch, weil sich aus dieser Aussage ein Widerspruch ergibt. Jeder, der die mathematische Logik GÖDELS lesen kann, kann das sehen und verstehen ''':''' Das Zwischenergebnis, <span style="color:#00B000">(Term :20:)</span>, in dieser Kalkül-Ableitung, die logische Konsequenz aus der Annahme des dezidierten Atheismus, es sei unmöglich, dass es GOTT gibt, ist der faktische, nachprüfbare, und für jeden Menschen sichtbare Beweis dafür, dass diese Annahme in einen Widerspruch mündet, und damit falsch und unlogisch ist. Das bedeutet, es ist eine Tatsache, bzw. es ist ein allgemein gültiges Faktum unser Welt, dass der Atheismus, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, wirklich falsch und unsinnig ist, und daher, mit Recht, als ,Unsinn‘ bezeichnet werden darf '''!''' Das ist nicht bloß als eine Theoriefindung, oder als eine Interpretation eines Autors zu verstehen. Das ist vielmehr genau so wahr und <span style="color:#FF6000">»''mathematisch evident''«</span>, wie, dass zwei mal zwei vier ergibt, und wirklich genau so logisch richtig, wie, dass die Erde sich um die Sonne dreht. Das ist gerade das Überraschende und Unerwartete am Gödel-Kalkül. Es geht hier nicht mehr um Theoriefindung oder Interpretationen, denen man zustimmen kann oder nicht. Es geht hier <span style="color:#FF6000">»''rein verstandesmäßig''«</span> um mathematisch-logische Fakten. Damit steht GÖDEL, in seiner Bedeutung, in gewisser Weise, neben KOPERNIKUS, weil seine Kalkül-Ergebnisse, wie die Berechnungs-Ergebnisse dieses Pioniers der damaligen Zeitenwende, heute, in unserem Äon, ebenfalls mit eingefleischte Vorurteile aufräumen, ohne aber, dass GÖDEL für sich selbst, im Glauben, logisch konsequent gewesen wäre. <span style="color:#00B000">(Er ist sich der Tragweite und der Konsequenzen seiner <span style="color:#4C58FF">„axiomatischen Theologie“</span> anscheinend nicht bewusst gewesen, wenn er sagt ''':''' Man sei heute noch <span style="color:#FF6000">»''weit davon entfernt, das theologische Weltbild wissenschaftlich begründen zu können''«</span>, nachdem sein Kalkül das <span style="color:#FF6000">„atheistische Weltbild“</span> fundamental ins Wanken gebracht und als irrationalen ,Unsinn‘ entlarvt hat. Sein Kalkül ,beweist‘ ( ╞ ) indirekt, dass das <span style="color:#FF6000">„theologische Weltbild“</span>, im Beweisgang ,Widerlegung‘, aus dem Widerspruch des Gegenteils, mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span>, offensichtlich doch, wissenschaftlich begründet werden kann)</span>.
----
Kurt GÖDEL ist auch deswegen ein Ausnahmelogiker.
----
===<div class="center"><span style="color:#660066">Epilog für Skeptiker</span></div>===
Wenn man das GÖDEL-Argument genau liest, dann ist nur die Annahme ''':''' <span style="color:#FF6000"> „es ist möglich, dass es GOTT gibt“</span> bewiesen, weil aus der Annahme ''':''' <span style="color:#FF6000">„es ist unmöglich, dass es GOTT gibt“</span> ein logischer Widerspruch ableitbar ist. Die Aussage ''':''' <span style="color:#FF6000">„es gibt GOTT“</span> ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Menschen, der dann aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann ''':''' <span style="color:#FF6000">»''es gibt GOTT wirklich''«</span>, wenn er will ''':''' <span style="color:#FF6000">»''Es stimmt also, was ich glaube '''!''''' «</span> Das ist das Argument ANSELMS, der ein christlicher Amtsträger war, und der daher von dieser Grundannahme auch ausgeht. Solange in den Voraussetzungen des Möglichkeitsbeweises im GÖDEL-Kalkül kein Widerspruch nachweisbar ist, und solange in der logischen Durchführung dieses Beweises keine schweren Mängel festgestellt werden können, ist das Ergebnis des Möglichkeitsbeweises, wie GÖDEL ihn durchgeführt hat, korrekt, und die Folgerungen daraus, logisch richtig, dass es sich hier um <span style="color:#FF6000">»''mathematische Evidenz''«</span> handelt, <span style="color:#00B000">(z. B. wie 2 x 2 = 4)</span>. Aber niemand ist gezwungen, aus der Möglichkeit, dass es GOTT gibt, daraus zu schließen, dass es GOTT auch mit Notwendigkeit gibt, wie das im Argument ANSELMS geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit LEIBNIZ, der selbst an GOTT geglaubt hat, mit Bestimmtheit sagen ''':''' <span style="color:#FF6000">»''gesetzt, dass GOTT möglich ist, so ist er, was das Privilegium der Gottheit allein ist''«</span>, weil GÖDEL mit seinem Kalkül den noch ausstehenden Beweis der Widerspruchsfreiheit dafür geliefert hat.
Wenn Du den 3. Beweisgang des GÖDEL-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument ANSELMS, der identisch ist mit dem Term in der Zeile 10, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, immer noch formallogisch abhängig ist von der methodologischen Glaubens-Prämisse, Term :01:, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den Gott der Christen''«</span>. Diese Abhängigkeit ist bis zur Zeile 10 offensichtlich und logisch korrekt. <span style="color:#00B000">(Man könnte nach dieser Zeile, ohne Weiteres, ,regulär‘ die <span style="color:#FF6000">„logische Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A→B ]</span> mit Term :01: und Term :10: als ein mögliches Korollar bilden ''':''' <span style="color:#4C58FF">— ‚'''Gx→□∃xGx'''‘ — </span>)</span>. Das bedeutet, der Konsequenz-Teil im Theorem ANSELMS, der in diesem ,regulär‘-möglichen Korollar an zweiter Stelle steht, ist damit in seiner Formal-Struktur offensichtlich ,regulär‘ von der Glaubens-Prämisse, Term :01:, abhängig, d.h. er ist der Ausdruck einer Glaubensüberzeugung. Im Theorem ANSELMS steht er jetzt, in der Zeile 11, als Konsequenz-Teil auch an zweiter Stelle, hat aber nicht mehr seine Glaubens-Prämisse als notwendige Bedingung an erster Stelle vor sich, wie im ,regulär‘-möglichen Korollar. Jetzt steht eine neue und andere Voraussetzung als Begründung vor ihm. Der Schwerpunkt des Argument ANSELMS liegt damit am Begründungs-Teil des ANSELM-Theorems, der jetzt die erste Stelle im Theorem einnimmt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist möglich, dass es GOTT gibt''«</span>, der erst dadurch entstanden ist, und davon abhängig ist, weil sein Gegenteil ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist unmöglich, dass es GOTT gibt''«</span>, zu einem Widerspruch geführt hat. Dieser Begründungs-Teil, das Antezedens, im Argument ANSELMS, ist daher nicht mehr von der methodologischen Glaubens-Prämisse, Term :01:, abhängig, sondern nur vom Axiom-1, der Widerspruchsfreiheit, und von der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften im Axiom-2, die im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, die Widerspruchsfreiheit der Möglichkeit des GOTT-Glaubens mit Notwendigkeit herbeigeführt haben. Daraus ergibt sich eine logische Verschiebung in der Argumentationskette, denn dieser Begründungs-Teil, der jetzt die Widerspruchsfreiheit für den Konsequenz-Teil liefert, ist selbst unabhängig und frei von jeder Glaubensüberzeugung. Weil widerspruchsfrei und <span style="color:#FF6000">»''mathematisch evident''«</span>, muss er als logische Begründung für die Widerspruchsfreiheit und als Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Konsequenz-Teils gelesen werden, und damit bestätigt er die Widerspruchsfreiheit und Sinnhaftigkeit der Glaubensüberzeugung eines gläubigen Menschen, <span style="color:#00B000">(was auch das Ziel ANSELMS war)</span>. Das heißt also ''':''' der Glaube dieses Menschen ist widerspruchsfrei und sinnvoll, und enthält keinen Zirkelschluss, weil sein Gegenteil, der Nicht-GOTT-Glaube, zu einem Widerspruch führt; <span style="color:#00B000">(das hat GÖDEL mit seinem Kalkül-System bewiesen, dessen Argumentationskette mit einem Computer-Programm, dem sog. ,Theorembeweiser‘, überprüft worden ist, und als <span style="color:#FF6000">»''nachweisbar korrekt''«</span> befunden wurde)</span>. Das Theorem ANSELMS beweist, nach GÖDEL, dass der Glaube an GOTT, mit <span style="color:#FF6000">»''mathematische Evidenz''«</span> notwendig widerspruchsfrei und sinnvoll ist, weil der Nicht-GOTT-Glaube notwendig zu einem Widerspruch führt. <u>Das Theorem beweist jedoch nicht, dass die Existenz GOTTES notwendig ist</u>, <span style="color:#00B000">(wie es fast immer fälschlich gelesen wurde und wird)</span>, sondern, das Theorem ANSELMS geht davon aus, als nicht hinterfragtes Faktum, dass GOTT notwendig, schon immer existiert, und beweist, mit dem GÖDEL-Kalkül, dass diese Glaubens-Annahme widerspruchsfrei und sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL abschließend sagt. GOTT hat es ja auch nicht ,nötig‘, bewiesen zu werden. Für den Erzbischof ANSELM war die Existenz GOTTES, überall und jederzeit, die ungefragte und für ihn die selbstverständlichste Voraussetzung aller seiner Bemühungen, in seinem Leben, und in seinem Beruf als christlicher Amtsträger, und auch als Theologe in den philosophischen Überlegungen über seinen Glauben. Mit diesen Überlegungen hat er, mit GÖDEL, bewiesen ''':''' Glaube ist nicht irrational, kein Sprung ins Unbekannte, sondern eine freie, vernünftige Entscheidung. Glaube ist rational und vertrauenswürdig.
Zusammengefasst heißt das Ergebnis dieser Bemühungen ANSELMS ''':''' Wenn Du an GOTT glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist auch logisch in der <u>bewiesenen Möglichkeit</u>, dass es GOTT geben kann, begründet, und damit ist er widerspruchsfrei, sinnvoll und kein Zirkelschluss. Dein Glaube an GOTT beruht jedoch, nach wie vor und in erster Linie, auf Deiner freien Entscheidung für GOTT, und nicht auf dem Zwang einer ,logischen‘ Argumentation. Wenn Du nicht an GOTT glauben willst, dann <u>musst Du, und sollst Du, auch nicht deswegen</u> an GOTT glauben, weil der Nicht-GOTT-Glaube zu einem Widerspruch führt, und damit falsch und unlogisch ist. Denn der Glaube an GOTT muss immer eine freie und Deine ganz persönliche Entscheidung für GOTT sein und bleiben. Niemand darf zum Glauben an GOTT gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Warum '''?''' Weil GOTT die Liebe ist '''!''' Und die Liebe duldet keinen Zwang '''!'''
Zum Abschluss, und für eine bessere Verständlichkeit dieser Studie, hat die KI, der ich diese Studie für die Erstellung eines Podcast übergeben habe, eine, — sogar für Kinder —, verständliche Metapher kreiert. Sie sagt, man stelle sich vor ''':''' Es sei irgendwo ein ,Schatz’ vergraben, und es gäbe auch eine ,Schatzkarte’ für diesen ,Schatz’. Kurt GÖDEL ist nun gekommen, und hat mit seinem Kalkül bewiesen, dass diese ,Schatzkarte’ korrekt ist und fehlerfrei. Ob aber jemand, mit Hilfe dieser ,Schatzkarte’ auf ,Schatzsuche’ gehen will oder nicht ''':''' das ist und bleibt jedem selbst überlassen, und ist immer eine freie, und ganz persönliche Entscheidung. Damit hat die KI erstaunlich treffend, sowohl die Bedeutung, als auch die reale Funktion des GOTT-Glaubens in der Lebens-Wirklichkeit unserer Welt und Zeit charakterisiert, in Übereinstimmung mit der Gleichniserzählung JESU vom ,Schatz im Acker’; <small><span style="color:#00B000">( vgl. {{Bibel | Matthäus-Evangelium |13|44|EU}} )</span></small>. Der ,Schatz’ ist die <span style="color:#FF6000">„<span style="font-family: Times;"><big>Βασιλεία του Θεού</big></span>“</span><span style="color:#00B000"> | ,Basileía tou Theoú’</span>, d.h. das <span style="color:#CC66FF">»''Königtum GOTTES''«</span>, oder auch das <span style="color:#CC66FF">»''Himmelreich''«</span>. Die ,Schatzkarte’ ist der Glaube an GOTT. Die ,Schatzsuche’ ist der Weg des Glaubens in der Nachfolge JESU, der uns den Weg zeigt zum Ziel, zur Erfüllung aller unserer Sehnsüchte und Wünsche.
----
----
;Fußnoten
<references />
5vjqmpjpk6obohjlusqtp9wz7azl0nx
1090682
1090681
2026-09-11T06:14:15Z
Santiago
19191
/* Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘ */ ::daher:: hinzugefügt
1090682
wikitext
text/x-wiki
[[Kategorie: Buch]]
{{Regal|ort=Philosophie}}
{{Vorlage:StatusBuch|9}}
==<div class="center"><span style="color:#660066">'''Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘'''</span></div>==
<span style="font-family: Times;"><big><div class="center">לַמְנַצֵּ֗חַ לְדָ֫וִ֥ד אָ֘מַ֤ר נָבָ֣ל בְּ֭לִבּוֹ אֵ֣ין אֱלֹהִ֑ים הִֽשְׁחִ֗יתוּ הִֽתְעִ֥יבוּ עֲלִילָ֗ה אֵ֣ין עֹֽשֵׂה־טֽוֹב׃
(Psalm 14,1)</div></big></span>
----
===<div class="center"><span style="color:#660066">Vorwort</span></div>===
Zur Orientierung ''':''' Die Diskussion um GOTT läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser ANSELM gesagt ''':''' <span style="color:#FF6000">»''Ich glaube an GOTT'' … <span style="color:#00B000">[ sonst wäre er sicher
nicht Erzbischof von Canterbury geworden ]</span> … ''aber ich möchte auch wissen und verstehen, ob das stimmt und sinnvoll ist, was ich da glaube '''!''''' «</span> Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Professor und Philosoph aus Königsberg, Immanuel KANT, hat das, was ANSELM da aufgeschrieben hat, gelesen, <span style="color:#00B000">(vermittelt durch CARTESIUS)</span>, und das dann den <span style="color:#FF6000">„ontologischen Gottesbeweis“</span> genannt, <span style="color:#00B000">(obwohl es in Wirklichkeit gar kein Gottesbeweis ist; genauer ''':''' es ist kein Beweis für die Existenz GOTTES)</span>, und dieser große KANT hat dann großartig bewiesen, das, was ANSELM da aufgeschrieben hat, sei falsch. Es sei <span style="color:#FF6000">„ja gar kein“</span> Gottesbeweis '''!''' <span style="color:#00B000">( Naja, was denn sonst '''?''' )</span> Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichbaren GOTT mit hundert Talern in seinem Vermögenszustande verglichen hat. <span style="color:#00B000">(Das ist aber eine andere Geschichte.)</span> Hundert Taler und GOTT haben ,an sich‘ nichts gemeinsam, außer, wenn KANT ,wirklich‘ hundert Taler hat, und GOTT auch ,wirklich‘ existiert, <span style="color:#00B000">(wie ANSELM und gläubige Menschen glauben)</span>, dann gibt es GOTT und die Taler eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit KANT läuft die ganze Diskussion um GOTT immer nur als Diskussion um den <span style="color:#00B000">(von KANT)</span> so genannten <span style="color:#FF6000">„ontologischen, <span style="color:#00B000">[ kosmologischen, teleologischen etc. ]</span> Gottesbeweis“</span> —, obwohl es niemals einen Beweis für die Existenz GOTTES geben kann und niemals geben wird. <span style="color:#00B000">(Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich versucht zu sagen, weil keiner dieser sog. Beweise für die Existenz eines GOTTES stringent ist.)</span> Beweisen kann man die Existenz von Naturgesetzen. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie dann mit Mehrheitenbeschlüsse verändern. Wenn GOTT ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz GOTTES wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. GOTT ist <span style="color:#FF6000">„Person“</span>, — für Christgläubige ''':''' <span style="color:#FF6000">„ein GOTT in drei Personen“</span>. Und GOTT ist <span style="color:#FF6000">„Geist“</span>. Das besagt, dass GOTT nicht mit materiellen Dingen aus unserer Welt verglichen werden darf; <span style="color:#00B000">(was sowohl THOMAS von Aquin als auch Immanuel KANT doch getan haben)</span>. Und ganz wesentlich ''':''' der Zugang zu GOTT läuft nicht über den Beweis, sondern immer nur über den Glauben. Wer an GOTT glauben will, dem antwortet GOTT auf seine Weise — nämlich <span style="color:#FF6000">„geistig“</span> bzw. <span style="color:#FF6000">„geistlich“</span>. Wer nicht an GOTT glauben will, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Glaube ist immer eine freie Entscheidung des Menschen für GOTT. Niemand darf gezwungen werden. Wenn es einen Beweis für GOTT gäbe, wäre jeder vernünftige Mensch gezwungen, an GOTT zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Existenzbeweis für GOTT '''!!!''' ... Daher darf man das Kalkül des Logiker GÖDEL, <span style="color:#00B000">(und damit auch das Theorem ANSELMS)</span>, nicht als einen Existenzbeweis für GOTT lesen. Sowohl ANSELM als auch GÖDEL setzen die Existenz GOTTES notwendig als gegeben schon voraus. Das GÖDEL-System, und auch das Theorem ANSELMS, sind bloß die logische Bestätigung der Widerspruchsfreiheit der Glaubensüberzeugung eines Menschen, der sich schon entschieden hat, an GOTT zu glauben; und nicht der Grund für seine Entscheidung. Alle sogenannten ,Gottesbeweise‘, sind in Wirklichkeit nichts anderes, als nachträgliche Evaluierungen eines GOTT-Glaubens, bzw. ,Wege‘, <span style="color:#00B000">(bei THOMAS von Aquin)</span>, die aufzeigen, dass der GOTT-Glaube widerspruchsfrei, sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL sagt. GOTT hat es nicht nötig, ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> zu werden.
===<div class="center"><span style="color:#660066">Einleitung</span></div>===
Eine Studie zum GÖDEL-Kalkül. Der Logiker Kurt GÖDEL <span style="color:#00B000">(1906-1978)</span> hat mit diesem Kalkül eine moderne Rekonstruktion des, <span style="color:#00B000">(von KANT)</span>, so genannten ‚ontologischen Gottesbeweises‘ nach ANSELM von Canterbury auf modal-logischer Basis vorgelegt. Damit hat er die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt, d.h. sie soll für jeden Menschen nachvollziehbar sein, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie er sagt. GÖDEL ,nimmt‘ als Logiker, angeregt durch den Philosophen und Mathematiker Gottfried Wilhelm LEIBNIZ, rein theoretisch, fürs Erste, einmal ‚an‘, <span style="color:#00B000">(als Prämisse, d.i. der Term :01: im 3. Beweisgang zum Theorem ANSELMS im Anhang)</span>, dass es GOTT gibt ''':''' d.i. ein sog. ,methodologischer GOTT-Glaube‘, und untersucht die logischen Konsequenzen. Dabei zeigt sich, beim genaueren Hinsehen, dass der ‚Nicht-GOTT-Glaube‘, der ‚dezidierte‘ Atheismus, <span style="color:#00B000">(im Beweisgang ,Widerlegung‘ im Anhang)</span>, überraschender Weise, zu einem Widerspruch führt, und damit logisch ,falsch‘ ist. Jedoch, GÖDEL kann und will mit seinem Kalkül keinen ,GOTT-Glauben‘ ,erzeugen‘, d.h. das GÖDEL-Kalkül ist kein <span style="color:#FF6000">„Existenz-Beweis"</span> für den GOTT der Bibel, sondern, es setzt die Existenz eines GOTTES, einfach als gegeben, schon voraus. GÖDEL beweist dann mit seinem System, dass der traditionelle abendländische ,GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, <span style="color:#00B000">(d.i. die Kalkül-Prämisse, und das, daraus ,regulär‘ (├ ) abgeleitete, Theorem ANSELMS)</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> <span style="color:#00B000">(d.h. logisch ,richtig‘)</span> ist, im Gegensatz zum ,Nicht-GOTT-Glauben‘, der davon ausgeht, dass es keinen GOTT gibt. GÖDEL beweist mit seinem System ''':''' der traditionelle GOTT-Glaube ist, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, widerspruchfrei und daher wahr. <span style="color:#00B000">(Der Beweis aus dem Widerspruch des Gegenteils ist ein ,indirekter Beweis‘ und kein ,Zirkelbeweis‘ '''!''' )</span> GÖDEL blieb bis zu seinem Tod ohne ein dezidiertes religiöses Bekenntnis. <span style="color:#00B000">(Das Leben ist nicht immer ,logisch‘.)</span>
Entsprechend der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> ist GOTT der Größte, <span style="color:#FF6000">»''über dem nichts Größeres mehr gedacht werden kann''«</span>, <span style="color:#00B000">(ANSELM)</span>; bzw. <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>, und der für uns immer schon ,da‘ ist. Das ist die methodologische Prämisse des GÖDEL-Kalküls. Davon ausgehend, zeigen seine Axiome und Definitionen, dass es zu einem Widerspruch führt, falls man ,annimmt‘, es sei nicht möglich, dass es <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> gibt. Aus dem Widerspruch des Gegenteils wird von GÖDEL, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, dann ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> ''':''' es ist doch möglich, dass es <span style="color:#FF6000">„GOTT“</span> wirklich gibt. Somit ist der Glaube an <span style="color:#FF6000">„GOTT“</span>, — weil widerspruchsfrei —, mit den Worten GÖDELS ''':''' <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span>.
Immanuel KANT <span style="color:#00B000">(1724-1804)</span> scheint diesen Fall vorausgesehen zu haben, dass versucht werden könnte, die ,Möglichkeit‘ GOTTES aus einem Widerspruch zu ,beweisen‘ ''':'''
::<span style="color:#FF6000">»</span> <span style="color:#00B000">[ Angenommen, es gibt ]</span> ''doch einen und zwar nur diesen '''Einen''' Begriff'' <span style="color:#00B000">[ ,GOTT‘, so dass ]</span> ''das Nichtsein oder das Aufheben seines Gegenstandes'' <span style="color:#00B000">[ GOTT ]</span>, ''in ,sich selbst‘ widersprechend sei; und dieses ist der Begriff des allerrealsten Wesens. Es hat, sagt ihr, alle Realität'', <span style="color:#00B000">[ bzw. alle Vollkommenheit ]</span>, ''und ihr seid berechtigt, ein solches Wesen als ,möglich‘ anzunehmen'' ... <span style="color:#00B000">[ denn das GÖDEL-Kalkül ,beweist‘ ( ╞ ) in der ,Widerlegung‘ im Anhang, wie auch im 1. Beweisgang, aus einem Widerspruch, dass die Existenz GOTTES definitiv logisch ,möglich‘ ist. ]</span> … ''obgleich der sich nicht widersprechende'', <span style="color:#00B000">[ ,mögliche‘ ]</span>, ''Begriff'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''noch lange nicht die'' <span style="color:#00B000">[ reale ]</span> ''Möglichkeit des Gegenstandes'', <span style="color:#00B000">[ GOTT ]</span>, ''beweiset. … Das ist eine Warnung, von der Möglichkeit der Begriffe (logische)'', <span style="color:#4C58FF">— '''◇''' —</span>, ''nicht sofort auf die Möglichkeit der Dinge (reale)'', <span style="color:#4C58FF">— '''□''' —</span>, ''zu schließen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 399; https://www.korpora.org/kant/aa03/399.html</ref>. <span style="color:#00B000">[ Trotz dieser Warnung, wird dieser Schluss dennoch im Theorem ANSELMS vollzogen, bzw. mit GÖDEL im 3. Beweisgang ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> '''!''' ]</span>. <span style="color:#FF6000">«</span>
Warum das <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist, und inwieweit KANT sich irrt, wird in dieser Studie gezeigt.
===<div class="center"><span style="color:#660066">Der Schlüsselbegriff im Kalkül</span></div>===
Der ‚Schlüsselbegriff‘ in diesem Kalkül ist <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Perfektion“, „Vollkommenheit“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Für diesen wichtigen Begriff gibt es aber im Kalkül selbst keine explizite Definition, sondern er wird nur durch seine Verwendung innerhalb des Kalküls indirekt ‚definiert‘. <span style="color:#00B000">(Das heißt ''':''' <span style="color:#4C58FF"> — ‚'''P'''‘ — </span> bezeichnet ein System von ,Eigenschaften‘, die ,positiv‘, bzw. ,vollkommen‘ | ,perfekt‘ | genannt werden, von denen im Kalkül wohl beweisbar ist, dass sie sich gegenseitig ,nicht widersprechen‘, weil sie im System als solche ,gleichwertig‘, bzw. gleich ,wahr‘ sind, jedoch ohne sie erschöpfend aufzählen zu können, oder auch nur sagen zu können, was sie alle im einzelnen bedeuten, außer, dass sie kompatibel sind.)</span> Mit der Wahl dieses Schlüsselbegriffes hat GÖDEL eine wesentliche Vorentscheidung für die Ergebnisse des Kalküls getroffen '''!''' In seinen Notizen zum ‚ontologischen Beweis‘ vom 10. Februar 1970 gibt GÖDEL, — für die nachträgliche Interpretation dieses Begriffes <span style="color:#00B000">(und auch für das Kalkül selbst)</span> —, die richtungsweisende Erklärung ''':'''
::<span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne...''«</span>
::Und er fügt in Klammer hinzu ''':'''
::<span style="color:#FF6000">»...''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span><ref>GÖDEL, Kurt, ''<span style="font-family: Times;"><big>‚Ontological proof‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Collected Works‘</big></span>'', vol. III, ed. S.FEFERMAN et al., Oxford (U.P.), 1995; 403–404.</ref>
GÖDEL-Axiom-1 ''':''' <span style="color:#4C58FF">— ‚('''PX <small><math>{ \color{Blue} \dot\lor}</math></small> P¬X''')‘ ↔<span style="color:#00B000"> ‚('''¬PX ↔ P¬X''')‘</span> — </span> ''':''' <span style="color:#FF6000"> »''Entweder die Eigenschaft'' <span style="color:#4C58FF">‚'''X'''‘</span> ''oder ihre Negation'' <span style="color:#4C58FF">‚'''¬X'''‘</span> ''ist positiv''«</span>. Hier ist der Hauptkritikpunkt, dass es Eigenschaften gibt, die ,an sich‘ weder positiv noch negativ sind. Beispiele wären ''':''' ‚rothaarig‘ oder ‚schwerwiegend‘; solche Eigenschaften können aber ,für mich‘ entweder positiv oder negativ sein, abhängig von meiner Betrachtungsweise und subjektiven Vorlieben. Diese Eigenschaften, wie ‚rothaarig‘ an sich, oder meine positiv-negativen ‚Betrachtungsweisen‘, sind jedoch der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> entnommen und treffen nicht den <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Er orientierte sich an LEIBNIZ, welcher im Bezug zum ‚ontologischen Beweis‘ definiert ''':'''
::<span style="color:#FF6000">»''Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''nenne ich jede einfache Eigenschaft, die sowohl positiv als auch absolut ist, oder dasjenige, was sie ausdrückt, ohne jede Begrenzung ausdrückt''.«</span><ref>Zitiert nach Thomas GAWLICK, in ''<span style="font-family: Times;"><big>‚Was sind und was sollen mathematische Gottesbeweise ?‘</big></span>'', Predigt vom 8.1.2012 in der Kreuzkirche zu Hannover. https://web.archive.org/web/20130524164359/http://www.idmp.uni-hannover.de/fileadmin/institut/IDMP-Studium-Mathematik/downloads/Gawlick/Predigt_Gawlick_Gottesbeweise.pdf</ref>
Die Seins-Eigentümlichkeiten <span style="color:#00B000">(Daseinsmodi, Perfektionen)</span> wie ‚wahr‘, ‚gut‘, ‚edel‘ usw. entsprechen dem <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Das sind Beispiele für ‚absolut‘ positive Begriffe aus der Lehre der Seinsanalogie ''':''' <span style="font-family: Times;"><big>‚verissimum‘, ‚optimum‘, ‚nobilissimum‘</big></span>, usw., die, an sich, <span style="color:#FF6000">»''ohne jede Begrenzung gelten''«</span>; zu finden in der <span style="font-family: Times;"><big>‚Via quarta‘</big></span>, bei THOMAS von Aquin, über die <span style="color:#FF6000">„analoge"</span> Abstufung im ‚Sein‘ der Dinge. Diese <span style="color:#FF6000">„analoge"</span> ‚Abstufung‘ ist dann die faktische Begrenztheit <span style="color:#00B000">(d.h. Unvollkommenheit)</span> im <span style="color:#FF6000">»''zufälligen''«</span> ‚Sein‘ der Dinge —. Die <span style="color:#FF6000">„positiven Eigenschaften“</span> GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, wie Wahrheit, Einheit, Gutheit, <span style="color:#00B000">(von ,Güte‘)</span>, Schönheit, Adel, <span style="color:#00B000">(von ,edel‘)</span>, Gleichheit, Andersheit, Wirklichkeit, ,Sein‘ im Sinne von Etwas-sein, etc. werden <span style="color:#FF6000">„Perfektionen“</span>, oder auch <span style="color:#FF6000">„Transzendentalia“</span> genannt, <span style="color:#00B000">(von lateinisch ''':''' <span style="font-family: Times;"><big>transcendere</big></span>, <span style="color:#FF6000">„übersteigen“</span>)</span>. In der mittelalterlichen Scholastik sind Transzendentalien die Grundbegriffe, die allem Seienden als <span style="color:#FF6000">„Modus“</span>, <span style="color:#00B000">(d.h. ,Eigentümlichkeit‘, als allgemeine Seinsweisen)</span>, zukommen. Wegen ihrer Allgemeinheit ,übersteigen‘ sie die besonderen Seinsweisen, welche ARISTOTELES die ,Kategorien‘ nannte. Ontologisch betrachtet, werden die Transzendentalien als das allem Seienden Gemeinsame aufgefasst, da sie von allem ausgesagt werden können. Von der KI werden sie, nicht unpassend, als <span style="color:#FF6000">„ultimative Eigenschaften des Seins“</span> bezeichnet, die <span style="color:#FF6000">„jenseits der materiellen Welt existieren“</span>, <span style="color:#00B000">(da sie ,ultimativ‘ nur von GOTT, als den unbegrenzt Vollkommenen, ausgesagt werden können, die jedoch, auch von allen übrigen Seienden, wegen deren seinsmäßigen Unvollkommenheit und Begrenztheit, abgestuft, d.h. <span style="color:#FF6000">„analog"</span>, ausgesagt werden)</span>. Diese Transzendentalien sind ,inakzident‘, das heißt, sie entstehen nicht aus anderen Begriffen, sondern sind erste, unteilbare Bestimmungen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> des Denkens und des Seins, die allen Seienden ''':''' <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span>, unabhängig von ihren speziellen Eigenschaften, als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(bzw. Unvollkommenheiten)</span>, mit ,modaler‘ Notwendigkeit, <span style="color:#4C58FF">— ‚□‘ —</span>, <span style="color:#FF6000">„analogisch"</span> zukommen, d.h. sie sind in allen Seienden, seinsmäßig abgestuft und abgegrenzt, ,relativ‘ zum unbegrenzt Unendlichen ihrer selbst, und <span style="color:#FF6000">»''dasjenige, was sie ausdrücken, drücken sie ohne jede Begrenzung aus''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>; und damit stehen sie ontologisch in einer <span style="color:#FF6000">„analogen"</span> ,Beziehung‘ zu GOTT, dem absolut Vollkommenen und unbegrenzt Unendlichen. In der Erkenntnisordnung wirken sie als die ersten Begriffe des menschlichen Verstehens, die eine Basis für alle weiteren wissenschaftlichen Erkenntnisse bilden. In der Seinsordnung sind die Transzendentalien ontologisch eins, gleichwertig, <span style="color:#00B000">(,mathematisch äquivalent‘)</span>, und daher konvertierbar, d.h. austauschbar, <span style="color:#00B000">(vgl. z. B. den scholastischen ,Merksatz‘ ''':''' <span style="font-family: Times;"><big>,ens et verum convertuntur‘</big></span>)</span>. Damit sind sie auch von einander abhängig, was GÖDEL sowohl im Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, für positive Eigenschaften, als auch in der Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, für die Wesenseigenschaften, syntaktisch formalisiert hat mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, weil sie sich gegenseitig, — mit ,modaler‘ Notwendigkeit —, gleichwertig ,implizieren‘, d.h. einschließen, <span style="color:#00B000">(im Axiom-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span>, und in der Definition-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''y'''‘ — </span>)</span>. Man kann die Transzendentalia, <span style="color:#00B000">(wie GÖDEL)</span>, auch ,Wesenseigenschaften‘ ''':''' <span style="color:#4C58FF"> — ‚'''X'''<sub>ess</sub>‘ —</span>, nennen, weil sie allem Seienden <span style="color:#FF6000">„wesentlich analog"</span> zukommen. Weil Transzendentalien miteinander austauschbar sind, sind sie auch widerspruchsfrei, was GÖDEL mit Axiom-1 syntaktisch darstellt. Die Gültigkeit und Wahrheit, d.h. die mathematisch-logische Evidenz von Axiom-1 und Axiom-2, beruht auf der ontologischen Allgemeinheit und Gültigkeit der Transzendentalia, die GÖDEL mit Definition-2, in sein Kalkül explizit eingeführt und als Wesenseigenschaften ,bestimmt‘ hat. <span style="color:#00B000">(Definitionen werden formal-syntaktisch durch das Äquivalenzzeichen <span style="color:#4C58FF">,'''↔'''‘</span> angezeigt, gelesen als <span style="color:#FF6000">„...ist genau dann ... wenn...“</span>)</span> Die GÖDEL-Axiome und -Definitionen werden jedoch sofort <span style="color:#FF6000">„modal falsch"</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit ,Nicht-Transzendentalia‘, wie z. B. ,rot‘ oder ,schwer‘, belegt werden. <span style="color:#00B000">(Dieser ,Sachverhalt‘ wird von Kritikern des GÖDEL-Systems, — zu vorschnell —, verwendet, um ihre Behauptungen zu ,belegen‘, das GÖDEL-Kalkül und seine Konsequenzen seien ,falsch‘.)</span>
Zum Überblick ''':''' <span style="color:#FF6000">„Transzendentalia“</span> sind universale, alles Seiende charakterisierende Begriffe, die über kategoriale Einteilungen hinausgehen, und sowohl in der klassischen Scholastik, als auch in der modernen Philosophie, <span style="color:#00B000">(KANT, Uwe MEIXNER<ref>vgl. die ,transzendentalen‘ Bedingungen möglicher Erkenntnisse bei KANT; und auch in der ,Axiomatischen Ontologie‘ bei Uwe MEIXNER</ref>)</span>, als Grundlage der Metaphysik und Erkenntnistheorie dienen. Sie sind die <span style="color:#FF6000">„ersten Begriffe des Seins“</span>, die jedem Ding als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(Perfektionen)</span>, inhärent sind, <span style="color:#FF6000">„analogisch"</span> abgestuft, auf einen ,ultimativ‘-unbegrenzten Bezugspunkt ausgerichtet, und die sich im Denken, <span style="color:#00B000">(für uns als wahr)</span>, und in der moralischen Wertung, <span style="color:#00B000">(für uns als gut und edel)</span>, manifestieren, relativ zum ,ultimativ‘-unbegrenzten Bezugspunkt ihrer selbst. Die faktische, zusätzliche Unvollkommenheit, die sich generell in der notwendigen, und unausweichlichen Vergänglichkeit aller Dinge zeigt, ist einem ontologischen Defekt ,geschuldet‘, der stark zeitabhängig ist, d.h. der einen Anfang und ein Ende hat.
Das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''Notwendige Existenz ist eine positive Eigenschaft''«</span>, ist immer falsch, wenn es auf etwas aus der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> angewendet wird, wie z. B. auf einen <span style="color:#FF6000">„Tsunami“</span>, dessen ‚Existenz‘ für uns nicht ‚positiv‘ ist. KANT hat schon festgestellt ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Das gilt für alles, was <span style="color:#FF6000">„existiert“</span>. Das Axiom-5 hat nur dann seine Gültigkeit, ist nur dann ,wahr‘, wenn <span style="color:#FF6000">„Dasein“</span> <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span> <span style="color:#00B000">(Essenz)</span> in eins zusammenfallen. Bei allen Dingen, die ‚da‘ sind, ist ihr ‚Da-Sein‘ ontologisch immer verschieden zu dem ‚was‘ sie sind ''':''' zu ihrem ,Was-Sein‘. In der philosophischen Tradition, seit ARISTOTELES, wird die ontologische Identität, d.i. die Koinzidenz, der innere Zusammenhang von ‚Sein‘ und ‚Wesen‘ allein nur dem <span style="color:#FF6000">„selbst ‚unbewegten‘ Erstbewegenden“</span> zugeschrieben, dem <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“</span><span style="color:#00B000"> | ,prôton kinoûn akinêton‘</span>, von dem ARISTOTELES etwas später sagt ''':''' <span style="color:#FF6000">»''denn dies ist der Gott''«</span> und dann hinzufügt ''':''' <span style="color:#FF6000">»''so sagen wir ja''«</span>; d.h. das ist eine Interpretation aus dem Glaubenskontext des ARISTOTELES. Er war ein Gott-gläubiger Grieche. Wer an GOTT glaubt, kann das nachvollziehen. GÖDEL musste dieses Axiom-5 postulieren, sonst wäre sein Kalkül nicht aufgegangen, ohne dass er deswegen schon an GOTT glauben müsste. Er hat für sein Kalkül das ontologische Theorem von der Identität von ‚Sein‘ und ‚Wesen‘ im ‚unbewegten Erstbeweger‘ des ARISTOTELES benutzt, ohne diese Herkunft explizit referenziert zu haben. <span style="color:#00B000">(Gilt auch für Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit, das GOTT-Sein, das ‚Dasein‘ GOTTES, ist eine positive Wesenseigenschaft, eine Perfektion; d.h. ist das ‚Wesen‘ GOTTES ''':''' GOTT ist perfekt''«</span>)</span>. Die ontologische Identität von Sein und Wesen, Existenz und Essenz, wie auch die Koinzidenz von Möglichkeit und Wirklichkeit, von Ursache und Wirkung, sowie auch die ontologische Einheit von <span style="color:#00B000">(Erkenntnis-)</span>Subjekt und <span style="color:#00B000">(Erkenntnis-)</span>Objekt im <span style="color:#FF6000">»''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“</span><span style="color:#00B000"> | ,noêseôs noêsis‘ <small>(<span style="font-family: Times;"><big>,''Metaphysik''‘</big></span> XII 9, 1074b34)</small></span>, und der innere Zusammenhang der <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, gilt nur in der <span style="color:#FF6000">„unverursachten Letztursache"</span>, auf die ARISTOTELES bei seiner Prinzipienforschung gestoßen ist.
Es gibt verschiedene Versuche, die GÖDEL-Axiome durch sog. ,Modelle‘, relativ zu einfacheren ,Welten‘, zu verifizieren, um damit ihre relative Konsistenz nachzuweisen. Für GÖDEL aber <span style="color:#FF6000">»''sind die Axiome nur dann'' <span style="color:#00B000">[ in unserer ,realen‘ Welt ]</span> ''wahr'' <span style="color:#00B000">[ und annehmbar ]</span>«</span>, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt'' <span style="color:#00B000">[ d.h. jeder auch nur ,möglichen‘ Welt ]</span> ''sind''«</span>. Diese Bedingung verweist jede Verifikation und jede Interpretation der Axiome auf das ,Nicht-Zufällige‘, das ,Notwendige‘, ,Absolute‘, in dem die Axiome und Definitionen des GÖDEL-Kalküls erst dadurch ihren Sinn und ihre Bedeutung bekommen, wenn sie vom ,Absoluten‘ und ,Unendlichen‘ her erklärt und verstanden werden. Damit insistiert GÖDEL auf eine genuin <span style="color:#4C58FF">,theologische‘</span> Interpretation seines Kalküls, mit der <span style="color:#4C58FF">„Theologie“</span> zum Begriff GOTT, dem unbegrenzt Unendlichen, als Verifikationskriterium. Das entspricht auch der ,methodologischen‘ Prämisse seines Kalküls. Die wichtigsten Axiome und Definitionen im GÖDEL-Kalkül sind jedoch bloße ,Annahmen‘, deren Evidenz, sowohl die ,mathematische‘ als auch die <span style="color:#4C58FF">,theologische‘</span>, erst evaluiert, d.h. ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> werden muss. Das bedeutet ''':''' die logische Verifikation der Axiome und Definitionen von GOTT und seinen Vollkommenheiten kann nur Kalkül-intern durch den Aufweis ihrer Widerspruchsfreiheit erfolgen, d.i. <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span>. Logisch evaluierte und verifizierte Axiome und Definitionen sind die ,modal‘ notwendigen, d.h. die ,transzendentalen‘ Voraussetzungen für die Ergebnisse eines Kalküls, damit seine Theoreme und Korollare in unserer ,realen‘ Welt als logisch ,wahr‘ und damit für uns auch als ,annehmbar‘ gelten können, während die Prämissen eines Kalküls, <span style="color:#00B000">(die Argument Einführung, <span style="color:#4C58FF">— '''AE:''' —</span> )</span>, nicht notwendige, und somit ,modal‘ frei gewählte ,Annahmen‘ sind. Jedoch aus diesen ,modal‘ frei gewählten, ,möglichen‘ <span style="color:#00B000">( <span style="color:#4C58FF">'''◇'''</span> )</span> Prämissen folgen mit Hilfe der ,bewiesenen‘ <span style="color:#00B000">( ╞ )</span> Axiome und Definitionen die Ergebnisse mit ,modaler‘ Notwendigkeit <span style="color:#00B000">( <span style="color:#4C58FF">'''□'''</span> )</span>.
Die Logik des GÖDEL-Systems ist eine ,Prädikatenlogik‘ zweiter Stufe, in der die Quantoren nicht nur Individuum-Variable, sondern auch Eigenschafts-Variable, <span style="color:#00B000">(als noch ,unbestimmte‘ Prädikate im Allgemeinen)</span>, binden können. Die formale Struktur des GÖDEL-Kalküls besteht aus fünf Axiomen und drei Definitionen, mit deren Hilfe in drei Beweisgängen drei Theoreme und mehrere Korollare aus seiner ,methodologischen‘ Prämisse ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitet werden können, wobei die beiden ersten Beweisgänge, mit ihren Ergebnissen, den dritten vorbereiten, in dem es dann um das Theorem ANSELMS geht. Die Prämisse des GÖDEL-Kalküls in allen Beweisgängen ist der traditionelle ,GOTT-Glaube‘, in der Formulierung speziell nach LEIBNIZ. Ein Axiom, eine Definition, zwei Theoreme und alle Korollare im GÖDEL-Kalkül sind Aussagen über <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>. Alle fünf Axiome, eine Definition und ein Theorem, <span style="color:#00B000">(und das Korollar aus Axiom-4)</span>, sind auch Aussagen über die Eigenschaft <span style="color:#FF6000">„Vollkommenheit“, „Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, die in der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> als die Wesenseigenschaft GOTTES gilt ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist vollkommen''«</span> bzw. <span style="color:#FF6000">»''GOTT ist das Vollkommenste der Wesen''«</span>, <span style="color:#00B000">(DESCARTES)</span>. Zwei Definitionen sind Aussagen über die allgemeinen Wesenseigenschaften aller Seienden, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, die Transzendentalien, die, als notwendige Existenz, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, auch GOTT zugeordnet werden, mit der Besonderheit bei GOTT, dass sowohl alle Eigenschaften, als auch alle anderen Zuordnungen, wie Sein und Wesen, wie Ursache und Wirkung, usw., im Unendlichen, GOTT, <span style="color:#FF6000">„koinzident“</span> sind, d.h. in GOTT paarweise perspektivisch in ,eins‘ zusammenfallen, und die auch, als Transzendentalia, konvertierbar, d.h. austauschbar sind. Diese Sachverhalte machen deutlich, dass eine spezifische ,Verifikation‘ und sachgerechte ,Evaluierung‘ der GÖDEL-Axiomatik nur genuin <span style="color:#4C58FF">,theologisch‘</span> erfolgen kann. Die Evaluierung der <span style="color:#FF6000">»''mathematischen Evidenz''«</span> des GÖDEL-Systems, im Allgemeinen, muss jedoch entsprechend der Maßstäbe einer modalen Prädikatenlogik zweiter Stufe durchgeführt werden.
Das GÖDEL-Kalkül unterscheidet <span style="color:#00B000">(in Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>)</span> formal-syntaktisch zwischen der Eigenschaft ,Existenz‘, <span style="color:#4C58FF"> — ‚'''E'''‘ —</span>, die nur GOTT zugeordnet werden kann, und dem Existenz-Operator, <span style="color:#4C58FF">— ‚'''∃'''‘ —</span>, der auch allem Übrigen, das nicht GOTT ist, zugeordnet wird. Es gibt hier auch den formal-syntaktischen Unterschied zwischen der, <span style="color:#00B000">(von mir notierten, jedoch von GÖDEL schon intendierten und angesprochenen)</span>, speziellen ,Notwendigkeit‘, <span style="color:#4C58FF"> — <sub>not</sub> —</span>, die nur der Existenz GOTTES zugeordnet ist, und der modalen ,Notwendigkeit‘, <span style="color:#4C58FF">— ‚'''□'''‘ —</span>, die auf Verschiedenes bezogen werden kann. Diese Unterschiede sind Hinweise, dass GÖDEL in seiner Kalkül-Logik und -Syntax, die Außerordentlichkeit und Eigenständigkeit GOTTES berücksichtigt, der, als Schöpfer der Welt, prinzipiell und absolut <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span> ist, die erst durch GOTT auch das ist, was sie ist.
===<div class="center"><span style="color:#660066">Die Genese des Kalküls</span></div>===
Wie kommt GÖDEL zu seinem Kalkül '''?''' Sein Gewährsmann war Gottfried Wilhelm LEIBNIZ, <span style="color:#00B000">(1646-1716)</span>, den er sehr schätzte. Die rekonstruierbare Genese seines Kalküls findet man in LEIBNIZ ''':''' ''<span style="font-family: Times;"><big>‚Neue Abhandlungen über den menschlichen Verstand‘</big></span>'', <span style="color:#00B000">(1704)</span>‚ ''<span style="font-family: Times;"><big>Viertes Buch, Kapitel X ''':''' ‚Von unserer Erkenntnis des Daseins Gottes‘</big></span>'', Seite 475f.
Hier der <span style="color:#00B000">[ kommentierte ]</span> Textausschnitt zum sog. ontologischen ‚Gottesbeweis‘''':'''
::<span style="color:#FF6000">»</span>''Folgendes etwa ist der Gang seines'' <span style="color:#00B000">[ d.h. ANSELMS, Erzbischof von Canterbury; 1033-1109, ]</span> ''Beweises ''':''' GOTT ist das Größte'', <span style="color:#00B000">[ ANSELM spricht vom biblischen GOTT des Glaubens, als ''':''' <span style="color:#FF6000">»''den, über dem ,Größeres‘'' | <span style="font-family: Times;"><big>‚maius‘</big></span> | ''nicht mehr gedacht werden kann''«</span> ]</span>, ''oder, wie DESCARTES es ausdrückt ''':''' das Vollkommenste der Wesen oder auch ein Wesen von äußerster Größe und Vollkommenheit'' ''':''' <span style="color:#00B000"> [ GÖDEL ''':''' </span><span style="color:#4C58FF">‚'''P'''‘</span> <span style="color:#00B000">:= ‚Perfektion‘, ‚positive Eigenschaft‘ ]</span>, ''das alle Grade derselben in sich schließt.''<span style="color:#00B000"> [ GÖDEL-Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>. Definition-1 bildet die traditionelle Vorstellung von GOTT ab. ]</span> ''Dies also ist der Begriff GOTTES.'' <span style="color:#00B000">[ Der Term <span style="color:#4C58FF">— ,'''G'''‘ —</span> steht hier für den biblischen ‚Begriff‘ <span style="color:#FF6000">„GOTT“</span> als ,Individuumname‘ '''!''' ]</span> ''Sehen wir nun, wie aus diesem Begriff das ‚Dasein’ folgt.''<span style="color:#00B000"> [ GÖDEL ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist notwendig aus sich ‚da‘''«</span> ''':''' Term :10:, 1. Hauptergebnis im 3. Beweisgang. ]</span> ''Es ist etwas <u>mehr</u>, ‚da‘ zu sein, als nicht ‚da‘ zu sein, oder auch das ‚Dasein‘ fügt der Größe oder der Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''einen Grad hinzu, und wie DESCARTES es ausspricht, das ‚Dasein‘ ist selbst eine Vollkommenheit.''<span style="color:#FF6000">«</span>
<span style="color:#00B000">(Diesen Ausspruch DESCARTES übernimmt GÖDEL im Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''notwendige Existenz''</span> [ alias ‚Dasein GOTTES’ ] <span style="color:#FF6000">''ist eine positive Eigenschaft''</span> [ alias Vollkommenheit ]<span style="color:#FF6000">«</span>. Dem widerspricht KANT ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>. Das Axiom-5 ist daher nur dann ‚wahr‘, wenn ‚Wirklichsein‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια οὖσα</big></span>“</span> | ‚enérgeia oúsa‘ | d.h. ‚Dasein‘ und ‚Wesen‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ | — genauer ''':''' ‚Wesenseigenschaften’ —, ontologisch ,eins‘ sind, d.h. wenn <span style="color:#FF6000">„Existieren“</span> immer schon die <span style="color:#FF6000">„Wesenseigenschaft“</span> GOTTES ist. Was nach ARISTOTELES nur im <span style="color:#FF6000">„unbewegten Erstbeweger“</span> der Fall ist; bzw. mit LEIBNIZ ''':''' <span style="color:#FF6000">»''was das Privilegium der Gottheit allein ist''«</span> '''!''' Aus der ,methodologischen‘ ,Annahme‘ im 2. Beweisgang GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den GOTT der Christen''«</span>, und mit Hilfe von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, bzw. <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, mit Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind notwendig aus sich, — von Natur aus —, positiv''«</span>, mit Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span> ''':''' <span style="color:#FF6000">»''Zum Wesen gehören notwendig auch alle Konsequenzen aus einer Wesenseigenschaft''«</span>, und mit Axiom-1 und der Definition für GOTT, folgt nach einigen logischen Umformungen das GÖDEL-Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist genau dann der GOTT der Christen, wenn das Wesen dieses GOTTES sein eigenes Sein ist''«</span>. Dasein und Wesen sind im Unendlichen, GOTT <span style="color:#FF6000">„koinzident“</span> ,eins‘, übereinstimmend mit dem Theorem des ARISTOTELES. Mit diesem, im Kalkül <u>ohne</u> Axiom-5 ,regulär‘ (├ ) abgeleiteten Theorem, widerlegt er KANT für den individuellen Spezialfall <span style="color:#4C58FF">‚'''G'''‘</span> := <span style="color:#FF6000">„GOTT“</span>. Nachprüfbar im Anhang ''':''' im ‚ontologischen‘ Beweis für das Basis-Theorem-2. Somit ist Axiom-5 ,wahr‘, und KANT, der <span style="color:#FF6000">»''eine Abneigung gegen das Gebet hatte''«</span> und auch <span style="color:#FF6000">»''nie zu den sonntäglichen Kirchgängern zählte''«</span><ref>Uwe SCHULTZ ''':''' ‚''<span style="font-family: Times;"><big>Immanuel Kant</big></span>''‘, Rowohlt Monographie 50659, Seite 12</ref>, hat sich hier, im Bezug auf GOTT, geirrt. <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, war für KANT nie eine ernstzunehmende Option. Die <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, die natürlich immer auch verbunden sein muss mit der täglichen ,Erfahrung‘ einer Glaubens-Praxis, im Gebet und in den Gottesdienst-Feiern des <span style="color:#4C58FF">„Theologen“</span>, und die daraus entsteht, ist eine ziemlich ,ausgereifte‘ Disziplin. Es haben sich, durch Jahrhunderte hindurch, viele gläubige und auch gescheite Menschen, schon im Judentum, und dann im Christentum, und ebenfalls im Islam, darum bemüht.)</span>
:: <span style="color:#FF6000">»</span>''Darum ist dieser Grad von Größe und Vollkommenheit oder auch diese Vollkommenheit, welche im ‚Dasein‘ besteht, in diesem höchsten, durchaus großen, ganz vollkommenen Wesen, denn sonst würde ihm ein Grad fehlen, was gegen seine Definition wäre. Und folglich ist dies höchste Wesen ‚da‘. Die Scholastiker, ohne selbst ihren'' <span style="font-family: Times;"><big>doctor angelicus</big></span> <span style="color:#00B000">[ := THOMAS von Aquin ]</span> ''auszunehmen, haben diesen Beweis verachtet'', <span style="color:#00B000">[ wie später auch Immanuel KANT ]</span>, ''und ihn als einen Paralogismus'' <span style="color:#00B000">[ := Fehlschluss ]</span> ''betrachtet, worin sie sehr unrecht gehabt haben; und DESCARTES, welcher die scholastische Philosophie im Kolleg der Jesuiten zu La Flèche lange genug studiert hatte, hat sehr recht gehabt, ihn wieder zu Ehren zu bringen. Es ist nicht ein Paralogismus, sondern ein unvollständiger Beweis'', <span style="color:#00B000">[ den GÖDEL vervollständigt hat ]</span>, ''der etwas voraussetzt, was man noch hätte beweisen sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' <span style="color:#00B000">[ '''::''' <span style="color:#4C58FF">— '''◇''' —</span> '''::''' ,möglich‘, ,konsistent‘, ,denkbar‘; GÖDEL beweist im 1. Beweisgang aus Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, <span style="color:#FF6000">»''positive Eigenschaften'', <span style="color:#00B000">[ die allgemeinen Transzendentalien ]</span>, ''sind widerspruchsfrei''«</span>, mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, folgt Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist widerspruchsfrei möglich''«</span> ]</span>. ''Und es ist schon etwas, dass man durch diese Bemerkung beweist ''':''' gesetzt, dass GOTT'' <span style="color:#00B000">['' <span style="color:#FF6000">»widerspruchsfrei«</span> '']</span> '',möglich‘ ist, so ‚ist‘ er'' <span style="color:#00B000">[ ,notwendig‘ '''::''' <span style="color:#4C58FF">— '''□''' —</span> '''::''' für jede mögliche Welt auch wirklich aus sich ‚da‘ ]</span>, ''was das Privilegium der Gottheit allein ist'' ''':''' <span style="color:#00B000">[ Im 3. Beweisgang, Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' ‚ANSELMS Prinzip‘ ''':''' <span style="color:#FF6000">»''Weil GOTT widerspruchsfrei ,möglich‘ ist, darum ist auch der Glaube widerspruchsfrei, der annimmt, dass GOTT aus sich ,notwendig‘ da ist''«</span>; mit Korollar-3 ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ —</span>, <span style="color:#FF6000">»''Es gibt notwendig nur einen einzigen GOTT''«</span>. Damit ist auch der Monotheïsmus bewiesen. ]</span> ''Man hat recht, die Möglichkeit eines jeden Wesens anzunehmen und vor allem die GOTTES, bis ein anderer das Gegenteil beweist''. <span style="color:#00B000">[ Das Gegenteil besagt, dass GOTT ,unmöglich‘ ist. Hier setzt der Möglichkeitsbeweis im GÖDEL-Kalkül an, und beweist, dass diese Aussage zu einem Widerspruch führt. ]</span> ''Somit gibt dieser metaphysische Beweis schon einen moralischen zwingenden Schluss ab, wonach wir dem gegenwärtigen Stande unserer Erkenntnisse zufolge urteilen müssen, dass GOTT ‚da‘ sei, und demgemäß handeln.'' <span style="color:#00B000">[ Aber nicht logisch zwingend '''!''' Denn die Interpretation <span style="color:#4C58FF">— ‚'''G'''‘ —</span> mit dem GOTT der Bibel, als ,methodologische‘ Kalkül-Prämisse, ist nicht zwingend, jedoch ,modal‘ möglich, <span style="color:#4C58FF">— '''◇''' —</span>, und im christlichen Glaubenskontext sinnvoll, was mit einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls gezeigt werden kann. Damit wäre dann auch die Frage beantwortet, ob das GÖDEL-System sich plausibel als eine Theorie von GOTT und seinen Eigenschaften interpretieren lässt, bzw. als eine <span style="color:#FF6000">»''axiomatische''«</span> <span style="color:#4C58FF">„Theologie“</span>, wie sie André FUHRMANN apostrophiert. Das <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ist der ,Individuumname‘ für den GOTT der Bibel, — ,GOTT‘ groß geschrieben —, im monotheïstischen, christlichen Glaubenskontext, den auch LEIBNIZ teilt. Dann steht der ,Name‘ auch synonym für das ,existierende‘ Individuum, d.h. für dessen ,Existenz‘. ]</span> ''Es wäre aber doch zu wünschen, dass gescheite Männer'' <span style="color:#00B000">[ sic ! ]</span> ''den Beweis mit der Strenge einer mathematischen Evidenz vollendeten'', <span style="color:#00B000">[ was GÖDEL veranlasst hat, seine Version eines ‚ontologischen Beweises’ zu kreieren, dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> man heute mit Computerprogrammen<ref>siehe Fußnote 12</ref> schon nachgewiesen hat ]</span> ... <span style="color:#FF6000">«</span>.
Für GÖDEL war dieser Text eine intellektuelle Herausforderung, und er hat sie angenommen. Das war für GÖDEL sicher keine Glaubensangelegenheit. GOTT hat es ja auch nicht nötig, ‚bewiesen‘ zu werden. Wer <span style="color:#4C58FF">— ‚'''G'''‘ —</span> z. B. mit dem sog. ‚Urknall‘ gleich setzt, macht die <span style="color:#FF6000">»''zufällige Struktur der Welt''«</span> im ‚Urknall‘, <span style="color:#00B000">(pantheistisch)</span> zu einem ,Gott‘, was GÖDEL dezidiert für sein Kalkül ausgeschlossen haben wollte.
Kurt GÖDEL schreibt 1961 in einem Brief, in Anlehnung an den obigen Text ''':'''
::<span style="color:#FF6000">»...''ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig ''<span style="color:#00B000">[ sic '''!''' ]</span>, ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', <span style="color:#00B000">[ dass es GOTT gibt ]</span>, ''mit allen bekannten Tatsachen'', <span style="color:#00B000">[ z. B. mit den Maßstäben einer modernen Logik ]</span>, ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker LEIBNIZ versucht''.«</span><ref>Zitiert nach SCHIMANOVICH-GALIDESCU, M.-E. ''':''' ‚''<span style="font-family: Times;"><big>Princeton–Wien 1946–1966. Briefe an die Mutter</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kurt Gödel – Leben und Werk</big></span>''‘, Hg. B.BULDT et alia, Wien (HÖLDER–PICHLER–TEMSKY), 2001, Band 1</ref>
===<div class="center"><span style="color:#660066">Die Interpretation des Kalküls</span></div>===
Wenn man sich das GÖDEL-Kalkül ansieht, wie es heute formalisiert vorliegt, stellt sich die Frage ''':''' <span style="color:#FF6000">„Lässt sich dieses System plausibel als eine Theorie von GOTT <span style="color:#00B000">(als eine ‚Rede von GOTT’ := <span style="color:#4C58FF">,Theologie’</span>)</span> und seiner Eigenschaften verstehen '''?''' “ — „Ist hier eine genuin <span style="color:#4C58FF">,theologische’</span> Interpretation möglich '''?''' “</span> Seine Herkunft aus der intellektuellen Auseinandersetzung des Logikers GÖDEL mit dem GOTT-gläubigen Philosophen LEIBNIZ und dem christlichen Theologen und Erzbischof ANSELM rechtfertigt diese Frage. Die <span style="color:#FF6000">„mathematische Evidenz“</span> des GÖDEL-Formalismus, <span style="color:#00B000">(im Anhang nachgestellt)</span>, ist allgemein anerkannt, <span style="color:#00B000">(Vorbehalte dagegen gibt es nur bei der Interpretation seiner Syntax, d.h. ob die Axiome und Definitionen, wie GÖDEL sie konzipiert hat, bzw. ob die Theoreme und Korollare, die aus diesen Axiomen ,regulär’ (├ ) abgeleitet werden, auch in unserer realen Welt ,wahr’ und ,annehmbar’ sind)</span>. Die <span style="color:#FF6000">„theologische Evidenz“</span> des GÖDEL-Systems wird durch eine ,Verankerung’ der Axiome und Definitionen in den <span style="color:#4C58FF">,theologisch’</span>-philosophischen Diskurs über GOTT evaluiert, der schon seit zweieinhalbtausend Jahren läuft. In diesen zweieinhalbtausend Jahren hat sich, — gegen ARISTOTELES und die antike Philosophie —, die Erkenntnis durchgesetzt, dass GOTT <span style="color:#FF6000">»''unabhängig''«</span> von der <span style="color:#FF6000">»''zufälligen''«</span> Raum-Zeit-Struktur unserer vergänglichen Welt ist. In meiner Darstellung des GÖDEL-Kalküls folge ich, <span style="color:#00B000">(im Unterschied zum Autographen GÖDELS, vom 10. Feb 1970)</span>, in der Axiom-Formulierung und -Nummerierung, in der Syntax, und in der Beweis-Struktur, der Arbeit von André FUHRMANN ''':''' ''<span style="font-family: Times;"><big>‚Existenz und Notwendigkeit. Kurt Gödels axiomatische Theologie‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Logik in der Philosophie‘</big></span>'' Hg. SCHROEDER-HEISTER, SPOHN und OLSSON, 2005, Synchron, Heidelberg, Seite 349–374. <span style="color:#00B000">(Die tiefer gestellte Notation der spezifischen ,Eigenschaft‘ einer Eigenschaft ist meine Ergänzung zur formalen Syntax, z. B. ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>'''x'''‘ — </span>, angeregt durch die indizierende Schreibweise GÖDELS ''':''' <span style="color:#4C58FF">— ,'''G''' Ess. '''x'''’ —</span>.)</span> Die Erkenntnisse zur Straffung und Präzisierung der GÖDEL-Syntax, <span style="color:#00B000">(besonders im Möglichkeitsbeweis)</span>, stammen aus der Arbeit von Günther J. WIRSCHING ''':''' ,''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, im Web <ref>https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf</ref>. <span style="color:#00B000">(Auch der Hinweis auf AVICENNA kommt von WIRSCHING.)</span> Die Zitate von THOMAS von Aquin´s Stellungnahme zum Theorem ANSELMS, und von Georg Wilhelm Friedrich HEGEL zur Immanuel KANTS Ablehnung des Theorem ANSELMS, befinden sich in Franz SCHUPP, ,<span style="font-family: Times;"><big>''Geschichte der Philosophie im Überblick''</big></span>‘, Band 2 ‚<span style="font-family: Times;"><big>''Christliche Antike, Mittelalter''</big></span>‘, Hamburg 2003, Seite 168 und Seite 170.
Meines Erachtens ist der entscheidende Ansatzpunkt einer <span style="color:#4C58FF">„theologischen“</span> Interpretation das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>.
‚Frei‘ nach KANT ‚formuliere‘ ich ‚kurz‘ ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Hier die Positionen KANTS zum Thema ‚Existenz‘ und ‚Eigenschaften‘ ''':'''
::<span style="color:#FF6000">»</span>''… unbeschadet der wirklichen Existenz äußerer Dinge'', <span style="color:#00B000">[ kann man ]</span> ''von einer Menge ihrer Prädikate'', <span style="color:#00B000">[ d.h. Eigenschaften ],</span> ''sagen'' … ''':''' ''sie gehöreten nicht zu diesen ‚Dingen an sich selbst‘, sondern nur zu ihren Erscheinungen, und hätten außer unserer Vorstellung'' <span style="color:#00B000">[ ihrer, als ,wirklich‘ gedachten Erscheinung, ]</span> ''keine eigene Existenz, … weil ich finde, dass … '''alle Eigenschaften, die die Anschauung eines Körpers ausmachen''', bloß zu seiner Erscheinung gehören; denn die Existenz des Dinges, was erscheint, wird dadurch nicht … aufgehoben, sondern nur gezeigt, dass wir es'', <span style="color:#00B000">[ das Ding ]</span>, ''wie es ‚an sich selbst‘ sei'', <span style="color:#00B000">[ d.h. existiert ]</span>, ''durch Sinne gar nicht erkennen können''.<span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Prolegomena zu einer jeden künftigen Metaphysik, die als Wissenschaft wird auftreten können</big></span>''‘, Seite 289; https://www.korpora.org/kant/aa04/289.html</ref> <span style="color:#00B000"><small>(Hervorhebung durch KANT.)</small> [ Seine Prädikate, d.h. Eigenschaften, jedoch können wir mit unseren Sinnen ,anschauen‘, aber nur in Kombination mit unserer Vorstellung ihrer, als ,wirklich‘ gedachten Erscheinung, vermittelt durch den sog. ,transzendentalen Schematismus‘ unserer Einbildungskraft ''':'''</span> <span style="color:#FF6000">»</span>''Eine verborgene Kunst in den Tiefen der menschlichen Seele''<span style="color:#FF6000">«</span>, <span style="color:#00B000">jedoch auch eines der ,dunkelsten‘ Kapitel in der K.d.r.V., bedingt durch KANTS Konzept von ,Wirklichkeit‘, bzw. ,Sein‘. ]</span>
Mit anderen Worten, man kann die ‚Existenz‘, bzw. das ‚Sein‘ der Dinge, <span style="color:#00B000">(das ‚Ding an sich’ bei KANT)</span>, nicht unter dem Mikroskop finden. Die ‚Existenz‘ bzw. das ‚Sein‘ ist keine sinnlich registrierbare ‚Eigenschaft‘ z. B. des rekonstruierten ‚Stadt-Schlosses‘ in Berlin. <span style="color:#00B000">(‚Sein‘ ist kein reales ‚Prädikat‘.)</span> Dafür haben wir andere Fähigkeiten ''':''' Ich kann seine ‚Existenz‘ mit meinem Verstand einsehen, weil auch ich selbst ‚existiere‘. Seine ‚Ansicht‘, wie ‚gefällig‘ es ist, und auch weitere ‚Eigenschaften‘, die mir auffallen, kann ich mit einem Handy-Foto dokumentieren. Diese ‚Eigenschaften‘ sind nicht die Ursache, dass das ‚Berliner Schloss‘ existiert. Wohl aber die Rekonstruktion dieses Schlosses ist die ‚Ursache‘, dass es ,existiert‘, und jetzt so aussieht. Insofern ist ‚Existenz‘ keine ‚Eigenschaft‘, sondern die ‚Existenz‘ des Dinges ist die Voraussetzung, der ‚Grund‘, dass ich die ‚Eigenschaften‘ des Dinges mit meinen Sinnen feststellen kann.
In einer Auseinandersetzung mit CARTESIUS schreibt KANT, philosophisch ‚tiefgründig‘ und logisch ‚exakt‘, über dessen <span style="color:#FF6000"><span style="font-family: Times;"><big>„Cogito, ergo sum“</big></span></span> ''':'''
::<span style="color:#FF6000">»</span>''Das ‚Ich denke‘ ist ein empirischer Satz, und hält den Satz ‚Ich existiere‘ in sich. Ich kann aber nicht sagen ''':''' ‚Alles, was denkt, existiert‘; denn da würde die Eigenschaft des Denkens'', <span style="color:#00B000">[ eine essentielle Eigenschaft ]</span>, ''alle Wesen, die sie besitzen, zu notwendigen'' <span style="color:#00B000">[ d.h. notwendig existierenden ]</span> ''Wesen machen''. <span style="color:#00B000">[ Was allein nur von GOTT ausgesagt werden kann; mit AVICENNA, als anerkannter ARISTOTELES-Kommentator ''':''' <span style="color:#FF6000">»''GOTT ist das einzige Sein, bei dem Essenz'' <span style="color:#00B000">[ ‚Wesenseigenschaften‘ ]</span> ''und Existenz'' <span style="color:#00B000">[ ‚Dasein‘ ]</span> ''nicht zu trennen sind und das daher notwendig an sich da ist''«, <span style="color:#00B000">— konform mit GÖDEL ''':'''</span> »''notwendige Existenz ist eine positive'' <span style="color:#00B000">[ essentielle ]</span> ''Eigenschaft''«</span> ].</span> ''Daher kann meine Existenz auch nicht aus dem Satz, ‚Ich denke‘, als'' <span style="color:#00B000">[ logisch ]</span> ''gefolgert angesehen werden, wie CARTESIUS dafür hielt (weil sonst der Obersatz : ‚Alles, was denkt, existiert‘, vorausgehen müsste), sondern ist mit ihm identisch.'' <span style="color:#00B000">[ Eine einfache Schlussfolgerung ''':''' meine ‚Existenz‘ ist auch nicht von meiner ‚Eigenschaft‘ Denken ‚verursacht‘. ,Existenz‘ ist nicht bloß ein ,Gedanke‘ von mir. ]</span><span style="color:#FF6000">«</span> <span style="color:#00B000">(Aus der Anmerkung 41 zu den ‚''<span style="font-family: Times;"><big>Paralogismen der reinen Vernunft</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 275,<ref>https://korpora.org/kant/aa03/275.html</ref> mit meinem Einschub des AVICENNA-Zitat aus Wikipedia.<ref>{{w|Avicenna#Metaphysik}}</ref>)</span>
Mit anderen Worten ''':''' <span style="color:#FF6000">„Die Eigenschaft, dass ich denken kann, ist nicht die Ursache meiner ‚Existenz‘“</span>, sondern, <span style="color:#FF6000">„Die Liebe meiner Eltern und ihre Entscheidung füreinander ist die Ursache meiner ‚Existenz‘. Daher ‚bin’ ich. Und weil ich ein Mensch ‚bin‘, kann ich denken.“</span> Auch mit diesen Anmerkungen ist leicht einsehbar, dass ‚Existenz‘ keine ‚Eigenschaft‘ ist — außer bei GOTT. In GOTT ist ‚Dasein‘ die ‚Wesenseigenschaft‘ GOTTES, d.h. ‚Dasein‘ und ‚Wesen‘ sind in GOTT untrennbar verbunden; sind <span style="color:#FF6000">„koinzident“</span> ‚eins‘. Das ist die Einzigartigkeit im Wesen GOTTES, dass GOTT immer schon ‚da‘ ist. Die Frage nach dem ‚Wesen‘ GOTTES lautet ''':''' <span style="color:#FF6000">„Was bist du ? “</span>/<span style="color:#CC66FF">„Wer bist Du ? “</span> Antwort, Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'' <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Weil GOTT für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, hat GOTT es nicht nötig, ‚bewiesen‘ zu werden. <span style="color:#00B000">(In der Mathematik ist ein ‚Satz‘ erst dann ‚wahr‘ und ‚existent‘, wenn er bewiesen ist. Bei GOTT ist es jedoch nicht so ''':''' GOTTES ‚Existenz‘ ist nicht erst dann ‚wahr‘, wenn seine ‚Existenz‘ von uns ‚bewiesen‘ ist. Sein ‚Dasein‘ ist jedem unserer ‚Beweisversuche‘ immer schon voraus. Der Zugang zu GOTT ist nicht der ,Beweis‘, sondern der ,Glaube‘. Wer an GOTT glauben ,will‘, dem antwortet GOTT. Wer nicht an GOTT glauben ,will‘, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Die Glaubens-Entscheidung hat jedoch für jeden Menschen eine existenzielle Konsequenz ''':''' <span style="color:#CC66FF">»''Wer glaubt und sich taufen lässt, wird gerettet; wer aber nicht glaubt'', <span style="color:#00B000">[ und diese Entscheidung auch im Augenblick der ,Wahrheit‘, im Tod, in der sog. ,Endentscheidung‘, nicht widerruft ]</span>, ''wird verurteilt werden''«,</span> <small>({{Bibel | Markus Evangelium |16|16|EU}})</small>. Das Urteil lautet ''':''' <span style="color:#CC66FF">»''zweiter Tod ''':''' der Feuersee''«</span>, <small>({{Bibel | Offenbarung |20|14f|EU}})</small>, ohne Berufungsmöglichkeit. <span style="color:#CC66FF">»''Ohne Glauben aber ist es unmöglich, Gott zu gefallen; denn wer zu Gott kommen will, muss glauben, dass er ist und dass er denen, die ihn suchen, ihren Lohn geben wird''«.</span> <small>({{Bibel | Hebräer Brief |11|6|LUT}})</small>)</span>
Das GÖDEL-Axiom-5 ist m.E. der entscheidende Ansatzpunkt einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation der GÖDEL-Axiomatik.
===<div class="center"><span style="color:#660066">Das Kalkül ist kein Existenz-Beweis für GOTT</span></div>===
Die allgemeine <span style="color:#FF6000">»''mathematische Evidenz''«</span> des GÖDEL-Formalismus, d.h. seine ‚Schlusskraft‘, ist von kompetenten Leuten<ref>„GÖDELS Argumentationskette ist nachweisbar korrekt – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO nun gezeigt;“ vgl. https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html</ref> schon festgestellt worden, <span style="color:#00B000">(im Anhang ‚nachrechenbar‘ mit den Regeln und Gesetzen einer modalen Prädikatenlogik 2. Stufe)</span>. Das GÖDEL-Kalkül ist jedoch kein ‚moderner‘<span style="color:#FF6000">„Existenz-Beweis“</span> für GOTT, wofür es gehalten oder meistens bezweifelt wird, sondern setzt, <span style="color:#00B000">(theoretisch methodisch)</span>, den <span style="color:#FF6000">„Glauben an die Existenz GOTTES“</span> schon voraus, ohne ihn zu hinterfragen. Das <span style="color:#FF6000">„Dasein“</span> bzw. die <span style="color:#FF6000">„Existenz“</span> GOTTES wird mit der Definition-1 für <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, bzw. mit dem Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, im Kalkül ‚definitorisch‘ bzw. ‚axiomatisch‘ als Kalkül-,Annahme‘, als <span style="color:#FF6000">„Prämisse“</span>, eingeführt, unter der Voraussetzung, dass die ‚Eigenschaft‘ <span style="color:#4C58FF">‚'''G'''‘ := </span><span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(Essenz)</span> und das <span style="color:#FF6000">„Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> <span style="color:#00B000">(Existenz)</span>, ontologisch ‚identisch‘, genauer ''':''' <span style="color:#FF6000">„koinzident“</span> sind, was GÖDEL im Axiom-5 definitiv für sein System vorschreibt ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>. Das <span style="color:#FF6000">„Dasein GOTTES“</span> ist faktisch äquivalent zur <span style="color:#FF6000">„notwendigen Existenz als GOTT“</span>; und <span style="color:#FF6000">„Göttlichkeit“</span> ist die <span style="color:#FF6000">„positive Eigenschaft in GOTT“</span>. Beides ist nach Axiom-5 ‚identisch‘, d.h. dem ‚Sein nach‘ dasselbe, und daher konvertierbar. Beide, <span style="color:#00B000">(sowohl die Essenz, als auch die Existenz GOTTES)</span>, werden daher auch mit demselben Term ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span> im Kalkül dargestellt. Der traditionelle, christliche ,GOTT-Glaube‘ wird zugleich mit diesem Term <span style="color:#4C58FF">‚'''G'''‘ := </span> <span style="color:#FF6000">„GOTT“ <span style="color:#00B000">|</span> „göttlich“</span>, im 2. Beweisgang, dem Basisbeweis, und im 3. Beweisgang für das Theorem ANSELMS, jeweils als ,methodologische‘ Prämisse :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> regulär <span style="color:#00B000">( ├ )</span> und explizit eingeführt ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht für den GOTT'' <span style="color:#4C58FF">‚'''G'''‘</span> ''der Christen''«</span>. Das ist die ,modal‘-frei gewählte, <span style="color:#4C58FF">„theologische“</span> Kalkül-,Annahme‘, <span style="color:#00B000">(als ,Argument-Einführung‘ := <span style="color:#4C58FF">‚'''AE:'''‘</span> )</span>, und wird dann mit Definition-1 näher ,bestimmt‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ — </span> ''':''' <span style="color:#FF6000"> »''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht genau dann für ‚GOTT‘'' <span style="color:#00B000">|</span> ''‚göttlich‘'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle positiven Eigenschaften, bzw. Vollkommenheiten'', <span style="color:#4C58FF">‚'''PX'''‘</span>, ''hat''«</span>, entsprechend dem ‚Quelltext‘ bei LEIBNIZ. <span style="color:#00B000">(Das ,postulierte‘ Axiom-3 ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, wird standardmäßig gelesen als <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, hat aber auch die alternative Leseart ''':''' <span style="color:#FF6000">»''GOTT ist perfekt d.h. vollkommen''«</span>, was <span style="color:#4C58FF">„theologisch“</span> auch richtig ist; mit <span style="color:#4C58FF">‚'''P'''‘ </span> := <span style="color:#FF6000">„Perfektion“/„Vollkommenheit“</span> ist dann die Summe aller <span style="color:#FF6000">„positiven Eigenschaften“</span>.)</span> Mit Axiom-3, — in dieser <span style="color:#4C58FF">„theologischen“</span> Leseart —, ist der ‚Wenn-Satz‘ in Definition-1 ‚aufgelöst‘ ''':''' <span style="color:#FF6000">»''GOTT hat alle positiven Eigenschaften, weil er ‚perfekt‘ ist''«</span>.
In Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, wird die ,für uns‘ <span style="color:#FF6000">„notwendige Existenz“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —, </span> durch die ,aus sich‘ <span style="color:#FF6000">„notwendig“</span> <span style="color:#4C58FF">— '''□''' —</span> instanziierten <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(als zu den Transzendentalia gehörig)</span>, bestimmt. Das GÖDEL-Kalkül setzt sowohl in Definition-3 als auch im Axiom-5 das Theorem des ARISTOTELES von der ontologischen ‚Identität‘, d.i. die Koinzidenz von <span style="color:#FF6000">„Dasein“</span>, <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#00B000">(Essenz)</span> im prinzipiell <span style="color:#FF6000">„unbewegten Erstbewegenden“</span> voraus. Ohne diese Annahme bzw. ohne Axiom-5, würde das GÖDEL-Kalkül nicht ‚funktionieren‘. Das GÖDEL-Theorem-2.1 ''':''' <span style="color:#4C58FF">— ‚'''Gx→G'''<sub>ess</sub>'''x'''‘ —</span>, kann unter dieser Voraussetzung dann, <span style="color:#4C58FF">„theologisch“</span> richtig und eindeutig, so gelesen werden ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für GOTT'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''als Individuum steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span>, ''das Wesen'', <span style="color:#4C58FF">—<sub>ess</sub>—, </span> <span style="color:#00B000">(,Essenz‘)</span>, ''GOTTES'' <span style="color:#4C58FF">‚'''x'''‘</span>«</span><ref>vgl. z.B. THOMAS von Aquin ''':''' ,''<span style="font-family: Times;"><big>De Ente et Essentia</big></span>''’, Kapitel 5 ''':''' „Deus, cuius essentia est ipsummet suum esse“ ''':''' „GOTT, dessen Wesen sein eigenes Sein ist“.</ref>, statt der <span style="color:#4C58FF">„theologisch“</span> unrichtigen Lesearten in der Wikipedia ''':''' <span style="color:#FF6000">»''Göttlich ist eine essentielle Eigenschaft jedes göttlichen Wesens''«</span><ref>{{w|Gottesbeweis#Kurt_Gödel|Gottesbeweis 2.1.2, Theorem 2}}; Version vom 10.09.2025</ref>, oder bei Christoph BENZMÜLLER et alia, im sog. ,Theorembeweiser‘ ''':''' <span style="color:#FF6000">»''Gottähnlich zu sein ist eine Essenz von jeder gottähnlichen Entität''«</span><ref>[https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html ‚Gödels „Gottesbeweis“ bestätigt’, Theorem 2]</ref>, mit der suggestiven Annahme, es gäbe polytheïstisch, mehrere ,göttliche Wesen‘, bzw. ,gottähnliche Entitäten‘, was der monotheïstischen, abendländischen Tradition, bzw. dem <span style="color:#4C58FF">„theologischen“</span> Theorem von der ,Unvergleichlichkeit‘ und ,Einzigartigkeit‘ GOTTES widerspricht, das im GÖDEL-Kalkül mit Korollar-3 bestätigt wird. <span style="color:#00B000">(Die Interpretation <span style="color:#4C58FF">‚'''G'''‘ :=</span> <span style="color:#FF6000">„GOTT“</span>, als ,Individuumname‘, ist synonym zum <span style="color:#FF6000">„Dasein <span style="color:#00B000">(Existenz)</span> GOTTES“</span>, und äquivalent zur ‚positiven Eigenschaft‘ <span style="color:#FF6000">„Göttlichkeit“</span>, alias <span style="color:#FF6000">„göttlich zu sein“</span> = <span style="color:#FF6000">„GOTT zu sein“</span> = <span style="color:#FF6000">„GOTT-Sein“</span>; und mit dem GÖDEL-Term ''':''' <span style="color:#4C58FF">‚'''G'''<sub>ess</sub>‘ :=</span> <span style="color:#FF6000">„das Wesen <span style="color:#00B000">(Essenz)</span> GOTTES“</span>.)</span>
<div class="center"><span style="color:#FF6000"><span style="color:#4C58FF">‚'''G'''‘ :=</span> „'''G'''öttlichkeit“ <span style="color:#4C58FF">↔</span> „'''G'''OTT“ <span style="color:#4C58FF">↔</span> „'''G'''OTT-Sein“</span> </div>
Die Rechtfertigung für diese <span style="color:#4C58FF">„theologische“</span> Dreifach-Äquivalenz für <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, im GÖDEL-Kalkül, gibt Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''die positive <u>Eigenschaft</u>'', <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ''Göttlichkeit'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''äquivalent zu GOTT als Individuum-Name'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''ist auch äquivalent zum Dasein GOTTES'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''gleichbedeutend mit notwendiger <u>Existenz</u>'', <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>'', dem <u>Sein</u> GOTTES für uns''«</span>. Hier hat GÖDEL explizit <span style="color:#FF6000">„Eigenschaft“</span> mit <span style="color:#FF6000">„Existenz“</span> bzw. <span style="color:#FF6000">„Sein“</span> gleichgesetzt; <span style="color:#00B000">(was jedoch nach KANT für alles, was in unserer Welt ‚existiert‘, bzw. für alles, was zur <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> gehört, wie GÖDEL selbst sagt, in jedem Fall ‚unstatthaft‘ ist ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>)</span>. Jedoch wegen dieser ‚Gleichsetzung‘, die einzig und allein, der aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition entsprechend, singulär nur in GOTT ‚statthaft‘ ist, kann jetzt die ‚positive Eigenschaft‘ <span style="color:#00B000">(Essenz)</span> <span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(ontologisch korrekt)</span> gelesen werden als <span style="color:#FF6000">„das, was GOTT zu dem macht, ‚was‘ GOTT an sich selbst ist“</span>, nämlich zu seinem <span style="color:#FF6000">„GOTT-Sein“</span> <span style="color:#00B000">(Existenz)</span>, zu seinem <span style="color:#FF6000">„Dasein als GOTT“</span>; zur Tatsache, dass <span style="color:#FF6000">„GOTT GOTT ist“</span>, d.h. dass <span style="color:#FF6000">„GOTT als GOTT ‚da‘ ist“</span>. Das ist, <span style="color:#00B000">(und da folgt ARISTOTELES seinem Lehrer PLATO)</span>, nach traditioneller Auslegung, die übliche, ontologische Funktion des ‚Wesens‘<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ |</span> eines Seienden ''':''' es ‚macht‘ das Seiende zu dem, ‚was‘ es ist; es ist die ‚Ursache‘ dafür, dass das Seiende, das ‚ist‘, ‚was‘ es ist | ‚Was-Sein‘ — ‚Wesen‘. <span style="color:#00B000">(ARISTOTELES lokalisiert jedoch das ,Wesen‘ im Seienden, im Gegensatz zu PLATO, der das ,Wesen‘, — ,getrennt‘ vom Seienden —, in den allgemeinen ,Ideen‘ lokalisiert.)</span>
Da aber in ‚Gott‘, <span style="color:#00B000">(dem <span style="color:#FF6000">„unbewegten, ‚unverursachten‘ Erstbeweger“</span>)</span>, Prozesshaftes, ‚Ursächliches‘ auszuschließen ist, ist die übliche prozesshafte, ‚ursächliche‘ Funktion von <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span><span style="color:#00B000"> | ‚ousía‘ |</span> ,Wesen‘ im <span style="color:#FF6000">„Erstbewegenden“</span> nach ARISTOTELES, sozusagen, schon ‚zum Abschluss‘ gekommen, schon ‚verwirklicht‘, — <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐν-έργεια οὖσα</big></span>“</span><span style="color:#00B000"> | ‚en-érgeia oúsa‘</span> —, schon ‚ins-Werk‘ gesetzt; <span style="color:#00B000">(<span style="color:#FF6000">„<span style="font-family: Times;"><big>τὸ ἔργον</big></span>“</span> | ‚to érgon‘ | ‚das Werk‘; <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια</big></span>“</span> | ‚enérgeia‘ | ,Wirksamkeit‘, ,Wirklichkeit‘, ,Aktualität‘, ,Energie‘; und <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὖσα</big></span>“</span> | ,oúsa‘ | feminin Nominativ Singular von <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὤν</big></span>“</span> | ‚ón‘ | ‚seiend‘)</span>. Sein ,Wesen‘ ist im ,Dasein‘ vollendet, ist ,wirkliches, verwirklichendes Sein‘, ‚seiende Aktualität‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>actus purus</big></span>“</span> ''':''' sein Wesen ist ‚reine Tätigkeit‘, ,reine verwirklichende Gegenwärtigkeit‘, d.h. ,existent‘, ohne jede prozesshafte ‚Potenzialität‘. Aus der wichtigen und richtigen Erkenntnis, dass GOTT <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer Welt''«</span> ist, folgt mit der ontologischen Identität von ,Dasein‘ und ,Wesen‘ in GOTT ''':''' Der zeitlos ewige GOTT ist <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''immer schon da''«</span>, m.a.W. ist <span style="color:#FF6000">„zeitlos-ursprungslos“</span>. Insofern ist <span style="color:#FF6000">„Göttlichkeit“</span> die <span style="color:#FF6000">„Wesenseigenschaft“</span>, die im <span style="color:#FF6000">„Dasein GOTTES“</span> d.h. in <span style="color:#FF6000">„GOTT“</span>, schon ihr ‚Ziel‘, ihre Vollendung, — <span style="color:#FF6000">„Perfektion“</span>, Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, erreicht hat. GOTT ist <span style="color:#FF6000">»''vollkommen''«</span> und darum auch <span style="color:#FF6000">»''notwendig für uns immer schon ‚da‘''«</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ — </span>. GOTT ist in seinem ‚zeitlosen Wesen‘ <span style="color:#FF6000">„unverursacht“</span>, da er <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''vollkommen''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''□PG'''‘ —</span>, <span style="color:#00B000">(eine Instanz von Axiom-4)</span>. <span style="color:#FF6000">„Vollkommenheit“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ist die <span style="color:#FF6000">„Wesenseigenschaft“</span>, bzw. das <span style="color:#FF6000">„Wesen GOTTES“</span> ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>. <span style="color:#FF6000">»''GOTT ist ,der‘ Vollkommenste''«</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, d.h. <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist die unbegrenzte Summe der unendlichen Vollkommenheiten''«</span>. Und zur absoluten <span style="color:#FF6000">„Vollkommenheit“</span> gehört <span style="color:#FF6000">„notwendig“</span> auch das <span style="color:#FF6000">„Existieren“</span> ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span>. <span style="color:#FF6000">„Notwendige Existenz“</span> gehört zu den ,ultimativen‘ Transzendentalia in GOTT, was GÖDEL mit Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, syntaktisch formalisiert hat, wenn sowohl das <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, als auch alle <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span> im Kalkül, für den Dreifaltigen GOTT der Christen stehen, was dann im Korollar-3, mit der Identität, <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, bzw. der Koinzidenz beider Individuum-Variablen, explizit gezeigt wird.
Entscheidend für diese Interpretation des GÖDEL-Systems ist ''':''' nur unter der ,modal‘ notwendigen Voraussetzung der ontologischen ‚Identität‘ von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, Theorem-2 ''':''' <span style="color:#4C58FF"> — '''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>, bzw. der ‚Gleichsetzung‘, <span style="color:#00B000">(Koinzidenz)</span>, von <span style="color:#FF6000">„notwendiger Existenz“</span> mit den ‚positiven‘ Wesenseigenschaften, der <span style="color:#FF6000">„Essenz“</span> in GOTT, Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, ‚funktioniert‘ die GÖDEL-Axiomatik '''!''' Diese ‚Identität‘, bzw. ,Koinzidenz‘ wird in ARISTOTELES, ‚''<span style="font-family: Times;"><big>Metaphysik</big></span>''‘, Buch XII 7, in einem Indizienbeweis erbracht, der mit der Methode der philosophischen Induktion zum Ergebnis kommt ''':'''
::<span style="color:#FF6000">» … ''es muss'' <span style="color:#00B000">[ notwendig ]</span> ''etwas geben, das, ohne selbst ‚bewegt‘'' <span style="color:#00B000">[ </span>''worden''<span style="color:#00B000"> ]</span> ''zu sein'', <span style="color:#00B000">[ ‚unentstanden‘ ]</span>, ''alles Übrige wie ein Geliebtes ‚bewegt‘'' <span style="color:#00B000">[ ‚entstehen lässt‘ ]</span>«</span>, das darum selbst ‚zugleich‘ <span style="color:#FF6000">„<span style="font-family: Times;"><big>αἴδιον καί οὐσία καί ἐνέργεια οὖσα</big></span>“ <span style="color:#00B000">| ,aídion kai ousía kai enérgeia oúsa‘ |</span> »<span style="color:#00B000">[ zeitlich-]</span>''ewig, sowohl <u>Wesen</u>'', <span style="color:#00B000">[ etwas Konkretes, Essentielles ]</span>, ''als auch seiende Wirksamkeit — ''<span style="color:#00B000">[ </span>„<span style="font-family: Times;"><big>actus purus</big></span>“, „reine Tätigkeit“<span style="color:#00B000"> ]</span> ''— verwirklichendes, wirkliches <u>Sein</u> ist'', <span style="color:#00B000">[ ein Existierendes, das alles Übrige ,zur Existenz‘ bringen kann ]</span> «</span>, bzw. <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὀρεκτόν καί νοητόν</big></span>“ <span style="color:#00B000"> | ,orektón kai noêtón‘ | </span>»''das ersehnt und erkennbar ist''.«</span> <span style="color:#00B000">(''<span style="font-family: Times;"><big>vgl. ,Metaphysik</big></span>''‘ XII 7, 1072a,23 – 1072b,4)</span>
Was <span style="color:#FF6000">»''alles Übrige''«</span> ,zur Existenz‘ bringen kann, bzw. ,verwirklichen‘ kann, ohne selbst ,entstanden‘ zu sein, muß auch selbst, als etwas Konkretes, Essentielles, immer schon ,existieren‘, bzw. ,wirklich sein‘. Die, daraus abgeleitete, und damit ,erkannte‘, ontologische ‚Identität‘, — ,Koinzidenz‘ —, von ‚Wesen‘ und ‚Sein‘, <span style="color:#00B000">(Ziel aller Sehnsucht und jedes Erkenntnisstrebens)</span>, <span style="color:#FF6000">»''ist das Privilegium der Gottheit allein''«</span> ''':''' mit Gottfried Wilhelm LEIBNIZ interpretiert, entsprechend einer adäquaten, aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition. Dieses induktive, ‚ontologisch‘ a-posteriori Ergebnis aus der ‚Prinzipienforschung‘ des ARISTOTELES ist die metaphysische und logische Voraussetzung, dass GÖDEL seine Axiomatik im Kalkül des sog. ‚ontologischen Gottesbeweises‘ a-priori des ANSELM von Canterbury, und nach LEIBNIZ, deduktiv korrekt formulieren konnte; <span style="color:#00B000">(vgl. 3. Beweisgang)</span>.
Angenommen, die Variable <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für den <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, der Christen, <span style="color:#00B000">(siehe Anhang, Term :01: im 2. Beweisgang)</span>, dann ist, — auf Grund von diesem Beweisgang —, in unserer Welt ,wahr‘ und evident ''':''' sowohl die ‚positive Eigenschaft‘ <span style="color:#FF6000">»''Göttlichkeit''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als auch das faktische <span style="color:#FF6000">»''‚Da‘-Sein'' <span style="color:#00B000">[ Existenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ‚benennen‘, ontologisch ident, denselben Sachverhalt ''':''' nämlich das, was wir das <span style="color:#FF6000">»''Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>, nennen. <span style="color:#FF6000">»''Göttlichkeit'', bzw. ''GOTT-‚Sein‘ ist das Wesen GOTTES''«</span>, <span style="color:#00B000">(Theorem-2.1)</span>, und dann umgedreht und äquivalent ''':''' <span style="color:#FF6000">»''Das Wesen GOTTES ist sein ‚Da‘-Sein als GOTT'', bzw. ''seine Göttlichkeit''«</span>, <span style="color:#00B000">(Theorem-2.2)</span>, m.a.W. ''':''' <span style="color:#FF6000">»''GOTT ist wesentlich ‚grundlos‘'' <span style="color:#00B000">[ d.h. </span> ''notwendig aus sich''<span style="color:#00B000"> ]</span> ''‚da‘''«</span>. Das ist das Einzigartige im <span style="color:#FF6000">»''Wesen GOTTES''«</span> ''':''' GOTT ist ohne zeitlichen Anfang, zeitlos-ewig, für uns immer schon ‚da‘, und das ‚ist‘ sein <span style="color:#FF6000">»''Wesen''«</span>; vorausgesetzt, ,angenommen‘, man glaubt an GOTT ''':''' Term :01:. <span style="color:#00B000">(Der schon von GÖDEL indizierte Term <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ — </span> ,expliziert‘ nur eine der drei Lesearten, die der Term <span style="color:#4C58FF"> — ‚'''G'''‘ — „theologisch“</span> ,impliziert‘.)</span> Theorem-2 hat somit die syntaktische Form einer Definition ''':'''
<div class="center"><span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span></div>
Somit kann GOTT ‚explizit‘ <span style="color:#00B000">(aus einer bewiesenen Kalkül-Definition)</span> <span style="color:#4C58FF">„theologisch“</span> genauer ‚bestimmt‘ werden ''':''' <span style="color:#FF6000">»''GOTT ist gerade deswegen GOTT, weil sein überzeitlich-ewiges und an sich ‚grundloses‘'' <span style="color:#00B000">[ aber für uns notwendiges ]</span> ''Dasein'' <span style="color:#00B000">[ Existenz ]</span> ''als GOTT, ontologisch, — dem Sein nach —, identisch ist mit seinem persönlichen und für uns liebevollen Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''als GOTT; diese Identität von Dasein und Wesen gilt einzig und allein nur bei GOTT.''«</span> Die philosophische Frage nach dem <span style="color:#FF6000">„Wesen GOTTES“</span> lautet, <span style="color:#00B000">(auf die Person bezogen)</span> ''':''' <span style="color:#FF6000">„Was bist du ? “</span> Sie ist äquivalent zur <span style="color:#4C58FF">,theologisch’</span>-biblischen Frage des MOSE ''':''' <span style="color:#CC66FF">„Wer bist Du ? “</span> Die bekannte Antwort des GOTTES-JHWH aus ‚Exodus 3,14‘, im Dornbusch, thematisiert das persönliche, für uns liebevolle und für immer notwendige <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'', <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Mit diesem Zitat aus der Bibel ist die GÖDEL-Axiomatik, sozusagen, <span style="color:#4C58FF">„theologisch“</span> ‚verifiziert‘. Sie hat einerseits im Theorem-2 ihren philosophischen ‚Abschluss’ erreicht, und andererseits damit formal-syntaktisch den ‚Anschluss‘ an eine allgemeine Basis-Glaubensaussage gefunden, die ‚an sich‘ für jeden CHRIST-gläubigen Menschen ‚selbstverständlich‘ ist. Was in der Metaphysik des ARISTOTELES das Ergebnis einer philosophischen ,Induktion‘ a-posteriori ist ''':''' <span style="color:#FF6000">„,Dasein‘ ist das ,Wesen‘ GOTTES“</span>, — <span style="color:#00B000">(das mit Theorem-2, auch ein Ergebnis der deduktiven GÖDEL-Axiomatik a-priori ist ''':''' die Beweisgrundlage für den Konsequenz-Teil im Theorem AMSELMS)</span>, — das ist in der Bibel die Grundüberzeugung jedes Menschen, der an GOTT glaubt ''':''' GOTT ist für uns immer schon <span style="color:#FF6000">„da“</span>, weil er uns liebt. Das ist das, <span style="color:#FF6000">„was“</span> GOTT für uns als GOTT ausmacht, — sein Wesen ''':''' <span style="color:#CC66FF">»''Wir haben die Liebe, die GOTT zu uns hat, erkannt und gläubig angenommen. GOTT ist Liebe, und wer in der Liebe bleibt, bleibt in GOTT und GOTT bleibt in ihm''«</span>, <small>({{Bibel | 1. Johannesbrief |4|16|EU}})</small>.
Das eigentliche Ergebnis der GÖDEL-Axiomatik ist somit die ‚triviale‘ Erkenntnis, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, vorausgesetzt <span style="color:#00B000">(‚angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#CC66FF">»''Ehe die Berge geboren wurden, ehe die Erde entstand und das Weltall erschaffen wurden, bist du, o GOTT, von Ewigkeit zu Ewigkeit''«</span>, <small>({{Bibel | Psalm |90|2|LUT}})</small>. <span style="color:#00B000">(Der Glaube an die Zeitlosigkeit GOTTES ist mit der ‚Annahme‘ von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, und der ‚Annahme‘ der Definition-1 für <span style="color:#4C58FF"> ‚'''Gx'''‘ := </span> den <span style="color:#FF6000">„GOTT der Christen“</span>, im Kalkül ‚implizit‘ schon eingeführt, da die Axiome und Definitionen, — nach GÖDEL —, nur dann <span style="color:#FF6000">»''wahr''«</span> sind, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen''</span> [ Raum-Zeit-]<span style="color:#FF6000">''Struktur''«</span> unserer Welt sind. Das ,impliziert‘ auch, dass der GOTT von Axiom-3 und Definition-1 ebenfalls <span style="color:#FF6000">»''unabhängig''«</span> von Raum und Zeit, d.h. zeitlos-ewig ist '''!''' )</span>
Wer an den GOTT der Bibel glaubt, kann sich von der ‚Vernünftigkeit‘ seines Glaubens mit Hilfe des sog. ,ontologischen‘ Gottesbeweises nach ANSELM von Canterbury, mit Kurt GÖDEL <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, überzeugen. <span style="color:#00B000">(Das war auch die Absicht ANSEMS '''!''' )</span> Die Annahme, es sei ‚unmöglich‘, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span>, <span style="color:#00B000">(dezidierter Atheismus)</span>, führt im GÖDEL-Kalkül formal zu einem logischen Widerspruch; vgl. z. B. ‚''<span style="font-family: Times;"><big>Gödels Möglichkeitsbeweis</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, Seite 17, von Günther J. WIRSCHING; (https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf), d.h. es ist also nicht ‚unmöglich‘, dass es GOTT gibt. Der GOTT-Glaube ist mit den Maßstäben einer modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> und darum ,vernünftig‘. Damit steht fest ''':''' das GÖDEL-Kalkül ist kein moderner ‚Existenz-Beweis‘ für den GOTT der Bibel, sondern es setzt, <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, ,methodologisch‘, den Glauben an die Existenz eines zeitlos-ewigen GOTTES voraus, der, — <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer '' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> —, für uns immer schon ‚da‘ ist. Wenn aber einmal als fix ‚angenommen‘ worden ist, <span style="color:#00B000">(als Prämisse)</span>, dass es wahr ist, dass GOTT ‚existiert‘, dann ist natürlich die ‚Annahme‘, dass GOTT ‚nicht existiert‘, falsch. Aber sie ist auch ,unlogisch‘ und ,unsinnig‘, weil die Annahme ''':''' <span style="color:#FF6000">»''Es ist unmöglich, dass es einen GOTT gibt''«</span>, offensichtlich und eindeutig zu einem Widerspruch führt; was z. B. Günther J. WIRSCHING mit seiner Version des <span style="color:#00B000">(nicht umkehrbaren)</span> ‚Möglichkeitsbeweises‘ für ,GOTT‘, explizit vorexerziert hat; <span style="color:#00B000">( nachgestellt im Anhang ''':''' GÖDELS ‚Möglichkeitsbeweis‘ als ,Widerlegung‘ eines Nicht-GOTT-Glaubens; in Entsprechung zu Psalm 14,1 und Psalm 53,2 ''':''' <span style="color:#CC66FF">»''Der'' <span style="color:#00B000">[ ,unvernünftige‘ ]</span> ''Tor sagt in seinem Herzen ''':''' Es gibt keinen Gott. Sie handeln verderbt, handeln abscheulich; da ist keiner, der Gutes tut''«</span>. Historischer Hintergrund zu diesem Psalm-Text ''':''' Die Zerstörung des Tempels in Jerusalem 586 v.Ch. durch die Truppen des NEBUKADNEZAR II.)</span> Der Logiker GÖDEL hat in seinem System zum ,ontologischen Beweis‘ keine ‚formale Unentscheidbarkeit‘ <span style="color:#00B000">(Agnostizismus)</span> feststellen können, wie auf einem anderen Feld seiner Forschungsarbeiten.
Das GÖDEL-Konsequenz-Teil von der ‚Notwendigkeit‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, <span style="color:#00B000">(die ‚Konsequenz’ aus dem ‚widerspruchsfreien‘ Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —,</span>)</span> im ‚Theorem ANSELMS‘, ist <span style="color:#00B000">(im 3. Beweisgang, Term :10:)</span> dann auch eine weitere Explikation des Basis-Theorems-2 des Kalküls ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span>, über die ‚ontologische Identität‘ vom <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, mit seinem <span style="color:#FF6000">„Wesen“</span> ''':''' <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, nach einem <span style="color:#4C58FF">[ Modus ponens ]</span>, dargestellt mit Term :09:.
<span style="color:#00B000">(Die ontologische Identität von Dasein und Wesen in GOTT, ist die, für uns, <span style="color:#FF6000">„notwendige Präsenz <span style="color:#00B000">[ das Sein, <span style="color:#4C58FF">— ‚'''E'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, die äquivalent, bzw. koinzident ist zur <span style="color:#FF6000">„Vollkommenheit <span style="color:#00B000">[ das Wesen, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>. Diese Identität von Sein und Wesen in GOTT ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub> —</span>, bedeutet <span style="color:#4C58FF">,theologisch‘</span> konkret ''':''' die, für uns, notwendige Gegenwärtigkeit GOTTES, [ sein Dasein ], ist verwirklicht worden in der liebevollen [ Wesens-]Zuwendung GOTTES zu uns Menschen, in seiner Kindwerdung in Bethlehem, durch die Jungfrau MARIA ''':''' GOTTES Wesen ist ,Sein-mit-uns‘ ''':''' <span style="color:#CC66FF">»''sein Name'', <span style="color:#00B000">[ sein Wesen ]</span>, ''ist IMMANUEL, das heiß übersetzt ''':''' GOTT-ist-mit-uns''«, <small>({{Bibel | Matthäus Evangelium |1|23|EU}})</small></span>, der unsere Not-,wenden‘-wird, d.h. der uns und die Welt von der Korruption der Sünde und des Todes <span style="color:#4C58FF">,erlösen‘</span> will und wird; jedoch nicht ohne uns. Die <span style="color:#4C58FF">„Menschwerdung“</span> GOTTES in JESUS CHRISTUS, die <span style="color:#4C58FF">„Hypostatische Union“</span>, bzw. diese außergewöhnliche und einzigartige <span style="color:#FF6000">„Koinzidenz“</span> von GOTT und Mensch, ist der wirkliche und historische Beginn der <span style="color:#4C58FF">„Erlösung“</span> des Menschen und der Welt; vergegenwärtigt für jede Generation der Menschen in und durch die <span style="color:#4C58FF">„Kirche“</span> JESU CHRISTI.)</span>
Die, von GÖDEL im 1. Beweisgang, als Prämissen schon vorausgesetzten und ,angenommenen‘ Perfektionen, bzw. Vollkommenheiten, <span style="color:#00B000">(das sind die allgemeinen ,Transzendentalia‘ für alles Nicht-Göttliche in der Welt)</span>, werden im ersten Teil des 2. Beweisganges, mit Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dann auch als <span style="color:#FF6000">„positive Wesenseigenschaften“</span>, <span style="color:#00B000">(als die ultimativen ,Transzendentalia‘)</span>, in GOTT ‚definitiv‘ <span style="color:#00B000">( ╞ )</span> bestätigt; <span style="color:#00B000">(siehe Anhang, 2. Beweisgang, Anmerkung-2)</span>.
Im 3. Beweisgang ist das Basis-Theorem-2 die ,modal‘ notwendige, bzw. transzendentale, Voraussetzung, sowohl für das <span style="color:#FF6000">„an sich notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, im Term :10:, als auch für die <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, in den Ressourcen dieses Beweisganges ''':''' in der Definition-3, und im Axiom-5; <span style="color:#00B000">(das <span style="color:#4C58FF">— ‚'''E'''‘ —</span> wird nur GOTT zugeordnet; vgl. auch Anhang, 3. Beweisgang, Anmerkung-4)</span>. Dieses Basis-Theorem-2 ist auch zugleich die Antwort auf die Frage nach dem ‚Ursprung‘ GOTTES ''':''' GOTT ist <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> ‚da‘, von <span style="color:#CC66FF">„Ewigkeit zu Ewigkeit“</span>, denn es ‚ist‘ sein <span style="color:#FF6000">„Wesen“</span>, <span style="color:#00B000">(überzeitlich-ewig)</span> für uns immer schon ‚da‘ zu sein. Weitere ‚Einzelheiten‘ über Wesen und Eigenschaften GOTTES gehören in die Mystik, bzw. in die <span style="color:#4C58FF">„Theologie“</span>.
===<div class="center"><span style="color:#660066">Die Bedeutung des Kalküls</span></div>===
<div class="center">Immanuel KANT und Kurt GÖDEL im ‚Dialog‘</div>
KANT sagt ''':'''
::<span style="color:#FF6000">»</span>'''''Sein''' ist offenbar kein reales Prädikat''. ... ''Es ist bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Position'' <span style="color:#00B000">[ latinisiert, deutsch für ''':''' ,Setzung‘ ]</span> ''eines Dinges ... Nehme ich nun das Subjekt (Gott) mit allen seinen Prädikaten'' <span style="color:#00B000">[ d.h. Eigenschaften ]</span> ''(worunter auch die Allmacht gehört) zusammen, und sage ''':''' ‚'''Gott ist'''‘'', <span style="color:#00B000">[ ,GOTT existiert wirklich‘ ]</span>, ''oder ‚es ist ein Gott‘, so <u>setze</u> ich kein neues Prädikat'' <span style="color:#00B000">[ keine neue Eigenschaft ]</span> ''zum ‚Begriffe‘ von Gott ''':''''' <span style="color:#00B000">[ <span style="color:#0000FF; background-color:#FFFF00">‚Sein’ ist kein ‚reales Prädikat’ in GOTT</span>; ‚Existenz‘ ist in GOTT keine ‚Eigenschaft‘ ],</span> ... ''es kann daher zu dem Begriffe'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''der bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Möglichkeit ausdrückt, darum, dass ich dessen Gegenstand'', <span style="color:#00B000">[ GOTT ]</span>, ''als schlechthin gegeben (durch den Ausdruck ''':''' er ist'', <span style="color:#00B000">[ GOTT ist wirklich ]</span>'' ) <u>denke</u>, nichts weiter hinzukommen.'' <span style="color:#00B000">[ Beides ist ,bloß gedacht‘ '''!''' ]</span> ''Und so enthält das Wirkliche nichts mehr als das bloß Mögliche. Hundert ‚wirkliche‘ Taler enthalten nicht das mindeste <u>mehr</u>, als hundert ‚mögliche‘. Denn, da diese den'' <span style="color:#00B000">[ gedachten ]</span>'' ‚Begriff‘, jene aber den Gegenstand und dessen'' <span style="color:#00B000">[ gedachte ]</span>'' Position an sich selbst bedeuten, so würde, im Fall dieser'', <span style="color:#00B000">[ die 100, als ,wirklich‘ bloß gedachten Taler ]</span>, ''<u>mehr</u> enthielte als jener,'' <span style="color:#00B000">[ als ihr ‚gedachter‘ Begriff im Verstand, wie ΑNSELM von Canterbury für GOTT, als ‚wirklich‘ Existierenden, argumentierte, …''so würde'' ]</span> ''mein ‚Begriff‘'' <span style="color:#00B000">[ die 100 im Verstand ‚gedachten‘ Taler ]</span> ''nicht den ganzen Gegenstand ausdrücken, und also auch <u>nicht der angemessene Begriff</u> von ihm sein. Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben'', <span style="color:#00B000">[ als bei 100 bloß ‚gedachten‘ Talern ]</span> ... <span style="color:#FF6000">«</span> <span style="color:#00B000"><ref>‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 401; https://www.korpora.org/kant/aa03/401.html</ref></span>.
GÖDEL würde darauf <span style="color:#00B000">(korrespondierend zur aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition von der Identität von Sein und Wesen in GOTT)</span> antworten ''':'''
::<span style="color:#FF6000">»</span>Die <span style="color:#FF6000">„100 Taler“</span> sind der <span style="color:#FF6000">»''zufälligen Struktur der'' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> entnommen, und sind daher nicht mit GOTT vergleichbar, der, <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer Welt, <span style="color:#FF6000">„über“</span> dieser Welt steht. Einzig und allein nur von GOTT gilt ''':''' Der mit Dingen aus unserer Welt ,nicht vergleichbare‘ GOTT, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#FF6000">„existiert notwendig für uns“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, und <span style="color:#FF6000">„notwendiges Existieren, <u>Sein</u>“</span> ,ist‘ eine <span style="color:#FF6000">„positive <u>Wesen</u>seigenschaft“</span> in GOTT, <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, weil GOTT aus sich <span style="color:#FF6000">„vollkommen“ <span style="color:#00B000">|</span> „perfekt“</span> ist, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#0000FF; background-color:#FFFF00">‚Sein‘ ist in GOTT ein ‚reales Prädikat‘</span>; <span style="color:#00B000">(notwendige ‚Existenz’ ist eine positive ‚Wesenseigenschaft’ in GOTT)</span>, und nur bei GOTT '''!''' Zum zeitlos-ewigen GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(als methodologische Kalkül-Prämisse)</span>, kann man sagen ''':''' Weil es, wegen Axiom-1 und Axiom-2, <span style="color:#FF6000">„widerspruchsfrei möglich"</span> ist, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, darum ist GOTT auch das ‚einzige‘ <span style="color:#FF6000">„Wesen“</span>, <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, von dem ein Christ sagen kann, dass es <span style="color:#FF6000">„notwendig aus sich“</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, d.h. <span style="color:#FF6000">„grundlos“ <span style="color:#00B000">|</span> „unverursacht“</span>, für uns immer schon ‚da’ ist, und immer ,da’ sein wird; und zusätzlich gilt ''':''' Es gibt für jede mögliche Welt ‚nur‘ diesen einen GOTT ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ — </span><span style="color:#00B000">(Monotheïsmus, Korollar-3)</span>; vorausgesetzt, man geht von der ,Existenz’ dieses GOTTES aus, wobei diese Annahme für GÖDEL <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist.<span style="color:#FF6000">«</span>
Eine Beobachtung ''':''' KANT sagt, gleichsam als ,krönenden‘ Abschluss seiner Widerlegung des, — von ihm so genannten —, ,ontologischen Gottesbeweises‘ ''':''' <span style="color:#FF6000">»</span>''Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben, (d.i. ihrer Möglichkeit).''<span style="color:#FF6000">«</span> Diese Feststellung KANTS entspricht jedoch genau der Argumentation ANSELMS ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span>, d.h. GOTT ,existiert auch in Wirklichkeit‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was <u>mehr</u> ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ein bloßer Begriff ,im Verstand zu sein‘. Der ,Mehr-Wert‘ ergibt sich in beiden Fällen, sowohl bei den Talern als auch bei GOTT, aus der ,Wirklichkeit‘ ihrer Existenz, im Gegensatz zur bloßen, <span style="color:#00B000">(im Begriff gedachten)</span>, ,Möglichkeit‘ ihrer Existenz, so dass, in jedem Fall, der ,Begriff‘ im Verstand ohne Abstriche <span style="color:#FF6000">»</span>''den ganzen Gegenstand ausdrückt''<span style="color:#FF6000">«</span>, und von diesem auch <span style="color:#FF6000">»</span>''der angemessene Begriff''<span style="color:#FF6000">«</span> ist. Alles andere wäre eine ,Lüge‘. Mit dieser ,Beobachtung‘ ist das implizit ,Widersprüchliche‘ in KANTS Argumentation aufgedeckt ''':''' Das Wirkliche in KANTS Vermögenszustande enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, konträr zu seiner vorigen Behauptung ''':''' <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#FF6000">«</span> enthalte <span style="color:#FF6000">»'',nichts mehr‘</span> als das bloß Mögliche''<span style="color:#FF6000">«</span>. Diese Behauptung ist offensichtlich falsch. Das ist somit ein indirekter Beweis und damit eine Bestätigung für die analoge Argumentation ANSELMS aus dem Wiederspruch des Gegenteils, am Beispiel KANTS <span style="color:#FF6000">»</span>''Vermögenzustandes bei hundert wirklichen Talern''<span style="color:#FF6000">«</span>, in dem in Wirklichkeit <span style="color:#FF6000">,doch mehr‘</span> ist, <span style="color:#FF6000">»</span>''als bei dem bloßen Begriffe derselben''<span style="color:#FF6000">«</span>.
<span style="color:#00B000">(Diese ,Beobachtung‘ ist zugleich auch das entscheidende Indiz dafür, dass das systembedingte Konzept KANTS von der ,Existenz‘, bzw. vom ,Sein‘ eines jeden Gegenstandes, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.i. als seine ,Setzung‘ bloß im- und durch den Verstand, ,falsch‘ ist, — d.h. im Klartext ''':''' für KANT ist das ,Sein‘ eines Gegenstandes bloß ein ,Gedanke‘ in uns, wenn er meint, dass uns ein Gegenstand erst dann wirklich ,gegeben‘ sei, wenn wir uns den</span> <span style="color:#FF6000">»</span>''Gegenstand als schlechthin gegeben (durch den Ausdruck : <u>er ist</u>) <u>denken</u>''<span style="color:#FF6000">«</span>, <span style="color:#00B000">was nur dem Irrtum einer falschen System-Konzeption geschuldet sein kann. Auf Grund dieser Konzeption ist das</span> <span style="color:#FF6000">»</span>''Ding, wie es an sich selbst ist''<span style="color:#FF6000">«</span>, <span style="color:#00B000">für KANT systembedingt weder ,anschaubar‘, noch ,erkennbar‘. Diese falsche Konzeption über die ,Existenz‘, bzw. das ,Sein‘ eines Dinges, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">ist für KANT letztendlich auch die Beweisgrundlage und Voraussetzung für seine Ablehnung des ontologischen Argumentes für GOTT im Theorem ANSELMS. Wenn das ,wirkliche‘ Sein eines Dinges nichts anderes ist, als</span> <span style="color:#FF6000">»</span>''dessen'' <span style="color:#00B000">[ bloß gedachte ]</span> ''Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.h. als seine ,mögliche‘ Setzung bloß im- und durch den Verstand, — das ist das, als ,wirklich‘ bloß nur ,gedachte‘ Ding —, dann</span> <span style="color:#FF6000">»</span>''enthält''<span style="color:#FF6000">«</span> <span style="color:#00B000">natürlich</span> <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#00B000">, [ als die bloß gedachte Existenz ],</span> ''nichts mehr als das bloß Mögliche''<span style="color:#00B000">, [ als der gedachte Begriff ]<span style="color:#FF6000">«</span>, was offensichtlich unhaltbar ist. <span style="color:#4C58FF">[ Modus tollendo tollens ] </span> ''':''' Wenn die Konsequenz einer Wenn-Dann-Folgerung ,falsch‘ ist, dann ist auch ihre Voraussetzung, das System-Konzept KANTS, ,falsch‘ ''':''' d.i. seine ,Kopernikanische Wende‘ für die Metaphysik, soweit sie KANTS ,Sein’-Konzept betrifft. Korrekt und ,wahr‘ ist in jedem Fall ''':''' Das Wirkliche enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, und die Dinge ,existieren‘ schon immer unabhängig von unserem Denken. ,Existenz‘, das ,Sein‘, ist <span style="color:#FF6000">,doch mehr‘</span>, als bloß ein ,Gedanke‘ von uns.)</span>
Somit ist die Argumentation KANTS gegen den ontologischen Beweis ANSELMS für GOTT ,falsch‘ und unhaltbar, weil sie auf der ,falschen‘ Voraussetzung beruht ''':''' die ,Existenz‘, bzw. das ,Sein‘ eines jeden ,Gegenstandes‘, — wie z. B. auch die Existenz bei GOTT —, sei bloß dessen gedachte ,Position‘ an sich selbst, d.h. bloß seine ,Setzung‘ im- und durch den Verstand. Damit ,macht‘ er GOTT außerdem zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, und verkennt so, — wie vor ihm THOMAS von Aquin —, auch die Einzigartigkeit und Exklusivität GOTTES im Theorem ANSELMS.
<div class="center">Die <span style="color:#FF6000">„Rede von GOTT“</span> in der philosophischen Tradition</div>
Wenn man die philosophische Tradition der <span style="color:#FF6000">„Rede von GOTT“</span> im Lichte der Ergebnisse der <span style="color:#4C58FF">„axiomatischen Theologie“</span> GÖDELS liest, dann stellt sie sich am Beispiel bei ARISTOTELES, — AVICENNA, — ANSELM, und bei GÖDEL wie folgt dar ''':'''
<span style="color:#FF6000">»''Das Erstbewegende,'' (<span style="font-family: Times;"><big>,πρῶτον κινοῦν‘</big></span>), ''das, ohne selbst ‚bewegt‘ zu sein'', (<span style="font-family: Times;"><big>,ἀκίνητον‘</big></span> <span style="color:#00B000">| ''unverursacht, ,entstehungslos‘'' |</span> ), ''alles Übrige wie ein Geliebtes ‚bewegt‘'', (<span style="font-family: Times;"><big>,κινεῖ δὴ ὡς ἐρώμενον‘</big></span> <span style="color:#00B000"> | ''-verursacht, ,entstehen‘ lässt'' |</span> ), ''ist sowohl'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚Wesen‘'', (<span style="font-family: Times;"><big>,ἀΐδιον καί οὐσία‘</big></span> <span style="color:#00B000">| ''‚Substanz‘'' |</span> ), ''als auch'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚wirksames, verwirklichendes Sein‘'', (<span style="font-family: Times;"><big>‚ἀΐδιον καί ἐνέργεια οὖσα‘ = ‚actus purus‘</big></span><span style="color:#00B000"> | '',reine Tätigkeit‘'' |</span> ), … ''ersehnt'', (<span style="font-family: Times;"><big>,ὀρεκτόν‘</big></span>), ''und erkennbar'', (<span style="font-family: Times;"><big>,νοητόν‘</big></span>), ... ''denn dies ist der ‚Gott‘'', (<span style="font-family: Times;"><big>,τοῦτο γὰρ ὁ θεός‘</big></span>), <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, ''der'' <span style="color:#00B000">[ zeitlich-]</span>''Ewige'', (<span style="font-family: Times;"><big>,ἀΐδιον‘</big></span>), — ''der Unvergleichliche'', (<span style="font-family: Times;"><big>,ἄριστον‘</big></span> <span style="color:#00B000">| ''‚der Beste‘'' |</span> ), — ''der Lebendige'', (<span style="font-family: Times;"><big>,ζῷον‘</big></span> <span style="color:#00B000">| ,''das Leben selbst‘'' |</span> ), — ... ''so sagen wir ja'', (<span style="font-family: Times;"><big>,φαμὲν δὴ‘</big></span>), — ...«</span> ''':''' <span style="color:#00B000">(ARISTOTELES — Grieche)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als ,Individuumname‘, ist synonym mit <span style="color:#FF6000">„göttliches ‚Da-Sein’“</span>, das sowohl <span style="color:#FF6000">„aus sich vollkommen“</span>, als auch <span style="color:#FF6000">„notwendig für uns“</span> ‚da‘ ist; <span style="color:#00B000">(das ist das, an sich, vollkommene ‚Was-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, das zugleich, für uns, das notwendige ‚Da-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> — ist)</span>; <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span>. Das ist der <u>angemessene Begriff</u> von GOTT, und gilt ‚nur‘ von GOTT. Weil GOTT <span style="color:#FF6000">„vollkommen“</span> ist, ist <span style="color:#FF6000">„Da-Sein“ <span style="color:#00B000">|</span> „GOTT-Sein“ <span style="color:#00B000">|</span> „Göttlichkeit“</span> das <span style="color:#FF6000">„Wesen“</span> GOTTES ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>. Im Unendlichen, GOTT, sind <span style="color:#FF6000">„Essenz“</span> und <span style="color:#FF6000">„Existenz“</span> koinzident ,eins‘, und daher untrennbar, und <span style="color:#FF6000">»''darum ist GOTT das einzige ‚Sein’, das notwendig an sich ‚da‘ ist''«</span> ''':''' <span style="color:#00B000">(ABU ALI SINA alias AVICENNA — Muslim)</span>.
Der <span style="color:#00B000">(gedachte)</span> ‚Eigenschafts-Begriff‘ <span style="color:#FF6000">„Vollkommenheit (die Größe) GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#00B000">(‚Perfektion‘, die unbegrenzte Summe aller ‚positiven Eigenschaften‘ in GOTT)</span> schließt koinzident die ‚Eigenschaft’ <span style="color:#FF6000">„notwendige Existenz für uns“</span> mit ein ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>. GOTT wäre nicht <span style="color:#FF6000">„vollkommen“</span>, wenn er nicht auch real für uns ‚da‘ wäre, wenn er nicht ,immer schon’ <span style="color:#FF6000">„existierte“</span>. ‚Sein’ ist <u>mehr</u> als ‚Nicht-Sein’. ,Sein’, bzw. ,Existenz’ gehört in GOTT zu den ,Transzendentalia’. Das sind die <span style="color:#00B000">(ultimativen)</span> ,Wesenseigenschaften’ in GOTT. Der unbegrenzt Unendliche, GOTT, ist daher das <span style="color:#FF6000">»''vollkommenste Wesen, über das nichts ,Größeres‘ d.h. Vollkommeneres <u>mehr</u> ‚gedacht‘ werden kann''«</span> ''':''' <span style="color:#00B000">(ANSELM von Canterbury — Christ)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„Perfektion GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schließt koinzident das <span style="color:#FF6000">„notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> —, für uns mit ein, ohne einen zeitlichen Anfang und ohne ein zeitliches Ende. Das ist die ‚zeitlos-ewige‘, an sich absolute, und <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#00B000">(Das ist ein ,regulär‘-mögliches Korollar im 2. Beweisgang aus Term :16: ''':''' <span style="color:#4C58FF">— ‚'''Gy→Yy'''‘ —</span>, mit der <span style="color:#4C58FF">[ Instanz(Y:=E<sub>not</sub>) ]</span>, und der <span style="color:#4C58FF">[ FUB(y:=x) ]</span>; und auch ein ,regulär‘-mögliches Korollar im 3. Beweisgang ''':''' entsprechend der <span style="color:#FF6000">„logischen Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A → B ]</span> von Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> und Term :05: <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span> aus diesem Beweisgang. In Worten ''':''' <span style="color:#FF6000">»</span>''Angenommen, '' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> ''steht für den GOTT der Christen'' ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ — </span>, ''dann existiert dieser GOTT'', <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, ''für uns notwendig'', <span style="color:#4C58FF">— <sub>not</sub> —</span> <span style="color:#FF6000">«</span>.)</span> Der Unendliche, GOTT, ist <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer ‚vergänglichen‘, ,endlichen‘ Welt, welche prinzipiell vom dreidimensionalen Raum und von der unwiederbringlich ‚vergehenden‘ Zeit geprägt ist. Der ,GOTT der Christen‘ ist <span style="color:#FF6000">»''unabhängig''«</span> von dieser <span style="color:#FF6600">„vergehenden Raum-Zeit“, — »''jenes rätselhafte und anscheinend in sich widersprüchliche Etwas''« <span style="color:#00B000">(GÖDEL)<ref>Kurt GÖDEL, ‚''<span style="font-family: Times;"><big>Eine Bemerkung über die Beziehungen zwischen der Relativitätstheorie und der idealistischen Philosophie‘</big></span>'', in P.A.SCHILPP (Hg.): ‚''<span style="font-family: Times;"><big>Albert Einstein, Philosoph und Naturforscher‘</big></span>'', Seite 406</ref></span> —</span>. Ohne ‚Zeit‘ gibt es keinen zeitlichen Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘, <span style="color:#00B000">(beides ist zeitlos ,eins‘)</span>, und so ist der zeitlos-ewige GOTT, der <span style="color:#FF6000">»''notwendig aus sich ,existiert‘'' «</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ — </span>, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> für uns immer schon ‚da‘ ''':''' <span style="color:#00B000">(GÖDEL — ohne religiöses Bekenntnis)</span>.
Mit dem GÖDEL-Kalkül ist die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt worden, und ist somit für jeden Menschen nachvollziehbar, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie obige Beispiele zeigen.
'''Resümee :'''
Das GÖDEL-Kalkül zeigt mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, was notwendig folgt, wenn die Axiome ‚wahr‘ sind, <span style="color:#00B000">(die Axiome bilden formal-syntaktisch <span style="color:#FF6000">»''die theologische Weltanschauung''«</span> ab)</span>, unter der Voraussetzung, dass die Axiome <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>'' Struktur''«</span> unserer Welt sind. Die ,Verifikation‘ der Axiome und Definitionen von GOTT und seiner Vollkommenheiten gelingt GÖDEL, — entsprechend seiner Unabhängigkeits-Bedingung —, durch den Aufweis ihrer Widerspruchsfreiheit ''':''' sie sind somit ,wahr‘ und, — im Kontext einer <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> —, auch ,annehmbar‘ in unserer ,realen‘ Welt ''':''' <span style="color:#00B000">(siehe Anhang, 2. Beweisgang und Anmerkung-2)</span>. Er vermeidet damit den Fehler, der immer wieder im Diskurs über Gottesbeweise gemacht wird ''':''' GOTT mit seinen Geschöpfen zu vergleichen. Diese logisch-philosophische Rede von GOTT <span style="color:#00B000">(<span style="color:#FF6000">»''ohne sich auf den Glauben an irgendeine Religion zu stützen''«</span>)</span> hat eine <u>mehr</u> als zweitausendjährige Tradition hinter sich. Der <span style="color:#FF6000">„100-Taler-Gott“</span> des Philosophen KANT, hat heute, nachdem der Logiker und Systemtheoretiker GÖDEL sein System vorgelegt hat, an ‚Strahlkraft‘ verloren.
Kurt GÖDEL ''':'''
::<span style="color:#FF6000">» ''Die theologische Weltanschauung'', <span style="color:#00B000">[ dass GOTT für uns immer schon ‚da‘ ist ]</span>, ''ist rein verstandesmäßig mit allen bekannten Tatsachen durchaus vereinbar'';«</span> <span style="color:#00B000">[ d.h. sie ist das ,Resultat‘ der, — vom Glauben geleiteten —, ‚theoretischen Vernunft‘, alias ‚reinen Vernunft‘, und nicht bloß das ‚Postulat‘ einer ‚praktischen Vernunft‘, wie KANT meint ]. <span style="color:#FF6000">»''Der'' <span style="color:#00B000">[ christliche ]</span> ''Glaube ist die ‚Pupille‘ im ‚Auge‘ unseres Verstandes.''«</span> (Heilige KATHARINA von Siena, Lehrerin der Kirche, Patronin Europas<ref>vgl. <span style="font-family: Times;"><big>''Gebet 7 ‚Für die neuen Kardinäle‘, Rom, 21. Dezember 1378,''</big></span> aus <span style="font-family: Times;"><big>''Caterina von Siena ,Die Gebete‘.''</big></span> Kleinhain 2019, online: https://caterina.at/werke/gebete/gebete-detailansicht/gebet-7.html</ref> )</span>
Der sonst so rationale KANT, hier doch etwas emotionell, <span style="color:#00B000">(als wolle er die Ergebnisse im GÖDEL-Kalkül nicht wahr haben, die belegen, dass er sich bei GOTT geirrt, und die Funktion des christlichen Glaubens für die Philosophie falsch eingeschätzt hat)</span> ''':'''
::<span style="color:#FF6000">»</span> ''Es war etwas ganz Unnatürliches und eine bloße Neuerung des Schulwitzes, aus einer ganz willkürlich entworfenen Idee das Dasein des ihr entsprechenden Gegenstandes selbst ausklauben zu wollen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 403. https://www.korpora.org/kant/aa03/403.html</ref>.<span style="color:#FF6000">«</span>
Für KANT, für die Scholastiker, <span style="color:#00B000">(und auch für uns)</span>, ist es natürlich ‚logisch‘, dass aus einem als ‚möglich’ gedachten Begriff, <span style="color:#FF6000">»</span>''aus einer ganz willkürlich entworfenen Idee''<span style="color:#FF6000">«</span>, keine Existenzaussage abgeleitet werden kann. <span style="color:#00B000">(Aus dem bloß gedachten Begriff ,goldene Berge‘ folgt natürlich nicht, dass es solche in Wirklichkeit auch gibt.)</span> In der philosophisch-<span style="color:#4C58FF">,theologischen’</span> Tradition, die von ARISTOTELES herkommt, ist der Begriff <span style="color:#FF6000">»''GOTT''«</span> jedoch von allen anderen Begriffen so verschieden, so dass für GOTT diese Logik KANTS nicht mehr gilt. GOTT ist ,unvergleichlich‘ und ,einzigartig‘.
Dazu der Kommentar von HEGEL ''':'''
::<span style="color:#FF6000">»''Wenn KANT sagt, man könne aus dem Begriff'' <span style="color:#00B000">[ ‚GOTT‘ ]</span> ''die Realität nicht ,herausklauben‘, so ist da der Begriff als endlich gefasst''.« <span style="color:#00B000">[ In der Endlichkeit unserer Welt trifft die Logik KANTS zu, dass dem ‚Begriff‘ nicht ,notwendig‘ das ‚Sein‘ folgt, denn es gibt in ihr die ,Lüge‘, die das ,Wirklich-Sein‘ im Begriff bloß behauptet, ohne dass es ,in Wirklichkeit‘ zutrifft, was sie behauptet. Es gilt hier nach KANT ''':''' »''Sein ist kein reales Prädikat''«. Somit ist ]</span> »''...der Begriff ohne'' <span style="color:#00B000">[ reales ]</span> ''Sein ein Einseitiges und Unwahres, und ebenso das Sein, in dem kein Begriff ist'', <span style="color:#00B000">[ ist ]</span> ''das begrifflose Sein,'' <span style="color:#00B000">[ d.i. das relative ,Noch-Nicht-Begriffene‘ ]</span>.'' Dieser Gegensatz, der in die Endlichkeit fällt'' <span style="color:#00B000">[ im Endlichen zutrifft ]</span>, ''kann bei dem Unendlichen, GOTT, gar nicht statthaben''<ref>Georg Wilhelm Friedrich HEGEL, ‚<span style="font-family: Times;"><big>''Ausführungen des ontologischen Beweises''</big></span>‘ in den ‚<span style="font-family: Times;"><big>''Vorlesungen über die Philosophie der Religion vom Jahr 1831''</big></span>‘ . Hamburg 1966, Seiten 175 bzw. 174</ref>; <span style="color:#00B000">[ denn ,Begriff‘, bzw. ,Denken‘ und ,Sein‘ sind in dem Unendlichen, GOTT, untrennbar und real immer dasselbe. Auf Grund dieser ontologischen Identität ,personifiziert‘ und ,repräsentiert‘ GOTT die ,Wahrheit‘ ''':''' GOTT ist die ,Wahrheit‘. In GOTT, dem <span style="color:#FF6000">„Schöpfer der Welt“</span>, folgt dem ,Begriff‘ immer ,notwendig‘ das ,Sein‘ ''':''' <span style="color:#CC66FF">»''GOTT sprach ''':''' Es werde ,Licht‘. Und es wurde Licht''«, <small>{{Bibel | Genesis |1|3|EU}}</small>;</span> oder auch ''':''' <span style="color:#CC66FF">»''Der Herr sprach, und sogleich geschah es; er gebot, und alles war da''«,</span> <small>{{Bibel | Psalm |33|9|EU}}</small>.]</span>«</span>
Das Entscheidende bei der <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls ist, dass der <span style="color:#00B000">(Begriff)</span> GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, nicht auf die Ebene seiner ,endlichen‘ Geschöpfe und unserer Welt gestellt wird, <span style="color:#00B000">(d.i. das ‚Universum‘ im ,Urknall‘, die ‚100-Taler‘, ein ‚Tsunami‘, auch ,einfache Modelle‘ von unserer Welt, etc.)</span>, und damit verglichen wird, sondern, dass der GOTT der Christen in seiner Einzigartigkeit und Besonderheit als <span style="color:#FF6000">»''der Unendliche''«</span> belassen und als <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer vergänglichen Welt, — als <span style="color:#FF6000">»''der Unvergleichliche''«</span> —, verstanden wird. <span style="color:#00B000">(Alle Kritiken des sog. ,ontologischen‘ Gottesbeweises übersehen die Einzigartigkeit und Besonderheit des <span style="color:#FF6000">»''Unendlichen''«</span>, und/oder wollen diese nicht ,wahr‘ haben.)</span> Auch THOMAS von Aquin ,verortet‘ den GOTT ANSELMS, — in seiner Kritik an dessen Theorem —, irrtümlich unter die ,Dinge‘ der uns umgebenden ,Natur‘, wenn er sagt ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse in rerum natura</big></span>“</span>, d.h. wörtlich, dass der GOTT ANSELMS <span style="color:#FF6000">»</span>''in der Natur der Dinge'' <span style="color:#00B000">(unserer Welt)</span> ''existiert''<span style="color:#FF6000">«</span>, und verkennt somit, — wie nach ihm auch KANT —, die ,Unvergleichlichkeit‘ GOTTES, <span style="color:#00B000">(vgl. STh I q.2 a.1 ad 2<ref>„Deus … illud quo maius cogitari non potest; non tamen propter hoc sequitur quod intelligat id quod significatur per nomen, esse in rerum natura; sed in apprehensione intellectus tantum.“ ——— »''GOTT ist'' (nach ANSELM) ''der, über den Größeres nicht mehr gedacht werden kann. Aber nicht deswegen, weil er'', (der Narr von Psalm 14.1, den ANSELM zitiert), ''das versteht, was durch diesen Namen,'' (d.h. mit dem Begriff ,GOTT‘, als der ,Größte‘, im Theorem ANSELMS), ''bezeichnet wird, folgt daraus'', (wie ANSELM meint), ''dass er auch versteht, dass er'', (der GOTT ANSELMS), ''auch in der ,Natur‘ der Dinge'' (unserer Welt) ''existiert''; <span style="color:#00B000">[ was ANSELM so nie gesagt hat ]</span>. ''Daraus folgt nur, dass er'', (als ,GOTT‘), ''bloß in der Auffassung seines Verstandes'', (d.h. nur im Denken des Narren als ,Begriff‘), ''existiert.''« ——— Hier ,verortet‘ THOMAS einerseits den unendlichen GOTT, von dem das Theorem ANSELMS spricht, irrtümlich unter die endlichen Dinge der uns umgebenden ,Natur‘, was sachlich dem theologischen Theorem der Unvergleichlichkeit GOTTES widerspricht, der nicht unter die Dinge unserer Welt eingereiht werden darf. Anderseits verliert er dadurch auch den ,Blick‘ für die Außerordentlichkeit und Besonderheit GOTTES, dessen Natur völlig verschieden und unabhängig von der ,Natur‘ unserer raum-zeitlichen Welt ist. GÖDEL beweist jedoch, mit ANSELM, weil es notwendig, ohne Widerspruch, (»''bloß in der Auffassung unseres Verstandes''«), möglich ist, dass GOTT existiert, ist es korrekt, daraus auch mit Notwendigkeit zu folgern, dass der Glaube des Erzbischofs ANSELM, und der Glaube seiner Anvertrauten, von der Wirklichkeit GOTTES, widerspruchsfrei, logisch richtig, und damit sinnvoll ist; denn Möglichkeit und Wirklichkeit sind in GOTT koinzident ,eins‘. Das ist das Privilegium GOTTES allein, der einzigartig und unvergleichlich ist. Damit zeigt er auf, dass THOMAS die Unvergleichlichkeit und Einzigartigkeit GOTTES in seinem Vorhalt nicht bedacht hat; und außerdem ANSELM missverstanden hat.</ref>)</span>; jedenfalls hier in der Auseinandersetzung mit ANSELM. Dagegen spricht ANSELM im ,''<span style="font-family: Times;"><big>Proslogion</big></span>''‘, Seite 85f, nur von einem <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span> GOTTES, d.h. dass GOTT ,auch in Wirklichkeit existiert‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was ,größer‘, bzw. ,mehr‘ ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ,im Verstand zu sein‘; wobei die ,zeitlose-überzeitliche‘ Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES jedoch völlig verschieden und <span style="color:#FF6000">»''unabhängig von der zufälligen''«</span> Wirklichkeit <span style="color:#00B000">(die ,Natur‘)</span> der ,raum-zeitlichen‘ Welt der Dinge ist. Daher ist sie mit dieser auch nicht vergleichbar. GOTT ist <span style="color:#FF6000">„vollkommen“</span> und alle <span style="color:#FF6000">„Vollkommenheiten“</span> in GOTT, <span style="color:#00B000">(die ultimativen ,Transzendentalia‘)</span>, sind koinzident ,eins‘, — ,fallen <span style="color:#FF6000">„notwendig“</span> perspektivisch in eins zusammen‘, und sind daher konvertierbar. Darum ist auch die Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES ,einzigartig‘ und ,unvergleichlich‘.
Mit Korollar-3 ist die Exklusivität und Außerordentlichkeit GOTTES definitiv im Kalkül ,bewiesen‘ <span style="color:#00B000">( ╞ )</span>. Der abendländische Monotheïsmus ist somit eine ,logische‘ Konsequenz aus den GÖDEL-Axiomen. <span style="color:#00B000">(Das <span style="color:#4C58FF">„theologische“</span> Theorem von der ,Einzigartigkeit‘ und Exklusivität GOTTES, d.h. hier im Kontext ''':''' die exklusive Einheit von GOTT und Mensch in JESUS CHRISTUS; von Vater, Sohn und Geist im <span style="color:#4C58FF">„Dreifaltigen“</span>; von Essenz und Existenz, von Begriff und Sein, von Ursache und Wirkung, von Subjekt und Objekt, von Möglichkeit und Wirklichkeit, und die unbegrenzte Summeneinheit und Koinzidenz der unendlichen Transzendentalien in GOTT, ist, — mit HEGEL —, die Voraussetzung und Bedingung jeder Philosophie ''':''' <span style="color:#FF6000">»''Die Einheit muss am Anfang der Philosophie stehen''«</span>; und ist zugleich auch ihr gesuchtes und bewiesenes Endergebnis und Ziel ''':''' <span style="color:#FF6000">»''Diese Einheit muss auch das Resultat der Philosophie sein''«</span><ref>https://hegel-system.de/de/gottesbeweis.htm#hegels-kritik-an-kant</ref>, was hier im GÖDEL-Kalkül ,logisch‘ mit Korollar-3 verifiziert wird ''':''' <span style="color:#4C58FF">— ‚'''□(∃xGx ∧ ∀y(Gy→x=y))'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist exklusiv einzigartig''«</span>.)</span>
Die Einzigartigkeit GOTTES bedingt die Koinzidenz, den inneren Zusammenhang aller seiner Vollkommenheiten und Zuschreibungen, <span style="color:#00B000">(Axiom-2)</span>, d.h. ihr paarweise, perspektivisches ,Zusammenfallen in eins‘ im Unendlichen, GOTT. ——— Aus der Notwendigkeit aller positiven Eigenschaften und Zuschreibungen, <span style="color:#00B000">(d.h. aus den, an sich, notwendigen, ultimativen Transzendentalien, Axiom-4)</span>, die in GOTT paarweise, als ,Wesenseigenschaften‘ koinzident ,eins‘ sind, <span style="color:#00B000">(Definition-2)</span>, ist die Einzigkeit GOTTES für uns erschließbar, <span style="color:#00B000">(Korollar-3)</span>. Axiom-4 ist die erste, ,modal‘ <span style="color:#FF6000">„notwendige“</span>, d.h. die transzendentale Voraussetzung für Korollar-3.
Wenn im Korollar-3 das <span style="color:#4C58FF">— ‚'''x'''‘ —</span> z. B. für GOTT, dem ,Vater‘ der Christen, und das <span style="color:#4C58FF">— ‚'''y'''‘ —</span> für GOTT, dem ,Sohn‘, d.h. für ,JESUS CHRISTUS‘ steht, oder für den ,HEILIGEN GEIST‘, <span style="color:#00B000">(den ,Dreifaltigen GOTT‘ der Christenheit)</span>; oder auch für die Gottesbezeichnung ,GOTT-ADONAI‘ der Juden, oder für die Gottesbezeichnung ,ALLAH‘ der Muslime steht, dann weist dieses Korollar, für <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span>, mit der ,ontologischen Identität‘ ''':''' <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, auf die ,Koinzidenz‘ des <span style="color:#4C58FF">„Dreifaltigen“</span>, und auf die <span style="color:#4C58FF">„Hypostatische Union“</span> der Naturen von GOTT und Mensch in JESUS CHRISTUS,
bzw. auch auf den inneren Zusammenhang der drei Buch-Religionen hin.
===<div class="center"><span style="color:#660066">Anhang : das GÖDEL-Kalkül</span></div>===
In der ,Legende zum GÖDEL-Kalkül‘ wird an einige Basics erinnert, und diese für die operative Praxis im anstehenden Kalkül, mit Hilfe von logischen Meta-Terme, adaptiert. Zusätzliche, notwendige Regeln und Gesetze werden dann ,benannt‘, wenn sie in der Kalkül-Durchführung auftreten.
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">Legende zum GÖDEL-Kalkül</span></div>
|-
|
<small>
<math>\begin{align}
{\color{blue}\text{ ◇}} \text{ :: konsistent ↔ widerspruchsfrei ↔ möglich ↔ denkbar, } & {\color{blue}\text{ □}} \text{ :: notwendig ↔ wirklich, für jede mögliche Welt ↔ exklusiv} \\
\text{logischer Meta-Term ::} {\color{blue}\text{ [ A ├ B ]}} \text{ ::} & \text{ „aus A folgt im Kalkül ,regulär‘ (├ ) B.“} \\
\text{ A, B sind Aussagen über Eigenschaften, (A ist keine Eigenschaft);} & \text{ die Aussage, z.B. in der Kalkül-Zeile 10, wird als ,Term :10:‘ bezeichnet} \\
{\color{blue}\text{ AE}} \text{ ::} & \text{ Argument Einführung, Prämisse, Postulat } \\
{\color{blue}\text{ Xx}} \text{ ::} & \text{ „X ist eine Eigenschaft der Individuum-Variable x.“ } \\
{\color{blue}\text{ ¬PX}} \text{ ::} & \text{ „X ist keine positive Eigenschaft, ist keine Perfektion, ist nicht vollkommen.“ } \\
{\color{blue}\text{ Instanz(X := Y)}} \text{ ::} & \text{ Substitution der Eigenschaft X durch die ,bestimmte‘ Eigenschaft Y } \\
\text{ (Eine ,Instanz‘ ist ein Exemplar aus einer Menge gleichartiger Dinge;} & \text{ hier die ,bestimmte‘ Eigenschaft Y, als Ersatz für das unbestimmte X.) } \\
{\color{blue}\text{ FUB(x := y)}} \text{ ::} & \text{ Freie-Um-Benennung der Individuum-Variable x in y } \\
\text{ ,modal‘-frei gewählte Kalkül-Prämisse ::} {\color{blue}\text{ Gx}} \text{ ::} & \text{ „Die Variable x steht für den GOTT der Christen.“ } \\
{\color{blue}\text{ [ G(y) ├ ⱯyG(y) ]}} \text{ ::} & \text{ All-Operator-Einführung der Variable y für GOTT } \\
\text{ „Angenommen, die Variable y steht für GOTT, dann } & \text{folgt ,regulär‘ (├ ), dass auch jedes y im Kalkül für GOTT steht.“}\\
{\color{blue}\text{[ ⱯXA(X) ├ A(X) ]}} \text{ ::} & \text{ All-Operator-Beseitigung für die substituierte Eigenschaft X } \\
\text{ „Wenn X durch eine ,bestimmte‘ Eigenschaft ,instanziiert‘ ist oder } & \text{wird, dann kann der All-Operator von X ,regulär‘ (├ ) beseitigt werden.}\\
{\color{blue}\text{ KOMM(↔)}} \text{ ::} & \;{\color{blue}\text{[ (A↔ B) ↔ (B ↔ A) ]}} \text{ :: Kommutativgesetz für ( ↔ )}\\
{\color{blue}\text{ DIST(□∧)}} \text{ ::} & \;{\color{blue}\text{[ (□A ∧ □B) ↔ □(A ∧ B) ]}} \text{ :: Distributivgesetz für (□∧ )} \\
\text{ (hypothetischer Syllogismus, häufige logische Schlussregel) ::} & \;{\color{blue}\text{[ A → B, A ├ B ]}} \text{ :: (Modus ponendo ponens) :: Abtrennregel.} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn A wahr ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch B wahr ist.“} \\
\text{ (negativer hypothetischer Syllogismus) ::} & \;{\color{blue}\text{[ A → B, ¬B ├ ¬A ]}} \text{ :: (Modus tollendo tollens)} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn B falsch ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch A falsch ist.“} \\
\text{''KONDITIONALER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ A ├ B ╞ A → B ]}} \text{ :: (logische Implikation)} \\
\text{ „Angenommen, A ist ,regulär‘ Axiom oder Prämisse, und B ist im } & \text{Kalkül ,regulär‘ abgeleitet, dann ist ,bewiesen‘ ( ╞ ) : A impliziert B, ist wahr.“} \\
\text{''INDIREKTER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ ¬A → F ╞ A ]}} \text{ :: (Reductio ad absurdum)} \\
\text{ „Wenn im Kalkül aus ¬A ,regulär‘ eine Kontradiktion } & \text{F folgt, dann ist A ,bewiesen‘ ( ╞ ) : A ist ,wahr‘.“} \\
\end{align}</math>
</small>
|}
A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Eine Prädikatenlogik zweiter Stufe ist eine Logik, in der die Quantoren auch Eigenschaftsausdrücke <span style="color:#00B000">(<span style="color:#FF6000">„Prädikate”</span>)</span> binden können''. <span style="color:#00B000">[ Die ,Prädikate‘ werden in einem Kalkül dieser Logik durch Definitionen ,bestimmt‘ ]</span>. ''Wir werden uns im folgenden recht frei einer dafür geeigneten formalen Sprache bedienen. Äußere Quantoren werden meist weggelassen und wir schreiben kurz'' <span style="color:#4C58FF">— ‚'''Xx'''‘ — </span> ''bzw.'' <span style="color:#4C58FF">— ‚'''PX'''‘ — </span> ''um auszudrücken, dass das Individuum'' <span style="color:#4C58FF">— ‚'''x'''‘ — </span> ''die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''hat, bzw. dass die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''die höherstufige Eigenschaft'' <span style="color:#4C58FF">— ‚'''P'''‘ — </span> ''<span style="color:#00B000">(für <span style="color:#FF6000">„positiv”</span>)</span> hat;'' <span style="color:#00B000"> [ wobei die Eigenschaft <span style="color:#4C58FF">— ‚'''P'''‘ — </span> als einzige im Kalkül ,unbestimmt‘ bleibt ]</span>. <span style="color:#FF6000">«</span><ref>A. FUHRMANN ‚''<span style="font-family: Times;"><big>‚G‘ wie Gödel. Kurt Gödels axiomatische Theologie</big></span>''‘, Seite 6, Anmerkung 3. Konform mit seinem Artikel in ‚''<span style="font-family: Times;"><big>Logik in der Philosophie</big></span>''‘ hg. v. P. SCHROEDER-HEISTER, W. SPOHN und E. OLSSON. 2005, Synchron, Heidelberg.</ref>
Der All-Quantor für Eigenschaften, hier im GÖDEL-Kalkül der ,modalen‘ Prädikatenlogik zweiter Stufe, bindet die ,unbestimmte‘ Eigenschafts-Variable <span style="color:#4C58FF">— ‚'''X'''‘ —</span> ausschließlich nur in den Definitionen im 2. und 3. Beweisgang . <span style="color:#00B000"> (Im ersten Beweisgang gibt es keine Definition.)</span> Dieser All-Quantor wird dann jedes Mal in der Beweis-Durchführung durch die Substitution ''':''' <span style="color:#4C58FF"> [ Instanz(X:= ..) ]</span> mit ,bestimmte‘ Eigenschafts-Konstanten wie <span style="color:#4C58FF">— (X:= G) —</span>, bzw. <span style="color:#4C58FF">— (X:= ¬Y) —</span>, oder <span style="color:#4C58FF">— (X:= E<sub>not</sub>) —</span> ,regulär‘ <span style="color:#00B000">(├ )</span> beseitigt ''':''' <span style="color:#4C58FF"> [ ⱯXA(X) ├ A(X) ]</span>; wobei die Eigenschafts-Konstante im Kalkül entweder als Zwischenergebnis ,regulär‘ abgeleitet, <span style="color:#00B000">(,errechnet‘)</span>, oder mit einer Definition schon ,bestimmt‘ worden ist.
Die spezifische ‚Eigenschaft‘ einer Eigenschaft wird hier, in der formalen Syntax der ,modalen‘ Prädikatenlogik zweiter Stufe, als eine tiefer gestellte Abkürzung <span style="color:#00B000">(als Index)</span> an ihre Trägereigenschaft angehängt, wie z. B. ‚wesentlich‘, bzw. ‚essentiell‘ durch <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, oder ‚notwendig‘ durch <span style="color:#4C58FF"> — <sub>not</sub> —</span>. In der Definition-3 steht der Term ''':''' <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span>, um auszudrücken, dass das Individuum <span style="color:#4C58FF">— ‚'''x'''‘ —</span> notwendig <span style="color:#4C58FF">— <sub>not</sub> —</span> die Eigenschaft ''':''' <span style="color:#4C58FF">— ‚'''E'''‘ —</span>, für ,Existenz‘, hat, d.h. <span style="color:#FF6000">»''das <span style="color:#4C58FF">‚'''x'''‘</span> existiert notwendig''«</span>. Der schon von GÖDEL indizierte Term ''':''' <span style="color:#4C58FF">—‚'''G'''<sub>ess</sub>'''x'''‘ —</span> kann gelesen werden als ''':''' <span style="color:#FF6000">»''Das Individuum <span style="color:#4C58FF">‚'''x'''‘</span> hat die Wesenseigenschaft, <span style="color:#4C58FF"> — <sub>ess</sub> — </span> ''':''' GOTT zu sein, <span style="color:#4C58FF">‚'''G'''‘ </span>''«</span>, statt der ,an sich‘ konformen, aber <span style="color:#4C58FF">„theologisch“</span> etwas ungenauen Formulierung ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist wesentlich göttlich''«</span>; oder mit der Voraussetzung ''':''' <span style="color:#4C58FF">— ‚'''Gx'''→'''G'''<sub>ess</sub>'''x'''‘ — </span> deutlicher und <span style="color:#4C58FF">„theologisch“</span> korrekt ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für den GOTT der Christen'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span> ''das Wesen dieses GOTTES'', <span style="color:#4C58FF">— <sub>ess</sub>‚'''x'''‘ —</span>, <span style="color:#00B000">(,Essenz‘)</span>«</span>; wobei, — entsprechend der ,methodologischen‘ Prämisse des Kalküls <span style="color:#00B000">(<span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> ''':''' das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den ,GOTT der Christen‘)</span> —, bei der Interpretation der Terme dieses besonderen Kalküls, die <span style="color:#4C58FF">„christliche Theologie”</span> für den Begriff <span style="color:#FF6000">„GOTT”</span>, Korrektur und die leitende Instanz ist. Dabei muss die Dreifach-Äquivalenz von <span style="color:#4C58FF"><span style="color:#4C58FF">— ‚'''G'''‘ — </span></span>berücksichtigt werden. Welche der drei Äquivalenzen, bzw. Lesearten von <span style="color:#4C58FF">— ‚'''G'''‘ — </span> bei einem bestimmten Term im Kalkül zulässig ist, muss <span style="color:#4C58FF">„theologisch”</span> überprüft und evaluiert werden. Bei manchen können sogar alle drei Lesearten <span style="color:#4C58FF">„theologisch”</span> zulässig sein.
Warum es in der modalen Prädikatenlogik zweiter Stufe, im GÖDEL-System, ,Definitionen‘ gibt, erklärt GÖDEL formal-syntaktisch ''':''' <span style="color:#FF6000">»''Definitionen dienen ja nur der kürzeren Schreibwelse und sind daher prinzipiell überflüssig.''«</span> <span style="color:#00B000">(Aus der Anmerkung 6 in seinem Hauptwerk ''':''' ,''<span style="font-family: Times;"><big>Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I</big></span>''‘.)</span> Für die <span style="color:#4C58FF">„theologische”</span> Interpretation und Hermeneutik seines Kalküls, sind die ,Definitionen‘ im GÖDEL-System jedoch wesentlich, und letztlich entscheidend. Erst dadurch wird sein Axiomensystem zur <span style="color:#4C58FF">„axiomatischen Theologie”</span>. GÖDEL gibt selbst den hermeneutischen Hinweis dazu, wenn er über den höherstufigen Eigenschaftsbegriff <span style="color:#FF6000">»''positiv''«</span> sagt, der nur ,indirekt‘ definiert wird, jedoch mit seinem gesamten Axiomensystem ''':''' <span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne, (unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span> Die Deutung dieses ,höherstufigen‘ Begriffs als ein anderes Wort für <span style="color:#FF6000">„Transzendentalia“</span> ergibt sich aus der <span style="color:#4C58FF">„theologischen”</span> Evaluierung, d.h. der Einordnung des GÖDEL-Systems in die ,laufende‘ <span style="color:#FF6000">„Rede von GOTT“</span>, seit Menschen, sich über den Sinn der Welt und unseres Lebens in ihr, Gedanken machen. GOTT, der ,transzendent‘, — unabhängig —, zur Welt ist, ist Thema im Theorem ANSELMS, um das es ja im GÖDEL-Kalkül geht. Eine <span style="color:#4C58FF">„theologische”</span> Hermeneutik des GÖDEL-Systems ist daher legitim, die, als ein Bemühen um ein überzeugendes Verstehen, aus dem <span style="color:#4C58FF">„theologischen”</span> Vorwissen vieler Generationen schöpft.
Um philosophische, und sogar <span style="color:#4C58FF">„theologische”</span> Theoreme exakt zu formulieren, und untersuchen zu können, hat der Ausnahmelogiker GÖDEL, im 20. Jahrhundert, ein Tor aufgestoßen, das uns ermöglichen kann, <span style="color:#FF6000">»''mathematisch evident''«</span>, und logisch objektiv nachprüfbar, in diesen Disziplinen zu argumentieren. Mit seiner modalen Prädikatenlogik zweiter Stufe, hat GÖDEL dem alten Wunsch eines Raimundus LULLUS, eines Gottfried Wilhelm LEIBNIZ, eines Immanuel KANT, und anderer, nach einer nachprüfbaren ,Universalsprache‘ in den Geisteswissenschaften, entsprochen; analog zur Mathematik, als Universalsprache in den Naturwissenschaften. Der sog. ,Theorembeweiser‘ der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO, mit Hilfe eines Computers, im 21. Jahrhundert, ist die kongeniale und logische Folge aus diesem Quanten-Schritt GÖDELS.
In der folgenden Neu-Kalkülisierung, wird jeder einzelne operative Logik-Schritt des Kalküls in der '''linken Spalte''' nummeriert und als Term-Ergebnis angezeigt, und in der '''rechten Spalte''' werden die dafür benötigten Term-Komponenten und die dabei angewendeten Logik-Regeln und -Gesetze, mit Meta-Terme, dokumentiert. Am Anfang stehen die Ressourcen und das angestrebte Ziel des Beweisganges, <span style="color:#00B000">(das Theorem)</span>. Die GÖDEL Axiome und Definitionen, die Theoreme und Korollare, die Zwischenergebnisse, das Endergebnis, und die logischen Meta-Terme, <span style="color:#00B000">[ in eckigen Klammern ]</span>, werden kontextabhängig, <span style="color:#00B000">(durch ''„Benennungen“'')</span>, interpretiert, <span style="color:#00B000">(angezeigt durch ,Interpretationspunkte‘ — '''::''' —, falls nötig)</span>. Der jeweilige Beweisgang wird in den Anmerkungen ausführlich und umfassend kommentiert. Die Kalkül-Prämissen, <span style="color:#00B000">(<span style="color:#4C58FF">'''AE:'''</span> Argument Einführung)</span>, sind der modal-frei gewählte Einstieg in das Kalkül. Sie dokumentieren, zusammen mit dem angestrebten Beweis-Ziel, eine bestimmte Problemlage in einem externen Diskurs, der mit dem modalen Logik-System hier, formal-syntaktisch überprüft, und gegebenenfalls, verifiziert oder falsifiziert werden soll. Korollare sind einfache, logische Folgerungen aus dem jeweiligen Beweisgang. Theoreme und Korollare sind ,modal‘ gleichwertig.
====<div class="center"><span style="color:#660066">1. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 1, (Möglichkeitsbeweis)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe__________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist die Eigenschaft X nicht positiv“} \\
\text{(Axiom 2)} & \quad (P\ X \wedge \;\Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x)) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaften Y, die aus einer positiven Eigenschaft X modal} \\
\text{ } & \quad & \ & \; \; \text{notwendig folgen, sind auch positive Eigenschaften“} \\
\text{(Axiom 3)} & \quad P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Theorem 1)} &\quad P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{ (◇ :: „möglich“ ↔ „konsistent“ ↔ „denkbar“; □ :: „notwendig“) } \\
\text{ } & \text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad P\ X \ & \ & \text{ AE: „Angenommen, es gibt positive Eigenschaften, Perfektionen“} \\
\text{02} & \quad P\ X \;\Rightarrow\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{ AE: „Angenommen, positive Eigenschaften sind nicht konsistent“} \\
\text{03} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{04} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{05} & \quad \text{ ├ }\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{:01:02:[Modus ponendo ponens] :: [A, A → B├ B] :AE:} \\
\text{06} & \quad \neg\neg \Box \neg \exists x \ X \ x \ & \ & \text{:05:[ ◇A ↔ ¬□¬A] :: (Modalregel)} \\
\text{07} & \quad \neg\neg \Box \neg\neg \forall x \neg X \ x \ & \ & \text{:06:[∃xA ↔ ¬Ɐx¬A] :: (Quantoren Regel)} \\
\text{08} & \quad \text{ ├ }\; \Box \; \forall x \neg X \ x \ & \ & \text{:07:NEG :: [¬¬A↔A] :: (Gesetz der Aussagenlogik)} \\
\text{09} & \quad \Box \; \forall x \neg X \ x \Leftrightarrow\ W & \ & \text{:02:08:[(:02:↔W) → (├:08:↔W)] :: (Kalkülregel)} \\
\text{10} & \quad \Box \; \forall x \ X \ x \Leftrightarrow\ F & \ & \text{:09:[(¬A↔W)↔(A↔F)] :: (Regel für Wahrheitswerte)} \\
\text{11} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:03:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{12} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \text{ } & \text{:10:11:[(:10:↔F) → (:11:↔F)] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{13} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \ & \text{:01:12:[Konjunktion] :: [A, B ├ A∧B]} \\
\text{14} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow \; (\neg x = x))) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(Y:=( ¬x= ..)) :: (Substitution für Eigenschaften)} \\
\text{15} & \quad \ P (\neg x = .. ) & \ & \text{:13:14:[Modus ponens] :: (logische Schlussregel)} \\
\text{16} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{17} & \quad \neg P (\ x = .. )\ & \ & \text{:15:16:[Modus ponens]}\\
\text{18} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:04:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{19} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \text{ } & \text{:10:18:[(:10:↔F) → (:18:↔W)] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{20} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \ & \text{:01:19:[Konjunktion] } \\
\text{21} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x))) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(Y:=(x=..))} \\
\text{22} & \quad \ P (\ x = .. )\ & \ & \text{:20:21:[Modus ponens]}\\
\text{23} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ & \text{:17:22:[Konjunktion] ⇒ Kontradiktion !}\\
\text{24} & \quad \neg \Diamond \; \exists x \ X \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:05:23:[├A├B╞ A→B] :: ''KONDITIONALER BEWEIS''}\\
\text{25} & \quad \neg\neg \Diamond \; \exists x \ X \ x & \ & \text{:24:23:[Modus tollendo tollens] :: [A→B,¬B ├ ¬A]}\\
\text{26} & \quad \text{ ├ }\; \Diamond \; \exists x \ X \ x & \ & \text{:25:NEG; bzw. :05:23:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS''}\\
\text{27} & \quad \ P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{:01:26:[├A├B ╞ A→B]} \\
\text{(Theorem 1)} & \;\text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\text{28} & \quad \ P\ G \;\Longrightarrow\; \Diamond \; \exists x \ G \ x \ & \ & \text{:27:Instanz(X:=G) } \\
\text{29} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{(A3):28:[Modus ponens]} \\
\text{(Korollar 1)} & \;\text{„Das Dasein GOTTES ist definitiv denkbar“} & \ & \text{„Es ist widerspruchsfrei möglich, dass es GOTT gibt“} \\
\end{align}</math>
</small>
|}
Anmerkung-1 ''':''' <span style="color:#00B000">(Der GÖDEL-Term <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, im Axiom-2 ist an sich überflüssig, da dieser hier als Prämisse :01: ohnehin ,angenommen‘ wird. Der Beweisgang kommt mit Axiom-2 auch ohne diesen GÖDEL-Term zum selben Ergebnis, und verkürzt sich damit sogar um zwei Schritte ''':''' Zeile 13 und Zeile 20 sind dann unnötig.)</span>
Der Beweisgang geht mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als Kalkül-Ressource, prinzipiell von der Existenz eines GOTTES aus. Mit der Prämisse :01: <span style="color:#00B000">(hier im 1. Beweisgang)</span> postuliert GÖDEL vorerst allgemein, dass es <span style="color:#FF6000">»''Vollkommenheit, d.h. positive Eigenschaften''«</span> in unserer Welt gibt ''':''' <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, ohne im Kalkül zu definieren, was darunter zu verstehen ist. Definiert wird dann <span style="color:#00B000">(im 2. Beweisgang)</span>, was eine <span style="color:#FF6000">»''wesentliche Eigenschaft''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(im Sinne von ,Transzendentalia‘)</span>; und mit Hilfe dieser Eigenschaft definiert GÖDEL <span style="color:#00B000">(im 3. Beweisgang)</span>, was eine <span style="color:#FF6000">»''notwendige Existenz''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, die er <span style="color:#00B000">(im selben Beweisgang)</span> axiomatisch mit den <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> gleich setzt ''':''' Axiom-5 ''':''' <span style="color:#4C58FF"> —‚'''PE'''<sub>not</sub>‘ —</span>. Erst im 2. Beweisgang wird mit Term :13:, nach einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, definitiv bewiesen <span style="color:#00B000">( ╞ )</span>, dass die, von GÖDEL, hier postulierten, <span style="color:#00B000">(allgemeinen)</span>, positiven Eigenschaften, <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, tatsächlich auch in GOTT <span style="color:#FF6000">»''positive Eigenschaften''«</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, sind; <span style="color:#00B000">(das sind die ultimativen ,Transzendentalia‘ in GOTT)</span>. Jetzt aber muss vorerst der ,Wunsch‘, bzw. die LEIBNIZ-Frage beantwortet werden ''':''' Ob, mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, <span style="color:#FF6000">»''GOTT''«</span> ,möglich‘ ist, der, nach traditioneller Auffassung, <span style="color:#FF6000">»''ein Wesen von äußerster Größe und Vollkommenheit'' <span style="color:#00B000">[ ist ]</span>, ''das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(nach LEIBNIZ; was GÖDEL mit Definition-1 ,abbildet‘)</span>. Wenn man also beweisen will, dass die Existenz eines solchen ''<span style="color:#FF6000">»GOTTES«</span>'' ,möglich‘ sein soll, dann muss man beweisen, dass dieses postulierte System der <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> möglich und formal ,widerspruchsfrei‘ ist. Das Ergebnis des 1. Beweisganges, das ,Theorem-1‘, <span style="color:#00B000">(,Erster Satz‘)</span>, fasst A. FUHRMANN zusammen als ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>. Wenn sie nicht konsistent wären, käme es zu unlösbaren Widersprüchen, <span style="color:#00B000">(Term :24:)</span>. Term :27: ,besagt‘ ''':''' <span style="color:#FF6000">»''Es ist definitiv, d.h. ohne Widerspruch möglich, dass es positive Eigenschaften gibt''«</span>; denn die Behauptung, es sei nicht möglich, dass es positive Eigenschaften, <span style="color:#00B000">(das sind die ,Transzendentalia‘)</span>, in unserer Welt gibt, führt zu einem Widerspruch, und ist daher falsch und ,unlogisch’. Einmal Axiom-1 und zweimal Axiom-2, <span style="color:#00B000">(das die Gleichwertigkeit aller positiven Eigenschaften nachdrücklich klarstellt)</span>, sichern hier die Konsistenz <span style="color:#FF6000">»''aller positiven Eigenschaften in der Welt'', <span style="color:#00B000">[ die ,Transzendentalien‘ ]</span>, ''und damit auch die, die in GOTT sind''«</span>. <span style="color:#00B000">(Der 2. Beweisgang bestätigt, dass es in GOTT tatsächlich positive Eigenschaften gibt.)</span> Die ,Gleichwertigkeit‘ aller Transzendentalia, <span style="color:#00B000">(ihre ,Äquivalenz‘)</span>, ist formal-syntaktisch daran erkennbar, dass die beiden Eigenschafts-Variablen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> im Axiom-2 für beliebige, unterschiedliche ,positive‘ Eigenschaften gegenseitig austauschbar, <span style="color:#00B000">(,konvertierbar‘)</span>, sind. Das heißt, dass beliebige, unterschiedliche ,positive‘ Eigenschaften, für die diese Variablen stehen, sich paarweise, wechselseitig ,implizieren‘, einschließen, und damit notwendig voneinander abhängen, d.h. koinzident ,eins‘ sind, konvertierbar, und somit gleichwertig sind; entsprechend dem Theorem von den Transzendentalia. Zu Term :29:, dem Korollar zu Theorem-1, notiert GÖDEL am 10. Feb. 1970, <span style="color:#00B000">(übersetzt von Joachim BROMAND)</span> ''':''' <span style="color:#FF6000">»''◇∃xG(x) besagt, dass das System aller positiver Eigenschaften kompatibel ist'',</span> <span style="color:#00B000">[ d.h. miteinander verträglich, weil ohne Widersprüche ].</span> <span style="color:#FF6000">''Dies ist ,wahr‘ auf Grund von Axiom-2,'' <span style="color:#00B000">[ weil alle positiven Eigenschaften, d.h. die Transzendentalien, koinzident gleichwertig und konvertierbar sind ]</span>.«</span> Darum ist es definitiv ,möglich‘, dass es diesen GOTT gibt, der <span style="color:#FF6000">»''alle Grade der Vollkommenheit in sich schließt''«</span> und <span style="color:#FF6000">»''über dem ,Größeres‘ nicht mehr gedacht werden kann''«</span>, und, in weiterer Konsequenz, ist der GOTT-Glaube deshalb ,notwendig‘ widerspruchsfrei und sinnvoll, nach Theorem-3 ''':''' <u>Wenn</u> es ,ohne Widerspruch‘ ''<span style="color:#FF6000">»möglich, bzw. denkbar«</span>'' ist, dass es ''<span style="color:#FF6000">»GOTT«</span>'' gibt, <u>dann</u> folgt daraus ''<span style="color:#FF6000">»notwendig«</span>'' ''':''' es ist auch ,widerspruchsfrei‘, wenn man als Voraussetzung ,annimmt‘, dass es ''<span style="color:#FF6000">»GOTT wirklich, für jede mögliche Welt«</span>'' gibt ''':''' Term :11: im 3. Beweisgang. Der Wenn-Satz ist hier mit Korollar-1 bewiesen; der Dann-Satz wird im 3. Beweisgang bewiesen <span style="color:#00B000">( ╞ )</span>, d.i. die Widerspruchsfreiheit und Sinnhaftigkeit des GOTT-Glaubens.
Die ontologische ,Identität‘, d.h. die ,Gleichsetzung‘, bzw. die ,Koinzidenz‘ von Strukturen, die in der Endlichkeit für uns verschieden sind, jedoch in dem unbegrenzt Unendlichen, GOTT, paarweise, perspektivisch in eins zusammenfallen, wie ,Sein‘ und ,Wesen‘, wie ,Ursache‘ und ,Wirkung‘ usw., und auch die Äquivalenz und Austauschbarkeit der Transzendentalien, haben im GÖDEL-Kalkül die logisch-syntaktische Form einer, aus sich, ,modal‘ notwendigen Implikation zwischen zwei verschiedenen, gegenseitig austauschbaren Eigenschafts-Variablen ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>. Dieses Term-Element stellt formal-syntaktisch die Gleichwertigkeit, <span style="color:#00B000">(Äquivalenz)</span>, bzw. die paarweise Koinzidenz aller positiven Eigenschaften und Zuordnungen in GOTT dar; sowohl hier im Axiom-2, als auch in der Definition-2 über die ,Wesenseigenschaften‘, im 2. Beweisgang, mit jeweils verschiedenen, frei umbenennbaren, Individuum-Variablen. Dieses Term-Element ,gilt‘ allgemein jedoch nur für positive Eigenschaften, alias ,Transzendentalia‘, und wird sofort <span style="color:#FF6000">„modal falsch“</span>, wenn für <span style="color:#4C58FF">— ‚'''X'''‘ —</span>, oder <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, Eigenschaften eingesetzt werden, die, — von Natur aus —, weder positiv noch negativ sind, wie z. B. ,rot‘ oder ,schwer‘. Die wechselseitige Austauschbarkeit der noch ,unbestimmten‘ Eigenschafts-Variablen, für beliebige positive Eigenschaften, ist formal äquivalent zur freien Umbenennung der noch ,unbestimmten‘ Individuum-Variablen ''':''' <span style="color:#4C58FF">[ FUB(x:=y) ]</span>. Der formale, gegenseitige, allgemeine Austausch der positiven Eigenschafts-Variablen, bzw. die formale Gleichsetzung beliebiger positiver Eigenschaften, kann, auf Grund der Äquivalenz aller Vollkommenheiten, bzw. ,Transzendentalia‘, auch dann noch durchgeführt werden, wenn eine, von zwei Eigenschafts-Variablen, durch eine Definition oder eine Schlussfolgerung ,bestimmt‘ worden ist, und dadurch zu einer positiven Eigenschafts-Konstante, d.h. zu einer ,bestimmten‘, positiven Eigenschaft geworden ist. Das ist z. B. bei einer instanziierenden Substitution der Fall ''':''' <span style="color:#4C58FF">[ Instanz(X:=..) ]</span>. Das ist eine spezifische Eigenheit der GÖDEL-Axiomatik, weil alle relevanten, positiven Eigenschaften und Zuordnungen in GOTT, als <span style="color:#FF6000">„ultimative Transzendentalia“</span>, immer auch miteinander kompatibel sind. Mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, wird formal die <span style="color:#FF6000">„Koinzidenz“</span> aller ,Transzententalia‘ in der Welt, und auch der ,Zusammenfall‘ aller Gegensätze in GOTT, abgebildet.
Da die Variable <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht, <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(im Korollar-1)</span>, ist die Eigenschaft ''':''' ''<span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'' ''':''' <span style="color:#4C58FF">(¬x=..)</span>, d.h. das <span style="color:#FF6000">„Ungleichsein“</span>, das <span style="color:#FF6000">„Anderssein“</span> GOTTES, <span style="color:#00B000">(Prämisse :03:)</span>, die entscheidende Voraussetzung und Norm für jeden Diskurs über GOTT ''':''' um der <span style="color:#FF6000">„Unvergleichlichkeit“</span>
GOTTES gerecht zu werden, darf GOTT niemals mit etwas aus der ''<span style="color:#FF6000">»zufälligen Struktur der Welt«</span>'' verglichen, d.h. gleich gesetzt werden. Der Term :18: <span style="color:#4C58FF">(x=x) ↔ W</span> erinnert an die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin‘''«</span>. <span style="color:#00B000">(In der mystischen Tradition, im ''<span style="font-family: Times;"><big>‚Dialog über die Vorsehung‘</big></span>'', dem Hauptwerk der Heiligen KATHARINA von Siena, Mystikerin und Lehrerin der Kirche, sagt GOTT-VATER zur KATHARINA ''':''' <span style="color:#FF6000">»''ICH BIN der IST'', <span style="color:#00B000">[ aus mir selbst ]</span>, ''du bist, die nicht ist'', <span style="color:#00B000">[ aus dir selbst ]</span>.«</span> Das ist eine wichtige, deutende Ergänzung, und die authentische <span style="color:#4C58FF">,theologische‘</span> Interpretation dieser Exodus Text-Stelle. Das ist der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES.)</span>
Zum Term :03: notiert A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Die Notation'' <span style="color:#4C58FF">(¬x=..)</span> ''für die Eigenschaft ''':''' <span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'', <span style="color:#00B000">[ d.h. <span style="color:#FF6000">„Ungleichheit“, „Anderssein“</span>, bzw. die Notation <span style="color:#4C58FF">(x=..)</span> für den Existenzmodus-Perfektion ''':''' <span style="color:#FF6000">„Gleichheit“, „Idendität“</span> ]</span>, ''ist suggestiv und informell und ersetzt hier einen formal korrekten Abstraktionsausdruck wie'' <span style="color:#4C58FF">λy.(¬x=y)</span>, <span style="color:#00B000">[ bzw. <span style="color:#4C58FF">λy.(x=y)</span> ]</span>. ''Für die formal korrektere Notation bedarf es der zusätzlichen Vereinbarung, dass der Ausdruck'' <span style="color:#4C58FF">λy.(¬x=y)</span> ''gleichbedeutend sei mit dem Ausdruck'' <span style="color:#4C58FF">¬λy.(x=y)</span>. ''Diese Vereinbarung ist harmlos, da wir aufgrund der Regel der λ–Konversion'' ''':''' <span style="color:#4C58FF">λy.Xy.x ↔ Xx</span>, <span style="color:#00B000">[ mit der <span style="color:#4C58FF">Instanz(X:=(¬x=..))</span> ]</span>, ''so schließen dürfen'' ''':''' <span style="color:#4C58FF">λy.(¬x=y).x ↔ ¬x=x ↔ <span style="color:#00B000">¬(x=x)</span> ↔ ¬λy.(x=y).x</span> .<span style="color:#FF6000">«</span> <ref>A. FUHRMANN a.a.O. Seite 7, Anmerkung 4 (von mir korrigiert und ergänzt)</ref>
In der Kalkül-Zeile 29 wird das Möglichkeits-Korollar-1 durch einen <span style="color:#4C58FF">[ Modus ponens ]</span> mit Axiom-3 von der Kalkül-Prämisse-Term :01: ,abgekoppelt‘, d.h. es ist nicht mehr vom Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span> logisch abhängig. Das Möglichkeits-Korollar-1 behält jedoch die bewiesene Widerspruchsfreiheit von Theorem-1, und ist damit nur mehr von Axiom-1 und Axiom-2 abhängig, was für das Theorem-ANSELMS am Schluss entscheidend ist. Erklärung zu Term :05: Das Ergebnis einer Logik-Operation zwischen Prämissen ist ,regulär‘ <span style="color:#00B000">(├ )</span> den Prämissen zuzurechnen.
Das Modale-Prinzip KRIPKE-Γ-Ɐx, <span style="color:#4C58FF">['''RK''']</span>, in Worten ''':''' <span style="color:#FF6000">»''Wenn mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''gilt, und daraus logisch folgt, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''auch die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''gilt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar'' ''':''' ''es ist wahr, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''aus der Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''logisch folgt''«</span>. Der Term <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span> steht formal-syndaktisch, allgemein für ,Transzendentalia‘, und ist für alle ,Nicht-Transzendentalia‘ <span style="color:#FF6000">„modal falsch“</span>.
====<div class="center"><span style="color:#660066">2. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 2, (,Basisbeweis‘)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe____________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.2)} & \quad \neg P\ X \;\Longrightarrow\;\ P\neg X\ & \ & \text{„Wenn X nicht positiv ist, dann ist die Negation ¬X positiv“} \\
\text{(Axiom 3)} & \quad \ P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{(Axiom 4)} & \quad \ P\ X \;\Longrightarrow\; \Box \; \ P\ X \ & \ & \text{„Positive Eigenschaften sind notwendig aus sich positiv“} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 2)} & \quad \ X_{ess}\ x \;\Leftrightarrow X\ x \wedge \forall Y \left(\ Y\ x \Rightarrow \Box \; \forall y (\ X\ y \Rightarrow \ Y\ y)\right) & \ & \text{„X ist genau dann eine wesentliche Eigenschaft von x, wenn x sie hat, und} \\
\text{ } & \quad & \text { } & \;\;\text{alle anderen Eigenschaften Y von x notwendig aus dieser Eigenschaft X folgen“} \\
\text{[RM]} &\quad \ A \;\Longrightarrow\;\ B\; \text{ ├ }\;\Box \; A \Longrightarrow\;\Box\; \ B\ & \ & \text{( :: Modales Prinzip)} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{(,G‘ :: „Göttlichkeit“ ↔ „GOTT“ ↔ „Dasein GOTTES“)} \\
\text{ } &\;\text{„Das Wesen GOTTES ist sein Dasein“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} &\quad \ G\ x \ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} &\quad \ Y\ x \ & \ & \text{ AE: „Angenommen, GOTT hat die Eigenschaften Y“} \\
\text{03} &\quad \neg P\ Y & \ & \text{ AE: „Angenommen, die Y in GOTT sind nicht positiv“} \\
\text{04} &\quad \neg P \ Y \Rightarrow \ P \neg Y\ & \ &\text{(A1.2):Instanz(X:=Y) :: (Substitution für Eigenschaften) } \\
\text{05} &\quad \ P \neg Y \ & \ & \text {:03:04:[Modus ponens] :: [A, A → B├ B] } \\
\text{06} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{07} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:06:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{08} &\quad \ P \neg Y \Rightarrow \neg Y \ x\ & \ &\text{:07:Instanz(X:=¬Y)} \\
\text{09} &\quad \neg Y \ x\ & \ &\text{:05:08:[Modus ponens]} \\
\text{10} &\quad \text{ ├ }\; (Y\ x \wedge \neg Y \ x) \;\Leftrightarrow\;\ F\ & \ & \text{:02:09:[Konjunktion] ⇒ Kontradiktion !} \\
\text{11} &\quad \neg P\ Y \; \Rightarrow \; (Y\ x \wedge \neg Y \ x )\ & \ &\text{:03:10:[├A├B ╞ A → B] :: ''KONDITIONALER BEWEIS''} \\
\text{12} &\quad \neg\neg P\ Y \ & \ &\text{:11:10:[Modus tollendo tollens] :: [A → B,¬B├ ¬A]} \\
\text{13} &\quad \text{ ├ }\; P\ Y \ & \ &\text{:12:NEG; bzw. :03:10:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS'' :AE:} \\
\text{14} &\quad \ P\ Y \;\Rightarrow\;\Box \; \ P\ Y \ & \ & \text{(A4):Instanz(X:=Y)} \\
\text{15} &\quad \Box \; \ P\ Y \ & \ & \text{:13:14:[Modus ponens]} \\
\text{16} &\quad \ G \ y \Rightarrow \ Y \ y\ & \ &\text{:01:02:[├A├B ╞ A→B]:FUB(x:=y)} \\
\text{17} &\quad \text{ ├ }\; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:16:[G(y) ├ ⱯyG(y)]} \\
\text{18} &\quad \Box \; \ P\ Y \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:13:17:[├A├B ╞ A→B]:[RM]} \\
\text{19} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:15:18:[Modus ponens]} \\
\text{20} &\quad \ Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:02:19:[├A├B ╞ A→B]} \\
\text{21} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x & \ &\text{:20:01:[Konjunktion] :: [A, B├ A ∧ B]} \\
\text{22} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ X \ y \Rightarrow \ Y \ y)) \wedge \ X \ x\;\Leftrightarrow\; X_{ess}\ x \ & \ &\text{(D2):KOMM(↔):KOMM(∧):[ⱯYA(Y) ├ A(Y)] wegen :13:} \\
\text{23} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x\;\Leftrightarrow\; G_{ess}\ x \ & \ &\text{:22:Instanz(X:=G)} \\
\text{24} & \quad \text{ ├ }\; G_{ess}\ x \ & \ &\text{:21:23:[Modus ponens]:AE: wegen :30:} \\
\text{25} &\quad \ G\ x \;\Rightarrow\; \ G_{ess}\ x \ & \ & \text{:01:24:[├A├B ╞ A→B] :: Theorem 2.1} \\
\text{26} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] } \\
\text{27} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:26:[ⱯXA(X) ├ A(X)]} \\
\text{28} &\quad \ P \ G \Rightarrow \ G \ x\ & \ &\text{:27:Instanz(X:=G)} \\
\text{29} &\quad \text{ ├ }\; G \ x\ & \ &\text{(A3):28:[Modus ponens]} \\
\text{30} &\quad \ G_{ess}\ x \;\Rightarrow \ G \ x\ & \ &\text{:24:29:[├A├B ╞ A→B] :: Theorem 2.2 } \\
\text{31} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{:25:30:[Konjunktion]:BIKONDITIONAL :: [(A→B) ∧ (B→A) ↔ (A↔B)] } \\
\text{(Theorem 2)} &\; \text{„Dasein, GOTT-Sein, ist das Wesen GOTTES“} & \ & \Longleftarrow\; \text{was zu beweisen war ! } \\
\text{32} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:19:Instanz(Y:=(x=..))} \\
\text{33} &\quad \ G\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:01:32:[├A├B ╞ A→B]} \\
\text{(Korollar 2)} & \;\text{„Es gibt notwendig höchstens einen GOTT“} & \ & \text{„Wenn es GOTT gibt, dann gibt es für jede mögliche Welt nur einen GOTT“} \\
\end{align}</math>
</small>
|}
<span style="color:#00B000"><small>(In den Kalkül-Zeilen 16, 18, 31 mussten zwei-, und in Zeile 22 drei Kalkül-Schritte, d.h. Logik-Operationen in eine Zeile zusammengezogen werden, weil der Parser dieser speziellen Mathematik-Funktion in Wikibooks jedes Mal wegen Puffer-Überlauf abstürzt, wenn zu den bestehenden Zeilen noch eine neue Zeile, oder ein Text-Element, zusätzlich eingefügt wird. Das vermindert etwas die Transparenz des Kalküls.)</small></span>
Anmerkung-2 ''':''' <span style="color:#00B000">(Dieser Beweisgang kommt auch ohne das ,unbestimmte‘ Konjunkt <span style="color:#4C58FF"> — ‚'''Xx'''‘ —</span> in der Definition-2 zum gleichen Ergebnis, und wird dadurch um eine Zeile verkürzt ''':''' Zeile 21 entfällt, und <span style="color:#4C58FF">[ KOMM(∧) ]</span> ist dann unnötig. Dieses Konjunkt wird hier ebenfalls schon in der Kalkül-Prämisse :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, als ,Annahme‘ gesetzt, vorentschieden und ,bestimmt‘ mit der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>. Es war also logisch korrekt, dass GÖDEL, in seiner Notiz vom 10. Feb. 1970 zum ontologischen Beweis, dieses Konjunkt weggelassen hat, was ihm von Kommentatoren als ein Flüchtigkeitsfehler angerechnet worden war. Der gesamte 2. Beweisgang bewegt sich im Geltungsbereich der Prämisse Term :01:, d.h. ist in jeder Zeile von der Annahme abhängig ''':''' die Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span> steht für den GOTT der Christen. In der Kalkül-Zeile 33 wird mit Korollar-2 diese Abhängigkeit, für den Term :32:, explizit dargestellt.)</span>
Der Beweisgang geht mit der Prämisse :01: prinzipiell, als ,modal‘ freigewählte Voraussetzung, von der Existenz eines GOTTES aus. Im 1. Beweisgang wurde bewiesen, dass die von GÖDEL ,postulierten‘ <span style="color:#FF6000">»''allgemeinen positiven Eigenschaften, Vollkommenheiten, Perfektionen'', <span style="color:#00B000">[ die sog. ,Transzendentalien‘ ]</span> ''konsistent''«</span>, d.i. widerspruchsfrei sind. Hier, in diesem Beweisgang wird nun die Prämisse vom 1. Beweisgang, <span style="color:#4C58FF"> — ‚'''PX'''‘ —</span>, im Bezug auf GOTT hinterfragt ''':''' Gibt es auch in GOTT so Etwas, wie <span style="color:#FF6000">»''Vollkommenheit, Positives, Perfektes''«</span> '''?''' Die ,Annahme‘ jedoch, dass es <span style="color:#FF6000">»''in GOTT keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span> <span style="color:#00B000">(keine Transzendentalien)</span> gibt, <span style="color:#00B000">(Prämisse Term :03:)</span>,<span style="color:#4C58FF"> — ‚'''¬PY'''‘ —</span>, d.h. dass die <span style="color:#00B000">(wesentlichen)</span> Eigenschaften in GOTT keine <span style="color:#FF6000">„Vollkommenheiten“</span> seien, führt aber zu einem unlösbaren Widerspruch, <span style="color:#00B000">(Term :10:)</span>. Mit Term :13:, als 1. Hauptergebnis, ist damit, — als ,neue‘ Prämisse, <span style="color:#00B000">(ersetzt Term :03:)</span> —, definitiv ,bewiesen‘ <span style="color:#00B000">( ╞ , d.h. es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, dass alle Eigenschaften, die hier mit <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> symbolisiert werden, <span style="color:#FF6000">„positive Eigenschaften“</span>, d.h. <span style="color:#FF6000">„Perfektionen“</span> sind, von denen das Kalkül ,annimmt‘, <span style="color:#00B000">(Prämissen Term :01:, Term :02: und speziell Term :16:)</span>, dass der GOTT der Christen sie besitzt. Alle ,Wesenseigenschaften‘ in GOTT ''':''' <span style="color:#4C58FF">— ‚'''Y'''<sub>ess</sub>‘ —</span>, die durch den Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —, </span> dargestellt werden, sind somit <span style="color:#FF6000">„Vollkommenheiten“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span><span style="color:#00B000">, (,ultimative Transzendentalien‘, aller ,Grade‘)</span>. Damit ist definitiv ‚bestätigt‘, <span style="color:#00B000">( ╞ , es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, was mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schon ‚angenommen‘ worden ist ''':''' <span style="color:#FF6000">»''GOTT ist perfekt; er hat alle positiven Eigenschaften''«</span>; und auch Definition-1 ist damit ,verifiziert‘ ''':''' <span style="color:#FF6000">»''GOTT ist genau deswegen GOTT, weil er, als GOTT, positive Eigenschaften aller Grade in sich schließt''«</span>; entsprechend dem Quelltext bei LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. <span style="color:#00B000">(Der ,Schlüsselbegriff‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> ist der ,Schlüssel‘ zur Erkenntnis, dass GOTT ,notwendig‘, sowohl ,wesentlich‘ für uns, als auch an sich ,grundlos‘, immer schon ,da‘ ist.)</span> Hier, <span style="color:#00B000">(im 2. Beweisgang)</span>, hat Axiom-1, <span style="color:#00B000">(im Term :04:)</span>, sicher gestellt, dass die Eigenschaften in GOTT, <span style="color:#00B000">(Definition-1; Term :06:)</span>, tatsächlich <span style="color:#FF6000">„ultimativ positiv, perfekt und vollkommen“</span> sind ''':''' <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>. Das GÖDEL-Axiom-1 bezieht seine ,Potenz‘ aus dem Prinzip vom ,auszuschließenden‘ Widerspruch ''':''' eine Eigenschaft kann nicht zugleich ,positiv‘ und ,nicht positiv‘ sein '''!'''
Formal lässt sich das 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' schon aus Term :23: in diesem Beweisgang mit der <span style="color:#4C58FF">[ Vereinfachung ] :: [ A∧B ├ B ]</span> ohne Weiteres ,regulär‘ ableiten, — analog zu den Vorgehensweisen bei A. FUHRMANN und G.J. WIRSCHING. <span style="color:#00B000">(Beide Aussagen dieser ,Konjunktion‘ sind ,gleichwertig‘ und wahr, daher partizipiert das Theorem-2 auch am Ergebnis der Widerspruchsfreiheit von Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dem 1. Hauptergebnis. Beide Aussagen im Term :23: interpretieren sich gegenseitig.)</span> Der hier gewählte, etwas längere Weg zum Ergebnis, soll die innere Struktur und Abhängigkeit der Ergebnisse von bestimmten Voraussetzungen offen legen, und ihren ,Zweck‘ verdeutlichen. Die beiden Hauptergebnisse im Basisbeweis gehen vom vorgefundenen und traditionell vorgegebenen Begriff von ,GOTT‘ aus, <span style="color:#00B000">(Term :06:, Term :16: und Term :26:)</span>. Das ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 1. Hauptergebnis, hier im 2. Beweisgang, Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span> ''':''' <span style="color:#FF6000">»''die Eigenschaften in GOTT sind vollkommen, d.h. sind die ultimativen Transzendentalia''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als auch die Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span>, für die Annahme ''':''' den ,GOTT der Christen‘, der deswegen GOTT ist, weil er alle Grade der Vollkommenheit in sich schließt. Und das ebenfalls ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 2. Hauptergebnis, hier im selben Beweisgang, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''das Wesen GOTTES ist sein eigenes Sein''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, als auch die Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, für die Wesenseigenschaft ''':''' ,notwendige Existenz‘, und widerlegt den Einwand KANTS, für den Spezialfall ''':''' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für ,GOTT‘. Zwei Axiome und zwei Definitionen von GOTT und seinen Vollkommenheiten werden durch die Ergebnisse im Basisbeweis des GÖDEL-Kalküls in unserer realen Welt als ,wahr‘, <span style="color:#00B000">(genauer als ,widerspruchsfrei‘)</span>, und, — im Rahmen des christlichen Glaubens —, als ,annehmbar‘ bestätigt. <span style="color:#00B000">(Anmerkung zu Term :24: ''':''' eine Prämisse ist regulär-,modal‘ immer ,frei‘ wählbar.)</span>
Zusammengefasst heißt das ''':''' die ,strittige‘ Begründung der ,methodologischen‘ Prämisse des GÖDEL-Kalküls ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#00B000">(Prämisse, Term :01:)</span>, weil <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#00B000">(Korollar-1)</span> ''':''' <span style="color:#FF6000">»''Das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den GOTT der Christen, für den es ohne Widerspruch denkbar ist, dass es ihn gibt''«</span>, <span style="color:#00B000">(ANSELMS Prinzip, trotz der ,Warnung‘ KANTS)</span>, ist ,wahr‘ und für uns ,annehmbar, denn es ist auch, auf Grund der Ergebnisse des 2. Beweisganges, in unserer realen Welt ,wahr‘ und ,annehmbar‘, weil schon als ,widerspruchsfrei‘ verifiziert ''':''' <span style="color:#FF6000">»''Der GOTT der Christen'' <span style="color:#00B000">(Term :01:)</span> '',existiert‘ für uns ,notwendig‘''«</span> ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, <span style="color:#00B000">(d.i. das ,regulär‘-mögliche Korollar sowohl im 2. als auch im 3. Beweisgang)</span>, denn dieser GOTT ist aus sich ,vollkommen‘ ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, und zu seiner ,Vollkommenheit‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> gehört auch notwendig sein ,Existieren‘ ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. <span style="color:#00B000">(Jeder dieser Terme ist im-, und durch den 2. Beweisgang, im Geltungsbereich der Prämisse Term :01:, als ,wahr‘ und ,annehmbar‘ bewiesen, bzw. verifiziert.)</span> Das ist der ,Kern‘ des ontologischen Arguments, und somit ist auch diese ,strittige‘ Begründung der Prämisse des GÖDEL-Kalküls mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. sie ist logisch ,richtig‘ und, im Kontext des christlichen Glaubens, vernünftig. Die Annahme des Gegenteils zu dieser Prämisse ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Es ist undenkbar, dass es diesen GOTT gibt''«</span>, führt jedoch, unabhängig von jeder Glaubensüberzeugung, zu einem Widerspruch — ist unlogisch und daher ,falsch‘, <span style="color:#00B000">(siehe Anhang ''':''' Widerlegung)</span>. Die Behauptung einer ,formalen Unentscheidbarkeit‘ zu den Annahmen über die Existenz GOTTES, ob oder nicht, <span style="color:#00B000">(d.h. ein ,methodologischer‘ Agnostizismus)</span>, ist gegen jede ,Logik‘; und ist auch ,falsch‘, d.h. der Agnostizismus ist einfach nur ein ,logischer Irrtum‘. Denn aus dem, im Kalkül abgeleiteten, Widerspruch aus der einen Annahme, und damit ihrer Unrichtigkeit, folgt notwendig die Richtigkeit der gegenteiligen Annahme. Damit ist eine klare Entscheidung getroffen.
Das Modale-Prinzip <span style="color:#4C58FF">['''RM''']</span> in Worten ''':''' <span style="color:#FF6000">»''Wenn es wahr ist, dass aus'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> ''ein'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> ''logisch folgt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar, dass, wenn'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist, auch'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist''«</span>. <span style="color:#00B000">(Das <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> in Term :18: ist als ,modal notwendig‘ durch den Term :15: verifiziert '''!''' )</span>
Mit dem 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#FF6000">»'',Dasein‘ ist das ,Wesen‘ GOTTES''«</span>, folgt die GÖDEL-Axiomatik der philosophisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition der ,Rede von GOTT‘ seit ARISTOTELES, und schließt sich damit formal-syntaktisch zugleich auch der religiösen Überzeugung der Christen an, die glauben, dass GOTT, als unser Vater, aus Liebe, in seinem Sohn, JESUS CHRISTUS, für uns immer schon <span style="color:#FF6000">»''da''«</span> ist, <span style="color:#00B000">(der Sohn ist koinzident ,eins‘ mit GOTT, dem Vater und dem GEIST)</span>, wirksam in und durch seine <span style="color:#4C58F0">„Kirche“</span>, im HEILIGEN GEIST, bis ans Ende der Zeit. Das ist das, <span style="color:#FF6000">»''was''«</span> GOTT eigentlich für uns ausmacht, — die Selbstmitteilung seines unergründlichen Wesens in den Sakramenten der <span style="color:#4C58F0">„Kirche“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin da für euch und für immer, als der ich ''<span style="color:#00B000">[ immer schon gewesen ]</span> ''bin''«</span>; <span style="color:#00B000">(d.i. das <span style="color:#4C58FF">,theologisch‘</span>-exegetische ,Axiom‘ der Christen, und eine <span style="color:#4C58FF">,theologisch‘</span> korrekte Explikation der ,regulären‘ Kalkül-Prämisse Term :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, jeweils im 2. und 3. Beweisgang)</span>. Das heißt aber nicht, dass der Autor des Kalküls sich mit diesem Glauben identifiziert hat, <span style="color:#00B000">(,hat‘ er auch nicht)</span>, oder dass der Leser des ontologischen Beweises von Kurt GÖDEL sich damit identifizieren muss, wenn er dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> anerkennt.
Zur erweiterten <span style="color:#4C58FF">„theologischen“</span> Explikation der Kalkül-Prämisse ''':''' Die <span style="color:#4C58F0">„Kirche“</span> ist das ,Meisterwerk‘ GOTTES ''':''' In ihr ist es GOTT gelungen, etwas Göttliches und Unzerstörbares in unsere korrupte Welt einzupflanzen ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Etwas Göttliches existiert notwendig, d.h. ,unzerstörbar‘ in unserer Welt''«</span>. Sie ist, durch die Menschwerdung des GOTTES Sohnes, JESUS CHRISTUS, dessen <span style="color:#4C58F0">„Leib“</span> die <span style="color:#4C58F0">„Kirche“</span> ist, untrennbar mit Menschen verbunden, die schon, von allem Anfang an, und jetzt immer noch, durch die Sünde korrumpiert sind. Mit ihr will und wird GOTT unsere Welt und die Menschheit, bis ans Ende der Zeit, von der Sünde und von deren Konsequenz, dem <span style="color:#00B000">(ewigen)</span> Tod <span style="color:#4C58FF">„erlösen“</span>, <span style="color:#00B000">(jedoch nicht ohne die Zustimmung des Menschen)</span>. Mit dieser Explikation wird die Tragweite des ontologischen Arguments ANSELMS, und damit auch die <span style="color:#4C58FF">„theologische“</span> Relevanz der GÖDEL-Axiomatik erkennbar. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT, <span style="color:#00B000">(Term :01:)</span>.
====<div class="center"><span style="color:#660066">3. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 3, (ANSELMS Theorem)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe___________________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 5)} & \quad P\ E_{not}\; \ & \text { } & \text{„Notwendige Existenz ist eine positive Eigenschaft“} \\
\text{ } & \text{( :: Das ist nur dann wahr, wenn ,Dasein‘ und ,Wesen‘ } & \ & \text{( :: dagegen KANT : ,Existenz‘ ist keine ,Eigenschaft‘,} \\
\text{ } & \;\;\text{in eins zusammenfallen ! ARISTOTELES : Theorem-2)}\ & \ & \;\;\text{,Sein‘ ist für alles, was existiert, kein ,reales Prädikat‘ ! )} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 3)} & \quad \ E_{not}\ x \;\Longleftrightarrow\;\ \forall X \left(\ X_{ess}\ x \Longrightarrow \Box \; \exists y \ X\ y \right) & \ & \text{„Notwendige Existenz ist genau dann eine Eigenschaft von x, wenn} \\
\text{ } & \quad & \ & \;\;\text{alle wesentl. Eigenschaften von x notwendig instanziiert sind“} \\
\text{(Korollar 1)} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{„Es ist widespruchsfrei möglich, dass es GOTT gibt“} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ &\text{„Dasein, GOTT-Sein, Existenz ist das Wesen, die Essenz GOTTES“} \\
\text{(Korollar 2)} &\quad \ G\ x \;\Longrightarrow\; \Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{„Wenn es GOTT gibt, dann gibt es notwendig nur einen GOTT“} \\
\text{(Theorem 3)} & \quad \Diamond \; \exists x \ G \ x \;\Longrightarrow\; \Box \; \exists x \ G \ x \ & \ & \text{( :: ANSELMS Prinzip)} \\
\text{ } & \text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{01} & \quad \ G \ x\ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} & \quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ & \text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{03} & \quad \ P \ X \Rightarrow \ X \ x\ & \ & \text{:02:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{04} & \quad \ P \ E_{not}\;\Rightarrow \ E_{not}\ x\ & \ & \text{:03:Instanz(X:= Enot) :: (Substitution für Eigenschaften)} \\
\text{05} & \quad \ E_{not}\ x\ & \ & \text{(A5):04:[Modus ponens] :: [A, A → B├ B]} \\
\text{06} & \quad \forall X \left(\ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y \right) & \ & \text{(D3):05:[Modus ponens]} \\
\text{07} & \quad \ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y & \ & \text{:06:[ⱯXA(X) ├ A(X)]} \\
\text{08} & \quad \ G_{ess}\ x \Rightarrow \Box \; \exists y \ G\ y & \ & \text{:07:Instanz(X:= G)} \\
\text{09} & \quad \ G_{ess}\ x \ & \ & \text{(Th2):01:[Modus ponens]} \\
\text{10} & \quad \text{ ├ }\;\Box \; \exists x \ G\ x & \ & \text{:08:09:[Modus ponens]:FUB(y:=x) :: (Freie-Um-Benennung der Var.)} \\
\text{ } & \text{„Es gibt GOTT wirklich, für jede mögliche Welt“} & \ & \Longleftarrow\; \text{1. Hauptergebnis !} \\
\text{11} & \quad \;\Diamond \exists x \ G \ x \;\Longrightarrow \; \Box \; \exists x \ G\ x & \ & \text{(K1):10:[├A├B ╞ A→B] :: ''KONDITIONALER BEWEIS''} \\
\text{(Theorem 3)} & \;\text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen war ! 2. Hauptergebnis ! } \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{12} & \quad \;\Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{(K2):01:[Modus ponens]} \\
\text{13} & \quad \;\Box \; (\exists x \ G\ x \wedge \; \forall y(\ G \ y \Longrightarrow \ (x = y)))\ & \ & \text{:10:12:[Konjunktion]:DIST(□∧)} \\
\text{(Korollar 3)} & \;\text{„Es gibt notwendig genau nur einen GOTT“} & \ & \text{„Es gibt für jede mögliche Welt nur den GOTT der Christen“} \\
\end{align}</math>
</small>
|}
Anmerkung-3 ''':''' <span style="color:#00B000">(Ein Theorem und zwei Korollare, aus den beiden vorhergehenden Beweisgängen, werden hier, im 3. Beweisgang, zu ,Axiomen‘, die das Theorem-ANSELMS und sein Korollar mit-verifizieren und bestätigen.)</span>
Dieser Beweisgang ist das Ziel aller Bemühungen. Hier wird der sog. ,ontologische Gottesbeweis‘ nach ANSELM von Canterbury formal-syntaktisch dargestellt und als logisch nachvollziehbar von GÖDEL bestätigt. Damit hat er aber auch klar gestellt, dass der ontologische Beweis ANSELMS kein Beweis für die ,Existenz‘ des GOTTES der Bibel sein kann, bzw. sein ,will‘ ''':''' Denn mit der Prämisse, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(Term :01:, wie auch schon im ,Basisbeweis‘, und ausformuliert hier in Term :02:, mit der Definition für GOTT)</span>, wird mit dem traditionellen, abendländischen ,GOTT-Glauben‘, der ,glaubt‘, dass der Gott der Christen tatsächlich existiert, — methodologisch als ,Annahme‘ —, der Beweisgang schon regulär und explizit eröffnet, aus dem sich dann, logisch korrekt, mit Hilfe der GÖDEL-Axiome und Definitionen, das ,Theorem ANSELMS‘ ergibt; <span style="color:#00B000">(hier jedoch, mit Günther J. WIRSCHING, ohne den Umweg bei GÖDEL über den <span style="color:#4C58FF">[ Modus Barbara ] :: [ A → B, B → C ├ A → C ] </span>, mit dem modalen Axiom-BECKER ''':''' <span style="color:#4C58FF">— ‚'''◇□A→□A'''‘ —</span>, als <span style="color:#4C58FF">‚B → C‘</span> im kategorischen Syllogismus, das André FUHRMANN recherchiert hat)</span>. GÖDEL verwendet zur Darstellung des sog. ,ontologischen Gottesbeweises‘ nach ANSELM die Struktur eines modal-logischen Kalküls. Ein modal-logisches Kalkül ist ein genau geregeltes Schema, in dem bei bestimmten ,Annahmen‘ <span style="color:#00B000">(Axiome, Definitionen, Prämissen)</span> etwas anderes als das Vorausgesetzte, auf Grund des Vorausgesetzten mit Notwendigkeit folgt. Entsprechend der ,Modalität‘ der sechs ,modal‘ notwendigen, d.h. transzendentalen Voraussetzungen, hier, für den 3. Beweisgang, die in den <span style="color:#00B000">(und durch die)</span> beiden vorhergehenden Beweisgängen schon als <span style="color:#FF6000">„modal wahr“</span>, bzw. als logisch annehmbar, verifiziert und/oder ,bewiesen‘ wurden, sind auch die beiden ,Schlusssätze‘ <span style="color:#00B000">(Theorem-3 und Korollar-3)</span> <span style="color:#FF6000">„modal wahr“</span>, bzw. logisch annehmbar '''!''' Die Wahl der Prämisse :01: dagegen ist nicht ,modal‘ notwendig, sondern beruht auf einer freien Entscheidung, und damit ist auch ihre Interpretation eine freie Entscheidung, mit der Voraussetzung, dass man das Kalkül mit Theoremen aus der <span style="color:#4C58FF">„christlichen Theologie“</span> evaluieren, und damit interpretieren will. Dazu berechtigt die Genese des Kalküls. Der Glaube an den GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, beruht immer auf einer freien Entscheidung. Das Kalkül, als solches, unabhängig von jeder Interpretation seiner Syntax, ist genau dann ,allgemein‘ <span style="color:#FF6000">»''mathematisch evident''«</span>, d.h. ,ist allgemein gültig‘, wenn es gültigen Logik-Regeln folgt. Die Bestimmung seiner Syntax jedoch, d.h. seine Interpretation, unterliegt hermeneutischen Kriterien, die nicht von Logik-Regeln abhängen, wie hier ''':''' <span style="color:#FF6000">»''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''«</span>, wie GÖDEL selbst hinzufügt. Mit der, — von GÖDEL eingeforderten —, ‚Unabhängigkeit‘ der Kalkül-Axiome von der zufälligen Struktur der Welt, wird implizit für das Kalkül auch festgelegt, dass <span style="color:#FF6000">„GOTT“</span> ‚unabhängig‘ von der zufälligen <span style="color:#00B000">(Raum-Zeit-)</span>Struktur unserer vergänglichen Welt, und daher ,zeitlos-ewig‘ ist, <span style="color:#00B000">(was <span style="color:#4C58FF">„theologisch“</span> korrekt ist)</span>, begründet durch Definition-1 und Axiom-3. Aus der zeitlosen Ewigkeit GOTTES folgt, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, denn bei Zeitlosigkeit gibt es keinen ,zeitlichen‘ und damit auch keinen ,ontologischen‘ Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘. Beides ist dann koinzident ,eins‘ ''':''' wie ,Wesen‘ und ,Dasein‘ in GOTT, bzw. wie ,Begriff‘ und ,Sein‘, oder ,Möglichkeit‘ und ,Wirklichkeit‘. <span style="color:#00B000">(Man vergleiche damit auch die ,postulierte‘ Einheit von ,Erkenntnisobjekt‘ und ,Erkenntnissubjekt‘ im ,Gott‘ des ARISTOTELES ''':''' im <span style="color:#FF6000">»<span style="color:#00B000">[ selbstbewussten ]</span> ''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“<span style="color:#00B000"> | </span>„noêseôs noêsis“</span> <small>(‚<span style="font-family: Times;"><big>''Metaphysik''</big></span>‘ XII 9, 1074b34)</small>, im Vollzug seiner Funktion als ,unbewegtes Bewegungsprinzip‘, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“<span style="color:#00B000"> | </span>„prôton kinoûn akinêton“</span> der Welt, das alles Übrige <span style="color:#FF6000">»''wie ein Geliebtes''«<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὡς ἐρώμενον</big></span>“</span> | <span style="color:#FF6000">„hôs erômenon“</span> bewegt; d.h. christlich ''':''' <span style="color:#FF6000">»''aus Liebe''«</span> ,entstehen‘ lässt.)</span>
Anmerkung-4 ''':''' Das <span style="color:#00B000">(im 2. Beweisgang)</span> schon bewiesene Theorem-2, d.i. die Koinzidenz von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, <span style="color:#00B000">(‚Existenz‘</span> und <span style="color:#00B000">‚Essenz‘)</span>, rechtfertigt sowohl Axiom-5 als auch die Definition-3, und widerlegt den Einwand KANTS. Somit ist deren Setzung <span style="color:#00B000">(hier, im 3. Beweisgang)</span> korrekt, und durch das Theorem-2 schon vorbestimmt und bestätigt, d.h. beide sind <span style="color:#FF6000">„modal wahr“</span> und ,logisch‘ annehmbar, da sie durch die Gültigkeit von Theorem-2 ,verifiziert‘ worden sind. Damit wird klar erkennbar, dass das Theorem-2 tatsächlich die Basis des GÖDEL-Kalküls ist. Und wenn damit Axiom-5 im GÖDEL-Kalkül ‚gerechtfertigt‘ ist, dann ist auch, <span style="color:#00B000">(als Voraussetzung dafür)</span>, das Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ — ''':''' </span> <span style="color:#FF6000">»''Positive Eigenschaften'', <span style="color:#00B000">[ ,Transzendentalia‘ ]</span>, ''sind notwendig aus sich'', <span style="color:#00B000">[ von Natur aus ]</span>, ''positiv''«</span>, im 2. Beweisgang erklärbar, in dem die ‚Positivität‘, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, einer Eigenschaft schon als ‚notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, charakterisiert worden ist, äquivalent zu Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, in dem die ‚Notwendigkeit‘, <span style="color:#4C58FF">— <sub>not</sub> —</span>, <span style="color:#00B000">(der Existenz <span style="color:#4C58FF">— ‚'''E'''‘ —</span>)</span>, dann als ‚positive‘ Eigenschaft, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ‚bestimmt‘ wird; <span style="color:#00B000">(unter der speziellen Voraussetzung, dass <span style="color:#FF6000">„Existieren“</span> definitiv als eine <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT ,instanziiert‘ ist; vgl. Definition-3. Eine ,bestimmte‘ Eigenschaft ist genau dann ,instanziiert‘, wenn sie an einem Träger real ,existiert‘. Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, besagt, dass die, von GÖDEL ,postulierte‘, und im Basis-Theorem-2 verifizierte, <span style="color:#FF6000">„notwendige Existenz“</span> zu den ,ultimativen‘ Transzendentalia in GOTT gehört. Genauer ''':''' Sie ist die ,Summe‘ aller Transzendentalia.)</span> Zum Axiom-4, <span style="color:#00B000">(bzw. zum Term :14:, im 2. Beweisgang)</span>, erklärt GÖDEL in seinen Notizen zum Kalkül ''':''' <span style="color:#FF6000">»''da es'' <span style="color:#00B000">[ das Notwendigsein, <span style="color:#4C58FF">— '''□''' —</span> ]</span> ''aus der Natur der'' <span style="color:#00B000">[ positiven ]</span> ''Eigenschaft folgt'', <span style="color:#00B000">[ deren Positivität, im selben Beweisgang, mit Term :13: vorher schon ,bewiesen‘ (╞ ) worden ist ]</span>«</span>. Die GÖDEL-Erklärung zum Axiom-4 entspricht der Modal-Regel zur sog. ,Nezessisierung‘ in der KRIPKE-Logik nach GÖDEL. <span style="color:#4C58FF">[ Nezessisierungsregel ] '''::''' [ ├ A →├ □ A ]</span> ''':''' <span style="color:#FF6000">»''Angenommen'', <span style="color:#4C58FF">‚'''A'''‘</span> ''ist in einem Kalkül eine Prämisse, oder darin regulär'' <span style="color:#4C58FF">(├ )</span> ''abgeleitet, dann folgt in diesem Kalkül regulär'' <span style="color:#4C58FF">(├ )</span>, ''dass dieses'' <span style="color:#4C58FF">‚'''A'''‘</span> ''auch ,modal‘ notwendig'' <span style="color:#4C58FF">— ,□‘ —</span> ''ist''«</span>. GÖDEL hat jedoch diese modale Notwendigkeit nur in der ,Natur‘ der positiven Eigenschaften, alias ,Transzendentalia‘, gesehen, und mit den Aussagen im Axiom-4 expliziert ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt, nur dann sind die Axiome wahr''«</span>. Ob dieselbe modale Notwendigkeit auch auf Aussagen über Eigenschaften, wie ,rot‘ oder ,schwer‘, die weder positiv noch negativ sind, zutrifft, ist nicht erwiesen. Hier kann nur von modaler ,Kontingenz‘ gesprochen werden, die universal, alles Seiende innerhalb der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> betrifft. Somit sind die Aussagen <span style="color:#4C58FF">— ‚'''A'''‘ —</span> in der GÖDEL-Regel, nur auf Aussagen über ,positive‘ Eigenschaften eingeschränkt, und nicht allgemein gültig. Die <span style="color:#4C58FF">[ Nezessisierungsregel ]</span> ist nur für <span style="color:#FF6000">„Transzendentalia“ „modal wahr“</span>, und für ,Nicht-Transzendentalia‘ immer <span style="color:#FF6000">„modal falsch“</span>.
Der unbegrenzt Unendliche, GOTT, — im Glauben der Christen —, ist deswegen ,notwendig für uns da‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, weil er als GOTT ,vollkommen‘, ,perfekt‘ und absolut ,positiv‘, d.h. absolut ,gut allein‘ ist, ohne jede Negativität ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>; <span style="color:#00B000">(was auch schon im 2. Beweisgang mit Term :13: verifiziert wurde)</span>. Und wenn GOTT ,vollkommen‘, ,perfekt‘, ,positiv‘, und absolut ,gut‘ ist, dann ist er das auch ,notwendig aus sich‘ ''':''' <span style="color:#4C58FF">— ‚'''PG → □PG'''‘ — ::</span> <span style="color:#00B000">(als Zusatz-Korollar im 2. Beweisgang mit Axiom-4 und der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>)</span>, d.h. ,aus seinem Wesen‘. Das ist gerade das, ,was‘ GOTT als GOTT ausmacht ''':''' sein ,Wesen‘, bzw. seine <span style="color:#FF6000">„Natur“</span>. Zusammen mit der Definition-1 für GOTT, <span style="color:#00B000">(und der Definition-2 ''':''' Alle Wesenseigenschaften hängen notwendig gleichwertig aus sich zusammen)</span>, ist dieses, aus der <span style="color:#FF6000">„Natur“</span> GOTTES sich ergebende, ‚Notwendigsein‘, <span style="color:#4C58FF">— '''□''' —</span>, aller ‚positiven‘ Eigenschaften im Axiom-4, und ihr logischer Zusammenhang, d.i. die Koinzidenz aller ,Vollkommenheiten‘ und ,Zuschreibungen‘ im Unendlichen, GOTT, ihr ,Zusammenfallen in eins‘, die entscheidende Voraussetzung, aus der sich dann für GÖDEL <span style="color:#00B000">(im 2. Beweisgang)</span> auch der logische Zusammenhang, bzw. die ontologische Identität, <span style="color:#00B000">(die Koinzidenz)</span>, von <span style="color:#FF6000">„Dasein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, im Basis-Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> mit Notwendigkeit ergibt. Damit hat GÖDEL ein altes <span style="color:#4C58FF">„theologisches“</span> Theorem der Vergessenheit entrissen. Das Theorem-2 ist dann, in weiterer Folge, die ,modal‘ notwendige, d.h. die transzendentale Voraussetzung auch für den Konsequenz-Teil im Theorem ANSELMS, <span style="color:#00B000">(Term :09: hier im 3. Beweisgang)</span>. <span style="color:#FF6000">„Positive Eigenschaften“<span style="color:#00B000"> | </span>„Vollkommenheiten“</span> sind ,immer‘ auch <span style="color:#FF6000">„notwendige Eigenschaften“</span>, daher ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. Das ,Dasein‘, die <span style="color:#FF6000">„Existenz“</span> ist ,immer‘ etwas <span style="color:#FF6000">„Positives“</span>, speziell in GOTT, dem Schöpfer jeder ,Existenz‘, bzw. allen ,Seins‘. Axiom-4 begründet im GÖDEL-Kalkül das Basis-Theorem-2, <span style="color:#00B000">(wie auch das Korollar-3 von der exklusiven Einzigartigkeit GOTTES)</span>, und ,verankert‘ diese Theoreme damit zugleich in der <span style="color:#4C58FF">,theologisch‘</span>-philosophischen Tradition der ,Rede von GOTT‘ bei ARISTOTELES, — AVICENNA, — ANSELM, — DESCARTES, — LEIBNIZ, — HEGEL, — und bei GÖDEL mit äußerster ,logischer‘ Klarheit.
Anmerkung-5 ''':''' Der ‚Schlüsselbegriff‘ in diesem Kalkül ''':''' <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Vollkommenheit“<span style="color:#00B000"> | </span>„Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, dominiert alle Axiome des GÖDEL-Kalküls, jedoch ohne inhaltlich genauer ‚bestimmt‘ worden zu sein. Für <span style="color:#4C58FF">— ‚'''P'''‘ — </span> gibt es keine explizite Definition '''!''' <span style="color:#00B000">(Das Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, besagt nur, dass die ,postulierten‘, positiven Eigenschaften, die <span style="color:#FF6000">„Transzendentalia“</span>, formal miteinander verträglich, d.h. ‚widerspruchsfrei‘ sind, wegen Axiom-2. Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, besagt, dass positive Eigenschaften ,gleichwertig‘ sind, d.h. gleich ,wahr‘ sind, weil sie ,notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, aus sich, alle paarweise mit- und voneinander ,impliziert‘ sind, sich gegenseitig ,einschließen‘, und damit eine Einheit bilden, d.h. in GOTT ,eins‘ sind. Axiom-2 ist somit zugleich eine ,indirekte‘ Definition für ,positive‘ Eigenschaften ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, besagt ''':''' Weil die ,gleichwertigen‘, positiven Eigenschaften sich gegenseitig implizieren, und damit notwendig von einander abhängen, d.h. koinzident in GOTT ,eins‘ sind, — wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht —, dann sind sie somit auch die ,wesentlichen‘ Eigenschaften, die <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, in GOTT, der, wesentlich und exklusiv, notwendig ,Einer‘ ist. Die Definition-2 ist nur dann <span style="color:#FF6000">„modal wahr“</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit positive Eigenschaften, d.h. mit <span style="color:#FF6000">„Transzendentalien“</span>, besetzt werden. Diese Definition ist jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn ihre Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind. Fußnote zu Definition-2 in der GÖDEL-Notiz ''':''' <span style="color:#FF6000">»''any two essences of x are nec. equivalent''«</span>. Die paarweise, notwendige Äquivalenz von zwei beliebigen Wesenseigenschaften der Individuum-Variable <span style="color:#4C58FF">‚'''x'''‘</span>, wird hier, spezifisch für GOTT, d.h. wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT, dem ,Einen‘, steht, zur <span style="color:#FF6000">„Koinzidenz“</span>, — zum paarweise ,Zusammenfallen aller Gegensätze in Einem‘ —, dem inneren Zusammenhang aller seiner <span style="color:#FF6000">„ultimativen“</span> Vollkommenheiten, d.h. aller <span style="color:#FF6000">„Transzendentalia“</span> und Zuschreibungen, in dem unbegrenzt Unendlichen, GOTT, den schon der Philosoph und Kardinal NIKOLAUS von Cues als <span style="font-family: Times;"><big>,coincidentia oppositorum‘</big></span> verstanden hat.)</span>
In den entscheidenden ‚Schlusssätzen‘ des Kalküls ist der ‚Schlüsselbegriff‘ verschwunden. Hier ist nur mehr von GOTT, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, die Rede ''':''' Korollar-1, <span style="color:#FF6000">»''Es ist definitiv denkbar, dass es GOTT gibt''«</span>, Theorem-2, <span style="color:#FF6000">»''Dasein, GOTT-Sein, Göttlichkeit ist das Wesen GOTTES''«</span>, Theorem-3, <span style="color:#FF6000">»''Weil GOTT definitiv denkbar, d.h. widerspruchsfrei möglich ist, darum ist auch der Glaube an GOTT widerspruchsfrei, logisch richtig und mathematisch evident, der annimmt, dass es GOTT, mit Notwendigkeit, wirklich gibt''«</span>, <span style="color:#00B000">(nach ANSELM von Canterbury, und was spezifisch das <span style="color:#FF6000">»</span>''Privilegium der Gottheit allein''<span style="color:#FF6000">«</span> ist, nach LEIBNIZ)</span>, und Korollar-3, <span style="color:#FF6000">»''Es gibt notwendig aus sich, d.i. unverursacht, nur einen GOTT''«</span>. Das GÖDEL-Kalkül ist zu diesen Erkenntnissen gekommen, ohne die Eigenschaften, bzw. die ‚Vollkommenheiten‘ GOTTES, d.h. wer oder was GOTT ‚an sich‘ selbst ist, genauer bestimmen zu müssen, <span style="color:#00B000">(was ,für uns‘ ohnehin ,unmöglich‘ ist)</span>; außer im Theorem-2, in dem das <span style="color:#FF6000">„Dasein“</span> GOTTES als die ‚für uns‘ bestimmende und wichtigste <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT erkannt worden ist, — immer vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. Der GOTT des GÖDEL-Kalküls ist nicht mehr der an Raum und Zeit gebundene ‚Gott‘ des ARISTOTELES, sondern der von Raum und Zeit <span style="color:#FF6000">»''unabhängige''«</span> GOTT der Bibel bei ANSELM und bei LEIBNIZ. Das GÖDEL-Kalkül, <span style="color:#00B000">(wie ja auch der sog. ‚ontologische Gottesbeweis‘ ANSELMS)</span>, kann jedoch, — bei aller ‚Coolness‘ —, keinen GOTT-Glauben ‚erzeugen‘, sondern setzt vielmehr die Existenz GOTTES notwendig als gegeben schon voraus. Das Kalkül des Logiker GÖDEL beweist aber, dass der traditionelle ‚GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. logisch ,richtig‘ und <span style="color:#FF6000">»''mathematisch evident''«</span> ist, weil der ‚Nicht-GOTT-Glaube‘, <span style="color:#FF6000">»''die atheistische Weltanschauung''«</span>, im Möglichkeitsbeweis notwendig zu unlösbaren Widersprüchen führt, und somit logisch ,falsch‘ ist. <span style="color:#00B000">(Die ,Logik‘ hat aber, — bekanntlich —, bei allen wichtigen, persönlichen Entscheidungen immer nur eine untergeordnete Rolle '''!''' )</span>
Anmerkung-6 ''':''' Das erste, ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitete, Hauptergebnis im 3. Beweisgang, Term :10: <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' der Glaube, dass GOTT ,notwendig‘ existiert, ist die logische Konsequenz aus der Prämisse, Term :1: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>. Dieses erste Hauptergebnis hat also den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist daher davon ,abhängig‘, d.h. Term :10: ist der Ausdruck einer ,Glaubensüberzeugung‘. Das zweite Hauptergebnis im 3. Beweisgang, das Theorem ANSELMS ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, dagegen, ist die Darstellung der Abhängigkeit des ersten Hauptergebnisses von dem, vorher schon bewiesenen, ,Axiom‘ von der ,möglichen‘ Existenz GOTTES ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang. Dem geht folgende Beobachtung voraus ''':''' Der Term ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, hat in seiner syntaktischen Stellung hier, im Theorem-3, nicht mehr den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist damit, in seiner Position als Konsequenz-Teil im Theorem ANSELMS, auch nicht mehr davon syntaktisch abhängig, sondern stützt sich formal-syntaktisch nur auf die behauptete Möglichkeit GOTTES; daher muss diese ,angenommene‘ Möglichkeit noch bewiesen <span style="color:#00B000">( ╞ )</span> werden. Dazu die Feststellung LEIBNIZ‘, der diesen Zusammenhang, und seinen Mangel, erkannt hat ''':'''
::Das Theorem ANSELMS ist <span style="color:#FF6000">» ''ein unvollständiger Beweis, der etwas voraussetzt, was man noch hätte beweisen'' <span style="color:#00B000">( ╞ )</span> ''sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' «</span>.
Diesen <span style="color:#FF6000">»''unvollständigen Beweis''«</span> hat GÖDEL im 1. Beweisgang mit dem ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleiteten, und widerspruchfreien Möglichkeits-Korollar-1, vervollständigt, und damit hat er mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span> bewiesen ''':''' <span style="color:#FF6000">»''Diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens''«</span> enthält <span style="color:#FF6000">»''keinen Widerspruch''«</span> '''!''' Das Korollar-1 ist nur vom logischen Axiom-1 und von der mathematischen Äquivalenz der Perfektionen, <span style="color:#00B000">(der Transzendentalien)</span>, im Axiom-2 ,abhängig‘, und nicht mehr von der ,methodologischen‘ Kalkül-Prämisse, dem traditionellen GOTT-Glauben. Damit hat das Glaubens-Theorem ANSELMS die gesuchte <span style="color:#FF6000">»''mathematische Evidenz''«</span> erreicht, unabhängig von jeder Glaubensüberzeugung. Entscheidend dafür ist der mathematisch-logische Beweis GÖDELS, dass der Nicht-GOTT-Glaube zu einem Widerspruch führt.
Zusammenfassung ''':'''
Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>, ist die logische Konsequenz aus der Prämisse im 1. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, den, — <u>modal-frei</u> — gewählten, ,angenommenen‘ positiven Eigenschaften, bzw. ,Transzendentalia‘.
Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' <span style="color:#FF6000">»''GOTT-Sein ist das Wesen GOTTES''«</span>, ist die logische Konsequenz aus der Prämisse im 2. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, dem, — <u>modal-frei</u> — gewählten, ,angenommenen‘ GOTT-Glauben der Christen.
Im Unterschied dazu ist im 3. Beweisgang, das Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' der Glaube, dass es einen GOTT notwendig gibt ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, die logische Konsequenz aus dem, — <u>modal-notwendig</u> — als widerspruchsfrei ,bewiesenen‘, Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, im 1. Beweisgang, <span style="color:#00B000">(auch im Beweisgang ,Widerlegung‘ im Anhang)</span>, und damit ist das Glaubens-Theorem-3, als ganzes, ,widerspruchsfrei‘. Das Theorem ANSELMS ist, mit Korollar-1, nur vom logischen Axiom-1 der Widerspruchsfreiheit, und der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften, <span style="color:#00B000">(aller Transzendentalia)</span>, im Axiom-2, abhängig. Damit ist die Bedingung für die geforderte, spezielle <span style="color:#FF6000">»''mathematische Evidenz''«</span>, und auch für die Widerspruchsfreiheit im Glaubens-Theorem ANSELMS erfüllt; unabhängig von jeder Glaubensüberzeugung. Weil es <span style="color:#FF6000">„modal wahr“</span> ist, dass die Transzendentalien, bzw. die Vollkommenheiten ontologisch, — dem Sein nach —‚ alle <span style="color:#00B000">(zueinander)</span> widerspruchsfrei, und alle <span style="color:#00B000">(miteinander)</span> gleichwertig sind, ist es auch <span style="color:#FF6000">„modal wahr“</span>, dass es möglich ist, dass GOTT, — dem Sein nach —‚ da ist, <span style="color:#00B000">(d.h. existiert)</span>, der die unbegrenzte Summe aller ultimativen Transzendentalia, bzw. der unendlichen Vollkommenheiten allen Grades ist, wie es der ,christliche Glaube‘ des Erzbischofs ANSELM und seiner Anvertrauten ,annimmt‘.
====<div class="center"><span style="color:#660066">Widerlegung</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDEL-Kalkül : der Möglichkeitsbeweis als Widerlegung des Nicht-GOTT-Glaubens</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe_____________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist X nicht positiv“} \\
\text{(Axiom 2)} & \quad \Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaft Y in allen x, die aus der Eigenschaft X in allen x} \\
\text{ } & \quad & \ & \; \; \text{mit modaler Notwendigkeit folgt, ist eine positive Eigenschaft“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Korollar-1)} &\quad \Diamond \; \exists x \ G \ x \ & \ & \; \; \text{( „das —,x‘— steht für den GOTT, —,G‘—, der Christen“ )} \\
\text{ } & \text{„Es ist möglich, dass es den GOTT der Christen gibt“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad \; \neg \Diamond \; \exists x \ G \ x \ & \ & \text{ AE: „Es ist unmöglich, dass es diesen GOTT gibt“ (dezidierter Atheismus)} \\
\text{02} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{03} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{04} & \quad \neg\neg \Box \neg \exists x \ G \ x \ & \ & \text{:01:[ ◇A ↔ ¬□¬A ] :: (Modalregel) } \\
\text{05} & \quad \neg\neg \Box \neg\neg \forall x \neg \ G \ x \ & \ & \text{:04:[ ∃xA ↔ ¬Ɐx¬A ] :: (Quantorenregel) } \\
\text{06} & \quad \text{ ├ }\; \Box \; \forall x \neg G \ x \ & \ & \text{:05:NEG :: [ ¬¬A↔A ] :: (Gesetz der Aussagenlogik) } \\
\text{07} & \quad \Box \; \forall x \neg G \ x \Leftrightarrow\ W & \ & \text{:01:06:[ (:01:↔W) → (├:06:↔W) ] :: (Kalkülregel) } \\
\text{08} & \quad \Box \; \forall x \ G \ x \Leftrightarrow\ F & \ & \text{:07:[ (¬A↔W)↔(A↔F) ] :: (Regel für Wahrheitswerte)} \\
\text{ } & \text{„Jeder GOTT-Glaube ist notwendig falsch ! “} & \ & \Longleftarrow\; \text{die logische Konsequenz aus der Prämisse :01: !} \\
\text{09} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:02:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{10} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (\neg x = x)) & \text { } & \text{:08:09:[ (:08:↔F) → (:09:↔F) ] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{11} & \quad \Box \; \forall x (\ G \ x \Rightarrow \; (\neg x = x)) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=(¬x= ..)) } \\
\text{12} & \quad \ P (\neg x = .. ) & \ & \text{:10:11:[ Modus ponens ] :: [ A→B, A ├ B ]} \\
\text{13} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{14} & \quad \neg P (\ x = .. )\ & \ & \text{:12:13:[ Modus ponens ] :: (log. Schlussregel)}\\
\text{15} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:03:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{16} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) & \ & \text{:08:15:[ (:08:↔F) → (:15:↔W) ] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{17} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=( x= ..))} \\
\text{18} & \quad \ P (\ x = .. )\ & \ & \text{:16:17:[ Modus ponens ]}\\
\text{19} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ &
\text{:14:18:[ Konjunktion ] ⇒ Kontradiktion !}\\
\text{20} & \quad \neg \Diamond \; \exists x \ G \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:01:19:[ ├A├B╞ A→B ] :: ''KONDITIONALER BEWEIS''}\\
\text{ } & {\color{RedOrange}\text{Der Atheismus führt zu einem logischen Widerspruch ! }} & \ & \Longleftarrow\; \text{was mit Term :20: bewiesen ist !} \\
\text{21} & \quad \neg\neg \Diamond \; \exists x \ G \ x & \ & \text{:20:19:[ Modus tollendo tollens ] :: [ A→B,¬B ├ ¬A ]}\\
\text{22} & \quad \; \Diamond \; \exists x \ G \ x & \ & \text{:21:NEG }\\
\text{(Korollar-1)} & \;\text{„Es ist definitiv möglich, dass es diesen GOTT gibt“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\end{align}</math>
</small>
|}
Anmerkung-7 ''':''' <span style="color:#00B000">( Dieser Beweisgang ist praktisch identisch mit dem 1. Beweisgang, jedoch gestrafft und präzisiert nach G.J.WIRSCHING. Diese Widerlegung des Nicht-GOTT-Glaubens beginnt sofort mit dem Korollar-1 <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> aus dem 1. Beweisgang, als in Frage gestelltes ,Theorem‘, und beweist, ohne das Axiom-3 <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, und ohne die GÖDEL-Prämisse <span style="color:#4C58FF">— ,'''PX'''‘ —</span>, in einem Zwischenergebnis, die innere Widersprüchlichkeit und damit auch die Unhaltbarkeit der atheistischen Glaubens-Annahme, aus rein logischen ,Gründen‘, bzw. Axiomen. )</span>
Dieser Beweisgang geht von der Existenz GOTTES, <span style="color:#4C58FF">— ,'''G'''‘ —</span>, als Glaubens-Annahme, aus, wobei aber die Möglichkeit seiner Existenz, und damit die Sinnhaftigkeit des Glaubens an GOTT, durch die Prämisse :01: in Frage gestellt wird, und daher im Kalkül überprüft werden muss. Denn mit der Behauptung der Existenz GOTTES allein ist es nicht getan. Es muss auch seine ,Möglichkeit‘, d.h. die Sinnhaftigkeit des Glaubens an GOTT aufgewiesen werden. LEIBNIZ hat als erster, <span style="color:#00B000">(nach ANSELM)</span>, dieses Problem gesehen, und GÖDEL hat dafür die Lösung gefunden. Dieser Beweisgang, <span style="color:#00B000">(analog zum Möglichkeitsbeweis von Günther J. WIRSCHING konzipiert)</span>, setzt in den Axiomen, genau wie im 1. Beweisgang, die Existenz von etwas <span style="color:#FF6000">„Positiven“, „Perfekten“, „Vollkommenen“</span>, <span style="color:#4C58FF">— ,'''P'''‘ —</span>, <span style="color:#00B000">(d.h. die Transzendentalien)</span>, allgemein für die Welt voraus, <span style="color:#00B000">(was im Axiom-3 ''':''' <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, auch GOTT ultimativ zugeordnet wird ''':''' <span style="color:#FF6000">»''GOTT ist absolut positiv, perfekt und vollkommen''«</span>)</span>; das dann im 2. Beweisgang mit Term :13: als widerspruchsfrei, <span style="color:#00B000">(als ,wahr‘ und ,annehmbar‘ im Kontext des christlichen Glaubens)</span>, schon ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> worden ist. Die Existenz von ,Transzendentalien‘ in der Welt, ist ein, mit Beispielen belegbares, allgemeines Faktum; ihre Existenz auch in GOTT ist mit dem Term :13: des 2. Beweisganges bewiesen, die jedoch im Unendlichen, GOTT, als Transzendentalia, auch in ,ultimativer‘ Form vorliegen. Axiom-1 ,besagt‘, dass Eigenschaften nicht zugleich, vollkommen und nicht vollkommen, sein können. Axiom-2 ,besagt‘, dass, allgemein, alle Vollkommenheiten, <span style="color:#00B000">(alle Transzendentalien)</span>, gleichwertig, <span style="color:#00B000">(mathematisch äquivalent)</span>, sind. <span style="color:#00B000">(Axiom-2 wird hier um das GÖDEL-Konjunkt <span style="color:#4C58FF">— ,'''PX'''‘ —</span> verkürzt dargestellt. Damit ist auch Axiom-3 für diesen Beweisgang unnötig geworden, ohne dass sich wegen dieser Kürzung am Ergebnis etwas ändert. Axiom-2 wird jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn seine Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind, die keine ,Transzendentalia‘ sind.)</span> Die Eigenschaft <span style="color:#4C58FF">— (¬x=..) —</span> ,besagt‘, dass GOTT <span style="color:#FF6000">„unvergleichlich“</span> ist, wenn <span style="color:#4C58FF">,'''x'''‘</span> für GOTT steht. <span style="color:#00B000">(Der informelle Term, <span style="color:#4C58FF">— (¬x=..) —</span>, ersetzt hier, wie bei A. FUHRMANN, den formal korrekten Abstraktionsausdruck ''':''' <span style="color:#4C58FF">— λy.(¬x=y) —</span>, aus dem Lambda-Kalkül.)</span> Der Term :16: <span style="color:#4C58FF">— (x=x) ↔ W —</span> steht für die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚IST‘'' <span style="color:#00B000">(aus mir selbst)</span>«</span>, der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES. Der GOTT der abendländischen, christlichen Tradition wird mit <span style="color:#4C58FF">— ,'''G'''‘ —</span> bezeichnet ''':''' d.i. der <span style="color:#FF6000">„GOTT der Christen“</span>, entsprechend der ,methodologischen‘ Prämisse und der ,Genese‘ des Kalküls, syntaktisch formalisiert in der Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn es alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>, nach der Vorgabe von LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Mit Korollar-1 hat dieser Beweisgang dasselbe Endergebnis, wie der 1. Beweisgang. Der Beweis, dass der dezidierte Atheismus zu einem logischen Widerspruch führt, und damit falsch ist, ist ein Zwischenergebnis in diesem Beweisgang, und begründet mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, und unabhängig von jeder Glaubensüberzeugung, den, von LEIBNIZ gesuchten, Möglichkeitsbeweis für die Existenz GOTTES im Argument des Erzbischofs, und bestätigt damit die Sinnhaftigkeit des GOTT-Glaubens. Einmal Axiom-1 und zweimal Axiom-2 sichern hier das Ergebnis des Kalküls ''':''' das Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>''':''' <span style="color:#FF6000">»''Es ist definitiv möglich, dass es den GOTT der Christen gibt''«</span>. Diese zwei Axiome sind die einzigen, und modal-notwendigen, d.h. die transzendentalen Voraussetzungen und Bedingungen für das Endergebnis ''':''' der Widerspruchsfreiheit und Sinnhaftigkeit des Glaubens der Christen an GOTT; <span style="color:#00B000">(dasselbe gilt natürlich auch für die <span style="color:#4C58FF">„theologische“</span> Weltanschauung jeder monotheïstischen Religion '''!''' Dem Erzbischof ANSELM ging es damals nur um seinen Glauben an GOTT.)</span>.
Die Logik-Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso sequitur quotlibet, etiam verum“</big></span></span>, <span style="color:#00B000">(‚Aus Falschem folgt irgendetwas, auch Wahres‘)</span>, ist der scholastische Ausdruck für die ‚Implikation‘ <span style="color:#00B000">(Folgerung)</span> von Aussagen, die nur dann falsch, <span style="color:#4C58FF">— F —</span> ist, wenn das Antezedens wahr, <span style="color:#4C58FF">— W —</span>, und die Konsequenz falsch, <span style="color:#4C58FF">— F —</span> ist. Andernfalls ist sie immer wahr, <span style="color:#4C58FF">— W —</span>, auch wenn die Voraussetzung falsch, <span style="color:#4C58FF">— F —</span> ist ''':''' ‚Modern‘ darstellbar durch die ‚Wahrheitswertetafel‘ für die ‚materiale Implikation‘, <span style="color:#4C58FF">— ,(A → B)‘ —</span> <span style="color:#FF6000">„wenn A, dann B“</span>. Damit ist auch der <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ] </span> verstehbar; <span style="color:#00B000">(vgl. die vierte Zeile der ‚materialen Implikation‘)</span>. Der positive hypothetische Syllogismus ''':''' <span style="color:#4C58FF">[ Modus ponendo ponens ] :: [ A → B, A ├ B ] </span> ist aus der ersten Zeile ablesbar.
Die folgende Tabelle gibt für jeden ,Wahrheitswert‘ der Aussagen <math>A</math> und <math>B</math> das Resultat einiger zweiwertiger Verknüpfungen an ''':'''
{|class="wikitable hintergrundfarbe2" style="text-align:center;"
|-
!colspan="2"|''Belegung''!!Konjunktion!!Disjunktion!!materiale<br /> Implikation!!Äquivalenz<br /> Bikonditional!!kopulative<br /> Konjunktion
|-
!<math>A</math>
!<math>B</math>
!<math>A</math> und <math>B</math>
!<math>A</math> oder <math>B</math>
!wenn <math>A</math> dann <math>B</math>
!sowohl <math>A</math> als auch <math>B</math>
!entweder <math>A</math> oder <math>B</math>
|-
!W!!W
|W||W||W||W||F
|-
!W!!F
|F||W||F||F||W
|-
!F!!W
|F||W||W||F||W
|-
!F!!F
|F||F||W||W||F
|}
<span style="color:#00B000">(Eine ‚Konjunktion‘ ist nur dann ,wahr‘, wenn beide Aussagen einer ‚Konjunktion‘ wahr sind. Eine ‚kopulative Konjunktion‘ ist nur dann ,wahr‘, wenn entweder die eine, oder die andere Aussage der ‚kopulativen Konjunktion‘ wahr ist. Es besteht also eine Wenn-Dann-Verbindung zwischen beiden Aussagen — eine ,Kopplung‘. Das ist die logische Grundlage von Axiom-1 im GÖDEL-Formalismus)</span>
Um das Widersprüchliche der ,Annahme‘ nachzuweisen, dass positive Eigenschaften ,nicht konsistent‘ seien, <span style="color:#00B000">(im 1. Beweisgang)</span>, bzw. um das Unlogische und Sinnwidrige der ,Annahme‘ klarzustellen, es sei ,unmöglich‘, dass es einen GOTT gibt, <span style="color:#00B000">(hier, in der Widerlegung)</span>, verwendet das GÖDEL-Kalkül den Gegensatz ''':''' wahr, <span style="color:#4C58FF">— W —</span>, falsch, <span style="color:#4C58FF">— F —</span>, zwischen der dritten und vierten Zeile der Wahrheitswertetafel, für zwei ,wahre‘ <span style="color:#4C58FF">— W —</span> ,materiale Implikationen‘, in denen die Voraussetzung jeweils falsch, <span style="color:#4C58FF">— F —</span>, ist, entsprechend der Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso, <span style="color:#4C58FF">— F —</span>, sequitur quotlibet, <span style="color:#4C58FF">— F —</span>, etiam verum, <span style="color:#4C58FF">— W —</span>“</big></span></span>, jeweils mit der Hilfe von Axiom-1 und Axiom-2, in einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>; hier unabhängig von jeder Glaubensüberzeugung. Im Gegensatz dazu, wird, <span style="color:#00B000">(im 2. Beweisgang)</span>, aus dem Glauben an GOTT, auch mit einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, speziell mit Axiom-1, das Widersprüchliche in der ,Annahme‘ nachgewiesen, es gäbe in GOTT <span style="color:#FF6000">»''keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span>, d.h. keine ,Transzendentalia‘. In dieser <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, im 2. Beweisgang, wird vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span> ''':''' es gibt den GOTT der Christen, <span style="color:#00B000">(als Prämisse :01:)</span>, der ,unvergleichlich‘ und ,einzigartig‘ ist, und in dem auch alle ,Transzendentalia‘ <span style="color:#FF6000">„koinzident“</span> ,eins‘ sind, entsprechend Axiom-2.
Für KANT entsteht ein Widerspruch in den Prädikaten eines Satzes.
::<span style="color:#FF6000">»</span> ''Wenn ich das Prädicat in einem identischen Urtheile aufhebe'', <span style="color:#00B000">[ durch eine Negation ]</span>, ''und behalte das Subject, so entspringt ein Widerspruch''. <span style="color:#00B000">[ Wenn ich sage ''':''' ,''GOTT ist nicht allmächtig''‘, entsteht ein Widerspruch zur richtigen Aussage ''':''' ,''GOTT ist allmächtig''‘. ]</span> … ''Wenn ihr aber sagt ''':''' ,GOTT ist nicht‘, so ist weder die Allmacht, noch irgendein anderes seiner Prädicate gegeben; denn sie sind alle zusammt dem Subjecte aufgehoben'', <span style="color:#00B000">[ negiert ]</span>, ''und es zeigt sich in diesem Gedanken nicht der mindeste Widerspruch.'' <span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 398f; https://www.korpora.org/kant/aa03/398.html</ref>
Es ist richtig, wie KANT sagt, der Widerspruch entsteht nicht in dem Gedanken ''':''' <span style="color:#FF6000">»</span>''GOTT ist nicht''<span style="color:#FF6000">«</span>. GÖDEL zeigt daher, dass der Widerspruch erst dann entsteht, wenn von der Annahme ausgegangen wird ''':''' ''<span style="color:#FF6000">»</span>Es ist unmöglich, dass GOTT ist''<span style="color:#FF6000">«</span>. Daraus folgt dann ,regulär‘, mit Hilfe von Axiom-1 und Axiom-2, <span style="color:#00B000">(d.h. mit den Theoremen von den Transzendentalien)</span>, die logische ,Möglichkeit‘ GOTTES, unabhängig von jeder Glaubensüberzeugung. Wie LEIBNIZ klar erkannt hat, muss zuerst, aus dem Widerspruch des Gegenteils, die logische ,Möglichkeit‘, <span style="color:#00B000">(die Konsistenz)</span>, der Existenz GOTTES bewiesen werden ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, bevor daraus die reale ,Notwendigkeit‘ GOTTES abgeleitet werden kann ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, dessen ,Existenz‘ jedoch, aus dem ,Glauben‘, im Voraus, schon angenommen worden ist. Dieser Sachverhalt ist das ausschließliche Spezifikum GOTTES, <span style="color:#00B000">(das <span style="color:#FF6000">»''Privilegium der Gottheit allein''«</span>)</span>, und gilt nur bei GOTT, als dem Unvergleichlichen und Einzigartigen. Dieses ,Spezifikum‘ wird im Theorem ANSELMS abgebildet ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, auf Grund von Axiom-2, das den inneren Zusammenhang, die Koinzidenz auch von ,Möglichkeit‘ und ,Notwendigkeit‘ im Unendlichen, GOTT, erkennen lässt. Bis Zeile 10, im 3. Beweisgang, reicht der Geltungsbereich der ,modal‘-frei gewählten Kalkül-Prämisse :01:, der ,methodologische‘ GOTT-Glaube. In Zeile 11 liegt der ,Schwerpunkt‘ des ontologischen Beweises dann aber am, — modal als notwendig — ,bewiesenen‘ Widerspruch des Gegenteils zum GOTT-Glauben, <span style="color:#00B000"> (formal-syntaktisch dargestellt als widerspruchfreies Antezedens, <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang)</span>, und nicht mehr am ,angenommenen‘ GOTT-Glauben der Kalkül-Voraussetzung, <span style="color:#00B000">(nun dargestellt als Konsequenz <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> im Theorem ANSELMS)</span>. Das Möglichkeits-Korollar-1 muss jetzt immer, wie folgt, gelesen werden ''':''' <span style="color:#FF6000">»''Es ist <u>widerspruchfrei</u> möglich, dass GOTT ist''«</span>. Damit hat er, — angeregt durch LEIBNIZ, und mit ihm —, die fast einhellig akzeptierte Fehldeutung des ontologisch-<span style="color:#4C58FF">„theologischen“</span> Arguments ANSELMS für GOTT durch gewichtige philosophische, <span style="color:#00B000">(KANT<ref>GOTT ist absolut einzigartig und unvergleichlich. KANT macht GOTT jedoch zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, indem er die Existenz, bzw. das ,Sein‘ GOTTES mit dem ,Sein der Dinge‘ gleich setzt. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! KANT verkennt damit die Einzigartigkeit und Besonderheit GOTTES. Das ,Sein‘ der Dinge ist, — wie KANT sagt —, kein ,reales Prädikat’, d.h. Existenz ist keine Eigenschaft. Jedoch in GOTT ist ,Sein‘ ein ,reales Prädikat‘, d.h. Existieren ist ,real‘ die Wesenseigenschaft GOTTES, denn GOTT ist der, der für uns, — aus Liebe —, immer schon ,da‘ ist ''':''' in der ,Hypostatischen Union‘, sowohl als GOTT von Ewigkeit zu Ewigkeit, als auch als Mensch in unserer Zeitlichkeit. Das ist das, was GOTT für uns ausmacht —, sein Wesen.</ref>)</span>, und <span style="color:#4C58FF">„theologische“</span>, <span style="color:#00B000">(THOMAS<ref>GOTT ist absolut einzigartig und unvergleichlich. THOMAS unterscheidet die ,Natur GOTTES‘ nicht von der ,Natur der Dinge‘, indem er die ,Natur‘ des GOTTES ANSELMS irrtümlich mit der ,Natur‘ der Dinge gleich setzt. Damit reiht er GOTT unter die vielen Dinge unserer Welt ein, indem er für den GOTT ANSELMS annimmt ''':''' GOTT ,esse in rerum natura‘, d.h. wörtlich, dass der GOTT ANSELMS in der ,Natur‘ der Dinge existiert, <span style="color:#00B000">(was ANSELM nie gesagt hat)</span>. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! Die ,zeitlose-überzeitliche‘ Wirklichkeit, (Natur), GOTTES ist völlig verschieden und unabhängig von der zufälligen Wirklichkeit, (die ,Natur‘), unserer ,raum-zeitlichen‘ Welt. Daher ist sie mit dieser auch nicht vergleichbar. Thomas verkennt damit die Einzigartigkeit und Besonderheit GOTTES.</ref>)</span>, Autoritäten zurechtgerückt, welche die Einzigartigkeit und Unvergleichlichkeit des Unendlichen, GOTT, bei ihrer Beurteilung des Theorem ANSELMS nicht berücksichtigt, sondern den Unendlichen, <span style="color:#00B000">(irrtümlich)</span>, unter die endlichen Dinge unserer Welt eingereiht haben. GÖDEL hat mit dem bewiesenen Widerspruch des Gegenteils zum GOTT-Glauben, den Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Theorem ANSELMS geliefert, was, nach LEIBNIZ, für die Akzeptanz dieses Theorems noch gefehlt hat. Das Theorem ANSELMS besagt universell ''':''' Die <span style="color:#FF6000">»''theologische Weltanschauung''«</span> der Juden, Christen und Muslime, <span style="color:#00B000">(und des ägyptischen Pharaos ECHNATON und seiner Frau NOFRETETE)</span>, die ,annehmen‘, dass es mit ,Notwendigkeit‘ <span style="color:#4C58FF">— ‚'''□'''‘ —</span> <span style="color:#00B000">(nur)</span> einen GOTT gibt, ist logisch richtig und <span style="color:#FF6000">»''mathematisch evident''«</span>, weil es <u>ohne Widerspruch</u> ,denkbar‘ <span style="color:#4C58FF">— ‚'''◇'''‘ —</span> ist, dass es GOTT gibt ''':''' Nicht mehr und nicht weniger, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>.
Es geht hier bei GÖDEL nicht um Theoriefindung oder ähnliches. GÖDEL ist kein ,spekulierender‘ Theoretiker. GÖDEL ist Logiker und Mathematiker. Was er sagt, ist mathematisch wahr und logisch richtig. Wenn er sagt, dass die Aussage ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ — »''wahr''«</span> ist ''':''' <span style="color:#FF6000">»''es ist möglich, dass es Gott gibt'' ''':''' ''das ist ,wahr‘ wegen Axiom-2 (und Axiom-1)''«</span>, dann spricht er hier von der mathematischen Wahrheit. Logischerweise ist dann die konträre Aussage ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ — »''falsch''«</span> ''':''' <span style="color:#FF6000">»''es ist nicht möglich, dass es einen Gott gibt''«</span>, und zwar mathematisch falsch, weil sich aus dieser Aussage ein Widerspruch ergibt. Jeder, der die mathematische Logik GÖDELS lesen kann, kann das sehen und verstehen ''':''' Das Zwischenergebnis, <span style="color:#00B000">(Term :20:)</span>, in dieser Kalkül-Ableitung, die logische Konsequenz aus der Annahme des dezidierten Atheismus, es sei unmöglich, dass es GOTT gibt, ist der faktische, nachprüfbare, und für jeden Menschen sichtbare Beweis dafür, dass diese Annahme in einen Widerspruch mündet, und damit falsch und unlogisch ist. Das bedeutet, es ist eine Tatsache, bzw. es ist ein allgemein gültiges Faktum unser Welt, dass der Atheismus, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, wirklich falsch und unsinnig ist, und daher, mit Recht, als ,Unsinn‘ bezeichnet werden darf '''!''' Das ist nicht bloß als eine Theoriefindung, oder als eine Interpretation eines Autors zu verstehen. Das ist vielmehr genau so wahr und <span style="color:#FF6000">»''mathematisch evident''«</span>, wie, dass zwei mal zwei vier ergibt, und wirklich genau so logisch richtig, wie, dass die Erde sich um die Sonne dreht. Das ist gerade das Überraschende und Unerwartete am Gödel-Kalkül. Es geht hier nicht mehr um Theoriefindung oder Interpretationen, denen man zustimmen kann oder nicht. Es geht hier <span style="color:#FF6000">»''rein verstandesmäßig''«</span> um mathematisch-logische Fakten. Damit steht GÖDEL, in seiner Bedeutung, in gewisser Weise, neben KOPERNIKUS, weil seine Kalkül-Ergebnisse, wie die Berechnungs-Ergebnisse dieses Pioniers der damaligen Zeitenwende, heute, in unserem Äon, ebenfalls mit eingefleischte Vorurteile aufräumen, ohne aber, dass GÖDEL für sich selbst, im Glauben, logisch konsequent gewesen wäre. <span style="color:#00B000">(Er ist sich der Tragweite und der Konsequenzen seiner <span style="color:#4C58FF">„axiomatischen Theologie“</span> anscheinend nicht bewusst gewesen, wenn er sagt ''':''' Man sei heute noch <span style="color:#FF6000">»''weit davon entfernt, das theologische Weltbild wissenschaftlich begründen zu können''«</span>, nachdem sein Kalkül das <span style="color:#FF6000">„atheistische Weltbild“</span> fundamental ins Wanken gebracht und als irrationalen ,Unsinn‘ entlarvt hat. Sein Kalkül ,beweist‘ ( ╞ ) indirekt, dass das <span style="color:#FF6000">„theologische Weltbild“</span>, im Beweisgang ,Widerlegung‘, aus dem Widerspruch des Gegenteils, mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span>, offensichtlich doch, wissenschaftlich begründet werden kann)</span>.
----
Kurt GÖDEL ist auch deswegen ein Ausnahmelogiker.
----
===<div class="center"><span style="color:#660066">Epilog für Skeptiker</span></div>===
Wenn man das GÖDEL-Argument genau liest, dann ist nur die Annahme ''':''' <span style="color:#FF6000"> „es ist möglich, dass es GOTT gibt“</span> bewiesen, weil aus der Annahme ''':''' <span style="color:#FF6000">„es ist unmöglich, dass es GOTT gibt“</span> ein logischer Widerspruch ableitbar ist. Die Aussage ''':''' <span style="color:#FF6000">„es gibt GOTT“</span> ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Menschen, der dann aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann ''':''' <span style="color:#FF6000">»''es gibt GOTT wirklich''«</span>, wenn er will ''':''' <span style="color:#FF6000">»''Es stimmt also, was ich glaube '''!''''' «</span> Das ist das Argument ANSELMS, der ein christlicher Amtsträger war, und der daher von dieser Grundannahme auch ausgeht. Solange in den Voraussetzungen des Möglichkeitsbeweises im GÖDEL-Kalkül kein Widerspruch nachweisbar ist, und solange in der logischen Durchführung dieses Beweises keine schweren Mängel festgestellt werden können, ist das Ergebnis des Möglichkeitsbeweises, wie GÖDEL ihn durchgeführt hat, korrekt, und die Folgerungen daraus, logisch richtig, dass es sich hier um <span style="color:#FF6000">»''mathematische Evidenz''«</span> handelt, <span style="color:#00B000">(z. B. wie 2 x 2 = 4)</span>. Aber niemand ist gezwungen, aus der Möglichkeit, dass es GOTT gibt, daraus zu schließen, dass es GOTT auch mit Notwendigkeit gibt, wie das im Argument ANSELMS geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit LEIBNIZ, der selbst an GOTT geglaubt hat, mit Bestimmtheit sagen ''':''' <span style="color:#FF6000">»''gesetzt, dass GOTT möglich ist, so ist er, was das Privilegium der Gottheit allein ist''«</span>, weil GÖDEL mit seinem Kalkül den noch ausstehenden Beweis der Widerspruchsfreiheit dafür geliefert hat.
Wenn Du den 3. Beweisgang des GÖDEL-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument ANSELMS, der identisch ist mit dem Term in der Zeile 10, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, immer noch formallogisch abhängig ist von der methodologischen Glaubens-Prämisse, Term :01:, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den Gott der Christen''«</span>. Diese Abhängigkeit ist bis zur Zeile 10 offensichtlich und logisch korrekt. <span style="color:#00B000">(Man könnte nach dieser Zeile, ohne Weiteres, ,regulär‘ die <span style="color:#FF6000">„logische Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A→B ]</span> mit Term :01: und Term :10: als ein mögliches Korollar bilden ''':''' <span style="color:#4C58FF">— ‚'''Gx→□∃xGx'''‘ — </span>)</span>. Das bedeutet, der Konsequenz-Teil im Theorem ANSELMS, der in diesem ,regulär‘-möglichen Korollar an zweiter Stelle steht, ist damit in seiner Formal-Struktur offensichtlich ,regulär‘ von der Glaubens-Prämisse, Term :01:, abhängig, d.h. er ist der Ausdruck einer Glaubensüberzeugung. Im Theorem ANSELMS steht er jetzt, in der Zeile 11, als Konsequenz-Teil auch an zweiter Stelle, hat aber nicht mehr seine Glaubens-Prämisse als notwendige Bedingung an erster Stelle vor sich, wie im ,regulär‘-möglichen Korollar. Jetzt steht eine neue und andere Voraussetzung als Begründung vor ihm. Der Schwerpunkt des Argument ANSELMS liegt damit am Begründungs-Teil des ANSELM-Theorems, der jetzt die erste Stelle im Theorem einnimmt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist möglich, dass es GOTT gibt''«</span>, der erst dadurch entstanden ist, und davon abhängig ist, weil sein Gegenteil ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist unmöglich, dass es GOTT gibt''«</span>, zu einem Widerspruch geführt hat. Dieser Begründungs-Teil, das Antezedens, im Argument ANSELMS, ist daher nicht mehr von der methodologischen Glaubens-Prämisse, Term :01:, abhängig, sondern nur vom Axiom-1, der Widerspruchsfreiheit, und von der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften im Axiom-2, die im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, die Widerspruchsfreiheit der Möglichkeit des GOTT-Glaubens mit Notwendigkeit herbeigeführt haben. Daraus ergibt sich eine logische Verschiebung in der Argumentationskette, denn dieser Begründungs-Teil, der jetzt die Widerspruchsfreiheit für den Konsequenz-Teil liefert, ist selbst unabhängig und frei von jeder Glaubensüberzeugung. Weil widerspruchsfrei und <span style="color:#FF6000">»''mathematisch evident''«</span>, muss er als logische Begründung für die Widerspruchsfreiheit und als Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Konsequenz-Teils gelesen werden, und damit bestätigt er die Widerspruchsfreiheit und Sinnhaftigkeit der Glaubensüberzeugung eines gläubigen Menschen, <span style="color:#00B000">(was auch das Ziel ANSELMS war)</span>. Das heißt also ''':''' der Glaube dieses Menschen ist widerspruchsfrei und sinnvoll, und enthält keinen Zirkelschluss, weil sein Gegenteil, der Nicht-GOTT-Glaube, zu einem Widerspruch führt; <span style="color:#00B000">(das hat GÖDEL mit seinem Kalkül-System bewiesen, dessen Argumentationskette mit einem Computer-Programm, dem sog. ,Theorembeweiser‘, überprüft worden ist, und als <span style="color:#FF6000">»''nachweisbar korrekt''«</span> befunden wurde)</span>. Das Theorem ANSELMS beweist, nach GÖDEL, dass der Glaube an GOTT, mit <span style="color:#FF6000">»''mathematische Evidenz''«</span> notwendig widerspruchsfrei und sinnvoll ist, weil der Nicht-GOTT-Glaube notwendig zu einem Widerspruch führt. <u>Das Theorem beweist jedoch nicht, dass die Existenz GOTTES notwendig ist</u>, <span style="color:#00B000">(wie es fast immer fälschlich gelesen wurde und wird)</span>, sondern, das Theorem ANSELMS geht davon aus, als nicht hinterfragtes Faktum, dass GOTT notwendig, schon immer existiert, und beweist, mit dem GÖDEL-Kalkül, dass diese Glaubens-Annahme widerspruchsfrei und sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL abschließend sagt. GOTT hat es ja auch nicht ,nötig‘, bewiesen zu werden. Für den Erzbischof ANSELM war die Existenz GOTTES, überall und jederzeit, die ungefragte und für ihn die selbstverständlichste Voraussetzung aller seiner Bemühungen, in seinem Leben, und in seinem Beruf als christlicher Amtsträger, und auch als Theologe in den philosophischen Überlegungen über seinen Glauben. Mit diesen Überlegungen hat er, mit GÖDEL, bewiesen ''':''' Glaube ist nicht irrational, kein Sprung ins Unbekannte, sondern eine freie, vernünftige Entscheidung. Glaube ist rational und vertrauenswürdig.
Zusammengefasst heißt das Ergebnis dieser Bemühungen ANSELMS ''':''' Wenn Du an GOTT glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist auch logisch in der <u>bewiesenen Möglichkeit</u>, dass es GOTT geben kann, begründet, und damit ist er widerspruchsfrei, sinnvoll und kein Zirkelschluss. Dein Glaube an GOTT beruht jedoch, nach wie vor und in erster Linie, auf Deiner freien Entscheidung für GOTT, und nicht auf dem Zwang einer ,logischen‘ Argumentation. Wenn Du nicht an GOTT glauben willst, dann <u>musst Du, und sollst Du, auch nicht deswegen</u> an GOTT glauben, weil der Nicht-GOTT-Glaube zu einem Widerspruch führt, und damit falsch und unlogisch ist. Denn der Glaube an GOTT muss immer eine freie und Deine ganz persönliche Entscheidung für GOTT sein und bleiben. Niemand darf zum Glauben an GOTT gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Warum '''?''' Weil GOTT die Liebe ist '''!''' Und die Liebe duldet keinen Zwang '''!'''
Zum Abschluss, und für eine bessere Verständlichkeit dieser Studie, hat die KI, der ich diese Studie für die Erstellung eines Podcast übergeben habe, eine, — sogar für Kinder —, verständliche Metapher kreiert. Sie sagt, man stelle sich vor ''':''' Es sei irgendwo ein ,Schatz’ vergraben, und es gäbe auch eine ,Schatzkarte’ für diesen ,Schatz’. Kurt GÖDEL ist nun gekommen, und hat mit seinem Kalkül bewiesen, dass diese ,Schatzkarte’ korrekt ist und fehlerfrei. Ob aber jemand, mit Hilfe dieser ,Schatzkarte’ auf ,Schatzsuche’ gehen will oder nicht ''':''' das ist und bleibt jedem selbst überlassen, und ist immer eine freie, und ganz persönliche Entscheidung. Damit hat die KI erstaunlich treffend, sowohl die Bedeutung, als auch die reale Funktion des GOTT-Glaubens in der Lebens-Wirklichkeit unserer Welt und Zeit charakterisiert, in Übereinstimmung mit der Gleichniserzählung JESU vom ,Schatz im Acker’; <small><span style="color:#00B000">( vgl. {{Bibel | Matthäus-Evangelium |13|44|EU}} )</span></small>. Der ,Schatz’ ist die <span style="color:#FF6000">„<span style="font-family: Times;"><big>Βασιλεία του Θεού</big></span>“</span><span style="color:#00B000"> | ,Basileía tou Theoú’</span>, d.h. das <span style="color:#CC66FF">»''Königtum GOTTES''«</span>, oder auch das <span style="color:#CC66FF">»''Himmelreich''«</span>. Die ,Schatzkarte’ ist der Glaube an GOTT. Die ,Schatzsuche’ ist der Weg des Glaubens in der Nachfolge JESU, der uns den Weg zeigt zum Ziel, zur Erfüllung aller unserer Sehnsüchte und Wünsche.
----
----
;Fußnoten
<references />
ogewvbyqf04ywhebkm9d8lmerjpkfnt
1090683
1090682
2026-09-11T06:45:16Z
Santiago
19191
/* Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘ */ Zusatz
1090683
wikitext
text/x-wiki
[[Kategorie: Buch]]
{{Regal|ort=Philosophie}}
{{Vorlage:StatusBuch|9}}
==<div class="center"><span style="color:#660066">'''Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘'''</span></div>==
<span style="font-family: Times;"><big><div class="center">לַמְנַצֵּ֗חַ לְדָ֫וִ֥ד אָ֘מַ֤ר נָבָ֣ל בְּ֭לִבּוֹ אֵ֣ין אֱלֹהִ֑ים הִֽשְׁחִ֗יתוּ הִֽתְעִ֥יבוּ עֲלִילָ֗ה אֵ֣ין עֹֽשֵׂה־טֽוֹב׃
(Psalm 14,1)</div></big></span>
----
===<div class="center"><span style="color:#660066">Vorwort</span></div>===
Zur Orientierung ''':''' Die Diskussion um GOTT läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser ANSELM gesagt ''':''' <span style="color:#FF6000">»''Ich glaube an GOTT'' … <span style="color:#00B000">[ sonst wäre er sicher
nicht Erzbischof von Canterbury geworden ]</span> … ''aber ich möchte auch wissen und verstehen, ob das stimmt und sinnvoll ist, was ich da glaube '''!''''' «</span> Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Professor und Philosoph aus Königsberg, Immanuel KANT, hat das, was ANSELM da aufgeschrieben hat, gelesen, <span style="color:#00B000">(vermittelt durch CARTESIUS)</span>, und das dann den <span style="color:#FF6000">„ontologischen Gottesbeweis“</span> genannt, <span style="color:#00B000">(obwohl es in Wirklichkeit gar kein Gottesbeweis ist; genauer ''':''' es ist kein Beweis für die Existenz GOTTES)</span>, und dieser große KANT hat dann großartig bewiesen, das, was ANSELM da aufgeschrieben hat, sei falsch. Es sei <span style="color:#FF6000">„ja gar kein“</span> Gottesbeweis '''!''' <span style="color:#00B000">( Naja, was denn sonst '''?''' )</span> Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichbaren GOTT mit hundert Talern in seinem Vermögenszustande verglichen hat. <span style="color:#00B000">(Das ist aber eine andere Geschichte.)</span> Hundert Taler und GOTT haben ,an sich‘ nichts gemeinsam, außer, wenn KANT ,wirklich‘ hundert Taler hat, und GOTT auch ,wirklich‘ existiert, <span style="color:#00B000">(wie ANSELM und gläubige Menschen glauben)</span>, dann gibt es GOTT und die Taler eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit KANT läuft die ganze Diskussion um GOTT immer nur als Diskussion um den <span style="color:#00B000">(von KANT)</span> so genannten <span style="color:#FF6000">„ontologischen, <span style="color:#00B000">[ kosmologischen, teleologischen etc. ]</span> Gottesbeweis“</span> —, obwohl es niemals einen Beweis für die Existenz GOTTES geben kann und niemals geben wird. <span style="color:#00B000">(Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich versucht zu sagen, weil keiner dieser sog. Beweise für die Existenz eines GOTTES stringent ist.)</span> Beweisen kann man die Existenz von Naturgesetzen. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie dann mit Mehrheitenbeschlüsse verändern. Wenn GOTT ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz GOTTES wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. GOTT ist <span style="color:#FF6000">„Person“</span>, — für Christgläubige ''':''' <span style="color:#FF6000">„ein GOTT in drei Personen“</span>. Und GOTT ist <span style="color:#FF6000">„Geist“</span>. Das besagt, dass GOTT nicht mit materiellen Dingen aus unserer Welt verglichen werden darf; <span style="color:#00B000">(was sowohl THOMAS von Aquin als auch Immanuel KANT doch getan haben)</span>. Und ganz wesentlich ''':''' der Zugang zu GOTT läuft nicht über den Beweis, sondern immer nur über den Glauben. Wer an GOTT glauben will, dem antwortet GOTT auf seine Weise — nämlich <span style="color:#FF6000">„geistig“</span> bzw. <span style="color:#FF6000">„geistlich“</span>. Wer nicht an GOTT glauben will, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Glaube ist immer eine freie Entscheidung des Menschen für GOTT. Niemand darf gezwungen werden. Wenn es einen Beweis für GOTT gäbe, wäre jeder vernünftige Mensch gezwungen, an GOTT zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Existenzbeweis für GOTT '''!!!''' ... Daher darf man das Kalkül des Logiker GÖDEL, <span style="color:#00B000">(und damit auch das Theorem ANSELMS)</span>, nicht als einen Existenzbeweis für GOTT lesen. Sowohl ANSELM als auch GÖDEL setzen die Existenz GOTTES notwendig als gegeben schon voraus. Das GÖDEL-System, und auch das Theorem ANSELMS, sind bloß die logische Bestätigung der Widerspruchsfreiheit der Glaubensüberzeugung eines Menschen, der sich schon entschieden hat, an GOTT zu glauben; und nicht der Grund für seine Entscheidung. Alle sogenannten ,Gottesbeweise‘, sind in Wirklichkeit nichts anderes, als nachträgliche Evaluierungen eines GOTT-Glaubens, bzw. ,Wege‘, <span style="color:#00B000">(bei THOMAS von Aquin)</span>, die aufzeigen, dass der GOTT-Glaube widerspruchsfrei, sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL sagt. GOTT hat es nicht nötig, ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> zu werden.
===<div class="center"><span style="color:#660066">Einleitung</span></div>===
Eine Studie zum GÖDEL-Kalkül. Der Logiker Kurt GÖDEL <span style="color:#00B000">(1906-1978)</span> hat mit diesem Kalkül eine moderne Rekonstruktion des, <span style="color:#00B000">(von KANT)</span>, so genannten ‚ontologischen Gottesbeweises‘ nach ANSELM von Canterbury auf modal-logischer Basis vorgelegt. Damit hat er die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt, d.h. sie soll für jeden Menschen nachvollziehbar sein, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie er sagt. GÖDEL ,nimmt‘ als Logiker, angeregt durch den Philosophen und Mathematiker Gottfried Wilhelm LEIBNIZ, rein theoretisch, fürs Erste, einmal ‚an‘, <span style="color:#00B000">(als Prämisse, d.i. der Term :01: im 3. Beweisgang zum Theorem ANSELMS im Anhang)</span>, dass es GOTT gibt ''':''' d.i. ein sog. ,methodologischer GOTT-Glaube‘, und untersucht die logischen Konsequenzen. Dabei zeigt sich, beim genaueren Hinsehen, dass der ‚Nicht-GOTT-Glaube‘, der ‚dezidierte‘ Atheismus, <span style="color:#00B000">(im Beweisgang ,Widerlegung‘ im Anhang)</span>, überraschender Weise, zu einem Widerspruch führt, und damit logisch ,falsch‘ ist. Jedoch, GÖDEL kann und will mit seinem Kalkül keinen ,GOTT-Glauben‘ ,erzeugen‘, d.h. das GÖDEL-Kalkül ist kein <span style="color:#FF6000">„Existenz-Beweis"</span> für den GOTT der Bibel, sondern, es setzt die Existenz eines GOTTES, einfach als gegeben, schon voraus. GÖDEL beweist dann mit seinem System, dass der traditionelle abendländische ,GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, <span style="color:#00B000">(d.i. die Kalkül-Prämisse, und das, daraus ,regulär‘ (├ ) abgeleitete, Theorem ANSELMS)</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> <span style="color:#00B000">(d.h. logisch ,richtig‘)</span> ist, im Gegensatz zum ,Nicht-GOTT-Glauben‘, der davon ausgeht, dass es keinen GOTT gibt. GÖDEL beweist mit seinem System ''':''' der traditionelle GOTT-Glaube ist, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, widerspruchfrei und daher wahr. <span style="color:#00B000">(Der Beweis aus dem Widerspruch des Gegenteils ist ein ,indirekter Beweis‘ und kein ,Zirkelbeweis‘ '''!''' )</span> GÖDEL blieb bis zu seinem Tod ohne ein dezidiertes religiöses Bekenntnis. <span style="color:#00B000">(Das Leben ist nicht immer ,logisch‘.)</span>
Entsprechend der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> ist GOTT der Größte, <span style="color:#FF6000">»''über dem nichts Größeres mehr gedacht werden kann''«</span>, <span style="color:#00B000">(ANSELM)</span>; bzw. <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>, und der für uns immer schon ,da‘ ist. Das ist die methodologische Prämisse des GÖDEL-Kalküls. Davon ausgehend, zeigen seine Axiome und Definitionen, dass es zu einem Widerspruch führt, falls man ,annimmt‘, es sei nicht möglich, dass es <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> gibt. Aus dem Widerspruch des Gegenteils wird von GÖDEL, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, dann ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> ''':''' es ist doch möglich, dass es <span style="color:#FF6000">„GOTT“</span> wirklich gibt. Somit ist der Glaube an <span style="color:#FF6000">„GOTT“</span>, — weil widerspruchsfrei —, mit den Worten GÖDELS ''':''' <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span>.
Immanuel KANT <span style="color:#00B000">(1724-1804)</span> scheint diesen Fall vorausgesehen zu haben, dass versucht werden könnte, die ,Möglichkeit‘ GOTTES aus einem Widerspruch zu ,beweisen‘ ''':'''
::<span style="color:#FF6000">»</span> <span style="color:#00B000">[ Angenommen, es gibt ]</span> ''doch einen und zwar nur diesen '''Einen''' Begriff'' <span style="color:#00B000">[ ,GOTT‘, so dass ]</span> ''das Nichtsein oder das Aufheben seines Gegenstandes'' <span style="color:#00B000">[ GOTT ]</span>, ''in ,sich selbst‘ widersprechend sei; und dieses ist der Begriff des allerrealsten Wesens. Es hat, sagt ihr, alle Realität'', <span style="color:#00B000">[ bzw. alle Vollkommenheit ]</span>, ''und ihr seid berechtigt, ein solches Wesen als ,möglich‘ anzunehmen'' ... <span style="color:#00B000">[ denn das GÖDEL-Kalkül ,beweist‘ ( ╞ ) in der ,Widerlegung‘ im Anhang, wie auch im 1. Beweisgang, aus einem Widerspruch, dass die Existenz GOTTES definitiv logisch ,möglich‘ ist. ]</span> … ''obgleich der sich nicht widersprechende'', <span style="color:#00B000">[ ,mögliche‘ ]</span>, ''Begriff'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''noch lange nicht die'' <span style="color:#00B000">[ reale ]</span> ''Möglichkeit des Gegenstandes'', <span style="color:#00B000">[ GOTT ]</span>, ''beweiset. … Das ist eine Warnung, von der Möglichkeit der Begriffe (logische)'', <span style="color:#4C58FF">— '''◇''' —</span>, ''nicht sofort auf die Möglichkeit der Dinge (reale)'', <span style="color:#4C58FF">— '''□''' —</span>, ''zu schließen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 399; https://www.korpora.org/kant/aa03/399.html</ref>. <span style="color:#00B000">[ Trotz dieser Warnung, wird dieser Schluss dennoch im Theorem ANSELMS vollzogen, bzw. mit GÖDEL im 3. Beweisgang ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> '''!''' ]</span>. <span style="color:#FF6000">«</span>
Warum das <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist, und inwieweit KANT sich irrt, wird in dieser Studie gezeigt.
===<div class="center"><span style="color:#660066">Der Schlüsselbegriff im Kalkül</span></div>===
Der ‚Schlüsselbegriff‘ in diesem Kalkül ist <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Perfektion“, „Vollkommenheit“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Für diesen wichtigen Begriff gibt es aber im Kalkül selbst keine explizite Definition, sondern er wird nur durch seine Verwendung innerhalb des Kalküls indirekt ‚definiert‘. <span style="color:#00B000">(Das heißt ''':''' <span style="color:#4C58FF"> — ‚'''P'''‘ — </span> bezeichnet ein System von ,Eigenschaften‘, die ,positiv‘, bzw. ,vollkommen‘ | ,perfekt‘ | genannt werden, von denen im Kalkül wohl beweisbar ist, dass sie sich gegenseitig ,nicht widersprechen‘, weil sie im System als solche ,gleichwertig‘, bzw. gleich ,wahr‘ sind, jedoch ohne sie erschöpfend aufzählen zu können, oder auch nur sagen zu können, was sie alle im einzelnen bedeuten, außer, dass sie kompatibel sind.)</span> Mit der Wahl dieses Schlüsselbegriffes hat GÖDEL eine wesentliche Vorentscheidung für die Ergebnisse des Kalküls getroffen '''!''' In seinen Notizen zum ‚ontologischen Beweis‘ vom 10. Februar 1970 gibt GÖDEL, — für die nachträgliche Interpretation dieses Begriffes <span style="color:#00B000">(und auch für das Kalkül selbst)</span> —, die richtungsweisende Erklärung ''':'''
::<span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne...''«</span>
::Und er fügt in Klammer hinzu ''':'''
::<span style="color:#FF6000">»...''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span><ref>GÖDEL, Kurt, ''<span style="font-family: Times;"><big>‚Ontological proof‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Collected Works‘</big></span>'', vol. III, ed. S.FEFERMAN et al., Oxford (U.P.), 1995; 403–404.</ref>
GÖDEL-Axiom-1 ''':''' <span style="color:#4C58FF">— ‚('''PX <small><math>{ \color{Blue} \dot\lor}</math></small> P¬X''')‘ ↔<span style="color:#00B000"> ‚('''¬PX ↔ P¬X''')‘</span> — </span> ''':''' <span style="color:#FF6000"> »''Entweder die Eigenschaft'' <span style="color:#4C58FF">‚'''X'''‘</span> ''oder ihre Negation'' <span style="color:#4C58FF">‚'''¬X'''‘</span> ''ist positiv''«</span>. Hier ist der Hauptkritikpunkt, dass es Eigenschaften gibt, die ,an sich‘ weder positiv noch negativ sind. Beispiele wären ''':''' ‚rothaarig‘ oder ‚schwerwiegend‘; solche Eigenschaften können aber ,für mich‘ entweder positiv oder negativ sein, abhängig von meiner Betrachtungsweise und subjektiven Vorlieben. Diese Eigenschaften, wie ‚rothaarig‘ an sich, oder meine positiv-negativen ‚Betrachtungsweisen‘, sind jedoch der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> entnommen und treffen nicht den <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Er orientierte sich an LEIBNIZ, welcher im Bezug zum ‚ontologischen Beweis‘ definiert ''':'''
::<span style="color:#FF6000">»''Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''nenne ich jede einfache Eigenschaft, die sowohl positiv als auch absolut ist, oder dasjenige, was sie ausdrückt, ohne jede Begrenzung ausdrückt''.«</span><ref>Zitiert nach Thomas GAWLICK, in ''<span style="font-family: Times;"><big>‚Was sind und was sollen mathematische Gottesbeweise ?‘</big></span>'', Predigt vom 8.1.2012 in der Kreuzkirche zu Hannover. https://web.archive.org/web/20130524164359/http://www.idmp.uni-hannover.de/fileadmin/institut/IDMP-Studium-Mathematik/downloads/Gawlick/Predigt_Gawlick_Gottesbeweise.pdf</ref>
Die Seins-Eigentümlichkeiten <span style="color:#00B000">(Daseinsmodi, Perfektionen)</span> wie ‚wahr‘, ‚gut‘, ‚edel‘ usw. entsprechen dem <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Das sind Beispiele für ‚absolut‘ positive Begriffe aus der Lehre der Seinsanalogie ''':''' <span style="font-family: Times;"><big>‚verissimum‘, ‚optimum‘, ‚nobilissimum‘</big></span>, usw., die, an sich, <span style="color:#FF6000">»''ohne jede Begrenzung gelten''«</span>; zu finden in der <span style="font-family: Times;"><big>‚Via quarta‘</big></span>, bei THOMAS von Aquin, über die <span style="color:#FF6000">„analoge"</span> Abstufung im ‚Sein‘ der Dinge. Diese <span style="color:#FF6000">„analoge"</span> ‚Abstufung‘ ist dann die faktische Begrenztheit <span style="color:#00B000">(d.h. Unvollkommenheit)</span> im <span style="color:#FF6000">»''zufälligen''«</span> ‚Sein‘ der Dinge —. Die <span style="color:#FF6000">„positiven Eigenschaften“</span> GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, wie Wahrheit, Einheit, Gutheit, <span style="color:#00B000">(von ,Güte‘)</span>, Schönheit, Adel, <span style="color:#00B000">(von ,edel‘)</span>, Gleichheit, Andersheit, Wirklichkeit, ,Sein‘ im Sinne von Etwas-sein, etc. werden <span style="color:#FF6000">„Perfektionen“</span>, oder auch <span style="color:#FF6000">„Transzendentalia“</span> genannt, <span style="color:#00B000">(von lateinisch ''':''' <span style="font-family: Times;"><big>transcendere</big></span>, <span style="color:#FF6000">„übersteigen“</span>)</span>. In der mittelalterlichen Scholastik sind Transzendentalien die Grundbegriffe, die allem Seienden als <span style="color:#FF6000">„Modus“</span>, <span style="color:#00B000">(d.h. ,Eigentümlichkeit‘, als allgemeine Seinsweisen)</span>, zukommen. Wegen ihrer Allgemeinheit ,übersteigen‘ sie die besonderen Seinsweisen, welche ARISTOTELES die ,Kategorien‘ nannte. Ontologisch betrachtet, werden die Transzendentalien als das allem Seienden Gemeinsame aufgefasst, da sie von allem ausgesagt werden können. Von der KI werden sie, nicht unpassend, als <span style="color:#FF6000">„ultimative Eigenschaften des Seins“</span> bezeichnet, die <span style="color:#FF6000">„jenseits der materiellen Welt existieren“</span>, <span style="color:#00B000">(da sie ,ultimativ‘ nur von GOTT, als den unbegrenzt Vollkommenen, ausgesagt werden können, die jedoch, auch von allen übrigen Seienden, wegen deren seinsmäßigen Unvollkommenheit und Begrenztheit, abgestuft, d.h. <span style="color:#FF6000">„analog"</span>, ausgesagt werden)</span>. Diese Transzendentalien sind ,inakzident‘, das heißt, sie entstehen nicht aus anderen Begriffen, sondern sind erste, unteilbare Bestimmungen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> des Denkens und des Seins, die allen Seienden ''':''' <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span>, unabhängig von ihren speziellen Eigenschaften, als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(bzw. Unvollkommenheiten)</span>, mit ,modaler‘ Notwendigkeit, <span style="color:#4C58FF">— ‚□‘ —</span>, <span style="color:#FF6000">„analogisch"</span> zukommen, d.h. sie sind in allen Seienden, seinsmäßig abgestuft und abgegrenzt, ,relativ‘ zum unbegrenzt Unendlichen ihrer selbst, und <span style="color:#FF6000">»''dasjenige, was sie ausdrücken, drücken sie ohne jede Begrenzung aus''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>; und damit stehen sie ontologisch in einer <span style="color:#FF6000">„analogen"</span> ,Beziehung‘ zu GOTT, dem absolut Vollkommenen und unbegrenzt Unendlichen. In der Erkenntnisordnung wirken sie als die ersten Begriffe des menschlichen Verstehens, die eine Basis für alle weiteren wissenschaftlichen Erkenntnisse bilden. In der Seinsordnung sind die Transzendentalien ontologisch eins, gleichwertig, <span style="color:#00B000">(,mathematisch äquivalent‘)</span>, und daher konvertierbar, d.h. austauschbar, <span style="color:#00B000">(vgl. z. B. den scholastischen ,Merksatz‘ ''':''' <span style="font-family: Times;"><big>,ens et verum convertuntur‘</big></span>)</span>. Damit sind sie auch von einander abhängig, was GÖDEL sowohl im Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, für positive Eigenschaften, als auch in der Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, für die Wesenseigenschaften, syntaktisch formalisiert hat mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, weil sie sich gegenseitig, — mit ,modaler‘ Notwendigkeit —, gleichwertig ,implizieren‘, d.h. einschließen, <span style="color:#00B000">(im Axiom-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span>, und in der Definition-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''y'''‘ — </span>)</span>. Man kann die Transzendentalia, <span style="color:#00B000">(wie GÖDEL)</span>, auch ,Wesenseigenschaften‘ ''':''' <span style="color:#4C58FF"> — ‚'''X'''<sub>ess</sub>‘ —</span>, nennen, weil sie allem Seienden <span style="color:#FF6000">„wesentlich analog"</span> zukommen. Weil Transzendentalien miteinander austauschbar sind, sind sie auch widerspruchsfrei, was GÖDEL mit Axiom-1 syntaktisch darstellt. Die Gültigkeit und Wahrheit, d.h. die mathematisch-logische Evidenz von Axiom-1 und Axiom-2, beruht auf der ontologischen Allgemeinheit und Gültigkeit der Transzendentalia, die GÖDEL mit Definition-2, in sein Kalkül explizit eingeführt und als Wesenseigenschaften ,bestimmt‘ hat. <span style="color:#00B000">(Definitionen werden formal-syntaktisch durch das Äquivalenzzeichen <span style="color:#4C58FF">,'''↔'''‘</span> angezeigt, gelesen als <span style="color:#FF6000">„...ist genau dann ... wenn...“</span>)</span> Die GÖDEL-Axiome und -Definitionen werden jedoch sofort <span style="color:#FF6000">„modal falsch"</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit ,Nicht-Transzendentalia‘, wie z. B. ,rot‘ oder ,schwer‘, belegt werden. <span style="color:#00B000">(Dieser ,Sachverhalt‘ wird von Kritikern des GÖDEL-Systems, — zu vorschnell —, verwendet, um ihre Behauptungen zu ,belegen‘, das GÖDEL-Kalkül und seine Konsequenzen seien ,falsch‘.)</span>
Zum Überblick ''':''' <span style="color:#FF6000">„Transzendentalia“</span> sind universale, alles Seiende charakterisierende Begriffe, die über kategoriale Einteilungen hinausgehen, und sowohl in der klassischen Scholastik, als auch in der modernen Philosophie, <span style="color:#00B000">(KANT, Uwe MEIXNER<ref>vgl. die ,transzendentalen‘ Bedingungen möglicher Erkenntnisse bei KANT; und auch in der ,Axiomatischen Ontologie‘ bei Uwe MEIXNER</ref>)</span>, als Grundlage der Metaphysik und Erkenntnistheorie dienen. Sie sind die <span style="color:#FF6000">„ersten Begriffe des Seins“</span>, die jedem Ding als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(Perfektionen)</span>, inhärent sind, <span style="color:#FF6000">„analogisch"</span> abgestuft, auf einen ,ultimativ‘-unbegrenzten Bezugspunkt ausgerichtet, und die sich im Denken, <span style="color:#00B000">(für uns als wahr)</span>, und in der moralischen Wertung, <span style="color:#00B000">(für uns als gut und edel)</span>, manifestieren, relativ zum ,ultimativ‘-unbegrenzten Bezugspunkt ihrer selbst. Die faktische, zusätzliche Unvollkommenheit, die sich generell in der notwendigen, und unausweichlichen Vergänglichkeit aller Dinge zeigt, ist einem ontologischen Defekt ,geschuldet‘, der stark zeitabhängig ist, d.h. der einen Anfang und ein Ende hat.
Das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''Notwendige Existenz ist eine positive Eigenschaft''«</span>, ist immer falsch, wenn es auf etwas aus der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> angewendet wird, wie z. B. auf einen <span style="color:#FF6000">„Tsunami“</span>, dessen ‚Existenz‘ für uns nicht ‚positiv‘ ist. KANT hat schon festgestellt ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Das gilt für alles, was <span style="color:#FF6000">„existiert“</span>. Das Axiom-5 hat nur dann seine Gültigkeit, ist nur dann ,wahr‘, wenn <span style="color:#FF6000">„Dasein“</span> <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span> <span style="color:#00B000">(Essenz)</span> in eins zusammenfallen. Bei allen Dingen, die ‚da‘ sind, ist ihr ‚Da-Sein‘ ontologisch immer verschieden zu dem ‚was‘ sie sind ''':''' zu ihrem ,Was-Sein‘. In der philosophischen Tradition, seit ARISTOTELES, wird die ontologische Identität, d.i. die Koinzidenz, der innere Zusammenhang von ‚Sein‘ und ‚Wesen‘ allein nur dem <span style="color:#FF6000">„selbst ‚unbewegten‘ Erstbewegenden“</span> zugeschrieben, dem <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“</span><span style="color:#00B000"> | ,prôton kinoûn akinêton‘</span>, von dem ARISTOTELES etwas später sagt ''':''' <span style="color:#FF6000">»''denn dies ist der Gott''«</span> und dann hinzufügt ''':''' <span style="color:#FF6000">»''so sagen wir ja''«</span>; d.h. das ist eine Interpretation aus dem Glaubenskontext des ARISTOTELES. Er war ein Gott-gläubiger Grieche. Wer an GOTT glaubt, kann das nachvollziehen. GÖDEL musste dieses Axiom-5 postulieren, sonst wäre sein Kalkül nicht aufgegangen, ohne dass er deswegen schon an GOTT glauben müsste. Er hat für sein Kalkül das ontologische Theorem von der Identität von ‚Sein‘ und ‚Wesen‘ im ‚unbewegten Erstbeweger‘ des ARISTOTELES benutzt, ohne diese Herkunft explizit referenziert zu haben. <span style="color:#00B000">(Gilt auch für Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit, das GOTT-Sein, das ‚Dasein‘ GOTTES, ist eine positive Wesenseigenschaft, eine Perfektion; d.h. ist das ‚Wesen‘ GOTTES ''':''' GOTT ist perfekt''«</span>)</span>. Die ontologische Identität von Sein und Wesen, Existenz und Essenz, wie auch die Koinzidenz von Möglichkeit und Wirklichkeit, von Ursache und Wirkung, sowie auch die ontologische Einheit von <span style="color:#00B000">(Erkenntnis-)</span>Subjekt und <span style="color:#00B000">(Erkenntnis-)</span>Objekt im <span style="color:#FF6000">»''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“</span><span style="color:#00B000"> | ,noêseôs noêsis‘ <small>(<span style="font-family: Times;"><big>,''Metaphysik''‘</big></span> XII 9, 1074b34)</small></span>, und der innere Zusammenhang der <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, gilt nur in der <span style="color:#FF6000">„unverursachten Letztursache"</span>, auf die ARISTOTELES bei seiner Prinzipienforschung gestoßen ist.
Es gibt verschiedene Versuche, die GÖDEL-Axiome durch sog. ,Modelle‘, relativ zu einfacheren ,Welten‘, zu verifizieren, um damit ihre relative Konsistenz nachzuweisen. Für GÖDEL aber <span style="color:#FF6000">»''sind die Axiome nur dann'' <span style="color:#00B000">[ in unserer ,realen‘ Welt ]</span> ''wahr'' <span style="color:#00B000">[ und annehmbar ]</span>«</span>, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt'' <span style="color:#00B000">[ d.h. jeder auch nur ,möglichen‘ Welt ]</span> ''sind''«</span>. Diese Bedingung verweist jede Verifikation und jede Interpretation der Axiome auf das ,Nicht-Zufällige‘, das ,Notwendige‘, ,Absolute‘, in dem die Axiome und Definitionen des GÖDEL-Kalküls erst dadurch ihren Sinn und ihre Bedeutung bekommen, wenn sie vom ,Absoluten‘ und ,Unendlichen‘ her erklärt und verstanden werden. Damit insistiert GÖDEL auf eine genuin <span style="color:#4C58FF">,theologische‘</span> Interpretation seines Kalküls, mit der <span style="color:#4C58FF">„Theologie“</span> zum Begriff GOTT, dem unbegrenzt Unendlichen, als Verifikationskriterium. Das entspricht auch der ,methodologischen‘ Prämisse seines Kalküls. Die wichtigsten Axiome und Definitionen im GÖDEL-Kalkül sind jedoch bloße ,Annahmen‘, deren Evidenz, sowohl die ,mathematische‘ als auch die <span style="color:#4C58FF">,theologische‘</span>, erst evaluiert, d.h. ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> werden muss. Das bedeutet ''':''' die logische Verifikation der Axiome und Definitionen von GOTT und seinen Vollkommenheiten kann nur Kalkül-intern durch den Aufweis ihrer Widerspruchsfreiheit erfolgen, d.i. <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span>. Logisch evaluierte und verifizierte Axiome und Definitionen sind die ,modal‘ notwendigen, d.h. die ,transzendentalen‘ Voraussetzungen für die Ergebnisse eines Kalküls, damit seine Theoreme und Korollare in unserer ,realen‘ Welt als logisch ,wahr‘ und damit für uns auch als ,annehmbar‘ gelten können, während die Prämissen eines Kalküls, <span style="color:#00B000">(die Argument Einführung, <span style="color:#4C58FF">— '''AE:''' —</span> )</span>, nicht notwendige, und somit ,modal‘ frei gewählte ,Annahmen‘ sind. Jedoch aus diesen ,modal‘ frei gewählten, ,möglichen‘ <span style="color:#00B000">( <span style="color:#4C58FF">'''◇'''</span> )</span> Prämissen folgen mit Hilfe der ,bewiesenen‘ <span style="color:#00B000">( ╞ )</span> Axiome und Definitionen die Ergebnisse mit ,modaler‘ Notwendigkeit <span style="color:#00B000">( <span style="color:#4C58FF">'''□'''</span> )</span>.
Die Logik des GÖDEL-Systems ist eine ,Prädikatenlogik‘ zweiter Stufe, in der die Quantoren nicht nur Individuum-Variable, sondern auch Eigenschafts-Variable, <span style="color:#00B000">(als noch ,unbestimmte‘ Prädikate im Allgemeinen)</span>, binden können. Die formale Struktur des GÖDEL-Kalküls besteht aus fünf Axiomen und drei Definitionen, mit deren Hilfe in drei Beweisgängen drei Theoreme und mehrere Korollare aus seiner ,methodologischen‘ Prämisse ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitet werden können, wobei die beiden ersten Beweisgänge, mit ihren Ergebnissen, den dritten vorbereiten, in dem es dann um das Theorem ANSELMS geht. Die Prämisse des GÖDEL-Kalküls in allen Beweisgängen ist der traditionelle ,GOTT-Glaube‘, in der Formulierung speziell nach LEIBNIZ. Ein Axiom, eine Definition, zwei Theoreme und alle Korollare im GÖDEL-Kalkül sind Aussagen über <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>. Alle fünf Axiome, eine Definition und ein Theorem, <span style="color:#00B000">(und das Korollar aus Axiom-4)</span>, sind auch Aussagen über die Eigenschaft <span style="color:#FF6000">„Vollkommenheit“, „Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, die in der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> als die Wesenseigenschaft GOTTES gilt ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist vollkommen''«</span> bzw. <span style="color:#FF6000">»''GOTT ist das Vollkommenste der Wesen''«</span>, <span style="color:#00B000">(DESCARTES)</span>. Zwei Definitionen sind Aussagen über die allgemeinen Wesenseigenschaften aller Seienden, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, die Transzendentalien, die, als notwendige Existenz, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, auch GOTT zugeordnet werden, mit der Besonderheit bei GOTT, dass sowohl alle Eigenschaften, als auch alle anderen Zuordnungen, wie Sein und Wesen, wie Ursache und Wirkung, usw., im Unendlichen, GOTT, <span style="color:#FF6000">„koinzident“</span> sind, d.h. in GOTT paarweise perspektivisch in ,eins‘ zusammenfallen, und die auch, als Transzendentalia, konvertierbar, d.h. austauschbar sind. Diese Sachverhalte machen deutlich, dass eine spezifische ,Verifikation‘ und sachgerechte ,Evaluierung‘ der GÖDEL-Axiomatik nur genuin <span style="color:#4C58FF">,theologisch‘</span> erfolgen kann. Die Evaluierung der <span style="color:#FF6000">»''mathematischen Evidenz''«</span> des GÖDEL-Systems, im Allgemeinen, muss jedoch entsprechend der Maßstäbe einer modalen Prädikatenlogik zweiter Stufe durchgeführt werden.
Das GÖDEL-Kalkül unterscheidet <span style="color:#00B000">(in Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>)</span> formal-syntaktisch zwischen der Eigenschaft ,Existenz‘, <span style="color:#4C58FF"> — ‚'''E'''‘ —</span>, die nur GOTT zugeordnet werden kann, und dem Existenz-Operator, <span style="color:#4C58FF">— ‚'''∃'''‘ —</span>, der auch allem Übrigen, das nicht GOTT ist, zugeordnet wird. Es gibt hier auch den formal-syntaktischen Unterschied zwischen der, <span style="color:#00B000">(von mir notierten, jedoch von GÖDEL schon intendierten und angesprochenen)</span>, speziellen ,Notwendigkeit‘, <span style="color:#4C58FF"> — <sub>not</sub> —</span>, die nur der Existenz GOTTES zugeordnet ist, und der modalen ,Notwendigkeit‘, <span style="color:#4C58FF">— ‚'''□'''‘ —</span>, die auf Verschiedenes bezogen werden kann. Diese Unterschiede sind Hinweise, dass GÖDEL in seiner Kalkül-Logik und -Syntax, die Außerordentlichkeit und Eigenständigkeit GOTTES berücksichtigt, der, als Schöpfer der Welt, prinzipiell und absolut <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span> ist, die erst durch GOTT auch das ist, was sie ist.
===<div class="center"><span style="color:#660066">Die Genese des Kalküls</span></div>===
Wie kommt GÖDEL zu seinem Kalkül '''?''' Sein Gewährsmann war Gottfried Wilhelm LEIBNIZ, <span style="color:#00B000">(1646-1716)</span>, den er sehr schätzte. Die rekonstruierbare Genese seines Kalküls findet man in LEIBNIZ ''':''' ''<span style="font-family: Times;"><big>‚Neue Abhandlungen über den menschlichen Verstand‘</big></span>'', <span style="color:#00B000">(1704)</span>‚ ''<span style="font-family: Times;"><big>Viertes Buch, Kapitel X ''':''' ‚Von unserer Erkenntnis des Daseins Gottes‘</big></span>'', Seite 475f.
Hier der <span style="color:#00B000">[ kommentierte ]</span> Textausschnitt zum sog. ontologischen ‚Gottesbeweis‘''':'''
::<span style="color:#FF6000">»</span>''Folgendes etwa ist der Gang seines'' <span style="color:#00B000">[ d.h. ANSELMS, Erzbischof von Canterbury; 1033-1109, ]</span> ''Beweises ''':''' GOTT ist das Größte'', <span style="color:#00B000">[ ANSELM spricht vom biblischen GOTT des Glaubens, als ''':''' <span style="color:#FF6000">»''den, über dem ,Größeres‘'' | <span style="font-family: Times;"><big>‚maius‘</big></span> | ''nicht mehr gedacht werden kann''«</span> ]</span>, ''oder, wie DESCARTES es ausdrückt ''':''' das Vollkommenste der Wesen oder auch ein Wesen von äußerster Größe und Vollkommenheit'' ''':''' <span style="color:#00B000"> [ GÖDEL ''':''' </span><span style="color:#4C58FF">‚'''P'''‘</span> <span style="color:#00B000">:= ‚Perfektion‘, ‚positive Eigenschaft‘ ]</span>, ''das alle Grade derselben in sich schließt.''<span style="color:#00B000"> [ GÖDEL-Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>. Definition-1 bildet die traditionelle Vorstellung von GOTT ab. ]</span> ''Dies also ist der Begriff GOTTES.'' <span style="color:#00B000">[ Der Term <span style="color:#4C58FF">— ,'''G'''‘ —</span> steht hier für den biblischen ‚Begriff‘ <span style="color:#FF6000">„GOTT“</span> als ,Individuumname‘ '''!''' ]</span> ''Sehen wir nun, wie aus diesem Begriff das ‚Dasein’ folgt.''<span style="color:#00B000"> [ GÖDEL ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist notwendig aus sich ‚da‘''«</span> ''':''' Term :10:, 1. Hauptergebnis im 3. Beweisgang. ]</span> ''Es ist etwas <u>mehr</u>, ‚da‘ zu sein, als nicht ‚da‘ zu sein, oder auch das ‚Dasein‘ fügt der Größe oder der Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''einen Grad hinzu, und wie DESCARTES es ausspricht, das ‚Dasein‘ ist selbst eine Vollkommenheit.''<span style="color:#FF6000">«</span>
<span style="color:#00B000">(Diesen Ausspruch DESCARTES übernimmt GÖDEL im Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''notwendige Existenz''</span> [ alias ‚Dasein GOTTES’ ] <span style="color:#FF6000">''ist eine positive Eigenschaft''</span> [ alias Vollkommenheit ]<span style="color:#FF6000">«</span>. Dem widerspricht KANT ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>. Das Axiom-5 ist daher nur dann ‚wahr‘, wenn ‚Wirklichsein‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια οὖσα</big></span>“</span> | ‚enérgeia oúsa‘ | d.h. ‚Dasein‘ und ‚Wesen‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ | — genauer ''':''' ‚Wesenseigenschaften’ —, ontologisch ,eins‘ sind, d.h. wenn <span style="color:#FF6000">„Existieren“</span> immer schon die <span style="color:#FF6000">„Wesenseigenschaft“</span> GOTTES ist. Was nach ARISTOTELES nur im <span style="color:#FF6000">„unbewegten Erstbeweger“</span> der Fall ist; bzw. mit LEIBNIZ ''':''' <span style="color:#FF6000">»''was das Privilegium der Gottheit allein ist''«</span> '''!''' Aus der ,methodologischen‘ ,Annahme‘ im 2. Beweisgang GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den GOTT der Christen''«</span>, und mit Hilfe von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, bzw. <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, mit Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind notwendig aus sich, — von Natur aus —, positiv''«</span>, mit Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span> ''':''' <span style="color:#FF6000">»''Zum Wesen gehören notwendig auch alle Konsequenzen aus einer Wesenseigenschaft''«</span>, und mit Axiom-1 und der Definition für GOTT, folgt nach einigen logischen Umformungen das GÖDEL-Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist genau dann der GOTT der Christen, wenn das Wesen dieses GOTTES sein eigenes Sein ist''«</span>. Dasein und Wesen sind im Unendlichen, GOTT <span style="color:#FF6000">„koinzident“</span> ,eins‘, übereinstimmend mit dem Theorem des ARISTOTELES. Mit diesem, im Kalkül <u>ohne</u> Axiom-5 ,regulär‘ (├ ) abgeleiteten Theorem, widerlegt er KANT für den individuellen Spezialfall <span style="color:#4C58FF">‚'''G'''‘</span> := <span style="color:#FF6000">„GOTT“</span>. Nachprüfbar im Anhang ''':''' im ‚ontologischen‘ Beweis für das Basis-Theorem-2. Somit ist Axiom-5 ,wahr‘, und KANT, der <span style="color:#FF6000">»''eine Abneigung gegen das Gebet hatte''«</span> und auch <span style="color:#FF6000">»''nie zu den sonntäglichen Kirchgängern zählte''«</span><ref>Uwe SCHULTZ ''':''' ‚''<span style="font-family: Times;"><big>Immanuel Kant</big></span>''‘, Rowohlt Monographie 50659, Seite 12</ref>, hat sich hier, im Bezug auf GOTT, geirrt. <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, war für KANT nie eine ernstzunehmende Option. Die <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, die natürlich immer auch verbunden sein muss mit der täglichen ,Erfahrung‘ einer Glaubens-Praxis, im Gebet und in den Gottesdienst-Feiern des <span style="color:#4C58FF">„Theologen“</span>, und die daraus entsteht, ist eine ziemlich ,ausgereifte‘ Disziplin. Es haben sich, durch Jahrhunderte hindurch, viele gläubige und auch gescheite Menschen, schon im Judentum, und dann im Christentum, und ebenfalls im Islam, darum bemüht.)</span>
:: <span style="color:#FF6000">»</span>''Darum ist dieser Grad von Größe und Vollkommenheit oder auch diese Vollkommenheit, welche im ‚Dasein‘ besteht, in diesem höchsten, durchaus großen, ganz vollkommenen Wesen, denn sonst würde ihm ein Grad fehlen, was gegen seine Definition wäre. Und folglich ist dies höchste Wesen ‚da‘. Die Scholastiker, ohne selbst ihren'' <span style="font-family: Times;"><big>doctor angelicus</big></span> <span style="color:#00B000">[ := THOMAS von Aquin ]</span> ''auszunehmen, haben diesen Beweis verachtet'', <span style="color:#00B000">[ wie später auch Immanuel KANT ]</span>, ''und ihn als einen Paralogismus'' <span style="color:#00B000">[ := Fehlschluss ]</span> ''betrachtet, worin sie sehr unrecht gehabt haben; und DESCARTES, welcher die scholastische Philosophie im Kolleg der Jesuiten zu La Flèche lange genug studiert hatte, hat sehr recht gehabt, ihn wieder zu Ehren zu bringen. Es ist nicht ein Paralogismus, sondern ein unvollständiger Beweis'', <span style="color:#00B000">[ den GÖDEL vervollständigt hat ]</span>, ''der etwas voraussetzt, was man noch hätte beweisen sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' <span style="color:#00B000">[ '''::''' <span style="color:#4C58FF">— '''◇''' —</span> '''::''' ,möglich‘, ,konsistent‘, ,denkbar‘; GÖDEL beweist im 1. Beweisgang aus Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, <span style="color:#FF6000">»''positive Eigenschaften'', <span style="color:#00B000">[ die allgemeinen Transzendentalien ]</span>, ''sind widerspruchsfrei''«</span>, mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, folgt Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist widerspruchsfrei möglich''«</span> ]</span>. ''Und es ist schon etwas, dass man durch diese Bemerkung beweist ''':''' gesetzt, dass GOTT'' <span style="color:#00B000">['' <span style="color:#FF6000">»widerspruchsfrei«</span> '']</span> '',möglich‘ ist, so ‚ist‘ er'' <span style="color:#00B000">[ ,notwendig‘ '''::''' <span style="color:#4C58FF">— '''□''' —</span> '''::''' für jede mögliche Welt auch wirklich aus sich ‚da‘ ]</span>, ''was das Privilegium der Gottheit allein ist'' ''':''' <span style="color:#00B000">[ Im 3. Beweisgang, Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' ‚ANSELMS Prinzip‘ ''':''' <span style="color:#FF6000">»''Weil GOTT widerspruchsfrei ,möglich‘ ist, darum ist auch der Glaube widerspruchsfrei, der annimmt, dass GOTT aus sich ,notwendig‘ da ist''«</span>; mit Korollar-3 ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ —</span>, <span style="color:#FF6000">»''Es gibt notwendig nur einen einzigen GOTT''«</span>. Damit ist auch der Monotheïsmus bewiesen. ]</span> ''Man hat recht, die Möglichkeit eines jeden Wesens anzunehmen und vor allem die GOTTES, bis ein anderer das Gegenteil beweist''. <span style="color:#00B000">[ Das Gegenteil besagt, dass GOTT ,unmöglich‘ ist. Hier setzt der Möglichkeitsbeweis im GÖDEL-Kalkül an, und beweist, dass diese Aussage zu einem Widerspruch führt. ]</span> ''Somit gibt dieser metaphysische Beweis schon einen moralischen zwingenden Schluss ab, wonach wir dem gegenwärtigen Stande unserer Erkenntnisse zufolge urteilen müssen, dass GOTT ‚da‘ sei, und demgemäß handeln.'' <span style="color:#00B000">[ Aber nicht logisch zwingend '''!''' Denn die Interpretation <span style="color:#4C58FF">— ‚'''G'''‘ —</span> mit dem GOTT der Bibel, als ,methodologische‘ Kalkül-Prämisse, ist nicht zwingend, jedoch ,modal‘ möglich, <span style="color:#4C58FF">— '''◇''' —</span>, und im christlichen Glaubenskontext sinnvoll, was mit einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls gezeigt werden kann. Damit wäre dann auch die Frage beantwortet, ob das GÖDEL-System sich plausibel als eine Theorie von GOTT und seinen Eigenschaften interpretieren lässt, bzw. als eine <span style="color:#FF6000">»''axiomatische''«</span> <span style="color:#4C58FF">„Theologie“</span>, wie sie André FUHRMANN apostrophiert. Das <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ist der ,Individuumname‘ für den GOTT der Bibel, — ,GOTT‘ groß geschrieben —, im monotheïstischen, christlichen Glaubenskontext, den auch LEIBNIZ teilt. Dann steht der ,Name‘ auch synonym für das ,existierende‘ Individuum, d.h. für dessen ,Existenz‘. ]</span> ''Es wäre aber doch zu wünschen, dass gescheite Männer'' <span style="color:#00B000">[ sic ! ]</span> ''den Beweis mit der Strenge einer mathematischen Evidenz vollendeten'', <span style="color:#00B000">[ was GÖDEL veranlasst hat, seine Version eines ‚ontologischen Beweises’ zu kreieren, dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> man heute mit Computerprogrammen<ref>siehe Fußnote 12</ref> schon nachgewiesen hat ]</span> ... <span style="color:#FF6000">«</span>.
Für GÖDEL war dieser Text eine intellektuelle Herausforderung, und er hat sie angenommen. Das war für GÖDEL sicher keine Glaubensangelegenheit. GOTT hat es ja auch nicht nötig, ‚bewiesen‘ zu werden. Wer <span style="color:#4C58FF">— ‚'''G'''‘ —</span> z. B. mit dem sog. ‚Urknall‘ gleich setzt, macht die <span style="color:#FF6000">»''zufällige Struktur der Welt''«</span> im ‚Urknall‘, <span style="color:#00B000">(pantheistisch)</span> zu einem ,Gott‘, was GÖDEL dezidiert für sein Kalkül ausgeschlossen haben wollte.
Kurt GÖDEL schreibt 1961 in einem Brief, in Anlehnung an den obigen Text ''':'''
::<span style="color:#FF6000">»...''ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig ''<span style="color:#00B000">[ sic '''!''' ]</span>, ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', <span style="color:#00B000">[ dass es GOTT gibt ]</span>, ''mit allen bekannten Tatsachen'', <span style="color:#00B000">[ z. B. mit den Maßstäben einer modernen Logik ]</span>, ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker LEIBNIZ versucht''.«</span><ref>Zitiert nach SCHIMANOVICH-GALIDESCU, M.-E. ''':''' ‚''<span style="font-family: Times;"><big>Princeton–Wien 1946–1966. Briefe an die Mutter</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kurt Gödel – Leben und Werk</big></span>''‘, Hg. B.BULDT et alia, Wien (HÖLDER–PICHLER–TEMSKY), 2001, Band 1</ref>
===<div class="center"><span style="color:#660066">Die Interpretation des Kalküls</span></div>===
Wenn man sich das GÖDEL-Kalkül ansieht, wie es heute formalisiert vorliegt, stellt sich die Frage ''':''' <span style="color:#FF6000">„Lässt sich dieses System plausibel als eine Theorie von GOTT <span style="color:#00B000">(als eine ‚Rede von GOTT’ := <span style="color:#4C58FF">,Theologie’</span>)</span> und seiner Eigenschaften verstehen '''?''' “ — „Ist hier eine genuin <span style="color:#4C58FF">,theologische’</span> Interpretation möglich '''?''' “</span> Seine Herkunft aus der intellektuellen Auseinandersetzung des Logikers GÖDEL mit dem GOTT-gläubigen Philosophen LEIBNIZ und dem christlichen Theologen und Erzbischof ANSELM rechtfertigt diese Frage. Die <span style="color:#FF6000">„mathematische Evidenz“</span> des GÖDEL-Formalismus, <span style="color:#00B000">(im Anhang nachgestellt)</span>, ist allgemein anerkannt, <span style="color:#00B000">(Vorbehalte dagegen gibt es nur bei der Interpretation seiner Syntax, d.h. ob die Axiome und Definitionen, wie GÖDEL sie konzipiert hat, bzw. ob die Theoreme und Korollare, die aus diesen Axiomen ,regulär’ (├ ) abgeleitet werden, auch in unserer realen Welt ,wahr’ und ,annehmbar’ sind)</span>. Die <span style="color:#FF6000">„theologische Evidenz“</span> des GÖDEL-Systems wird durch eine ,Verankerung’ der Axiome und Definitionen in den <span style="color:#4C58FF">,theologisch’</span>-philosophischen Diskurs über GOTT evaluiert, der schon seit zweieinhalbtausend Jahren läuft. In diesen zweieinhalbtausend Jahren hat sich, — gegen ARISTOTELES und die antike Philosophie —, die Erkenntnis durchgesetzt, dass GOTT <span style="color:#FF6000">»''unabhängig''«</span> von der <span style="color:#FF6000">»''zufälligen''«</span> Raum-Zeit-Struktur unserer vergänglichen Welt ist. In meiner Darstellung des GÖDEL-Kalküls folge ich, <span style="color:#00B000">(im Unterschied zum Autographen GÖDELS, vom 10. Feb 1970)</span>, in der Axiom-Formulierung und -Nummerierung, in der Syntax, und in der Beweis-Struktur, der Arbeit von André FUHRMANN ''':''' ''<span style="font-family: Times;"><big>‚Existenz und Notwendigkeit. Kurt Gödels axiomatische Theologie‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Logik in der Philosophie‘</big></span>'' Hg. SCHROEDER-HEISTER, SPOHN und OLSSON, 2005, Synchron, Heidelberg, Seite 349–374. <span style="color:#00B000">(Die tiefer gestellte Notation der spezifischen ,Eigenschaft‘ einer Eigenschaft ist meine Ergänzung zur formalen Syntax, z. B. ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>'''x'''‘ — </span>, angeregt durch die indizierende Schreibweise GÖDELS ''':''' <span style="color:#4C58FF">— ,'''G''' Ess. '''x'''’ —</span>.)</span> Die Erkenntnisse zur Straffung und Präzisierung der GÖDEL-Syntax, <span style="color:#00B000">(besonders im Möglichkeitsbeweis)</span>, stammen aus der Arbeit von Günther J. WIRSCHING ''':''' ,''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, im Web <ref>https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf</ref>. <span style="color:#00B000">(Auch der Hinweis auf AVICENNA kommt von WIRSCHING.)</span> Die Zitate von THOMAS von Aquin´s Stellungnahme zum Theorem ANSELMS, und von Georg Wilhelm Friedrich HEGEL zur Immanuel KANTS Ablehnung des Theorem ANSELMS, befinden sich in Franz SCHUPP, ,<span style="font-family: Times;"><big>''Geschichte der Philosophie im Überblick''</big></span>‘, Band 2 ‚<span style="font-family: Times;"><big>''Christliche Antike, Mittelalter''</big></span>‘, Hamburg 2003, Seite 168 und Seite 170.
Meines Erachtens ist der entscheidende Ansatzpunkt einer <span style="color:#4C58FF">„theologischen“</span> Interpretation das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>.
‚Frei‘ nach KANT ‚formuliere‘ ich ‚kurz‘ ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Hier die Positionen KANTS zum Thema ‚Existenz‘ und ‚Eigenschaften‘ ''':'''
::<span style="color:#FF6000">»</span>''… unbeschadet der wirklichen Existenz äußerer Dinge'', <span style="color:#00B000">[ kann man ]</span> ''von einer Menge ihrer Prädikate'', <span style="color:#00B000">[ d.h. Eigenschaften ],</span> ''sagen'' … ''':''' ''sie gehöreten nicht zu diesen ‚Dingen an sich selbst‘, sondern nur zu ihren Erscheinungen, und hätten außer unserer Vorstellung'' <span style="color:#00B000">[ ihrer, als ,wirklich‘ gedachten Erscheinung, ]</span> ''keine eigene Existenz, … weil ich finde, dass … '''alle Eigenschaften, die die Anschauung eines Körpers ausmachen''', bloß zu seiner Erscheinung gehören; denn die Existenz des Dinges, was erscheint, wird dadurch nicht … aufgehoben, sondern nur gezeigt, dass wir es'', <span style="color:#00B000">[ das Ding ]</span>, ''wie es ‚an sich selbst‘ sei'', <span style="color:#00B000">[ d.h. existiert ]</span>, ''durch Sinne gar nicht erkennen können''.<span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Prolegomena zu einer jeden künftigen Metaphysik, die als Wissenschaft wird auftreten können</big></span>''‘, Seite 289; https://www.korpora.org/kant/aa04/289.html</ref> <span style="color:#00B000"><small>(Hervorhebung durch KANT.)</small> [ Seine Prädikate, d.h. Eigenschaften, jedoch können wir mit unseren Sinnen ,anschauen‘, aber nur in Kombination mit unserer Vorstellung ihrer, als ,wirklich‘ gedachten Erscheinung, vermittelt durch den sog. ,transzendentalen Schematismus‘ unserer Einbildungskraft ''':'''</span> <span style="color:#FF6000">»</span>''Eine verborgene Kunst in den Tiefen der menschlichen Seele''<span style="color:#FF6000">«</span>, <span style="color:#00B000">jedoch auch eines der ,dunkelsten‘ Kapitel in der K.d.r.V., bedingt durch KANTS Konzept von ,Wirklichkeit‘, bzw. ,Sein‘. ]</span>
Mit anderen Worten, man kann die ‚Existenz‘, bzw. das ‚Sein‘ der Dinge, <span style="color:#00B000">(das ‚Ding an sich’ bei KANT)</span>, nicht unter dem Mikroskop finden. Die ‚Existenz‘ bzw. das ‚Sein‘ ist keine sinnlich registrierbare ‚Eigenschaft‘ z. B. des rekonstruierten ‚Stadt-Schlosses‘ in Berlin. <span style="color:#00B000">(‚Sein‘ ist kein reales ‚Prädikat‘.)</span> Dafür haben wir andere Fähigkeiten ''':''' Ich kann seine ‚Existenz‘ mit meinem Verstand einsehen, weil auch ich selbst ‚existiere‘. Seine ‚Ansicht‘, wie ‚gefällig‘ es ist, und auch weitere ‚Eigenschaften‘, die mir auffallen, kann ich mit einem Handy-Foto dokumentieren. Diese ‚Eigenschaften‘ sind nicht die Ursache, dass das ‚Berliner Schloss‘ existiert. Wohl aber die Rekonstruktion dieses Schlosses ist die ‚Ursache‘, dass es ,existiert‘, und jetzt so aussieht. Insofern ist ‚Existenz‘ keine ‚Eigenschaft‘, sondern die ‚Existenz‘ des Dinges ist die Voraussetzung, der ‚Grund‘, dass ich die ‚Eigenschaften‘ des Dinges mit meinen Sinnen feststellen kann.
In einer Auseinandersetzung mit CARTESIUS schreibt KANT, philosophisch ‚tiefgründig‘ und logisch ‚exakt‘, über dessen <span style="color:#FF6000"><span style="font-family: Times;"><big>„Cogito, ergo sum“</big></span></span> ''':'''
::<span style="color:#FF6000">»</span>''Das ‚Ich denke‘ ist ein empirischer Satz, und hält den Satz ‚Ich existiere‘ in sich. Ich kann aber nicht sagen ''':''' ‚Alles, was denkt, existiert‘; denn da würde die Eigenschaft des Denkens'', <span style="color:#00B000">[ eine essentielle Eigenschaft ]</span>, ''alle Wesen, die sie besitzen, zu notwendigen'' <span style="color:#00B000">[ d.h. notwendig existierenden ]</span> ''Wesen machen''. <span style="color:#00B000">[ Was allein nur von GOTT ausgesagt werden kann; mit AVICENNA, als anerkannter ARISTOTELES-Kommentator ''':''' <span style="color:#FF6000">»''GOTT ist das einzige Sein, bei dem Essenz'' <span style="color:#00B000">[ ‚Wesenseigenschaften‘ ]</span> ''und Existenz'' <span style="color:#00B000">[ ‚Dasein‘ ]</span> ''nicht zu trennen sind und das daher notwendig an sich da ist''«, <span style="color:#00B000">— konform mit GÖDEL ''':'''</span> »''notwendige Existenz ist eine positive'' <span style="color:#00B000">[ essentielle ]</span> ''Eigenschaft''«</span> ].</span> ''Daher kann meine Existenz auch nicht aus dem Satz, ‚Ich denke‘, als'' <span style="color:#00B000">[ logisch ]</span> ''gefolgert angesehen werden, wie CARTESIUS dafür hielt (weil sonst der Obersatz : ‚Alles, was denkt, existiert‘, vorausgehen müsste), sondern ist mit ihm identisch.'' <span style="color:#00B000">[ Eine einfache Schlussfolgerung ''':''' meine ‚Existenz‘ ist auch nicht von meiner ‚Eigenschaft‘ Denken ‚verursacht‘. ,Existenz‘ ist nicht bloß ein ,Gedanke‘ von mir. ]</span><span style="color:#FF6000">«</span> <span style="color:#00B000">(Aus der Anmerkung 41 zu den ‚''<span style="font-family: Times;"><big>Paralogismen der reinen Vernunft</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 275,<ref>https://korpora.org/kant/aa03/275.html</ref> mit meinem Einschub des AVICENNA-Zitat aus Wikipedia.<ref>{{w|Avicenna#Metaphysik}}</ref>)</span>
Mit anderen Worten ''':''' <span style="color:#FF6000">„Die Eigenschaft, dass ich denken kann, ist nicht die Ursache meiner ‚Existenz‘“</span>, sondern, <span style="color:#FF6000">„Die Liebe meiner Eltern und ihre Entscheidung füreinander ist die Ursache meiner ‚Existenz‘. Daher ‚bin’ ich. Und weil ich ein Mensch ‚bin‘, kann ich denken.“</span> Auch mit diesen Anmerkungen ist leicht einsehbar, dass ‚Existenz‘ keine ‚Eigenschaft‘ ist — außer bei GOTT. In GOTT ist ‚Dasein‘ die ‚Wesenseigenschaft‘ GOTTES, d.h. ‚Dasein‘ und ‚Wesen‘ sind in GOTT untrennbar verbunden; sind <span style="color:#FF6000">„koinzident“</span> ‚eins‘. Das ist die Einzigartigkeit im Wesen GOTTES, dass GOTT immer schon ‚da‘ ist. Die Frage nach dem ‚Wesen‘ GOTTES lautet ''':''' <span style="color:#FF6000">„Was bist du ? “</span>/<span style="color:#CC66FF">„Wer bist Du ? “</span> Antwort, Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'' <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Weil GOTT für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, hat GOTT es nicht nötig, ‚bewiesen‘ zu werden. <span style="color:#00B000">(In der Mathematik ist ein ‚Satz‘ erst dann ‚wahr‘ und ‚existent‘, wenn er bewiesen ist. Bei GOTT ist es jedoch nicht so ''':''' GOTTES ‚Existenz‘ ist nicht erst dann ‚wahr‘, wenn seine ‚Existenz‘ von uns ‚bewiesen‘ ist. Sein ‚Dasein‘ ist jedem unserer ‚Beweisversuche‘ immer schon voraus. Der Zugang zu GOTT ist nicht der ,Beweis‘, sondern der ,Glaube‘. Wer an GOTT glauben ,will‘, dem antwortet GOTT. Wer nicht an GOTT glauben ,will‘, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Die Glaubens-Entscheidung hat jedoch für jeden Menschen eine existenzielle Konsequenz ''':''' <span style="color:#CC66FF">»''Wer glaubt und sich taufen lässt, wird gerettet; wer aber nicht glaubt'', <span style="color:#00B000">[ und diese Entscheidung auch im Augenblick der ,Wahrheit‘, im Tod, in der sog. ,Endentscheidung‘, nicht widerruft ]</span>, ''wird verurteilt werden''«,</span> <small>({{Bibel | Markus Evangelium |16|16|EU}})</small>. Das Urteil lautet ''':''' <span style="color:#CC66FF">»''zweiter Tod ''':''' der Feuersee''«</span>, <small>({{Bibel | Offenbarung |20|14f|EU}})</small>, ohne Berufungsmöglichkeit. <span style="color:#CC66FF">»''Ohne Glauben aber ist es unmöglich, Gott zu gefallen; denn wer zu Gott kommen will, muss glauben, dass er ist und dass er denen, die ihn suchen, ihren Lohn geben wird''«.</span> <small>({{Bibel | Hebräer Brief |11|6|LUT}})</small>)</span>
Das GÖDEL-Axiom-5 ist m.E. der entscheidende Ansatzpunkt einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation der GÖDEL-Axiomatik.
===<div class="center"><span style="color:#660066">Das Kalkül ist kein Existenz-Beweis für GOTT</span></div>===
Die allgemeine <span style="color:#FF6000">»''mathematische Evidenz''«</span> des GÖDEL-Formalismus, d.h. seine ‚Schlusskraft‘, ist von kompetenten Leuten<ref>„GÖDELS Argumentationskette ist nachweisbar korrekt – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO nun gezeigt;“ vgl. https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html</ref> schon festgestellt worden, <span style="color:#00B000">(im Anhang ‚nachrechenbar‘ mit den Regeln und Gesetzen einer modalen Prädikatenlogik 2. Stufe)</span>. Das GÖDEL-Kalkül ist jedoch kein ‚moderner‘<span style="color:#FF6000">„Existenz-Beweis“</span> für GOTT, wofür es gehalten oder meistens bezweifelt wird, sondern setzt, <span style="color:#00B000">(theoretisch methodisch)</span>, den <span style="color:#FF6000">„Glauben an die Existenz GOTTES“</span> schon voraus, ohne ihn zu hinterfragen. Das <span style="color:#FF6000">„Dasein“</span> bzw. die <span style="color:#FF6000">„Existenz“</span> GOTTES wird mit der Definition-1 für <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, bzw. mit dem Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, im Kalkül ‚definitorisch‘ bzw. ‚axiomatisch‘ als Kalkül-,Annahme‘, als <span style="color:#FF6000">„Prämisse“</span>, eingeführt, unter der Voraussetzung, dass die ‚Eigenschaft‘ <span style="color:#4C58FF">‚'''G'''‘ := </span><span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(Essenz)</span> und das <span style="color:#FF6000">„Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> <span style="color:#00B000">(Existenz)</span>, ontologisch ‚identisch‘, genauer ''':''' <span style="color:#FF6000">„koinzident“</span> sind, was GÖDEL im Axiom-5 definitiv für sein System vorschreibt ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>. Das <span style="color:#FF6000">„Dasein GOTTES“</span> ist faktisch äquivalent zur <span style="color:#FF6000">„notwendigen Existenz als GOTT“</span>; und <span style="color:#FF6000">„Göttlichkeit“</span> ist die <span style="color:#FF6000">„positive Eigenschaft in GOTT“</span>. Beides ist nach Axiom-5 ‚identisch‘, d.h. dem ‚Sein nach‘ dasselbe, und daher konvertierbar. Beide, <span style="color:#00B000">(sowohl die Essenz, als auch die Existenz GOTTES)</span>, werden daher auch mit demselben Term ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span> im Kalkül dargestellt. Der traditionelle, christliche ,GOTT-Glaube‘ wird zugleich mit diesem Term <span style="color:#4C58FF">‚'''G'''‘ := </span> <span style="color:#FF6000">„GOTT“ <span style="color:#00B000">|</span> „göttlich“</span>, im 2. Beweisgang, dem Basisbeweis, und im 3. Beweisgang für das Theorem ANSELMS, jeweils als ,methodologische‘ Prämisse :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> regulär <span style="color:#00B000">( ├ )</span> und explizit eingeführt ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht für den GOTT'' <span style="color:#4C58FF">‚'''G'''‘</span> ''der Christen''«</span>. Das ist die ,modal‘-frei gewählte, <span style="color:#4C58FF">„theologische“</span> Kalkül-,Annahme‘, <span style="color:#00B000">(als ,Argument-Einführung‘ := <span style="color:#4C58FF">‚'''AE:'''‘</span> )</span>, und wird dann mit Definition-1 näher ,bestimmt‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ — </span> ''':''' <span style="color:#FF6000"> »''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht genau dann für ‚GOTT‘'' <span style="color:#00B000">|</span> ''‚göttlich‘'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle positiven Eigenschaften, bzw. Vollkommenheiten'', <span style="color:#4C58FF">‚'''PX'''‘</span>, ''hat''«</span>, entsprechend dem ‚Quelltext‘ bei LEIBNIZ. <span style="color:#00B000">(Das ,postulierte‘ Axiom-3 ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, wird standardmäßig gelesen als <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, hat aber auch die alternative Leseart ''':''' <span style="color:#FF6000">»''GOTT ist perfekt d.h. vollkommen''«</span>, was <span style="color:#4C58FF">„theologisch“</span> auch richtig ist; mit <span style="color:#4C58FF">‚'''P'''‘ </span> := <span style="color:#FF6000">„Perfektion“/„Vollkommenheit“</span> ist dann die Summe aller <span style="color:#FF6000">„positiven Eigenschaften“</span>.)</span> Mit Axiom-3, — in dieser <span style="color:#4C58FF">„theologischen“</span> Leseart —, ist der ‚Wenn-Satz‘ in Definition-1 ‚aufgelöst‘ ''':''' <span style="color:#FF6000">»''GOTT hat alle positiven Eigenschaften, weil er ‚perfekt‘ ist''«</span>.
In Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, wird die ,für uns‘ <span style="color:#FF6000">„notwendige Existenz“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —, </span> durch die ,aus sich‘ <span style="color:#FF6000">„notwendig“</span> <span style="color:#4C58FF">— '''□''' —</span> instanziierten <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(als zu den Transzendentalia gehörig)</span>, bestimmt. Das GÖDEL-Kalkül setzt sowohl in Definition-3 als auch im Axiom-5 das Theorem des ARISTOTELES von der ontologischen ‚Identität‘, d.i. die Koinzidenz von <span style="color:#FF6000">„Dasein“</span>, <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#00B000">(Essenz)</span> im prinzipiell <span style="color:#FF6000">„unbewegten Erstbewegenden“</span> voraus. Ohne diese Annahme bzw. ohne Axiom-5, würde das GÖDEL-Kalkül nicht ‚funktionieren‘. Das GÖDEL-Theorem-2.1 ''':''' <span style="color:#4C58FF">— ‚'''Gx→G'''<sub>ess</sub>'''x'''‘ —</span>, kann unter dieser Voraussetzung dann, <span style="color:#4C58FF">„theologisch“</span> richtig und eindeutig, so gelesen werden ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für GOTT'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''als Individuum steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span>, ''das Wesen'', <span style="color:#4C58FF">—<sub>ess</sub>—, </span> <span style="color:#00B000">(,Essenz‘)</span>, ''GOTTES'' <span style="color:#4C58FF">‚'''x'''‘</span>«</span><ref>vgl. z.B. THOMAS von Aquin ''':''' ,''<span style="font-family: Times;"><big>De Ente et Essentia</big></span>''’, Kapitel 5 ''':''' „Deus, cuius essentia est ipsummet suum esse“ ''':''' „GOTT, dessen Wesen sein eigenes Sein ist“.</ref>, statt der <span style="color:#4C58FF">„theologisch“</span> unrichtigen Lesearten in der Wikipedia ''':''' <span style="color:#FF6000">»''Göttlich ist eine essentielle Eigenschaft jedes göttlichen Wesens''«</span><ref>{{w|Gottesbeweis#Kurt_Gödel|Gottesbeweis 2.1.2, Theorem 2}}; Version vom 10.09.2025</ref>, oder bei Christoph BENZMÜLLER et alia, im sog. ,Theorembeweiser‘ ''':''' <span style="color:#FF6000">»''Gottähnlich zu sein ist eine Essenz von jeder gottähnlichen Entität''«</span><ref>[https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html ‚Gödels „Gottesbeweis“ bestätigt’, Theorem 2]</ref>, mit der suggestiven Annahme, es gäbe polytheïstisch, mehrere ,göttliche Wesen‘, bzw. ,gottähnliche Entitäten‘, was der monotheïstischen, abendländischen Tradition, bzw. dem <span style="color:#4C58FF">„theologischen“</span> Theorem von der ,Unvergleichlichkeit‘ und ,Einzigartigkeit‘ GOTTES widerspricht, das im GÖDEL-Kalkül mit Korollar-3 bestätigt wird. <span style="color:#00B000">(Die Interpretation <span style="color:#4C58FF">‚'''G'''‘ :=</span> <span style="color:#FF6000">„GOTT“</span>, als ,Individuumname‘, ist synonym zum <span style="color:#FF6000">„Dasein <span style="color:#00B000">(Existenz)</span> GOTTES“</span>, und äquivalent zur ‚positiven Eigenschaft‘ <span style="color:#FF6000">„Göttlichkeit“</span>, alias <span style="color:#FF6000">„göttlich zu sein“</span> = <span style="color:#FF6000">„GOTT zu sein“</span> = <span style="color:#FF6000">„GOTT-Sein“</span>; und mit dem GÖDEL-Term ''':''' <span style="color:#4C58FF">‚'''G'''<sub>ess</sub>‘ :=</span> <span style="color:#FF6000">„das Wesen <span style="color:#00B000">(Essenz)</span> GOTTES“</span>.)</span>
<div class="center"><span style="color:#FF6000"><span style="color:#4C58FF">‚'''G'''‘ :=</span> „'''G'''öttlichkeit“ <span style="color:#4C58FF">↔</span> „'''G'''OTT“ <span style="color:#4C58FF">↔</span> „'''G'''OTT-Sein“</span> </div>
Die Rechtfertigung für diese <span style="color:#4C58FF">„theologische“</span> Dreifach-Äquivalenz für <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, im GÖDEL-Kalkül, gibt Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''die positive <u>Eigenschaft</u>'', <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ''Göttlichkeit'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''äquivalent zu GOTT als Individuum-Name'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''ist auch äquivalent zum Dasein GOTTES'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''gleichbedeutend mit notwendiger <u>Existenz</u>'', <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>'', dem <u>Sein</u> GOTTES für uns''«</span>. Hier hat GÖDEL explizit <span style="color:#FF6000">„Eigenschaft“</span> mit <span style="color:#FF6000">„Existenz“</span> bzw. <span style="color:#FF6000">„Sein“</span> gleichgesetzt; <span style="color:#00B000">(was jedoch nach KANT für alles, was in unserer Welt ‚existiert‘, bzw. für alles, was zur <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> gehört, wie GÖDEL selbst sagt, in jedem Fall ‚unstatthaft‘ ist ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>)</span>. Jedoch wegen dieser ‚Gleichsetzung‘, die einzig und allein, der aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition entsprechend, singulär nur in GOTT ‚statthaft‘ ist, kann jetzt die ‚positive Eigenschaft‘ <span style="color:#00B000">(Essenz)</span> <span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(ontologisch korrekt)</span> gelesen werden als <span style="color:#FF6000">„das, was GOTT zu dem macht, ‚was‘ GOTT an sich selbst ist“</span>, nämlich zu seinem <span style="color:#FF6000">„GOTT-Sein“</span> <span style="color:#00B000">(Existenz)</span>, zu seinem <span style="color:#FF6000">„Dasein als GOTT“</span>; zur Tatsache, dass <span style="color:#FF6000">„GOTT GOTT ist“</span>, d.h. dass <span style="color:#FF6000">„GOTT als GOTT ‚da‘ ist“</span>. Das ist, <span style="color:#00B000">(und da folgt ARISTOTELES seinem Lehrer PLATO)</span>, nach traditioneller Auslegung, die übliche, ontologische Funktion des ‚Wesens‘<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ |</span> eines Seienden ''':''' es ‚macht‘ das Seiende zu dem, ‚was‘ es ist; es ist die ‚Ursache‘ dafür, dass das Seiende, das ‚ist‘, ‚was‘ es ist | ‚Was-Sein‘ — ‚Wesen‘. <span style="color:#00B000">(ARISTOTELES lokalisiert jedoch das ,Wesen‘ im Seienden, im Gegensatz zu PLATO, der das ,Wesen‘, — ,getrennt‘ vom Seienden —, in den allgemeinen ,Ideen‘ lokalisiert.)</span>
Da aber in ‚Gott‘, <span style="color:#00B000">(dem <span style="color:#FF6000">„unbewegten, ‚unverursachten‘ Erstbeweger“</span>)</span>, Prozesshaftes, ‚Ursächliches‘ auszuschließen ist, ist die übliche prozesshafte, ‚ursächliche‘ Funktion von <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span><span style="color:#00B000"> | ‚ousía‘ |</span> ,Wesen‘ im <span style="color:#FF6000">„Erstbewegenden“</span> nach ARISTOTELES, sozusagen, schon ‚zum Abschluss‘ gekommen, schon ‚verwirklicht‘, — <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐν-έργεια οὖσα</big></span>“</span><span style="color:#00B000"> | ‚en-érgeia oúsa‘</span> —, schon ‚ins-Werk‘ gesetzt; <span style="color:#00B000">(<span style="color:#FF6000">„<span style="font-family: Times;"><big>τὸ ἔργον</big></span>“</span> | ‚to érgon‘ | ‚das Werk‘; <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια</big></span>“</span> | ‚enérgeia‘ | ,Wirksamkeit‘, ,Wirklichkeit‘, ,Aktualität‘, ,Energie‘; und <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὖσα</big></span>“</span> | ,oúsa‘ | feminin Nominativ Singular von <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὤν</big></span>“</span> | ‚ón‘ | ‚seiend‘)</span>. Sein ,Wesen‘ ist im ,Dasein‘ vollendet, ist ,wirkliches, verwirklichendes Sein‘, ‚seiende Aktualität‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>actus purus</big></span>“</span> ''':''' sein Wesen ist ‚reine Tätigkeit‘, ,reine verwirklichende Gegenwärtigkeit‘, d.h. ,existent‘, ohne jede prozesshafte ‚Potenzialität‘. Aus der wichtigen und richtigen Erkenntnis, dass GOTT <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer Welt''«</span> ist, folgt mit der ontologischen Identität von ,Dasein‘ und ,Wesen‘ in GOTT ''':''' Der zeitlos ewige GOTT ist <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''immer schon da''«</span>, m.a.W. ist <span style="color:#FF6000">„zeitlos-ursprungslos“</span>. Insofern ist <span style="color:#FF6000">„Göttlichkeit“</span> die <span style="color:#FF6000">„Wesenseigenschaft“</span>, die im <span style="color:#FF6000">„Dasein GOTTES“</span> d.h. in <span style="color:#FF6000">„GOTT“</span>, schon ihr ‚Ziel‘, ihre Vollendung, — <span style="color:#FF6000">„Perfektion“</span>, Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, erreicht hat. GOTT ist <span style="color:#FF6000">»''vollkommen''«</span> und darum auch <span style="color:#FF6000">»''notwendig für uns immer schon ‚da‘''«</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ — </span>. GOTT ist in seinem ‚zeitlosen Wesen‘ <span style="color:#FF6000">„unverursacht“</span>, da er <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''vollkommen''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''□PG'''‘ —</span>, <span style="color:#00B000">(eine Instanz von Axiom-4)</span>. <span style="color:#FF6000">„Vollkommenheit“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ist die <span style="color:#FF6000">„Wesenseigenschaft“</span>, bzw. das <span style="color:#FF6000">„Wesen GOTTES“</span> ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>. <span style="color:#FF6000">»''GOTT ist ,der‘ Vollkommenste''«</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, d.h. <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist die unbegrenzte Summe der unendlichen Vollkommenheiten''«</span>. Und zur absoluten <span style="color:#FF6000">„Vollkommenheit“</span> gehört <span style="color:#FF6000">„notwendig“</span> auch das <span style="color:#FF6000">„Existieren“</span> ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span>. <span style="color:#FF6000">„Notwendige Existenz“</span> gehört zu den ,ultimativen‘ Transzendentalia in GOTT, was GÖDEL mit Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, syntaktisch formalisiert hat, wenn sowohl das <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, als auch alle <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span> im Kalkül, für den Dreifaltigen GOTT der Christen stehen, was dann im Korollar-3, mit der Identität, <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, bzw. der Koinzidenz beider Individuum-Variablen, explizit gezeigt wird.
Entscheidend für diese Interpretation des GÖDEL-Systems ist ''':''' nur unter der ,modal‘ notwendigen Voraussetzung der ontologischen ‚Identität‘ von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, Theorem-2 ''':''' <span style="color:#4C58FF"> — '''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>, bzw. der ‚Gleichsetzung‘, <span style="color:#00B000">(Koinzidenz)</span>, von <span style="color:#FF6000">„notwendiger Existenz“</span> mit den ‚positiven‘ Wesenseigenschaften, der <span style="color:#FF6000">„Essenz“</span> in GOTT, Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, ‚funktioniert‘ die GÖDEL-Axiomatik '''!''' Diese ‚Identität‘, bzw. ,Koinzidenz‘ wird in ARISTOTELES, ‚''<span style="font-family: Times;"><big>Metaphysik</big></span>''‘, Buch XII 7, in einem Indizienbeweis erbracht, der mit der Methode der philosophischen Induktion zum Ergebnis kommt ''':'''
::<span style="color:#FF6000">» … ''es muss'' <span style="color:#00B000">[ notwendig ]</span> ''etwas geben, das, ohne selbst ‚bewegt‘'' <span style="color:#00B000">[ </span>''worden''<span style="color:#00B000"> ]</span> ''zu sein'', <span style="color:#00B000">[ ‚unentstanden‘ ]</span>, ''alles Übrige wie ein Geliebtes ‚bewegt‘'' <span style="color:#00B000">[ ‚entstehen lässt‘ ]</span>«</span>, das darum selbst ‚zugleich‘ <span style="color:#FF6000">„<span style="font-family: Times;"><big>αἴδιον καί οὐσία καί ἐνέργεια οὖσα</big></span>“ <span style="color:#00B000">| ,aídion kai ousía kai enérgeia oúsa‘ |</span> »<span style="color:#00B000">[ zeitlich-]</span>''ewig, sowohl <u>Wesen</u>'', <span style="color:#00B000">[ etwas Konkretes, Essentielles ]</span>, ''als auch seiende Wirksamkeit — ''<span style="color:#00B000">[ </span>„<span style="font-family: Times;"><big>actus purus</big></span>“, „reine Tätigkeit“<span style="color:#00B000"> ]</span> ''— verwirklichendes, wirkliches <u>Sein</u> ist'', <span style="color:#00B000">[ ein Existierendes, das alles Übrige ,zur Existenz‘ bringen kann ]</span> «</span>, bzw. <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὀρεκτόν καί νοητόν</big></span>“ <span style="color:#00B000"> | ,orektón kai noêtón‘ | </span>»''das ersehnt und erkennbar ist''.«</span> <span style="color:#00B000">(''<span style="font-family: Times;"><big>vgl. ,Metaphysik</big></span>''‘ XII 7, 1072a,23 – 1072b,4)</span>
Was <span style="color:#FF6000">»''alles Übrige''«</span> ,zur Existenz‘ bringen kann, bzw. ,verwirklichen‘ kann, ohne selbst ,entstanden‘ zu sein, muß auch selbst, als etwas Konkretes, Essentielles, immer schon ,existieren‘, bzw. ,wirklich sein‘. Die, daraus abgeleitete, und damit ,erkannte‘, ontologische ‚Identität‘, — ,Koinzidenz‘ —, von ‚Wesen‘ und ‚Sein‘, <span style="color:#00B000">(Ziel aller Sehnsucht und jedes Erkenntnisstrebens)</span>, <span style="color:#FF6000">»''ist das Privilegium der Gottheit allein''«</span> ''':''' mit Gottfried Wilhelm LEIBNIZ interpretiert, entsprechend einer adäquaten, aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition. Dieses induktive, ‚ontologisch‘ a-posteriori Ergebnis aus der ‚Prinzipienforschung‘ des ARISTOTELES ist die metaphysische und logische Voraussetzung, dass GÖDEL seine Axiomatik im Kalkül des sog. ‚ontologischen Gottesbeweises‘ a-priori des ANSELM von Canterbury, und nach LEIBNIZ, deduktiv korrekt formulieren konnte; <span style="color:#00B000">(vgl. 3. Beweisgang)</span>.
Angenommen, die Variable <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für den <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, der Christen, <span style="color:#00B000">(siehe Anhang, Term :01: im 2. Beweisgang)</span>, dann ist, — auf Grund von diesem Beweisgang —, in unserer Welt ,wahr‘ und evident ''':''' sowohl die ‚positive Eigenschaft‘ <span style="color:#FF6000">»''Göttlichkeit''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als auch das faktische <span style="color:#FF6000">»''‚Da‘-Sein'' <span style="color:#00B000">[ Existenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ‚benennen‘, ontologisch ident, denselben Sachverhalt ''':''' nämlich das, was wir das <span style="color:#FF6000">»''Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>, nennen. <span style="color:#FF6000">»''Göttlichkeit'', bzw. ''GOTT-‚Sein‘ ist das Wesen GOTTES''«</span>, <span style="color:#00B000">(Theorem-2.1)</span>, und dann umgedreht und äquivalent ''':''' <span style="color:#FF6000">»''Das Wesen GOTTES ist sein ‚Da‘-Sein als GOTT'', bzw. ''seine Göttlichkeit''«</span>, <span style="color:#00B000">(Theorem-2.2)</span>, m.a.W. ''':''' <span style="color:#FF6000">»''GOTT ist wesentlich ‚grundlos‘'' <span style="color:#00B000">[ d.h. </span> ''notwendig aus sich''<span style="color:#00B000"> ]</span> ''‚da‘''«</span>. Das ist das Einzigartige im <span style="color:#FF6000">»''Wesen GOTTES''«</span> ''':''' GOTT ist ohne zeitlichen Anfang, zeitlos-ewig, für uns immer schon ‚da‘, und das ‚ist‘ sein <span style="color:#FF6000">»''Wesen''«</span>; vorausgesetzt, ,angenommen‘, man glaubt an GOTT ''':''' Term :01:. <span style="color:#00B000">(Der schon von GÖDEL indizierte Term <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ — </span> ,expliziert‘ nur eine der drei Lesearten, die der Term <span style="color:#4C58FF"> — ‚'''G'''‘ — „theologisch“</span> ,impliziert‘.)</span> Theorem-2 hat somit die syntaktische Form einer Definition ''':'''
<div class="center"><span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span></div>
Somit kann GOTT ‚explizit‘ <span style="color:#00B000">(aus einer bewiesenen Kalkül-Definition)</span> <span style="color:#4C58FF">„theologisch“</span> genauer ‚bestimmt‘ werden ''':''' <span style="color:#FF6000">»''GOTT ist gerade deswegen GOTT, weil sein überzeitlich-ewiges und an sich ‚grundloses‘'' <span style="color:#00B000">[ aber für uns notwendiges ]</span> ''Dasein'' <span style="color:#00B000">[ Existenz ]</span> ''als GOTT, ontologisch, — dem Sein nach —, identisch ist mit seinem persönlichen und für uns liebevollen Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''als GOTT; diese Identität von Dasein und Wesen gilt einzig und allein nur bei GOTT.''«</span> Die philosophische Frage nach dem <span style="color:#FF6000">„Wesen GOTTES“</span> lautet, <span style="color:#00B000">(auf die Person bezogen)</span> ''':''' <span style="color:#FF6000">„Was bist du ? “</span> Sie ist äquivalent zur <span style="color:#4C58FF">,theologisch’</span>-biblischen Frage des MOSE ''':''' <span style="color:#CC66FF">„Wer bist Du ? “</span> Die bekannte Antwort des GOTTES-JHWH aus ‚Exodus 3,14‘, im Dornbusch, thematisiert das persönliche, für uns liebevolle und für immer notwendige <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'', <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Mit diesem Zitat aus der Bibel ist die GÖDEL-Axiomatik, sozusagen, <span style="color:#4C58FF">„theologisch“</span> ‚verifiziert‘. Sie hat einerseits im Theorem-2 ihren philosophischen ‚Abschluss’ erreicht, und andererseits damit formal-syntaktisch den ‚Anschluss‘ an eine allgemeine Basis-Glaubensaussage gefunden, die ‚an sich‘ für jeden CHRIST-gläubigen Menschen ‚selbstverständlich‘ ist. Was in der Metaphysik des ARISTOTELES das Ergebnis einer philosophischen ,Induktion‘ a-posteriori ist ''':''' <span style="color:#FF6000">„,Dasein‘ ist das ,Wesen‘ GOTTES“</span>, — <span style="color:#00B000">(das mit Theorem-2, auch ein Ergebnis der deduktiven GÖDEL-Axiomatik a-priori ist ''':''' die Beweisgrundlage für den Konsequenz-Teil im Theorem AMSELMS)</span>, — das ist in der Bibel die Grundüberzeugung jedes Menschen, der an GOTT glaubt ''':''' GOTT ist für uns immer schon <span style="color:#FF6000">„da“</span>, weil er uns liebt. Das ist das, <span style="color:#FF6000">„was“</span> GOTT für uns als GOTT ausmacht, — sein Wesen ''':''' <span style="color:#CC66FF">»''Wir haben die Liebe, die GOTT zu uns hat, erkannt und gläubig angenommen. GOTT ist Liebe, und wer in der Liebe bleibt, bleibt in GOTT und GOTT bleibt in ihm''«</span>, <small>({{Bibel | 1. Johannesbrief |4|16|EU}})</small>.
Das eigentliche Ergebnis der GÖDEL-Axiomatik ist somit die ‚triviale‘ Erkenntnis, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, vorausgesetzt <span style="color:#00B000">(‚angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#CC66FF">»''Ehe die Berge geboren wurden, ehe die Erde entstand und das Weltall erschaffen wurden, bist du, o GOTT, von Ewigkeit zu Ewigkeit''«</span>, <small>({{Bibel | Psalm |90|2|LUT}})</small>. <span style="color:#00B000">(Der Glaube an die Zeitlosigkeit GOTTES ist mit der ‚Annahme‘ von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, und der ‚Annahme‘ der Definition-1 für <span style="color:#4C58FF"> ‚'''Gx'''‘ := </span> den <span style="color:#FF6000">„GOTT der Christen“</span>, im Kalkül ‚implizit‘ schon eingeführt, da die Axiome und Definitionen, — nach GÖDEL —, nur dann <span style="color:#FF6000">»''wahr''«</span> sind, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen''</span> [ Raum-Zeit-]<span style="color:#FF6000">''Struktur''«</span> unserer Welt sind. Das ,impliziert‘ auch, dass der GOTT von Axiom-3 und Definition-1 ebenfalls <span style="color:#FF6000">»''unabhängig''«</span> von Raum und Zeit, d.h. zeitlos-ewig ist '''!''' )</span>
Wer an den GOTT der Bibel glaubt, kann sich von der ‚Vernünftigkeit‘ seines Glaubens mit Hilfe des sog. ,ontologischen‘ Gottesbeweises nach ANSELM von Canterbury, mit Kurt GÖDEL <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, überzeugen. <span style="color:#00B000">(Das war auch die Absicht ANSEMS '''!''' )</span> Die Annahme, es sei ‚unmöglich‘, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span>, <span style="color:#00B000">(dezidierter Atheismus)</span>, führt im GÖDEL-Kalkül formal zu einem logischen Widerspruch; vgl. z. B. ‚''<span style="font-family: Times;"><big>Gödels Möglichkeitsbeweis</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, Seite 17, von Günther J. WIRSCHING; (https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf), d.h. es ist also nicht ‚unmöglich‘, dass es GOTT gibt. Der GOTT-Glaube ist mit den Maßstäben einer modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> und darum ,vernünftig‘. Damit steht fest ''':''' das GÖDEL-Kalkül ist kein moderner ‚Existenz-Beweis‘ für den GOTT der Bibel, sondern es setzt, <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, ,methodologisch‘, den Glauben an die Existenz eines zeitlos-ewigen GOTTES voraus, der, — <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer '' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> —, für uns immer schon ‚da‘ ist. Wenn aber einmal als fix ‚angenommen‘ worden ist, <span style="color:#00B000">(als Prämisse)</span>, dass es wahr ist, dass GOTT ‚existiert‘, dann ist natürlich die ‚Annahme‘, dass GOTT ‚nicht existiert‘, falsch. Aber sie ist auch ,unlogisch‘ und ,unsinnig‘, weil die Annahme ''':''' <span style="color:#FF6000">»''Es ist unmöglich, dass es einen GOTT gibt''«</span>, offensichtlich und eindeutig zu einem Widerspruch führt; was z. B. Günther J. WIRSCHING mit seiner Version des <span style="color:#00B000">(nicht umkehrbaren)</span> ‚Möglichkeitsbeweises‘ für ,GOTT‘, explizit vorexerziert hat; <span style="color:#00B000">( nachgestellt im Anhang ''':''' GÖDELS ‚Möglichkeitsbeweis‘ als ,Widerlegung‘ eines Nicht-GOTT-Glaubens; in Entsprechung zu Psalm 14,1 und Psalm 53,2 ''':''' <span style="color:#CC66FF">»''Der'' <span style="color:#00B000">[ ,unvernünftige‘ ]</span> ''Tor sagt in seinem Herzen ''':''' Es gibt keinen Gott. Sie handeln verderbt, handeln abscheulich; da ist keiner, der Gutes tut''«</span>. Historischer Hintergrund zu diesem Psalm-Text ''':''' Die Zerstörung des Tempels in Jerusalem 586 v.Ch. durch die Truppen des NEBUKADNEZAR II.)</span> Der Logiker GÖDEL hat in seinem System zum ,ontologischen Beweis‘ keine ‚formale Unentscheidbarkeit‘ <span style="color:#00B000">(Agnostizismus)</span> feststellen können, wie auf einem anderen Feld seiner Forschungsarbeiten.
Das GÖDEL-Konsequenz-Teil von der ‚Notwendigkeit‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, <span style="color:#00B000">(die ‚Konsequenz’ aus dem ‚widerspruchsfreien‘ Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —,</span>)</span> im ‚Theorem ANSELMS‘, ist <span style="color:#00B000">(im 3. Beweisgang, Term :10:)</span> dann auch eine weitere Explikation des Basis-Theorems-2 des Kalküls ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span>, über die ‚ontologische Identität‘ vom <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, mit seinem <span style="color:#FF6000">„Wesen“</span> ''':''' <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, nach einem <span style="color:#4C58FF">[ Modus ponens ]</span>, dargestellt mit Term :09:.
<span style="color:#00B000">(Die ontologische Identität von Dasein und Wesen in GOTT, ist die, für uns, <span style="color:#FF6000">„notwendige Präsenz <span style="color:#00B000">[ das Sein, <span style="color:#4C58FF">— ‚'''E'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, die äquivalent, bzw. koinzident ist zur <span style="color:#FF6000">„Vollkommenheit <span style="color:#00B000">[ das Wesen, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>. Diese Identität von Sein und Wesen in GOTT ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub> —</span>, bedeutet <span style="color:#4C58FF">,theologisch‘</span> konkret ''':''' die, für uns, notwendige Gegenwärtigkeit GOTTES, [ sein Dasein ], ist verwirklicht worden in der liebevollen [ Wesens-]Zuwendung GOTTES zu uns Menschen, in seiner Kindwerdung in Bethlehem, durch die Jungfrau MARIA ''':''' GOTTES Wesen ist ,Sein-mit-uns‘ ''':''' <span style="color:#CC66FF">»''sein Name'', <span style="color:#00B000">[ sein Wesen ]</span>, ''ist IMMANUEL, das heiß übersetzt ''':''' GOTT-ist-mit-uns''«, <small>({{Bibel | Matthäus Evangelium |1|23|EU}})</small></span>, der unsere Not-,wenden‘-wird, d.h. der uns und die Welt von der Korruption der Sünde und des Todes <span style="color:#4C58FF">,erlösen‘</span> will und wird; jedoch nicht ohne uns. Die <span style="color:#4C58FF">„Menschwerdung“</span> GOTTES in JESUS CHRISTUS, die <span style="color:#4C58FF">„Hypostatische Union“</span>, bzw. diese außergewöhnliche und einzigartige <span style="color:#FF6000">„Koinzidenz“</span> von GOTT und Mensch, ist der wirkliche und historische Beginn der <span style="color:#4C58FF">„Erlösung“</span> des Menschen und der Welt; vergegenwärtigt für jede Generation der Menschen in und durch die <span style="color:#4C58FF">„Kirche“</span> JESU CHRISTI.)</span>
Die, von GÖDEL im 1. Beweisgang, als Prämissen schon vorausgesetzten und ,angenommenen‘ Perfektionen, bzw. Vollkommenheiten, <span style="color:#00B000">(das sind die allgemeinen ,Transzendentalia‘ für alles Nicht-Göttliche in der Welt)</span>, werden im ersten Teil des 2. Beweisganges, mit Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dann auch als <span style="color:#FF6000">„positive Wesenseigenschaften“</span>, <span style="color:#00B000">(als die ultimativen ,Transzendentalia‘)</span>, in GOTT ‚definitiv‘ <span style="color:#00B000">( ╞ )</span> bestätigt; <span style="color:#00B000">(siehe Anhang, 2. Beweisgang, Anmerkung-2)</span>.
Im 3. Beweisgang ist das Basis-Theorem-2 die ,modal‘ notwendige, bzw. transzendentale, Voraussetzung, sowohl für das <span style="color:#FF6000">„an sich notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, im Term :10:, als auch für die <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, in den Ressourcen dieses Beweisganges ''':''' in der Definition-3, und im Axiom-5; <span style="color:#00B000">(das <span style="color:#4C58FF">— ‚'''E'''‘ —</span> wird nur GOTT zugeordnet; vgl. auch Anhang, 3. Beweisgang, Anmerkung-4)</span>. Dieses Basis-Theorem-2 ist auch zugleich die Antwort auf die Frage nach dem ‚Ursprung‘ GOTTES ''':''' GOTT ist <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> ‚da‘, von <span style="color:#CC66FF">„Ewigkeit zu Ewigkeit“</span>, denn es ‚ist‘ sein <span style="color:#FF6000">„Wesen“</span>, <span style="color:#00B000">(überzeitlich-ewig)</span> für uns immer schon ‚da‘ zu sein. Weitere ‚Einzelheiten‘ über Wesen und Eigenschaften GOTTES gehören in die Mystik, bzw. in die <span style="color:#4C58FF">„Theologie“</span>.
===<div class="center"><span style="color:#660066">Die Bedeutung des Kalküls</span></div>===
<div class="center">Immanuel KANT und Kurt GÖDEL im ‚Dialog‘</div>
KANT sagt ''':'''
::<span style="color:#FF6000">»</span>'''''Sein''' ist offenbar kein reales Prädikat''. ... ''Es ist bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Position'' <span style="color:#00B000">[ latinisiert, deutsch für ''':''' ,Setzung‘ ]</span> ''eines Dinges ... Nehme ich nun das Subjekt (Gott) mit allen seinen Prädikaten'' <span style="color:#00B000">[ d.h. Eigenschaften ]</span> ''(worunter auch die Allmacht gehört) zusammen, und sage ''':''' ‚'''Gott ist'''‘'', <span style="color:#00B000">[ ,GOTT existiert wirklich‘ ]</span>, ''oder ‚es ist ein Gott‘, so <u>setze</u> ich kein neues Prädikat'' <span style="color:#00B000">[ keine neue Eigenschaft ]</span> ''zum ‚Begriffe‘ von Gott ''':''''' <span style="color:#00B000">[ <span style="color:#0000FF; background-color:#FFFF00">‚Sein’ ist kein ‚reales Prädikat’ in GOTT</span>; ‚Existenz‘ ist in GOTT keine ‚Eigenschaft‘ ],</span> ... ''es kann daher zu dem Begriffe'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''der bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Möglichkeit ausdrückt, darum, dass ich dessen Gegenstand'', <span style="color:#00B000">[ GOTT ]</span>, ''als schlechthin gegeben (durch den Ausdruck ''':''' er ist'', <span style="color:#00B000">[ GOTT ist wirklich ]</span>'' ) <u>denke</u>, nichts weiter hinzukommen.'' <span style="color:#00B000">[ Beides ist ,bloß gedacht‘ '''!''' ]</span> ''Und so enthält das Wirkliche nichts mehr als das bloß Mögliche. Hundert ‚wirkliche‘ Taler enthalten nicht das mindeste <u>mehr</u>, als hundert ‚mögliche‘. Denn, da diese den'' <span style="color:#00B000">[ gedachten ]</span>'' ‚Begriff‘, jene aber den Gegenstand und dessen'' <span style="color:#00B000">[ gedachte ]</span>'' Position an sich selbst bedeuten, so würde, im Fall dieser'', <span style="color:#00B000">[ die 100, als ,wirklich‘ bloß gedachten Taler ]</span>, ''<u>mehr</u> enthielte als jener,'' <span style="color:#00B000">[ als ihr ‚gedachter‘ Begriff im Verstand, wie ΑNSELM von Canterbury für GOTT, als ‚wirklich‘ Existierenden, argumentierte, …''so würde'' ]</span> ''mein ‚Begriff‘'' <span style="color:#00B000">[ die 100 im Verstand ‚gedachten‘ Taler ]</span> ''nicht den ganzen Gegenstand ausdrücken, und also auch <u>nicht der angemessene Begriff</u> von ihm sein. Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben'', <span style="color:#00B000">[ als bei 100 bloß ‚gedachten‘ Talern ]</span> ... <span style="color:#FF6000">«</span> <span style="color:#00B000"><ref>‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 401; https://www.korpora.org/kant/aa03/401.html</ref></span>.
GÖDEL würde darauf <span style="color:#00B000">(korrespondierend zur aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition von der Identität von Sein und Wesen in GOTT)</span> antworten ''':'''
::<span style="color:#FF6000">»</span>Die <span style="color:#FF6000">„100 Taler“</span> sind der <span style="color:#FF6000">»''zufälligen Struktur der'' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> entnommen, und sind daher nicht mit GOTT vergleichbar, der, <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer Welt, <span style="color:#FF6000">„über“</span> dieser Welt steht. Einzig und allein nur von GOTT gilt ''':''' Der mit Dingen aus unserer Welt ,nicht vergleichbare‘ GOTT, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#FF6000">„existiert notwendig für uns“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, und <span style="color:#FF6000">„notwendiges Existieren, <u>Sein</u>“</span> ,ist‘ eine <span style="color:#FF6000">„positive <u>Wesen</u>seigenschaft“</span> in GOTT, <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, weil GOTT aus sich <span style="color:#FF6000">„vollkommen“ <span style="color:#00B000">|</span> „perfekt“</span> ist, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#0000FF; background-color:#FFFF00">‚Sein‘ ist in GOTT ein ‚reales Prädikat‘</span>; <span style="color:#00B000">(notwendige ‚Existenz’ ist eine positive ‚Wesenseigenschaft’ in GOTT)</span>, und nur bei GOTT '''!''' Zum zeitlos-ewigen GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(als methodologische Kalkül-Prämisse)</span>, kann man sagen ''':''' Weil es, wegen Axiom-1 und Axiom-2, <span style="color:#FF6000">„widerspruchsfrei möglich"</span> ist, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, darum ist GOTT auch das ‚einzige‘ <span style="color:#FF6000">„Wesen“</span>, <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, von dem ein Christ sagen kann, dass es <span style="color:#FF6000">„notwendig aus sich“</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, d.h. <span style="color:#FF6000">„grundlos“ <span style="color:#00B000">|</span> „unverursacht“</span>, für uns immer schon ‚da’ ist, und immer ,da’ sein wird; und zusätzlich gilt ''':''' Es gibt für jede mögliche Welt ‚nur‘ diesen einen GOTT ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ — </span><span style="color:#00B000">(Monotheïsmus, Korollar-3)</span>; vorausgesetzt, man geht von der ,Existenz’ dieses GOTTES aus, wobei diese Annahme für GÖDEL <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist.<span style="color:#FF6000">«</span>
Eine Beobachtung ''':''' KANT sagt, gleichsam als ,krönenden‘ Abschluss seiner Widerlegung des, — von ihm so genannten —, ,ontologischen Gottesbeweises‘ ''':''' <span style="color:#FF6000">»</span>''Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben, (d.i. ihrer Möglichkeit).''<span style="color:#FF6000">«</span> Diese Feststellung KANTS entspricht jedoch genau der Argumentation ANSELMS ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span>, d.h. GOTT ,existiert auch in Wirklichkeit‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was <u>mehr</u> ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ein bloßer Begriff ,im Verstand zu sein‘. Der ,Mehr-Wert‘ ergibt sich in beiden Fällen, sowohl bei den Talern als auch bei GOTT, aus der ,Wirklichkeit‘ ihrer Existenz, im Gegensatz zur bloßen, <span style="color:#00B000">(im Begriff gedachten)</span>, ,Möglichkeit‘ ihrer Existenz, so dass, in jedem Fall, der ,Begriff‘ im Verstand ohne Abstriche <span style="color:#FF6000">»</span>''den ganzen Gegenstand ausdrückt''<span style="color:#FF6000">«</span>, und von diesem auch <span style="color:#FF6000">»</span>''der angemessene Begriff''<span style="color:#FF6000">«</span> ist. Alles andere wäre eine ,Lüge‘. Mit dieser ,Beobachtung‘ ist das implizit ,Widersprüchliche‘ in KANTS Argumentation aufgedeckt ''':''' Das Wirkliche in KANTS Vermögenszustande enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, konträr zu seiner vorigen Behauptung ''':''' <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#FF6000">«</span> enthalte <span style="color:#FF6000">»'',nichts mehr‘</span> als das bloß Mögliche''<span style="color:#FF6000">«</span>. Diese Behauptung ist offensichtlich falsch. Das ist somit ein indirekter Beweis und damit eine Bestätigung für die analoge Argumentation ANSELMS aus dem Wiederspruch des Gegenteils, am Beispiel KANTS <span style="color:#FF6000">»</span>''Vermögenzustandes bei hundert wirklichen Talern''<span style="color:#FF6000">«</span>, in dem in Wirklichkeit <span style="color:#FF6000">,doch mehr‘</span> ist, <span style="color:#FF6000">»</span>''als bei dem bloßen Begriffe derselben''<span style="color:#FF6000">«</span>.
<span style="color:#00B000">(Diese ,Beobachtung‘ ist zugleich auch das entscheidende Indiz dafür, dass das systembedingte Konzept KANTS von der ,Existenz‘, bzw. vom ,Sein‘ eines jeden Gegenstandes, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.i. als seine ,Setzung‘ bloß im- und durch den Verstand, ,falsch‘ ist, — d.h. im Klartext ''':''' für KANT ist das ,Sein‘ eines Gegenstandes bloß ein ,Gedanke‘ in uns, wenn er meint, dass uns ein Gegenstand erst dann wirklich ,gegeben‘ sei, wenn wir uns den</span> <span style="color:#FF6000">»</span>''Gegenstand als schlechthin gegeben (durch den Ausdruck : <u>er ist</u>) <u>denken</u>''<span style="color:#FF6000">«</span>, <span style="color:#00B000">was nur dem Irrtum einer falschen System-Konzeption geschuldet sein kann. Auf Grund dieser Konzeption ist das</span> <span style="color:#FF6000">»</span>''Ding, wie es an sich selbst ist''<span style="color:#FF6000">«</span>, <span style="color:#00B000">für KANT systembedingt weder ,anschaubar‘, noch ,erkennbar‘. Diese falsche Konzeption über die ,Existenz‘, bzw. das ,Sein‘ eines Dinges, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">ist für KANT letztendlich auch die Beweisgrundlage und Voraussetzung für seine Ablehnung des ontologischen Argumentes für GOTT im Theorem ANSELMS. Wenn das ,wirkliche‘ Sein eines Dinges nichts anderes ist, als</span> <span style="color:#FF6000">»</span>''dessen'' <span style="color:#00B000">[ bloß gedachte ]</span> ''Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.h. als seine ,mögliche‘ Setzung bloß im- und durch den Verstand, — das ist das, als ,wirklich‘ bloß nur ,gedachte‘ Ding —, dann</span> <span style="color:#FF6000">»</span>''enthält''<span style="color:#FF6000">«</span> <span style="color:#00B000">natürlich</span> <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#00B000">, [ als die bloß gedachte Existenz ],</span> ''nichts mehr als das bloß Mögliche''<span style="color:#00B000">, [ als der gedachte Begriff ]<span style="color:#FF6000">«</span>, was offensichtlich unhaltbar ist. <span style="color:#4C58FF">[ Modus tollendo tollens ] </span> ''':''' Wenn die Konsequenz einer Wenn-Dann-Folgerung ,falsch‘ ist, dann ist auch ihre Voraussetzung, das System-Konzept KANTS, ,falsch‘ ''':''' d.i. seine ,Kopernikanische Wende‘ für die Metaphysik, soweit sie KANTS ,Sein’-Konzept betrifft. Korrekt und ,wahr‘ ist in jedem Fall ''':''' Das Wirkliche enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, und die Dinge ,existieren‘ schon immer unabhängig von unserem Denken. ,Existenz‘, das ,Sein‘, ist <span style="color:#FF6000">,doch mehr‘</span>, als bloß ein ,Gedanke‘ von uns.)</span>
Somit ist die Argumentation KANTS gegen den ontologischen Beweis ANSELMS für GOTT ,falsch‘ und unhaltbar, weil sie auf der ,falschen‘ Voraussetzung beruht ''':''' die ,Existenz‘, bzw. das ,Sein‘ eines jeden ,Gegenstandes‘, — wie z. B. auch die Existenz bei GOTT —, sei bloß dessen gedachte ,Position‘ an sich selbst, d.h. bloß seine ,Setzung‘ im- und durch den Verstand. Damit ,macht‘ er GOTT außerdem zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, und verkennt so, — wie vor ihm THOMAS von Aquin —, auch die Einzigartigkeit und Exklusivität GOTTES im Theorem ANSELMS.
<div class="center">Die <span style="color:#FF6000">„Rede von GOTT“</span> in der philosophischen Tradition</div>
Wenn man die philosophische Tradition der <span style="color:#FF6000">„Rede von GOTT“</span> im Lichte der Ergebnisse der <span style="color:#4C58FF">„axiomatischen Theologie“</span> GÖDELS liest, dann stellt sie sich am Beispiel bei ARISTOTELES, — AVICENNA, — ANSELM, und bei GÖDEL wie folgt dar ''':'''
<span style="color:#FF6000">»''Das Erstbewegende,'' (<span style="font-family: Times;"><big>,πρῶτον κινοῦν‘</big></span>), ''das, ohne selbst ‚bewegt‘ zu sein'', (<span style="font-family: Times;"><big>,ἀκίνητον‘</big></span> <span style="color:#00B000">| ''unverursacht, ,entstehungslos‘'' |</span> ), ''alles Übrige wie ein Geliebtes ‚bewegt‘'', (<span style="font-family: Times;"><big>,κινεῖ δὴ ὡς ἐρώμενον‘</big></span> <span style="color:#00B000"> | ''-verursacht, ,entstehen‘ lässt'' |</span> ), ''ist sowohl'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚Wesen‘'', (<span style="font-family: Times;"><big>,ἀΐδιον καί οὐσία‘</big></span> <span style="color:#00B000">| ''‚Substanz‘'' |</span> ), ''als auch'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚wirksames, verwirklichendes Sein‘'', (<span style="font-family: Times;"><big>‚ἀΐδιον καί ἐνέργεια οὖσα‘ = ‚actus purus‘</big></span><span style="color:#00B000"> | '',reine Tätigkeit‘'' |</span> ), … ''ersehnt'', (<span style="font-family: Times;"><big>,ὀρεκτόν‘</big></span>), ''und erkennbar'', (<span style="font-family: Times;"><big>,νοητόν‘</big></span>), ... ''denn dies ist der ‚Gott‘'', (<span style="font-family: Times;"><big>,τοῦτο γὰρ ὁ θεός‘</big></span>), <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, ''der'' <span style="color:#00B000">[ zeitlich-]</span>''Ewige'', (<span style="font-family: Times;"><big>,ἀΐδιον‘</big></span>), — ''der Unvergleichliche'', (<span style="font-family: Times;"><big>,ἄριστον‘</big></span> <span style="color:#00B000">| ''‚der Beste‘'' |</span> ), — ''der Lebendige'', (<span style="font-family: Times;"><big>,ζῷον‘</big></span> <span style="color:#00B000">| ,''das Leben selbst‘'' |</span> ), — ... ''so sagen wir ja'', (<span style="font-family: Times;"><big>,φαμὲν δὴ‘</big></span>), — ...«</span> ''':''' <span style="color:#00B000">(ARISTOTELES — Grieche)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als ,Individuumname‘, ist synonym mit <span style="color:#FF6000">„göttliches ‚Da-Sein’“</span>, das sowohl <span style="color:#FF6000">„aus sich vollkommen“</span>, als auch <span style="color:#FF6000">„notwendig für uns“</span> ‚da‘ ist; <span style="color:#00B000">(das ist das, an sich, vollkommene ‚Was-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, das zugleich, für uns, das notwendige ‚Da-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> — ist)</span>; <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span>. Das ist der <u>angemessene Begriff</u> von GOTT, und gilt ‚nur‘ von GOTT. Weil GOTT <span style="color:#FF6000">„vollkommen“</span> ist, ist <span style="color:#FF6000">„Da-Sein“ <span style="color:#00B000">|</span> „GOTT-Sein“ <span style="color:#00B000">|</span> „Göttlichkeit“</span> das <span style="color:#FF6000">„Wesen“</span> GOTTES ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>. Im Unendlichen, GOTT, sind <span style="color:#FF6000">„Essenz“</span> und <span style="color:#FF6000">„Existenz“</span> koinzident ,eins‘, und daher untrennbar, und <span style="color:#FF6000">»''darum ist GOTT das einzige ‚Sein’, das notwendig an sich ‚da‘ ist''«</span> ''':''' <span style="color:#00B000">(ABU ALI SINA alias AVICENNA — Muslim)</span>.
Der <span style="color:#00B000">(gedachte)</span> ‚Eigenschafts-Begriff‘ <span style="color:#FF6000">„Vollkommenheit (die Größe) GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#00B000">(‚Perfektion‘, die unbegrenzte Summe aller ‚positiven Eigenschaften‘ in GOTT)</span> schließt koinzident die ‚Eigenschaft’ <span style="color:#FF6000">„notwendige Existenz für uns“</span> mit ein ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>. GOTT wäre nicht <span style="color:#FF6000">„vollkommen“</span>, wenn er nicht auch real für uns ‚da‘ wäre, wenn er nicht ,immer schon’ <span style="color:#FF6000">„existierte“</span>. ‚Sein’ ist <u>mehr</u> als ‚Nicht-Sein’. ,Sein’, bzw. ,Existenz’ gehört in GOTT zu den ,Transzendentalia’. Das sind die <span style="color:#00B000">(ultimativen)</span> ,Wesenseigenschaften’ in GOTT. Der unbegrenzt Unendliche, GOTT, ist daher das <span style="color:#FF6000">»''vollkommenste Wesen, über das nichts ,Größeres‘ d.h. Vollkommeneres <u>mehr</u> ‚gedacht‘ werden kann''«</span> ''':''' <span style="color:#00B000">(ANSELM von Canterbury — Christ)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„Perfektion GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schließt koinzident das <span style="color:#FF6000">„notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> —, für uns mit ein, ohne einen zeitlichen Anfang und ohne ein zeitliches Ende. Das ist die ‚zeitlos-ewige‘, an sich absolute, und <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#00B000">(Das ist ein ,regulär‘-mögliches Korollar im 2. Beweisgang aus Term :16: ''':''' <span style="color:#4C58FF">— ‚'''Gy→Yy'''‘ —</span>, mit der <span style="color:#4C58FF">[ Instanz(Y:=E<sub>not</sub>) ]</span>, und der <span style="color:#4C58FF">[ FUB(y:=x) ]</span>; und auch ein ,regulär‘-mögliches Korollar im 3. Beweisgang ''':''' entsprechend der <span style="color:#FF6000">„logischen Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A → B ]</span> von Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> und Term :05: <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span> aus diesem Beweisgang. In Worten ''':''' <span style="color:#FF6000">»</span>''Angenommen, '' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> ''steht für den GOTT der Christen'' ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ — </span>, ''dann existiert dieser GOTT'', <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, ''für uns notwendig'', <span style="color:#4C58FF">— <sub>not</sub> —</span> <span style="color:#FF6000">«</span>.)</span> Der Unendliche, GOTT, ist <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer ‚vergänglichen‘, ,endlichen‘ Welt, welche prinzipiell vom dreidimensionalen Raum und von der unwiederbringlich ‚vergehenden‘ Zeit geprägt ist. Der ,GOTT der Christen‘ ist <span style="color:#FF6000">»''unabhängig''«</span> von dieser <span style="color:#FF6600">„vergehenden Raum-Zeit“, — »''jenes rätselhafte und anscheinend in sich widersprüchliche Etwas''« <span style="color:#00B000">(GÖDEL)<ref>Kurt GÖDEL, ‚''<span style="font-family: Times;"><big>Eine Bemerkung über die Beziehungen zwischen der Relativitätstheorie und der idealistischen Philosophie‘</big></span>'', in P.A.SCHILPP (Hg.): ‚''<span style="font-family: Times;"><big>Albert Einstein, Philosoph und Naturforscher‘</big></span>'', Seite 406</ref></span> —</span>. Ohne ‚Zeit‘ gibt es keinen zeitlichen Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘, <span style="color:#00B000">(beides ist zeitlos ,eins‘)</span>, und so ist der zeitlos-ewige GOTT, der <span style="color:#FF6000">»''notwendig aus sich ,existiert‘'' «</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ — </span>, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> für uns immer schon ‚da‘ ''':''' <span style="color:#00B000">(GÖDEL — ohne religiöses Bekenntnis)</span>.
Mit dem GÖDEL-Kalkül ist die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt worden, und ist somit für jeden Menschen nachvollziehbar, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie obige Beispiele zeigen.
'''Resümee :'''
Das GÖDEL-Kalkül zeigt mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, was notwendig folgt, wenn die Axiome ‚wahr‘ sind, <span style="color:#00B000">(die Axiome bilden formal-syntaktisch <span style="color:#FF6000">»''die theologische Weltanschauung''«</span> ab)</span>, unter der Voraussetzung, dass die Axiome <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>'' Struktur''«</span> unserer Welt sind. Die ,Verifikation‘ der Axiome und Definitionen von GOTT und seiner Vollkommenheiten gelingt GÖDEL, — entsprechend seiner Unabhängigkeits-Bedingung —, durch den Aufweis ihrer Widerspruchsfreiheit ''':''' sie sind somit ,wahr‘ und, — im Kontext einer <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> —, auch ,annehmbar‘ in unserer ,realen‘ Welt ''':''' <span style="color:#00B000">(siehe Anhang, 2. Beweisgang und Anmerkung-2)</span>. Er vermeidet damit den Fehler, der immer wieder im Diskurs über Gottesbeweise gemacht wird ''':''' GOTT mit seinen Geschöpfen zu vergleichen. Diese logisch-philosophische Rede von GOTT <span style="color:#00B000">(<span style="color:#FF6000">»''ohne sich auf den Glauben an irgendeine Religion zu stützen''«</span>)</span> hat eine <u>mehr</u> als zweitausendjährige Tradition hinter sich. Der <span style="color:#FF6000">„100-Taler-Gott“</span> des Philosophen KANT, hat heute, nachdem der Logiker und Systemtheoretiker GÖDEL sein System vorgelegt hat, an ‚Strahlkraft‘ verloren.
Kurt GÖDEL ''':'''
::<span style="color:#FF6000">» ''Die theologische Weltanschauung'', <span style="color:#00B000">[ dass GOTT für uns immer schon ‚da‘ ist ]</span>, ''ist rein verstandesmäßig mit allen bekannten Tatsachen durchaus vereinbar'';«</span> <span style="color:#00B000">[ d.h. sie ist das ,Resultat‘ der, — vom Glauben geleiteten —, ‚theoretischen Vernunft‘, alias ‚reinen Vernunft‘, und nicht bloß das ‚Postulat‘ einer ‚praktischen Vernunft‘, wie KANT meint ]. <span style="color:#FF6000">»''Der'' <span style="color:#00B000">[ christliche ]</span> ''Glaube ist die ‚Pupille‘ im ‚Auge‘ unseres Verstandes.''«</span> (Heilige KATHARINA von Siena, Lehrerin der Kirche, Patronin Europas<ref>vgl. <span style="font-family: Times;"><big>''Gebet 7 ‚Für die neuen Kardinäle‘, Rom, 21. Dezember 1378,''</big></span> aus <span style="font-family: Times;"><big>''Caterina von Siena ,Die Gebete‘.''</big></span> Kleinhain 2019, online: https://caterina.at/werke/gebete/gebete-detailansicht/gebet-7.html</ref> )</span>
Der sonst so rationale KANT, hier doch etwas emotionell, <span style="color:#00B000">(als wolle er die Ergebnisse im GÖDEL-Kalkül nicht wahr haben, die belegen, dass er sich bei GOTT geirrt, und die Funktion des christlichen Glaubens für die Philosophie falsch eingeschätzt hat)</span> ''':'''
::<span style="color:#FF6000">»</span> ''Es war etwas ganz Unnatürliches und eine bloße Neuerung des Schulwitzes, aus einer ganz willkürlich entworfenen Idee das Dasein des ihr entsprechenden Gegenstandes selbst ausklauben zu wollen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 403. https://www.korpora.org/kant/aa03/403.html</ref>.<span style="color:#FF6000">«</span>
Für KANT, für die Scholastiker, <span style="color:#00B000">(und auch für uns)</span>, ist es natürlich ‚logisch‘, dass aus einem als ‚möglich’ gedachten Begriff, <span style="color:#FF6000">»</span>''aus einer ganz willkürlich entworfenen Idee''<span style="color:#FF6000">«</span>, keine Existenzaussage abgeleitet werden kann. <span style="color:#00B000">(Aus dem bloß gedachten Begriff ,goldene Berge‘ folgt natürlich nicht, dass es solche in Wirklichkeit auch gibt.)</span> In der philosophisch-<span style="color:#4C58FF">,theologischen’</span> Tradition, die von ARISTOTELES herkommt, ist der Begriff <span style="color:#FF6000">»''GOTT''«</span> jedoch von allen anderen Begriffen so verschieden, so dass für GOTT diese Logik KANTS nicht mehr gilt. GOTT ist ,unvergleichlich‘ und ,einzigartig‘.
Dazu der Kommentar von HEGEL ''':'''
::<span style="color:#FF6000">»''Wenn KANT sagt, man könne aus dem Begriff'' <span style="color:#00B000">[ ‚GOTT‘ ]</span> ''die Realität nicht ,herausklauben‘, so ist da der Begriff als endlich gefasst''.« <span style="color:#00B000">[ In der Endlichkeit unserer Welt trifft die Logik KANTS zu, dass dem ‚Begriff‘ nicht ,notwendig‘ das ‚Sein‘ folgt, denn es gibt in ihr die ,Lüge‘, die das ,Wirklich-Sein‘ im Begriff bloß behauptet, ohne dass es ,in Wirklichkeit‘ zutrifft, was sie behauptet. Es gilt hier nach KANT ''':''' »''Sein ist kein reales Prädikat''«. Somit ist ]</span> »''...der Begriff ohne'' <span style="color:#00B000">[ reales ]</span> ''Sein ein Einseitiges und Unwahres, und ebenso das Sein, in dem kein Begriff ist'', <span style="color:#00B000">[ ist ]</span> ''das begrifflose Sein,'' <span style="color:#00B000">[ d.i. das relative ,Noch-Nicht-Begriffene‘ ]</span>.'' Dieser Gegensatz, der in die Endlichkeit fällt'' <span style="color:#00B000">[ im Endlichen zutrifft ]</span>, ''kann bei dem Unendlichen, GOTT, gar nicht statthaben''<ref>Georg Wilhelm Friedrich HEGEL, ‚<span style="font-family: Times;"><big>''Ausführungen des ontologischen Beweises''</big></span>‘ in den ‚<span style="font-family: Times;"><big>''Vorlesungen über die Philosophie der Religion vom Jahr 1831''</big></span>‘ . Hamburg 1966, Seiten 175 bzw. 174</ref>; <span style="color:#00B000">[ denn ,Begriff‘, bzw. ,Denken‘ und ,Sein‘ sind in dem Unendlichen, GOTT, untrennbar und real immer dasselbe. Auf Grund dieser ontologischen Identität ,personifiziert‘ und ,repräsentiert‘ GOTT die ,Wahrheit‘ ''':''' GOTT ist die ,Wahrheit‘. In GOTT, dem <span style="color:#FF6000">„Schöpfer der Welt“</span>, folgt dem ,Begriff‘ immer ,notwendig‘ das ,Sein‘ ''':''' <span style="color:#CC66FF">»''GOTT sprach ''':''' Es werde ,Licht‘. Und es wurde Licht''«, <small>{{Bibel | Genesis |1|3|EU}}</small>;</span> oder auch ''':''' <span style="color:#CC66FF">»''Der Herr sprach, und sogleich geschah es; er gebot, und alles war da''«,</span> <small>{{Bibel | Psalm |33|9|EU}}</small>.]</span>«</span>
Das Entscheidende bei der <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls ist, dass der <span style="color:#00B000">(Begriff)</span> GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, nicht auf die Ebene seiner ,endlichen‘ Geschöpfe und unserer Welt gestellt wird, <span style="color:#00B000">(d.i. das ‚Universum‘ im ,Urknall‘, die ‚100-Taler‘, ein ‚Tsunami‘, auch ,einfache Modelle‘ von unserer Welt, etc.)</span>, und damit verglichen wird, sondern, dass der GOTT der Christen in seiner Einzigartigkeit und Besonderheit als <span style="color:#FF6000">»''der Unendliche''«</span> belassen und als <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer vergänglichen Welt, — als <span style="color:#FF6000">»''der Unvergleichliche''«</span> —, verstanden wird. <span style="color:#00B000">(Alle Kritiken des sog. ,ontologischen‘ Gottesbeweises übersehen die Einzigartigkeit und Besonderheit des <span style="color:#FF6000">»''Unendlichen''«</span>, und/oder wollen diese nicht ,wahr‘ haben.)</span> Auch THOMAS von Aquin ,verortet‘ den GOTT ANSELMS, — in seiner Kritik an dessen Theorem —, irrtümlich unter die ,Dinge‘ der uns umgebenden ,Natur‘, wenn er sagt ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse in rerum natura</big></span>“</span>, d.h. wörtlich, dass der GOTT ANSELMS <span style="color:#FF6000">»</span>''in der Natur der Dinge'' <span style="color:#00B000">(unserer Welt)</span> ''existiert''<span style="color:#FF6000">«</span>, und verkennt somit, — wie nach ihm auch KANT —, die ,Unvergleichlichkeit‘ GOTTES, <span style="color:#00B000">(vgl. STh I q.2 a.1 ad 2<ref>„Deus … illud quo maius cogitari non potest; non tamen propter hoc sequitur quod intelligat id quod significatur per nomen, esse in rerum natura; sed in apprehensione intellectus tantum.“ ——— »''GOTT ist'' (nach ANSELM) ''der, über den Größeres nicht mehr gedacht werden kann. Aber nicht deswegen, weil er'', (der Narr von Psalm 14.1, den ANSELM zitiert), ''das versteht, was durch diesen Namen,'' (d.h. mit dem Begriff ,GOTT‘, als der ,Größte‘, im Theorem ANSELMS), ''bezeichnet wird, folgt daraus'', (wie ANSELM meint), ''dass er auch versteht, dass er'', (der GOTT ANSELMS), ''auch in der ,Natur‘ der Dinge'' (unserer Welt) ''existiert''; <span style="color:#00B000">[ was ANSELM so nie gesagt hat ]</span>. ''Daraus folgt nur, dass er'', (als ,GOTT‘), ''bloß in der Auffassung seines Verstandes'', (d.h. nur im Denken des Narren als ,Begriff‘), ''existiert.''« ——— Hier ,verortet‘ THOMAS einerseits den unendlichen GOTT, von dem das Theorem ANSELMS spricht, irrtümlich unter die endlichen Dinge der uns umgebenden ,Natur‘, was sachlich dem theologischen Theorem der Unvergleichlichkeit GOTTES widerspricht, der nicht unter die Dinge unserer Welt eingereiht werden darf. Anderseits verliert er dadurch auch den ,Blick‘ für die Außerordentlichkeit und Besonderheit GOTTES, dessen Natur völlig verschieden und unabhängig von der ,Natur‘ unserer raum-zeitlichen Welt ist. GÖDEL beweist jedoch, mit ANSELM, weil es notwendig, ohne Widerspruch, (»''bloß in der Auffassung unseres Verstandes''«), möglich ist, dass GOTT existiert, ist es korrekt, daraus auch mit Notwendigkeit zu folgern, dass der Glaube des Erzbischofs ANSELM, und der Glaube seiner Anvertrauten, von der Wirklichkeit GOTTES, widerspruchsfrei, logisch richtig, und damit sinnvoll ist; denn Möglichkeit und Wirklichkeit sind in GOTT koinzident ,eins‘. Das ist das Privilegium GOTTES allein, der einzigartig und unvergleichlich ist. Damit zeigt er auf, dass THOMAS die Unvergleichlichkeit und Einzigartigkeit GOTTES in seinem Vorhalt nicht bedacht hat; und außerdem ANSELM missverstanden hat.</ref>)</span>; jedenfalls hier in der Auseinandersetzung mit ANSELM. Dagegen spricht ANSELM im ,''<span style="font-family: Times;"><big>Proslogion</big></span>''‘, Seite 85f, nur von einem <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span> GOTTES, d.h. dass GOTT ,auch in Wirklichkeit existiert‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was ,größer‘, bzw. ,mehr‘ ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ,im Verstand zu sein‘; wobei die ,zeitlose-überzeitliche‘ Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES jedoch völlig verschieden und <span style="color:#FF6000">»''unabhängig von der zufälligen''«</span> Wirklichkeit <span style="color:#00B000">(die ,Natur‘)</span> der ,raum-zeitlichen‘ Welt der Dinge ist. Daher ist sie mit dieser auch nicht vergleichbar. GOTT ist <span style="color:#FF6000">„vollkommen“</span> und alle <span style="color:#FF6000">„Vollkommenheiten“</span> in GOTT, <span style="color:#00B000">(die ultimativen ,Transzendentalia‘)</span>, sind koinzident ,eins‘, — ,fallen <span style="color:#FF6000">„notwendig“</span> perspektivisch in eins zusammen‘, und sind daher konvertierbar. Darum ist auch die Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES ,einzigartig‘ und ,unvergleichlich‘.
Mit Korollar-3 ist die Exklusivität und Außerordentlichkeit GOTTES definitiv im Kalkül ,bewiesen‘ <span style="color:#00B000">( ╞ )</span>. Der abendländische Monotheïsmus ist somit eine ,logische‘ Konsequenz aus den GÖDEL-Axiomen. <span style="color:#00B000">(Das <span style="color:#4C58FF">„theologische“</span> Theorem von der ,Einzigartigkeit‘ und Exklusivität GOTTES, d.h. hier im Kontext ''':''' die exklusive Einheit von GOTT und Mensch in JESUS CHRISTUS; von Vater, Sohn und Geist im <span style="color:#4C58FF">„Dreifaltigen“</span>; von Essenz und Existenz, von Begriff und Sein, von Ursache und Wirkung, von Subjekt und Objekt, von Möglichkeit und Wirklichkeit, und die unbegrenzte Summeneinheit und Koinzidenz der unendlichen Transzendentalien in GOTT, ist, — mit HEGEL —, die Voraussetzung und Bedingung jeder Philosophie ''':''' <span style="color:#FF6000">»''Die Einheit muss am Anfang der Philosophie stehen''«</span>; und ist zugleich auch ihr gesuchtes und bewiesenes Endergebnis und Ziel ''':''' <span style="color:#FF6000">»''Diese Einheit muss auch das Resultat der Philosophie sein''«</span><ref>https://hegel-system.de/de/gottesbeweis.htm#hegels-kritik-an-kant</ref>, was hier im GÖDEL-Kalkül ,logisch‘ mit Korollar-3 verifiziert wird ''':''' <span style="color:#4C58FF">— ‚'''□(∃xGx ∧ ∀y(Gy→x=y))'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist exklusiv einzigartig''«</span>.)</span>
Die Einzigartigkeit GOTTES bedingt die Koinzidenz, den inneren Zusammenhang aller seiner Vollkommenheiten und Zuschreibungen, <span style="color:#00B000">(Axiom-2)</span>, d.h. ihr paarweise, perspektivisches ,Zusammenfallen in eins‘ im Unendlichen, GOTT. ——— Aus der Notwendigkeit aller positiven Eigenschaften und Zuschreibungen, <span style="color:#00B000">(d.h. aus den, an sich, notwendigen, ultimativen Transzendentalien, Axiom-4)</span>, die in GOTT paarweise, als ,Wesenseigenschaften‘ koinzident ,eins‘ sind, <span style="color:#00B000">(Definition-2)</span>, ist die Einzigkeit GOTTES für uns erschließbar, <span style="color:#00B000">(Korollar-3)</span>. Axiom-4 ist die erste, ,modal‘ <span style="color:#FF6000">„notwendige“</span>, d.h. die transzendentale Voraussetzung für Korollar-3.
Wenn im Korollar-3 das <span style="color:#4C58FF">— ‚'''x'''‘ —</span> z. B. für GOTT, dem ,Vater‘ der Christen, und das <span style="color:#4C58FF">— ‚'''y'''‘ —</span> für GOTT, dem ,Sohn‘, d.h. für ,JESUS CHRISTUS‘ steht, oder für den ,HEILIGEN GEIST‘, <span style="color:#00B000">(den ,Dreifaltigen GOTT‘ der Christenheit)</span>; oder auch für die Gottesbezeichnung ,GOTT-ADONAI‘ der Juden, oder für die Gottesbezeichnung ,ALLAH‘ der Muslime steht, dann weist dieses Korollar, für <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span>, mit der ,ontologischen Identität‘ ''':''' <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, auf die ,Koinzidenz‘ des <span style="color:#4C58FF">„Dreifaltigen“</span>, und auf die <span style="color:#4C58FF">„Hypostatische Union“</span> der Naturen von GOTT und Mensch in JESUS CHRISTUS,
bzw. auch auf den inneren Zusammenhang der drei Buch-Religionen hin.
===<div class="center"><span style="color:#660066">Anhang : das GÖDEL-Kalkül</span></div>===
In der ,Legende zum GÖDEL-Kalkül‘ wird an einige Basics erinnert, und diese für die operative Praxis im anstehenden Kalkül, mit Hilfe von logischen Meta-Terme, adaptiert. Zusätzliche, notwendige Regeln und Gesetze werden dann ,benannt‘, wenn sie in der Kalkül-Durchführung auftreten.
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">Legende zum GÖDEL-Kalkül</span></div>
|-
|
<small>
<math>\begin{align}
{\color{blue}\text{ ◇}} \text{ :: konsistent ↔ widerspruchsfrei ↔ möglich ↔ denkbar, } & {\color{blue}\text{ □}} \text{ :: notwendig ↔ wirklich, für jede mögliche Welt ↔ exklusiv} \\
\text{logischer Meta-Term ::} {\color{blue}\text{ [ A ├ B ]}} \text{ ::} & \text{ „aus A folgt im Kalkül ,regulär‘ (├ ) B.“} \\
\text{ A, B sind Aussagen über Eigenschaften, (A ist keine Eigenschaft);} & \text{ die Aussage, z.B. in der Kalkül-Zeile 10, wird als ,Term :10:‘ bezeichnet} \\
{\color{blue}\text{ AE}} \text{ ::} & \text{ Argument Einführung, Prämisse, Postulat } \\
{\color{blue}\text{ Xx}} \text{ ::} & \text{ „X ist eine Eigenschaft der Individuum-Variable x.“ } \\
{\color{blue}\text{ ¬PX}} \text{ ::} & \text{ „X ist keine positive Eigenschaft, ist keine Perfektion, ist nicht vollkommen.“ } \\
{\color{blue}\text{ Instanz(X := Y)}} \text{ ::} & \text{ Substitution der Eigenschaft X durch die ,bestimmte‘ Eigenschaft Y } \\
\text{ (Eine ,Instanz‘ ist ein Exemplar aus einer Menge gleichartiger Dinge;} & \text{ hier die ,bestimmte‘ Eigenschaft Y, als Ersatz für das unbestimmte X.) } \\
{\color{blue}\text{ FUB(x := y)}} \text{ ::} & \text{ Freie-Um-Benennung der Individuum-Variable x in y } \\
\text{ ,modal‘-frei gewählte Kalkül-Prämisse ::} {\color{blue}\text{ Gx}} \text{ ::} & \text{ „Die Variable x steht für den GOTT der Christen.“ } \\
{\color{blue}\text{ [ G(y) ├ ⱯyG(y) ]}} \text{ ::} & \text{ All-Operator-Einführung der Variable y für GOTT } \\
\text{ „Angenommen, die Variable y steht für GOTT, dann } & \text{folgt ,regulär‘ (├ ), dass auch jedes y im Kalkül für GOTT steht.“}\\
{\color{blue}\text{[ ⱯXA(X) ├ A(X) ]}} \text{ ::} & \text{ All-Operator-Beseitigung für die substituierte Eigenschaft X } \\
\text{ „Wenn X durch eine ,bestimmte‘ Eigenschaft ,instanziiert‘ ist oder } & \text{wird, dann kann der All-Operator von X ,regulär‘ (├ ) beseitigt werden.}\\
{\color{blue}\text{ KOMM(↔)}} \text{ ::} & \;{\color{blue}\text{[ (A↔ B) ↔ (B ↔ A) ]}} \text{ :: Kommutativgesetz für ( ↔ )}\\
{\color{blue}\text{ DIST(□∧)}} \text{ ::} & \;{\color{blue}\text{[ (□A ∧ □B) ↔ □(A ∧ B) ]}} \text{ :: Distributivgesetz für (□∧ )} \\
\text{ (hypothetischer Syllogismus, häufige logische Schlussregel) ::} & \;{\color{blue}\text{[ A → B, A ├ B ]}} \text{ :: (Modus ponendo ponens) :: Abtrennregel.} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn A wahr ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch B wahr ist.“} \\
\text{ (negativer hypothetischer Syllogismus) ::} & \;{\color{blue}\text{[ A → B, ¬B ├ ¬A ]}} \text{ :: (Modus tollendo tollens)} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn B falsch ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch A falsch ist.“} \\
\text{''KONDITIONALER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ A ├ B ╞ A → B ]}} \text{ :: (logische Implikation)} \\
\text{ „Angenommen, A ist ,regulär‘ Axiom oder Prämisse, und B ist im } & \text{Kalkül ,regulär‘ abgeleitet, dann ist ,bewiesen‘ ( ╞ ) : A impliziert B, ist wahr.“} \\
\text{''INDIREKTER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ ¬A → F ╞ A ]}} \text{ :: (Reductio ad absurdum)} \\
\text{ „Wenn im Kalkül aus ¬A ,regulär‘ eine Kontradiktion } & \text{F folgt, dann ist A ,bewiesen‘ ( ╞ ) : A ist ,wahr‘.“} \\
\end{align}</math>
</small>
|}
A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Eine Prädikatenlogik zweiter Stufe ist eine Logik, in der die Quantoren auch Eigenschaftsausdrücke <span style="color:#00B000">(<span style="color:#FF6000">„Prädikate”</span>)</span> binden können''. <span style="color:#00B000">[ Die ,Prädikate‘ werden in einem Kalkül dieser Logik durch Definitionen ,bestimmt‘ ]</span>. ''Wir werden uns im folgenden recht frei einer dafür geeigneten formalen Sprache bedienen. Äußere Quantoren werden meist weggelassen und wir schreiben kurz'' <span style="color:#4C58FF">— ‚'''Xx'''‘ — </span> ''bzw.'' <span style="color:#4C58FF">— ‚'''PX'''‘ — </span> ''um auszudrücken, dass das Individuum'' <span style="color:#4C58FF">— ‚'''x'''‘ — </span> ''die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''hat, bzw. dass die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''die höherstufige Eigenschaft'' <span style="color:#4C58FF">— ‚'''P'''‘ — </span> ''<span style="color:#00B000">(für <span style="color:#FF6000">„positiv”</span>)</span> hat;'' <span style="color:#00B000"> [ wobei die Eigenschaft <span style="color:#4C58FF">— ‚'''P'''‘ — </span> als einzige im Kalkül ,unbestimmt‘ bleibt ]</span>. <span style="color:#FF6000">«</span><ref>A. FUHRMANN ‚''<span style="font-family: Times;"><big>‚G‘ wie Gödel. Kurt Gödels axiomatische Theologie</big></span>''‘, Seite 6, Anmerkung 3. Konform mit seinem Artikel in ‚''<span style="font-family: Times;"><big>Logik in der Philosophie</big></span>''‘ hg. v. P. SCHROEDER-HEISTER, W. SPOHN und E. OLSSON. 2005, Synchron, Heidelberg.</ref>
Der All-Quantor für Eigenschaften, hier im GÖDEL-Kalkül der ,modalen‘ Prädikatenlogik zweiter Stufe, bindet die ,unbestimmte‘ Eigenschafts-Variable <span style="color:#4C58FF">— ‚'''X'''‘ —</span> ausschließlich nur in den Definitionen im 2. und 3. Beweisgang; <span style="color:#00B000">(im ersten Beweisgang gibt es keine Definition)</span>. Wobei diese Definitionen nur dann <span style="color:#FF6000">„wahr und widerspruchsfrei”</span> sind, wenn ihre Eigenschafts-Variablen ausschließlich mit ,Transzendentalien‘ belegt werden. Andernfalls sind sie sofort <span style="color:#FF6000">„modal falsch”</span>. Dieser All-Quantor wird dann jedes Mal in der Beweis-Durchführung durch die Substitution ''':''' <span style="color:#4C58FF"> [ Instanz(X:= ..) ]</span> mit ,bestimmte‘ Eigenschafts-Konstanten wie <span style="color:#4C58FF">— (X:= G) —</span>, bzw. <span style="color:#4C58FF">— (X:= ¬Y) —</span>, oder <span style="color:#4C58FF">— (X:= E<sub>not</sub>) —</span> ,regulär‘ <span style="color:#00B000">(├ )</span> beseitigt ''':''' <span style="color:#4C58FF"> [ ⱯXA(X) ├ A(X) ]</span>; wobei die Eigenschafts-Konstante im Kalkül entweder als Zwischenergebnis ,regulär‘ abgeleitet, <span style="color:#00B000">(,errechnet‘)</span>, oder mit einer Definition schon ,bestimmt‘ worden ist.
Die spezifische ‚Eigenschaft‘ einer Eigenschaft wird hier, in der formalen Syntax der ,modalen‘ Prädikatenlogik zweiter Stufe, als eine tiefer gestellte Abkürzung <span style="color:#00B000">(als Index)</span> an ihre Trägereigenschaft angehängt, wie z. B. ‚wesentlich‘, bzw. ‚essentiell‘ durch <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, oder ‚notwendig‘ durch <span style="color:#4C58FF"> — <sub>not</sub> —</span>. In der Definition-3 steht der Term ''':''' <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span>, um auszudrücken, dass das Individuum <span style="color:#4C58FF">— ‚'''x'''‘ —</span> notwendig <span style="color:#4C58FF">— <sub>not</sub> —</span> die Eigenschaft ''':''' <span style="color:#4C58FF">— ‚'''E'''‘ —</span>, für ,Existenz‘, hat, d.h. <span style="color:#FF6000">»''das <span style="color:#4C58FF">‚'''x'''‘</span> existiert notwendig''«</span>. Der schon von GÖDEL indizierte Term ''':''' <span style="color:#4C58FF">—‚'''G'''<sub>ess</sub>'''x'''‘ —</span> kann gelesen werden als ''':''' <span style="color:#FF6000">»''Das Individuum <span style="color:#4C58FF">‚'''x'''‘</span> hat die Wesenseigenschaft, <span style="color:#4C58FF"> — <sub>ess</sub> — </span> ''':''' GOTT zu sein, <span style="color:#4C58FF">‚'''G'''‘ </span>''«</span>, statt der ,an sich‘ konformen, aber <span style="color:#4C58FF">„theologisch“</span> etwas ungenauen Formulierung ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist wesentlich göttlich''«</span>; oder mit der Voraussetzung ''':''' <span style="color:#4C58FF">— ‚'''Gx'''→'''G'''<sub>ess</sub>'''x'''‘ — </span> deutlicher und <span style="color:#4C58FF">„theologisch“</span> korrekt ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für den GOTT der Christen'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span> ''das Wesen dieses GOTTES'', <span style="color:#4C58FF">— <sub>ess</sub>‚'''x'''‘ —</span>, <span style="color:#00B000">(,Essenz‘)</span>«</span>; wobei, — entsprechend der ,methodologischen‘ Prämisse des Kalküls <span style="color:#00B000">(<span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> ''':''' das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den ,GOTT der Christen‘)</span> —, bei der Interpretation der Terme dieses besonderen Kalküls, die <span style="color:#4C58FF">„christliche Theologie”</span> für den Begriff <span style="color:#FF6000">„GOTT”</span>, Korrektur und die leitende Instanz ist. Dabei muss die Dreifach-Äquivalenz von <span style="color:#4C58FF"><span style="color:#4C58FF">— ‚'''G'''‘ — </span></span>berücksichtigt werden. Welche der drei Äquivalenzen, bzw. Lesearten von <span style="color:#4C58FF">— ‚'''G'''‘ — </span> bei einem bestimmten Term im Kalkül zulässig ist, muss <span style="color:#4C58FF">„theologisch”</span> überprüft und evaluiert werden. Bei manchen können sogar alle drei Lesearten <span style="color:#4C58FF">„theologisch”</span> zulässig sein.
Warum es in der modalen Prädikatenlogik zweiter Stufe, im GÖDEL-System, ,Definitionen‘ gibt, erklärt GÖDEL formal-syntaktisch ''':''' <span style="color:#FF6000">»''Definitionen dienen ja nur der kürzeren Schreibwelse und sind daher prinzipiell überflüssig.''«</span> <span style="color:#00B000">(Aus der Anmerkung 6 in seinem Hauptwerk ''':''' ,''<span style="font-family: Times;"><big>Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I</big></span>''‘.)</span> Für die <span style="color:#4C58FF">„theologische”</span> Interpretation und Hermeneutik seines Kalküls, sind die ,Definitionen‘ im GÖDEL-System jedoch wesentlich, und letztlich entscheidend. Erst dadurch wird sein Axiomensystem zur <span style="color:#4C58FF">„axiomatischen Theologie”</span>. GÖDEL gibt selbst den hermeneutischen Hinweis dazu, wenn er über den höherstufigen Eigenschaftsbegriff <span style="color:#FF6000">»''positiv''«</span> sagt, der nur ,indirekt‘ definiert wird, jedoch mit seinem gesamten Axiomensystem ''':''' <span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne, (unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span> Die Deutung dieses ,höherstufigen‘ Begriffs als ein anderes Wort für <span style="color:#FF6000">„Transzendentalia“</span> ergibt sich aus der <span style="color:#4C58FF">„theologischen”</span> Evaluierung, d.h. der Einordnung des GÖDEL-Systems in die ,laufende‘ <span style="color:#FF6000">„Rede von GOTT“</span>, seit Menschen, sich über den Sinn der Welt und unseres Lebens in ihr, Gedanken machen. GOTT, der ,transzendent‘, — unabhängig —, zur Welt ist, ist Thema im Theorem ANSELMS, um das es ja im GÖDEL-Kalkül geht. Eine <span style="color:#4C58FF">„theologische”</span> Hermeneutik des GÖDEL-Systems ist daher legitim, die, als ein Bemühen um ein überzeugendes Verstehen, aus dem <span style="color:#4C58FF">„theologischen”</span> Vorwissen vieler Generationen schöpft.
Um philosophische, und sogar <span style="color:#4C58FF">„theologische”</span> Theoreme exakt zu formulieren, und untersuchen zu können, hat der Ausnahmelogiker GÖDEL, im 20. Jahrhundert, ein Tor aufgestoßen, das uns ermöglichen kann, <span style="color:#FF6000">»''mathematisch evident''«</span>, und logisch objektiv nachprüfbar, in diesen Disziplinen zu argumentieren. Mit seiner modalen Prädikatenlogik zweiter Stufe, hat GÖDEL dem alten Wunsch eines Raimundus LULLUS, eines Gottfried Wilhelm LEIBNIZ, eines Immanuel KANT, und anderer, nach einer nachprüfbaren ,Universalsprache‘ in den Geisteswissenschaften, entsprochen; analog zur Mathematik, als Universalsprache in den Naturwissenschaften. Der sog. ,Theorembeweiser‘ der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO, mit Hilfe eines Computers, im 21. Jahrhundert, ist die kongeniale und logische Folge aus diesem Quanten-Schritt GÖDELS.
In der folgenden Neu-Kalkülisierung, wird jeder einzelne operative Logik-Schritt des Kalküls in der '''linken Spalte''' nummeriert und als Term-Ergebnis angezeigt, und in der '''rechten Spalte''' werden die dafür benötigten Term-Komponenten und die dabei angewendeten Logik-Regeln und -Gesetze, mit Meta-Terme, dokumentiert. Am Anfang stehen die Ressourcen und das angestrebte Ziel des Beweisganges, <span style="color:#00B000">(das Theorem)</span>. Die GÖDEL Axiome und Definitionen, die Theoreme und Korollare, die Zwischenergebnisse, das Endergebnis, und die logischen Meta-Terme, <span style="color:#00B000">[ in eckigen Klammern ]</span>, werden kontextabhängig, <span style="color:#00B000">(durch ''„Benennungen“'')</span>, interpretiert, <span style="color:#00B000">(angezeigt durch ,Interpretationspunkte‘ — '''::''' —, falls nötig)</span>. Der jeweilige Beweisgang wird in den Anmerkungen ausführlich und umfassend kommentiert. Die Kalkül-Prämissen, <span style="color:#00B000">(<span style="color:#4C58FF">'''AE:'''</span> Argument Einführung)</span>, sind der modal-frei gewählte Einstieg in das Kalkül. Sie dokumentieren, zusammen mit dem angestrebten Beweis-Ziel, eine bestimmte Problemlage in einem externen Diskurs, der mit dem modalen Logik-System hier, formal-syntaktisch überprüft, und gegebenenfalls, verifiziert oder falsifiziert werden soll. Korollare sind einfache, logische Folgerungen aus dem jeweiligen Beweisgang. Theoreme und Korollare sind ,modal‘ gleichwertig.
====<div class="center"><span style="color:#660066">1. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 1, (Möglichkeitsbeweis)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe__________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist die Eigenschaft X nicht positiv“} \\
\text{(Axiom 2)} & \quad (P\ X \wedge \;\Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x)) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaften Y, die aus einer positiven Eigenschaft X modal} \\
\text{ } & \quad & \ & \; \; \text{notwendig folgen, sind auch positive Eigenschaften“} \\
\text{(Axiom 3)} & \quad P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Theorem 1)} &\quad P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{ (◇ :: „möglich“ ↔ „konsistent“ ↔ „denkbar“; □ :: „notwendig“) } \\
\text{ } & \text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad P\ X \ & \ & \text{ AE: „Angenommen, es gibt positive Eigenschaften, Perfektionen“} \\
\text{02} & \quad P\ X \;\Rightarrow\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{ AE: „Angenommen, positive Eigenschaften sind nicht konsistent“} \\
\text{03} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{04} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{05} & \quad \text{ ├ }\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{:01:02:[Modus ponendo ponens] :: [A, A → B├ B] :AE:} \\
\text{06} & \quad \neg\neg \Box \neg \exists x \ X \ x \ & \ & \text{:05:[ ◇A ↔ ¬□¬A] :: (Modalregel)} \\
\text{07} & \quad \neg\neg \Box \neg\neg \forall x \neg X \ x \ & \ & \text{:06:[∃xA ↔ ¬Ɐx¬A] :: (Quantoren Regel)} \\
\text{08} & \quad \text{ ├ }\; \Box \; \forall x \neg X \ x \ & \ & \text{:07:NEG :: [¬¬A↔A] :: (Gesetz der Aussagenlogik)} \\
\text{09} & \quad \Box \; \forall x \neg X \ x \Leftrightarrow\ W & \ & \text{:02:08:[(:02:↔W) → (├:08:↔W)] :: (Kalkülregel)} \\
\text{10} & \quad \Box \; \forall x \ X \ x \Leftrightarrow\ F & \ & \text{:09:[(¬A↔W)↔(A↔F)] :: (Regel für Wahrheitswerte)} \\
\text{11} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:03:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{12} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \text{ } & \text{:10:11:[(:10:↔F) → (:11:↔F)] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{13} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \ & \text{:01:12:[Konjunktion] :: [A, B ├ A∧B]} \\
\text{14} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow \; (\neg x = x))) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(Y:=( ¬x= ..)) :: (Substitution für Eigenschaften)} \\
\text{15} & \quad \ P (\neg x = .. ) & \ & \text{:13:14:[Modus ponens] :: (logische Schlussregel)} \\
\text{16} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{17} & \quad \neg P (\ x = .. )\ & \ & \text{:15:16:[Modus ponens]}\\
\text{18} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:04:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{19} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \text{ } & \text{:10:18:[(:10:↔F) → (:18:↔W)] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{20} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \ & \text{:01:19:[Konjunktion] } \\
\text{21} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x))) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(Y:=(x=..))} \\
\text{22} & \quad \ P (\ x = .. )\ & \ & \text{:20:21:[Modus ponens]}\\
\text{23} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ & \text{:17:22:[Konjunktion] ⇒ Kontradiktion !}\\
\text{24} & \quad \neg \Diamond \; \exists x \ X \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:05:23:[├A├B╞ A→B] :: ''KONDITIONALER BEWEIS''}\\
\text{25} & \quad \neg\neg \Diamond \; \exists x \ X \ x & \ & \text{:24:23:[Modus tollendo tollens] :: [A→B,¬B ├ ¬A]}\\
\text{26} & \quad \text{ ├ }\; \Diamond \; \exists x \ X \ x & \ & \text{:25:NEG; bzw. :05:23:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS''}\\
\text{27} & \quad \ P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{:01:26:[├A├B ╞ A→B]} \\
\text{(Theorem 1)} & \;\text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\text{28} & \quad \ P\ G \;\Longrightarrow\; \Diamond \; \exists x \ G \ x \ & \ & \text{:27:Instanz(X:=G) } \\
\text{29} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{(A3):28:[Modus ponens]} \\
\text{(Korollar 1)} & \;\text{„Das Dasein GOTTES ist definitiv denkbar“} & \ & \text{„Es ist widerspruchsfrei möglich, dass es GOTT gibt“} \\
\end{align}</math>
</small>
|}
Anmerkung-1 ''':''' <span style="color:#00B000">(Der GÖDEL-Term <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, im Axiom-2 ist an sich überflüssig, da dieser hier als Prämisse :01: ohnehin ,angenommen‘ wird. Der Beweisgang kommt mit Axiom-2 auch ohne diesen GÖDEL-Term zum selben Ergebnis, und verkürzt sich damit sogar um zwei Schritte ''':''' Zeile 13 und Zeile 20 sind dann unnötig.)</span>
Der Beweisgang geht mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als Kalkül-Ressource, prinzipiell von der Existenz eines GOTTES aus. Mit der Prämisse :01: <span style="color:#00B000">(hier im 1. Beweisgang)</span> postuliert GÖDEL vorerst allgemein, dass es <span style="color:#FF6000">»''Vollkommenheit, d.h. positive Eigenschaften''«</span> in unserer Welt gibt ''':''' <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, ohne im Kalkül zu definieren, was darunter zu verstehen ist. Definiert wird dann <span style="color:#00B000">(im 2. Beweisgang)</span>, was eine <span style="color:#FF6000">»''wesentliche Eigenschaft''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(im Sinne von ,Transzendentalia‘)</span>; und mit Hilfe dieser Eigenschaft definiert GÖDEL <span style="color:#00B000">(im 3. Beweisgang)</span>, was eine <span style="color:#FF6000">»''notwendige Existenz''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, die er <span style="color:#00B000">(im selben Beweisgang)</span> axiomatisch mit den <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> gleich setzt ''':''' Axiom-5 ''':''' <span style="color:#4C58FF"> —‚'''PE'''<sub>not</sub>‘ —</span>. Erst im 2. Beweisgang wird mit Term :13:, nach einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, definitiv bewiesen <span style="color:#00B000">( ╞ )</span>, dass die, von GÖDEL, hier postulierten, <span style="color:#00B000">(allgemeinen)</span>, positiven Eigenschaften, <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, tatsächlich auch in GOTT <span style="color:#FF6000">»''positive Eigenschaften''«</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, sind; <span style="color:#00B000">(das sind die ultimativen ,Transzendentalia‘ in GOTT)</span>. Jetzt aber muss vorerst der ,Wunsch‘, bzw. die LEIBNIZ-Frage beantwortet werden ''':''' Ob, mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, <span style="color:#FF6000">»''GOTT''«</span> ,möglich‘ ist, der, nach traditioneller Auffassung, <span style="color:#FF6000">»''ein Wesen von äußerster Größe und Vollkommenheit'' <span style="color:#00B000">[ ist ]</span>, ''das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(nach LEIBNIZ; was GÖDEL mit Definition-1 ,abbildet‘)</span>. Wenn man also beweisen will, dass die Existenz eines solchen ''<span style="color:#FF6000">»GOTTES«</span>'' ,möglich‘ sein soll, dann muss man beweisen, dass dieses postulierte System der <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> möglich und formal ,widerspruchsfrei‘ ist. Das Ergebnis des 1. Beweisganges, das ,Theorem-1‘, <span style="color:#00B000">(,Erster Satz‘)</span>, fasst A. FUHRMANN zusammen als ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>. Wenn sie nicht konsistent wären, käme es zu unlösbaren Widersprüchen, <span style="color:#00B000">(Term :24:)</span>. Term :27: ,besagt‘ ''':''' <span style="color:#FF6000">»''Es ist definitiv, d.h. ohne Widerspruch möglich, dass es positive Eigenschaften gibt''«</span>; denn die Behauptung, es sei nicht möglich, dass es positive Eigenschaften, <span style="color:#00B000">(das sind die ,Transzendentalia‘)</span>, in unserer Welt gibt, führt zu einem Widerspruch, und ist daher falsch und ,unlogisch’. Einmal Axiom-1 und zweimal Axiom-2, <span style="color:#00B000">(das die Gleichwertigkeit aller positiven Eigenschaften nachdrücklich klarstellt)</span>, sichern hier die Konsistenz <span style="color:#FF6000">»''aller positiven Eigenschaften in der Welt'', <span style="color:#00B000">[ die ,Transzendentalien‘ ]</span>, ''und damit auch die, die in GOTT sind''«</span>. <span style="color:#00B000">(Der 2. Beweisgang bestätigt, dass es in GOTT tatsächlich positive Eigenschaften gibt.)</span> Die ,Gleichwertigkeit‘ aller Transzendentalia, <span style="color:#00B000">(ihre ,Äquivalenz‘)</span>, ist formal-syntaktisch daran erkennbar, dass die beiden Eigenschafts-Variablen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> im Axiom-2 für beliebige, unterschiedliche ,positive‘ Eigenschaften gegenseitig austauschbar, <span style="color:#00B000">(,konvertierbar‘)</span>, sind. Das heißt, dass beliebige, unterschiedliche ,positive‘ Eigenschaften, für die diese Variablen stehen, sich paarweise, wechselseitig ,implizieren‘, einschließen, und damit notwendig voneinander abhängen, d.h. koinzident ,eins‘ sind, konvertierbar, und somit gleichwertig sind; entsprechend dem Theorem von den Transzendentalia. Zu Term :29:, dem Korollar zu Theorem-1, notiert GÖDEL am 10. Feb. 1970, <span style="color:#00B000">(übersetzt von Joachim BROMAND)</span> ''':''' <span style="color:#FF6000">»''◇∃xG(x) besagt, dass das System aller positiver Eigenschaften kompatibel ist'',</span> <span style="color:#00B000">[ d.h. miteinander verträglich, weil ohne Widersprüche ].</span> <span style="color:#FF6000">''Dies ist ,wahr‘ auf Grund von Axiom-2,'' <span style="color:#00B000">[ weil alle positiven Eigenschaften, d.h. die Transzendentalien, koinzident gleichwertig und konvertierbar sind ]</span>.«</span> Darum ist es definitiv ,möglich‘, dass es diesen GOTT gibt, der <span style="color:#FF6000">»''alle Grade der Vollkommenheit in sich schließt''«</span> und <span style="color:#FF6000">»''über dem ,Größeres‘ nicht mehr gedacht werden kann''«</span>, und, in weiterer Konsequenz, ist der GOTT-Glaube deshalb ,notwendig‘ widerspruchsfrei und sinnvoll, nach Theorem-3 ''':''' <u>Wenn</u> es ,ohne Widerspruch‘ ''<span style="color:#FF6000">»möglich, bzw. denkbar«</span>'' ist, dass es ''<span style="color:#FF6000">»GOTT«</span>'' gibt, <u>dann</u> folgt daraus ''<span style="color:#FF6000">»notwendig«</span>'' ''':''' es ist auch ,widerspruchsfrei‘, wenn man als Voraussetzung ,annimmt‘, dass es ''<span style="color:#FF6000">»GOTT wirklich, für jede mögliche Welt«</span>'' gibt ''':''' Term :11: im 3. Beweisgang. Der Wenn-Satz ist hier mit Korollar-1 bewiesen; der Dann-Satz wird im 3. Beweisgang bewiesen <span style="color:#00B000">( ╞ )</span>, d.i. die Widerspruchsfreiheit und Sinnhaftigkeit des GOTT-Glaubens.
Die ontologische ,Identität‘, d.h. die ,Gleichsetzung‘, bzw. die ,Koinzidenz‘ von Strukturen, die in der Endlichkeit für uns verschieden sind, jedoch in dem unbegrenzt Unendlichen, GOTT, paarweise, perspektivisch in eins zusammenfallen, wie ,Sein‘ und ,Wesen‘, wie ,Ursache‘ und ,Wirkung‘ usw., und auch die Äquivalenz und Austauschbarkeit der Transzendentalien, haben im GÖDEL-Kalkül die logisch-syntaktische Form einer, aus sich, ,modal‘ notwendigen Implikation zwischen zwei verschiedenen, gegenseitig austauschbaren Eigenschafts-Variablen ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>. Dieses Term-Element stellt formal-syntaktisch die Gleichwertigkeit, <span style="color:#00B000">(Äquivalenz)</span>, bzw. die paarweise Koinzidenz aller positiven Eigenschaften und Zuordnungen in GOTT dar; sowohl hier im Axiom-2, als auch in der Definition-2 über die ,Wesenseigenschaften‘, im 2. Beweisgang, mit jeweils verschiedenen, frei umbenennbaren, Individuum-Variablen. Dieses Term-Element ,gilt‘ allgemein jedoch nur für positive Eigenschaften, alias ,Transzendentalia‘, und wird sofort <span style="color:#FF6000">„modal falsch“</span>, wenn für <span style="color:#4C58FF">— ‚'''X'''‘ —</span>, oder <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, Eigenschaften eingesetzt werden, die, — von Natur aus —, weder positiv noch negativ sind, wie z. B. ,rot‘ oder ,schwer‘. Die wechselseitige Austauschbarkeit der noch ,unbestimmten‘ Eigenschafts-Variablen, für beliebige positive Eigenschaften, ist formal äquivalent zur freien Umbenennung der noch ,unbestimmten‘ Individuum-Variablen ''':''' <span style="color:#4C58FF">[ FUB(x:=y) ]</span>. Der formale, gegenseitige, allgemeine Austausch der positiven Eigenschafts-Variablen, bzw. die formale Gleichsetzung beliebiger positiver Eigenschaften, kann, auf Grund der Äquivalenz aller Vollkommenheiten, bzw. ,Transzendentalia‘, auch dann noch durchgeführt werden, wenn eine, von zwei Eigenschafts-Variablen, durch eine Definition oder eine Schlussfolgerung ,bestimmt‘ worden ist, und dadurch zu einer positiven Eigenschafts-Konstante, d.h. zu einer ,bestimmten‘, positiven Eigenschaft geworden ist. Das ist z. B. bei einer instanziierenden Substitution der Fall ''':''' <span style="color:#4C58FF">[ Instanz(X:=..) ]</span>. Das ist eine spezifische Eigenheit der GÖDEL-Axiomatik, weil alle relevanten, positiven Eigenschaften und Zuordnungen in GOTT, als <span style="color:#FF6000">„ultimative Transzendentalia“</span>, immer auch miteinander kompatibel sind. Mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, wird formal die <span style="color:#FF6000">„Koinzidenz“</span> aller ,Transzententalia‘ in der Welt, und auch der ,Zusammenfall‘ aller Gegensätze in GOTT, abgebildet.
Da die Variable <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht, <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(im Korollar-1)</span>, ist die Eigenschaft ''':''' ''<span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'' ''':''' <span style="color:#4C58FF">(¬x=..)</span>, d.h. das <span style="color:#FF6000">„Ungleichsein“</span>, das <span style="color:#FF6000">„Anderssein“</span> GOTTES, <span style="color:#00B000">(Prämisse :03:)</span>, die entscheidende Voraussetzung und Norm für jeden Diskurs über GOTT ''':''' um der <span style="color:#FF6000">„Unvergleichlichkeit“</span>
GOTTES gerecht zu werden, darf GOTT niemals mit etwas aus der ''<span style="color:#FF6000">»zufälligen Struktur der Welt«</span>'' verglichen, d.h. gleich gesetzt werden. Der Term :18: <span style="color:#4C58FF">(x=x) ↔ W</span> erinnert an die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin‘''«</span>. <span style="color:#00B000">(In der mystischen Tradition, im ''<span style="font-family: Times;"><big>‚Dialog über die Vorsehung‘</big></span>'', dem Hauptwerk der Heiligen KATHARINA von Siena, Mystikerin und Lehrerin der Kirche, sagt GOTT-VATER zur KATHARINA ''':''' <span style="color:#FF6000">»''ICH BIN der IST'', <span style="color:#00B000">[ aus mir selbst ]</span>, ''du bist, die nicht ist'', <span style="color:#00B000">[ aus dir selbst ]</span>.«</span> Das ist eine wichtige, deutende Ergänzung, und die authentische <span style="color:#4C58FF">,theologische‘</span> Interpretation dieser Exodus Text-Stelle. Das ist der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES.)</span>
Zum Term :03: notiert A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Die Notation'' <span style="color:#4C58FF">(¬x=..)</span> ''für die Eigenschaft ''':''' <span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'', <span style="color:#00B000">[ d.h. <span style="color:#FF6000">„Ungleichheit“, „Anderssein“</span>, bzw. die Notation <span style="color:#4C58FF">(x=..)</span> für den Existenzmodus-Perfektion ''':''' <span style="color:#FF6000">„Gleichheit“, „Idendität“</span> ]</span>, ''ist suggestiv und informell und ersetzt hier einen formal korrekten Abstraktionsausdruck wie'' <span style="color:#4C58FF">λy.(¬x=y)</span>, <span style="color:#00B000">[ bzw. <span style="color:#4C58FF">λy.(x=y)</span> ]</span>. ''Für die formal korrektere Notation bedarf es der zusätzlichen Vereinbarung, dass der Ausdruck'' <span style="color:#4C58FF">λy.(¬x=y)</span> ''gleichbedeutend sei mit dem Ausdruck'' <span style="color:#4C58FF">¬λy.(x=y)</span>. ''Diese Vereinbarung ist harmlos, da wir aufgrund der Regel der λ–Konversion'' ''':''' <span style="color:#4C58FF">λy.Xy.x ↔ Xx</span>, <span style="color:#00B000">[ mit der <span style="color:#4C58FF">Instanz(X:=(¬x=..))</span> ]</span>, ''so schließen dürfen'' ''':''' <span style="color:#4C58FF">λy.(¬x=y).x ↔ ¬x=x ↔ <span style="color:#00B000">¬(x=x)</span> ↔ ¬λy.(x=y).x</span> .<span style="color:#FF6000">«</span> <ref>A. FUHRMANN a.a.O. Seite 7, Anmerkung 4 (von mir korrigiert und ergänzt)</ref>
In der Kalkül-Zeile 29 wird das Möglichkeits-Korollar-1 durch einen <span style="color:#4C58FF">[ Modus ponens ]</span> mit Axiom-3 von der Kalkül-Prämisse-Term :01: ,abgekoppelt‘, d.h. es ist nicht mehr vom Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span> logisch abhängig. Das Möglichkeits-Korollar-1 behält jedoch die bewiesene Widerspruchsfreiheit von Theorem-1, und ist damit nur mehr von Axiom-1 und Axiom-2 abhängig, was für das Theorem-ANSELMS am Schluss entscheidend ist. Erklärung zu Term :05: Das Ergebnis einer Logik-Operation zwischen Prämissen ist ,regulär‘ <span style="color:#00B000">(├ )</span> den Prämissen zuzurechnen.
Das Modale-Prinzip KRIPKE-Γ-Ɐx, <span style="color:#4C58FF">['''RK''']</span>, in Worten ''':''' <span style="color:#FF6000">»''Wenn mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''gilt, und daraus logisch folgt, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''auch die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''gilt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar'' ''':''' ''es ist wahr, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''aus der Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''logisch folgt''«</span>. Der Term <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span> steht formal-syndaktisch, allgemein für ,Transzendentalia‘, und ist für alle ,Nicht-Transzendentalia‘ <span style="color:#FF6000">„modal falsch“</span>.
====<div class="center"><span style="color:#660066">2. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 2, (,Basisbeweis‘)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe____________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.2)} & \quad \neg P\ X \;\Longrightarrow\;\ P\neg X\ & \ & \text{„Wenn X nicht positiv ist, dann ist die Negation ¬X positiv“} \\
\text{(Axiom 3)} & \quad \ P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{(Axiom 4)} & \quad \ P\ X \;\Longrightarrow\; \Box \; \ P\ X \ & \ & \text{„Positive Eigenschaften sind notwendig aus sich positiv“} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 2)} & \quad \ X_{ess}\ x \;\Leftrightarrow X\ x \wedge \forall Y \left(\ Y\ x \Rightarrow \Box \; \forall y (\ X\ y \Rightarrow \ Y\ y)\right) & \ & \text{„X ist genau dann eine wesentliche Eigenschaft von x, wenn x sie hat, und} \\
\text{ } & \quad & \text { } & \;\;\text{alle anderen Eigenschaften Y von x notwendig aus dieser Eigenschaft X folgen“} \\
\text{[RM]} &\quad \ A \;\Longrightarrow\;\ B\; \text{ ├ }\;\Box \; A \Longrightarrow\;\Box\; \ B\ & \ & \text{( :: Modales Prinzip)} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{(,G‘ :: „Göttlichkeit“ ↔ „GOTT“ ↔ „Dasein GOTTES“)} \\
\text{ } &\;\text{„Das Wesen GOTTES ist sein Dasein“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} &\quad \ G\ x \ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} &\quad \ Y\ x \ & \ & \text{ AE: „Angenommen, GOTT hat die Eigenschaften Y“} \\
\text{03} &\quad \neg P\ Y & \ & \text{ AE: „Angenommen, die Y in GOTT sind nicht positiv“} \\
\text{04} &\quad \neg P \ Y \Rightarrow \ P \neg Y\ & \ &\text{(A1.2):Instanz(X:=Y) :: (Substitution für Eigenschaften) } \\
\text{05} &\quad \ P \neg Y \ & \ & \text {:03:04:[Modus ponens] :: [A, A → B├ B] } \\
\text{06} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{07} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:06:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{08} &\quad \ P \neg Y \Rightarrow \neg Y \ x\ & \ &\text{:07:Instanz(X:=¬Y)} \\
\text{09} &\quad \neg Y \ x\ & \ &\text{:05:08:[Modus ponens]} \\
\text{10} &\quad \text{ ├ }\; (Y\ x \wedge \neg Y \ x) \;\Leftrightarrow\;\ F\ & \ & \text{:02:09:[Konjunktion] ⇒ Kontradiktion !} \\
\text{11} &\quad \neg P\ Y \; \Rightarrow \; (Y\ x \wedge \neg Y \ x )\ & \ &\text{:03:10:[├A├B ╞ A → B] :: ''KONDITIONALER BEWEIS''} \\
\text{12} &\quad \neg\neg P\ Y \ & \ &\text{:11:10:[Modus tollendo tollens] :: [A → B,¬B├ ¬A]} \\
\text{13} &\quad \text{ ├ }\; P\ Y \ & \ &\text{:12:NEG; bzw. :03:10:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS'' :AE:} \\
\text{14} &\quad \ P\ Y \;\Rightarrow\;\Box \; \ P\ Y \ & \ & \text{(A4):Instanz(X:=Y)} \\
\text{15} &\quad \Box \; \ P\ Y \ & \ & \text{:13:14:[Modus ponens]} \\
\text{16} &\quad \ G \ y \Rightarrow \ Y \ y\ & \ &\text{:01:02:[├A├B ╞ A→B]:FUB(x:=y)} \\
\text{17} &\quad \text{ ├ }\; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:16:[G(y) ├ ⱯyG(y)]} \\
\text{18} &\quad \Box \; \ P\ Y \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:13:17:[├A├B ╞ A→B]:[RM]} \\
\text{19} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:15:18:[Modus ponens]} \\
\text{20} &\quad \ Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:02:19:[├A├B ╞ A→B]} \\
\text{21} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x & \ &\text{:20:01:[Konjunktion] :: [A, B├ A ∧ B]} \\
\text{22} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ X \ y \Rightarrow \ Y \ y)) \wedge \ X \ x\;\Leftrightarrow\; X_{ess}\ x \ & \ &\text{(D2):KOMM(↔):KOMM(∧):[ⱯYA(Y) ├ A(Y)] wegen :13:} \\
\text{23} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x\;\Leftrightarrow\; G_{ess}\ x \ & \ &\text{:22:Instanz(X:=G)} \\
\text{24} & \quad \text{ ├ }\; G_{ess}\ x \ & \ &\text{:21:23:[Modus ponens]:AE: wegen :30:} \\
\text{25} &\quad \ G\ x \;\Rightarrow\; \ G_{ess}\ x \ & \ & \text{:01:24:[├A├B ╞ A→B] :: Theorem 2.1} \\
\text{26} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] } \\
\text{27} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:26:[ⱯXA(X) ├ A(X)]} \\
\text{28} &\quad \ P \ G \Rightarrow \ G \ x\ & \ &\text{:27:Instanz(X:=G)} \\
\text{29} &\quad \text{ ├ }\; G \ x\ & \ &\text{(A3):28:[Modus ponens]} \\
\text{30} &\quad \ G_{ess}\ x \;\Rightarrow \ G \ x\ & \ &\text{:24:29:[├A├B ╞ A→B] :: Theorem 2.2 } \\
\text{31} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{:25:30:[Konjunktion]:BIKONDITIONAL :: [(A→B) ∧ (B→A) ↔ (A↔B)] } \\
\text{(Theorem 2)} &\; \text{„Dasein, GOTT-Sein, ist das Wesen GOTTES“} & \ & \Longleftarrow\; \text{was zu beweisen war ! } \\
\text{32} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:19:Instanz(Y:=(x=..))} \\
\text{33} &\quad \ G\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:01:32:[├A├B ╞ A→B]} \\
\text{(Korollar 2)} & \;\text{„Es gibt notwendig höchstens einen GOTT“} & \ & \text{„Wenn es GOTT gibt, dann gibt es für jede mögliche Welt nur einen GOTT“} \\
\end{align}</math>
</small>
|}
<span style="color:#00B000"><small>(In den Kalkül-Zeilen 16, 18, 31 mussten zwei-, und in Zeile 22 drei Kalkül-Schritte, d.h. Logik-Operationen in eine Zeile zusammengezogen werden, weil der Parser dieser speziellen Mathematik-Funktion in Wikibooks jedes Mal wegen Puffer-Überlauf abstürzt, wenn zu den bestehenden Zeilen noch eine neue Zeile, oder ein Text-Element, zusätzlich eingefügt wird. Das vermindert etwas die Transparenz des Kalküls.)</small></span>
Anmerkung-2 ''':''' <span style="color:#00B000">(Dieser Beweisgang kommt auch ohne das ,unbestimmte‘ Konjunkt <span style="color:#4C58FF"> — ‚'''Xx'''‘ —</span> in der Definition-2 zum gleichen Ergebnis, und wird dadurch um eine Zeile verkürzt ''':''' Zeile 21 entfällt, und <span style="color:#4C58FF">[ KOMM(∧) ]</span> ist dann unnötig. Dieses Konjunkt wird hier ebenfalls schon in der Kalkül-Prämisse :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, als ,Annahme‘ gesetzt, vorentschieden und ,bestimmt‘ mit der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>. Es war also logisch korrekt, dass GÖDEL, in seiner Notiz vom 10. Feb. 1970 zum ontologischen Beweis, dieses Konjunkt weggelassen hat, was ihm von Kommentatoren als ein Flüchtigkeitsfehler angerechnet worden war. Der gesamte 2. Beweisgang bewegt sich im Geltungsbereich der Prämisse Term :01:, d.h. ist in jeder Zeile von der Annahme abhängig ''':''' die Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span> steht für den GOTT der Christen. In der Kalkül-Zeile 33 wird mit Korollar-2 diese Abhängigkeit, für den Term :32:, explizit dargestellt.)</span>
Der Beweisgang geht mit der Prämisse :01: prinzipiell, als ,modal‘ freigewählte Voraussetzung, von der Existenz eines GOTTES aus. Im 1. Beweisgang wurde bewiesen, dass die von GÖDEL ,postulierten‘ <span style="color:#FF6000">»''allgemeinen positiven Eigenschaften, Vollkommenheiten, Perfektionen'', <span style="color:#00B000">[ die sog. ,Transzendentalien‘ ]</span> ''konsistent''«</span>, d.i. widerspruchsfrei sind. Hier, in diesem Beweisgang wird nun die Prämisse vom 1. Beweisgang, <span style="color:#4C58FF"> — ‚'''PX'''‘ —</span>, im Bezug auf GOTT hinterfragt ''':''' Gibt es auch in GOTT so Etwas, wie <span style="color:#FF6000">»''Vollkommenheit, Positives, Perfektes''«</span> '''?''' Die ,Annahme‘ jedoch, dass es <span style="color:#FF6000">»''in GOTT keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span> <span style="color:#00B000">(keine Transzendentalien)</span> gibt, <span style="color:#00B000">(Prämisse Term :03:)</span>,<span style="color:#4C58FF"> — ‚'''¬PY'''‘ —</span>, d.h. dass die <span style="color:#00B000">(wesentlichen)</span> Eigenschaften in GOTT keine <span style="color:#FF6000">„Vollkommenheiten“</span> seien, führt aber zu einem unlösbaren Widerspruch, <span style="color:#00B000">(Term :10:)</span>. Mit Term :13:, als 1. Hauptergebnis, ist damit, — als ,neue‘ Prämisse, <span style="color:#00B000">(ersetzt Term :03:)</span> —, definitiv ,bewiesen‘ <span style="color:#00B000">( ╞ , d.h. es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, dass alle Eigenschaften, die hier mit <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> symbolisiert werden, <span style="color:#FF6000">„positive Eigenschaften“</span>, d.h. <span style="color:#FF6000">„Perfektionen“</span> sind, von denen das Kalkül ,annimmt‘, <span style="color:#00B000">(Prämissen Term :01:, Term :02: und speziell Term :16:)</span>, dass der GOTT der Christen sie besitzt. Alle ,Wesenseigenschaften‘ in GOTT ''':''' <span style="color:#4C58FF">— ‚'''Y'''<sub>ess</sub>‘ —</span>, die durch den Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —, </span> dargestellt werden, sind somit <span style="color:#FF6000">„Vollkommenheiten“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span><span style="color:#00B000">, (,ultimative Transzendentalien‘, aller ,Grade‘)</span>. Damit ist definitiv ‚bestätigt‘, <span style="color:#00B000">( ╞ , es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, was mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schon ‚angenommen‘ worden ist ''':''' <span style="color:#FF6000">»''GOTT ist perfekt; er hat alle positiven Eigenschaften''«</span>; und auch Definition-1 ist damit ,verifiziert‘ ''':''' <span style="color:#FF6000">»''GOTT ist genau deswegen GOTT, weil er, als GOTT, positive Eigenschaften aller Grade in sich schließt''«</span>; entsprechend dem Quelltext bei LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. <span style="color:#00B000">(Der ,Schlüsselbegriff‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> ist der ,Schlüssel‘ zur Erkenntnis, dass GOTT ,notwendig‘, sowohl ,wesentlich‘ für uns, als auch an sich ,grundlos‘, immer schon ,da‘ ist.)</span> Hier, <span style="color:#00B000">(im 2. Beweisgang)</span>, hat Axiom-1, <span style="color:#00B000">(im Term :04:)</span>, sicher gestellt, dass die Eigenschaften in GOTT, <span style="color:#00B000">(Definition-1; Term :06:)</span>, tatsächlich <span style="color:#FF6000">„ultimativ positiv, perfekt und vollkommen“</span> sind ''':''' <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>. Das GÖDEL-Axiom-1 bezieht seine ,Potenz‘ aus dem Prinzip vom ,auszuschließenden‘ Widerspruch ''':''' eine Eigenschaft kann nicht zugleich ,positiv‘ und ,nicht positiv‘ sein '''!'''
Formal lässt sich das 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' schon aus Term :23: in diesem Beweisgang mit der <span style="color:#4C58FF">[ Vereinfachung ] :: [ A∧B ├ B ]</span> ohne Weiteres ,regulär‘ ableiten, — analog zu den Vorgehensweisen bei A. FUHRMANN und G.J. WIRSCHING. <span style="color:#00B000">(Beide Aussagen dieser ,Konjunktion‘ sind ,gleichwertig‘ und wahr, daher partizipiert das Theorem-2 auch am Ergebnis der Widerspruchsfreiheit von Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dem 1. Hauptergebnis. Beide Aussagen im Term :23: interpretieren sich gegenseitig.)</span> Der hier gewählte, etwas längere Weg zum Ergebnis, soll die innere Struktur und Abhängigkeit der Ergebnisse von bestimmten Voraussetzungen offen legen, und ihren ,Zweck‘ verdeutlichen. Die beiden Hauptergebnisse im Basisbeweis gehen vom vorgefundenen und traditionell vorgegebenen Begriff von ,GOTT‘ aus, <span style="color:#00B000">(Term :06:, Term :16: und Term :26:)</span>. Das ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 1. Hauptergebnis, hier im 2. Beweisgang, Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span> ''':''' <span style="color:#FF6000">»''die Eigenschaften in GOTT sind vollkommen, d.h. sind die ultimativen Transzendentalia''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als auch die Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span>, für die Annahme ''':''' den ,GOTT der Christen‘, der deswegen GOTT ist, weil er alle Grade der Vollkommenheit in sich schließt. Und das ebenfalls ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 2. Hauptergebnis, hier im selben Beweisgang, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''das Wesen GOTTES ist sein eigenes Sein''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, als auch die Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, für die Wesenseigenschaft ''':''' ,notwendige Existenz‘, und widerlegt den Einwand KANTS, für den Spezialfall ''':''' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für ,GOTT‘. Zwei Axiome und zwei Definitionen von GOTT und seinen Vollkommenheiten werden durch die Ergebnisse im Basisbeweis des GÖDEL-Kalküls in unserer realen Welt als ,wahr‘, <span style="color:#00B000">(genauer als ,widerspruchsfrei‘)</span>, und, — im Rahmen des christlichen Glaubens —, als ,annehmbar‘ bestätigt. <span style="color:#00B000">(Anmerkung zu Term :24: ''':''' eine Prämisse ist regulär-,modal‘ immer ,frei‘ wählbar.)</span>
Zusammengefasst heißt das ''':''' die ,strittige‘ Begründung der ,methodologischen‘ Prämisse des GÖDEL-Kalküls ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#00B000">(Prämisse, Term :01:)</span>, weil <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#00B000">(Korollar-1)</span> ''':''' <span style="color:#FF6000">»''Das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den GOTT der Christen, für den es ohne Widerspruch denkbar ist, dass es ihn gibt''«</span>, <span style="color:#00B000">(ANSELMS Prinzip, trotz der ,Warnung‘ KANTS)</span>, ist ,wahr‘ und für uns ,annehmbar, denn es ist auch, auf Grund der Ergebnisse des 2. Beweisganges, in unserer realen Welt ,wahr‘ und ,annehmbar‘, weil schon als ,widerspruchsfrei‘ verifiziert ''':''' <span style="color:#FF6000">»''Der GOTT der Christen'' <span style="color:#00B000">(Term :01:)</span> '',existiert‘ für uns ,notwendig‘''«</span> ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, <span style="color:#00B000">(d.i. das ,regulär‘-mögliche Korollar sowohl im 2. als auch im 3. Beweisgang)</span>, denn dieser GOTT ist aus sich ,vollkommen‘ ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, und zu seiner ,Vollkommenheit‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> gehört auch notwendig sein ,Existieren‘ ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. <span style="color:#00B000">(Jeder dieser Terme ist im-, und durch den 2. Beweisgang, im Geltungsbereich der Prämisse Term :01:, als ,wahr‘ und ,annehmbar‘ bewiesen, bzw. verifiziert.)</span> Das ist der ,Kern‘ des ontologischen Arguments, und somit ist auch diese ,strittige‘ Begründung der Prämisse des GÖDEL-Kalküls mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. sie ist logisch ,richtig‘ und, im Kontext des christlichen Glaubens, vernünftig. Die Annahme des Gegenteils zu dieser Prämisse ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Es ist undenkbar, dass es diesen GOTT gibt''«</span>, führt jedoch, unabhängig von jeder Glaubensüberzeugung, zu einem Widerspruch — ist unlogisch und daher ,falsch‘, <span style="color:#00B000">(siehe Anhang ''':''' Widerlegung)</span>. Die Behauptung einer ,formalen Unentscheidbarkeit‘ zu den Annahmen über die Existenz GOTTES, ob oder nicht, <span style="color:#00B000">(d.h. ein ,methodologischer‘ Agnostizismus)</span>, ist gegen jede ,Logik‘; und ist auch ,falsch‘, d.h. der Agnostizismus ist einfach nur ein ,logischer Irrtum‘. Denn aus dem, im Kalkül abgeleiteten, Widerspruch aus der einen Annahme, und damit ihrer Unrichtigkeit, folgt notwendig die Richtigkeit der gegenteiligen Annahme. Damit ist eine klare Entscheidung getroffen.
Das Modale-Prinzip <span style="color:#4C58FF">['''RM''']</span> in Worten ''':''' <span style="color:#FF6000">»''Wenn es wahr ist, dass aus'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> ''ein'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> ''logisch folgt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar, dass, wenn'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist, auch'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist''«</span>. <span style="color:#00B000">(Das <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> in Term :18: ist als ,modal notwendig‘ durch den Term :15: verifiziert '''!''' )</span>
Mit dem 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#FF6000">»'',Dasein‘ ist das ,Wesen‘ GOTTES''«</span>, folgt die GÖDEL-Axiomatik der philosophisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition der ,Rede von GOTT‘ seit ARISTOTELES, und schließt sich damit formal-syntaktisch zugleich auch der religiösen Überzeugung der Christen an, die glauben, dass GOTT, als unser Vater, aus Liebe, in seinem Sohn, JESUS CHRISTUS, für uns immer schon <span style="color:#FF6000">»''da''«</span> ist, <span style="color:#00B000">(der Sohn ist koinzident ,eins‘ mit GOTT, dem Vater und dem GEIST)</span>, wirksam in und durch seine <span style="color:#4C58F0">„Kirche“</span>, im HEILIGEN GEIST, bis ans Ende der Zeit. Das ist das, <span style="color:#FF6000">»''was''«</span> GOTT eigentlich für uns ausmacht, — die Selbstmitteilung seines unergründlichen Wesens in den Sakramenten der <span style="color:#4C58F0">„Kirche“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin da für euch und für immer, als der ich ''<span style="color:#00B000">[ immer schon gewesen ]</span> ''bin''«</span>; <span style="color:#00B000">(d.i. das <span style="color:#4C58FF">,theologisch‘</span>-exegetische ,Axiom‘ der Christen, und eine <span style="color:#4C58FF">,theologisch‘</span> korrekte Explikation der ,regulären‘ Kalkül-Prämisse Term :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, jeweils im 2. und 3. Beweisgang)</span>. Das heißt aber nicht, dass der Autor des Kalküls sich mit diesem Glauben identifiziert hat, <span style="color:#00B000">(,hat‘ er auch nicht)</span>, oder dass der Leser des ontologischen Beweises von Kurt GÖDEL sich damit identifizieren muss, wenn er dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> anerkennt.
Zur erweiterten <span style="color:#4C58FF">„theologischen“</span> Explikation der Kalkül-Prämisse ''':''' Die <span style="color:#4C58F0">„Kirche“</span> ist das ,Meisterwerk‘ GOTTES ''':''' In ihr ist es GOTT gelungen, etwas Göttliches und Unzerstörbares in unsere korrupte Welt einzupflanzen ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Etwas Göttliches existiert notwendig, d.h. ,unzerstörbar‘ in unserer Welt''«</span>. Sie ist, durch die Menschwerdung des GOTTES Sohnes, JESUS CHRISTUS, dessen <span style="color:#4C58F0">„Leib“</span> die <span style="color:#4C58F0">„Kirche“</span> ist, untrennbar mit Menschen verbunden, die schon, von allem Anfang an, und jetzt immer noch, durch die Sünde korrumpiert sind. Mit ihr will und wird GOTT unsere Welt und die Menschheit, bis ans Ende der Zeit, von der Sünde und von deren Konsequenz, dem <span style="color:#00B000">(ewigen)</span> Tod <span style="color:#4C58FF">„erlösen“</span>, <span style="color:#00B000">(jedoch nicht ohne die Zustimmung des Menschen)</span>. Mit dieser Explikation wird die Tragweite des ontologischen Arguments ANSELMS, und damit auch die <span style="color:#4C58FF">„theologische“</span> Relevanz der GÖDEL-Axiomatik erkennbar. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT, <span style="color:#00B000">(Term :01:)</span>.
====<div class="center"><span style="color:#660066">3. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 3, (ANSELMS Theorem)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe___________________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 5)} & \quad P\ E_{not}\; \ & \text { } & \text{„Notwendige Existenz ist eine positive Eigenschaft“} \\
\text{ } & \text{( :: Das ist nur dann wahr, wenn ,Dasein‘ und ,Wesen‘ } & \ & \text{( :: dagegen KANT : ,Existenz‘ ist keine ,Eigenschaft‘,} \\
\text{ } & \;\;\text{in eins zusammenfallen ! ARISTOTELES : Theorem-2)}\ & \ & \;\;\text{,Sein‘ ist für alles, was existiert, kein ,reales Prädikat‘ ! )} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 3)} & \quad \ E_{not}\ x \;\Longleftrightarrow\;\ \forall X \left(\ X_{ess}\ x \Longrightarrow \Box \; \exists y \ X\ y \right) & \ & \text{„Notwendige Existenz ist genau dann eine Eigenschaft von x, wenn} \\
\text{ } & \quad & \ & \;\;\text{alle wesentl. Eigenschaften von x notwendig instanziiert sind“} \\
\text{(Korollar 1)} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{„Es ist widespruchsfrei möglich, dass es GOTT gibt“} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ &\text{„Dasein, GOTT-Sein, Existenz ist das Wesen, die Essenz GOTTES“} \\
\text{(Korollar 2)} &\quad \ G\ x \;\Longrightarrow\; \Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{„Wenn es GOTT gibt, dann gibt es notwendig nur einen GOTT“} \\
\text{(Theorem 3)} & \quad \Diamond \; \exists x \ G \ x \;\Longrightarrow\; \Box \; \exists x \ G \ x \ & \ & \text{( :: ANSELMS Prinzip)} \\
\text{ } & \text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{01} & \quad \ G \ x\ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} & \quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ & \text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{03} & \quad \ P \ X \Rightarrow \ X \ x\ & \ & \text{:02:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{04} & \quad \ P \ E_{not}\;\Rightarrow \ E_{not}\ x\ & \ & \text{:03:Instanz(X:= Enot) :: (Substitution für Eigenschaften)} \\
\text{05} & \quad \ E_{not}\ x\ & \ & \text{(A5):04:[Modus ponens] :: [A, A → B├ B]} \\
\text{06} & \quad \forall X \left(\ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y \right) & \ & \text{(D3):05:[Modus ponens]} \\
\text{07} & \quad \ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y & \ & \text{:06:[ⱯXA(X) ├ A(X)]} \\
\text{08} & \quad \ G_{ess}\ x \Rightarrow \Box \; \exists y \ G\ y & \ & \text{:07:Instanz(X:= G)} \\
\text{09} & \quad \ G_{ess}\ x \ & \ & \text{(Th2):01:[Modus ponens]} \\
\text{10} & \quad \text{ ├ }\;\Box \; \exists x \ G\ x & \ & \text{:08:09:[Modus ponens]:FUB(y:=x) :: (Freie-Um-Benennung der Var.)} \\
\text{ } & \text{„Es gibt GOTT wirklich, für jede mögliche Welt“} & \ & \Longleftarrow\; \text{1. Hauptergebnis !} \\
\text{11} & \quad \;\Diamond \exists x \ G \ x \;\Longrightarrow \; \Box \; \exists x \ G\ x & \ & \text{(K1):10:[├A├B ╞ A→B] :: ''KONDITIONALER BEWEIS''} \\
\text{(Theorem 3)} & \;\text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen war ! 2. Hauptergebnis ! } \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{12} & \quad \;\Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{(K2):01:[Modus ponens]} \\
\text{13} & \quad \;\Box \; (\exists x \ G\ x \wedge \; \forall y(\ G \ y \Longrightarrow \ (x = y)))\ & \ & \text{:10:12:[Konjunktion]:DIST(□∧)} \\
\text{(Korollar 3)} & \;\text{„Es gibt notwendig genau nur einen GOTT“} & \ & \text{„Es gibt für jede mögliche Welt nur den GOTT der Christen“} \\
\end{align}</math>
</small>
|}
Anmerkung-3 ''':''' <span style="color:#00B000">(Ein Theorem und zwei Korollare, aus den beiden vorhergehenden Beweisgängen, werden hier, im 3. Beweisgang, zu ,Axiomen‘, die das Theorem-ANSELMS und sein Korollar mit-verifizieren und bestätigen.)</span>
Dieser Beweisgang ist das Ziel aller Bemühungen. Hier wird der sog. ,ontologische Gottesbeweis‘ nach ANSELM von Canterbury formal-syntaktisch dargestellt und als logisch nachvollziehbar von GÖDEL bestätigt. Damit hat er aber auch klar gestellt, dass der ontologische Beweis ANSELMS kein Beweis für die ,Existenz‘ des GOTTES der Bibel sein kann, bzw. sein ,will‘ ''':''' Denn mit der Prämisse, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(Term :01:, wie auch schon im ,Basisbeweis‘, und ausformuliert hier in Term :02:, mit der Definition für GOTT)</span>, wird mit dem traditionellen, abendländischen ,GOTT-Glauben‘, der ,glaubt‘, dass der Gott der Christen tatsächlich existiert, — methodologisch als ,Annahme‘ —, der Beweisgang schon regulär und explizit eröffnet, aus dem sich dann, logisch korrekt, mit Hilfe der GÖDEL-Axiome und Definitionen, das ,Theorem ANSELMS‘ ergibt; <span style="color:#00B000">(hier jedoch, mit Günther J. WIRSCHING, ohne den Umweg bei GÖDEL über den <span style="color:#4C58FF">[ Modus Barbara ] :: [ A → B, B → C ├ A → C ] </span>, mit dem modalen Axiom-BECKER ''':''' <span style="color:#4C58FF">— ‚'''◇□A→□A'''‘ —</span>, als <span style="color:#4C58FF">‚B → C‘</span> im kategorischen Syllogismus, das André FUHRMANN recherchiert hat)</span>. GÖDEL verwendet zur Darstellung des sog. ,ontologischen Gottesbeweises‘ nach ANSELM die Struktur eines modal-logischen Kalküls. Ein modal-logisches Kalkül ist ein genau geregeltes Schema, in dem bei bestimmten ,Annahmen‘ <span style="color:#00B000">(Axiome, Definitionen, Prämissen)</span> etwas anderes als das Vorausgesetzte, auf Grund des Vorausgesetzten mit Notwendigkeit folgt. Entsprechend der ,Modalität‘ der sechs ,modal‘ notwendigen, d.h. transzendentalen Voraussetzungen, hier, für den 3. Beweisgang, die in den <span style="color:#00B000">(und durch die)</span> beiden vorhergehenden Beweisgängen schon als <span style="color:#FF6000">„modal wahr“</span>, bzw. als logisch annehmbar, verifiziert und/oder ,bewiesen‘ wurden, sind auch die beiden ,Schlusssätze‘ <span style="color:#00B000">(Theorem-3 und Korollar-3)</span> <span style="color:#FF6000">„modal wahr“</span>, bzw. logisch annehmbar '''!''' Die Wahl der Prämisse :01: dagegen ist nicht ,modal‘ notwendig, sondern beruht auf einer freien Entscheidung, und damit ist auch ihre Interpretation eine freie Entscheidung, mit der Voraussetzung, dass man das Kalkül mit Theoremen aus der <span style="color:#4C58FF">„christlichen Theologie“</span> evaluieren, und damit interpretieren will. Dazu berechtigt die Genese des Kalküls. Der Glaube an den GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, beruht immer auf einer freien Entscheidung. Das Kalkül, als solches, unabhängig von jeder Interpretation seiner Syntax, ist genau dann ,allgemein‘ <span style="color:#FF6000">»''mathematisch evident''«</span>, d.h. ,ist allgemein gültig‘, wenn es gültigen Logik-Regeln folgt. Die Bestimmung seiner Syntax jedoch, d.h. seine Interpretation, unterliegt hermeneutischen Kriterien, die nicht von Logik-Regeln abhängen, wie hier ''':''' <span style="color:#FF6000">»''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''«</span>, wie GÖDEL selbst hinzufügt. Mit der, — von GÖDEL eingeforderten —, ‚Unabhängigkeit‘ der Kalkül-Axiome von der zufälligen Struktur der Welt, wird implizit für das Kalkül auch festgelegt, dass <span style="color:#FF6000">„GOTT“</span> ‚unabhängig‘ von der zufälligen <span style="color:#00B000">(Raum-Zeit-)</span>Struktur unserer vergänglichen Welt, und daher ,zeitlos-ewig‘ ist, <span style="color:#00B000">(was <span style="color:#4C58FF">„theologisch“</span> korrekt ist)</span>, begründet durch Definition-1 und Axiom-3. Aus der zeitlosen Ewigkeit GOTTES folgt, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, denn bei Zeitlosigkeit gibt es keinen ,zeitlichen‘ und damit auch keinen ,ontologischen‘ Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘. Beides ist dann koinzident ,eins‘ ''':''' wie ,Wesen‘ und ,Dasein‘ in GOTT, bzw. wie ,Begriff‘ und ,Sein‘, oder ,Möglichkeit‘ und ,Wirklichkeit‘. <span style="color:#00B000">(Man vergleiche damit auch die ,postulierte‘ Einheit von ,Erkenntnisobjekt‘ und ,Erkenntnissubjekt‘ im ,Gott‘ des ARISTOTELES ''':''' im <span style="color:#FF6000">»<span style="color:#00B000">[ selbstbewussten ]</span> ''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“<span style="color:#00B000"> | </span>„noêseôs noêsis“</span> <small>(‚<span style="font-family: Times;"><big>''Metaphysik''</big></span>‘ XII 9, 1074b34)</small>, im Vollzug seiner Funktion als ,unbewegtes Bewegungsprinzip‘, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“<span style="color:#00B000"> | </span>„prôton kinoûn akinêton“</span> der Welt, das alles Übrige <span style="color:#FF6000">»''wie ein Geliebtes''«<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὡς ἐρώμενον</big></span>“</span> | <span style="color:#FF6000">„hôs erômenon“</span> bewegt; d.h. christlich ''':''' <span style="color:#FF6000">»''aus Liebe''«</span> ,entstehen‘ lässt.)</span>
Anmerkung-4 ''':''' Das <span style="color:#00B000">(im 2. Beweisgang)</span> schon bewiesene Theorem-2, d.i. die Koinzidenz von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, <span style="color:#00B000">(‚Existenz‘</span> und <span style="color:#00B000">‚Essenz‘)</span>, rechtfertigt sowohl Axiom-5 als auch die Definition-3, und widerlegt den Einwand KANTS. Somit ist deren Setzung <span style="color:#00B000">(hier, im 3. Beweisgang)</span> korrekt, und durch das Theorem-2 schon vorbestimmt und bestätigt, d.h. beide sind <span style="color:#FF6000">„modal wahr“</span> und ,logisch‘ annehmbar, da sie durch die Gültigkeit von Theorem-2 ,verifiziert‘ worden sind. Damit wird klar erkennbar, dass das Theorem-2 tatsächlich die Basis des GÖDEL-Kalküls ist. Und wenn damit Axiom-5 im GÖDEL-Kalkül ‚gerechtfertigt‘ ist, dann ist auch, <span style="color:#00B000">(als Voraussetzung dafür)</span>, das Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ — ''':''' </span> <span style="color:#FF6000">»''Positive Eigenschaften'', <span style="color:#00B000">[ ,Transzendentalia‘ ]</span>, ''sind notwendig aus sich'', <span style="color:#00B000">[ von Natur aus ]</span>, ''positiv''«</span>, im 2. Beweisgang erklärbar, in dem die ‚Positivität‘, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, einer Eigenschaft schon als ‚notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, charakterisiert worden ist, äquivalent zu Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, in dem die ‚Notwendigkeit‘, <span style="color:#4C58FF">— <sub>not</sub> —</span>, <span style="color:#00B000">(der Existenz <span style="color:#4C58FF">— ‚'''E'''‘ —</span>)</span>, dann als ‚positive‘ Eigenschaft, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ‚bestimmt‘ wird; <span style="color:#00B000">(unter der speziellen Voraussetzung, dass <span style="color:#FF6000">„Existieren“</span> definitiv als eine <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT ,instanziiert‘ ist; vgl. Definition-3. Eine ,bestimmte‘ Eigenschaft ist genau dann ,instanziiert‘, wenn sie an einem Träger real ,existiert‘. Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, besagt, dass die, von GÖDEL ,postulierte‘, und im Basis-Theorem-2 verifizierte, <span style="color:#FF6000">„notwendige Existenz“</span> zu den ,ultimativen‘ Transzendentalia in GOTT gehört. Genauer ''':''' Sie ist die ,Summe‘ aller Transzendentalia.)</span> Zum Axiom-4, <span style="color:#00B000">(bzw. zum Term :14:, im 2. Beweisgang)</span>, erklärt GÖDEL in seinen Notizen zum Kalkül ''':''' <span style="color:#FF6000">»''da es'' <span style="color:#00B000">[ das Notwendigsein, <span style="color:#4C58FF">— '''□''' —</span> ]</span> ''aus der Natur der'' <span style="color:#00B000">[ positiven ]</span> ''Eigenschaft folgt'', <span style="color:#00B000">[ deren Positivität, im selben Beweisgang, mit Term :13: vorher schon ,bewiesen‘ (╞ ) worden ist ]</span>«</span>. Die GÖDEL-Erklärung zum Axiom-4 entspricht der Modal-Regel zur sog. ,Nezessisierung‘ in der KRIPKE-Logik nach GÖDEL. <span style="color:#4C58FF">[ Nezessisierungsregel ] '''::''' [ ├ A →├ □ A ]</span> ''':''' <span style="color:#FF6000">»''Angenommen'', <span style="color:#4C58FF">‚'''A'''‘</span> ''ist in einem Kalkül eine Prämisse, oder darin regulär'' <span style="color:#4C58FF">(├ )</span> ''abgeleitet, dann folgt in diesem Kalkül regulär'' <span style="color:#4C58FF">(├ )</span>, ''dass dieses'' <span style="color:#4C58FF">‚'''A'''‘</span> ''auch ,modal‘ notwendig'' <span style="color:#4C58FF">— ,□‘ —</span> ''ist''«</span>. GÖDEL hat jedoch diese modale Notwendigkeit nur in der ,Natur‘ der positiven Eigenschaften, alias ,Transzendentalia‘, gesehen, und mit den Aussagen im Axiom-4 expliziert ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt, nur dann sind die Axiome wahr''«</span>. Ob dieselbe modale Notwendigkeit auch auf Aussagen über Eigenschaften, wie ,rot‘ oder ,schwer‘, die weder positiv noch negativ sind, zutrifft, ist nicht erwiesen. Hier kann nur von modaler ,Kontingenz‘ gesprochen werden, die universal, alles Seiende innerhalb der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> betrifft. Somit sind die Aussagen <span style="color:#4C58FF">— ‚'''A'''‘ —</span> in der GÖDEL-Regel, nur auf Aussagen über ,positive‘ Eigenschaften eingeschränkt, und nicht allgemein gültig. Die <span style="color:#4C58FF">[ Nezessisierungsregel ]</span> ist nur für <span style="color:#FF6000">„Transzendentalia“ „modal wahr“</span>, und für ,Nicht-Transzendentalia‘ immer <span style="color:#FF6000">„modal falsch“</span>.
Der unbegrenzt Unendliche, GOTT, — im Glauben der Christen —, ist deswegen ,notwendig für uns da‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, weil er als GOTT ,vollkommen‘, ,perfekt‘ und absolut ,positiv‘, d.h. absolut ,gut allein‘ ist, ohne jede Negativität ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>; <span style="color:#00B000">(was auch schon im 2. Beweisgang mit Term :13: verifiziert wurde)</span>. Und wenn GOTT ,vollkommen‘, ,perfekt‘, ,positiv‘, und absolut ,gut‘ ist, dann ist er das auch ,notwendig aus sich‘ ''':''' <span style="color:#4C58FF">— ‚'''PG → □PG'''‘ — ::</span> <span style="color:#00B000">(als Zusatz-Korollar im 2. Beweisgang mit Axiom-4 und der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>)</span>, d.h. ,aus seinem Wesen‘. Das ist gerade das, ,was‘ GOTT als GOTT ausmacht ''':''' sein ,Wesen‘, bzw. seine <span style="color:#FF6000">„Natur“</span>. Zusammen mit der Definition-1 für GOTT, <span style="color:#00B000">(und der Definition-2 ''':''' Alle Wesenseigenschaften hängen notwendig gleichwertig aus sich zusammen)</span>, ist dieses, aus der <span style="color:#FF6000">„Natur“</span> GOTTES sich ergebende, ‚Notwendigsein‘, <span style="color:#4C58FF">— '''□''' —</span>, aller ‚positiven‘ Eigenschaften im Axiom-4, und ihr logischer Zusammenhang, d.i. die Koinzidenz aller ,Vollkommenheiten‘ und ,Zuschreibungen‘ im Unendlichen, GOTT, ihr ,Zusammenfallen in eins‘, die entscheidende Voraussetzung, aus der sich dann für GÖDEL <span style="color:#00B000">(im 2. Beweisgang)</span> auch der logische Zusammenhang, bzw. die ontologische Identität, <span style="color:#00B000">(die Koinzidenz)</span>, von <span style="color:#FF6000">„Dasein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, im Basis-Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> mit Notwendigkeit ergibt. Damit hat GÖDEL ein altes <span style="color:#4C58FF">„theologisches“</span> Theorem der Vergessenheit entrissen. Das Theorem-2 ist dann, in weiterer Folge, die ,modal‘ notwendige, d.h. die transzendentale Voraussetzung auch für den Konsequenz-Teil im Theorem ANSELMS, <span style="color:#00B000">(Term :09: hier im 3. Beweisgang)</span>. <span style="color:#FF6000">„Positive Eigenschaften“<span style="color:#00B000"> | </span>„Vollkommenheiten“</span> sind ,immer‘ auch <span style="color:#FF6000">„notwendige Eigenschaften“</span>, daher ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. Das ,Dasein‘, die <span style="color:#FF6000">„Existenz“</span> ist ,immer‘ etwas <span style="color:#FF6000">„Positives“</span>, speziell in GOTT, dem Schöpfer jeder ,Existenz‘, bzw. allen ,Seins‘. Axiom-4 begründet im GÖDEL-Kalkül das Basis-Theorem-2, <span style="color:#00B000">(wie auch das Korollar-3 von der exklusiven Einzigartigkeit GOTTES)</span>, und ,verankert‘ diese Theoreme damit zugleich in der <span style="color:#4C58FF">,theologisch‘</span>-philosophischen Tradition der ,Rede von GOTT‘ bei ARISTOTELES, — AVICENNA, — ANSELM, — DESCARTES, — LEIBNIZ, — HEGEL, — und bei GÖDEL mit äußerster ,logischer‘ Klarheit.
Anmerkung-5 ''':''' Der ‚Schlüsselbegriff‘ in diesem Kalkül ''':''' <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Vollkommenheit“<span style="color:#00B000"> | </span>„Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, dominiert alle Axiome des GÖDEL-Kalküls, jedoch ohne inhaltlich genauer ‚bestimmt‘ worden zu sein. Für <span style="color:#4C58FF">— ‚'''P'''‘ — </span> gibt es keine explizite Definition '''!''' <span style="color:#00B000">(Das Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, besagt nur, dass die ,postulierten‘, positiven Eigenschaften, die <span style="color:#FF6000">„Transzendentalia“</span>, formal miteinander verträglich, d.h. ‚widerspruchsfrei‘ sind, wegen Axiom-2. Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, besagt, dass positive Eigenschaften ,gleichwertig‘ sind, d.h. gleich ,wahr‘ sind, weil sie ,notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, aus sich, alle paarweise mit- und voneinander ,impliziert‘ sind, sich gegenseitig ,einschließen‘, und damit eine Einheit bilden, d.h. in GOTT ,eins‘ sind. Axiom-2 ist somit zugleich eine ,indirekte‘ Definition für ,positive‘ Eigenschaften ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, besagt ''':''' Weil die ,gleichwertigen‘, positiven Eigenschaften sich gegenseitig implizieren, und damit notwendig von einander abhängen, d.h. koinzident in GOTT ,eins‘ sind, — wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht —, dann sind sie somit auch die ,wesentlichen‘ Eigenschaften, die <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, in GOTT, der, wesentlich und exklusiv, notwendig ,Einer‘ ist. Die Definition-2 ist nur dann <span style="color:#FF6000">„modal wahr“</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit positive Eigenschaften, d.h. mit <span style="color:#FF6000">„Transzendentalien“</span>, besetzt werden. Diese Definition ist jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn ihre Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind. Fußnote zu Definition-2 in der GÖDEL-Notiz ''':''' <span style="color:#FF6000">»''any two essences of x are nec. equivalent''«</span>. Die paarweise, notwendige Äquivalenz von zwei beliebigen Wesenseigenschaften der Individuum-Variable <span style="color:#4C58FF">‚'''x'''‘</span>, wird hier, spezifisch für GOTT, d.h. wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT, dem ,Einen‘, steht, zur <span style="color:#FF6000">„Koinzidenz“</span>, — zum paarweise ,Zusammenfallen aller Gegensätze in Einem‘ —, dem inneren Zusammenhang aller seiner <span style="color:#FF6000">„ultimativen“</span> Vollkommenheiten, d.h. aller <span style="color:#FF6000">„Transzendentalia“</span> und Zuschreibungen, in dem unbegrenzt Unendlichen, GOTT, den schon der Philosoph und Kardinal NIKOLAUS von Cues als <span style="font-family: Times;"><big>,coincidentia oppositorum‘</big></span> verstanden hat.)</span>
In den entscheidenden ‚Schlusssätzen‘ des Kalküls ist der ‚Schlüsselbegriff‘ verschwunden. Hier ist nur mehr von GOTT, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, die Rede ''':''' Korollar-1, <span style="color:#FF6000">»''Es ist definitiv denkbar, dass es GOTT gibt''«</span>, Theorem-2, <span style="color:#FF6000">»''Dasein, GOTT-Sein, Göttlichkeit ist das Wesen GOTTES''«</span>, Theorem-3, <span style="color:#FF6000">»''Weil GOTT definitiv denkbar, d.h. widerspruchsfrei möglich ist, darum ist auch der Glaube an GOTT widerspruchsfrei, logisch richtig und mathematisch evident, der annimmt, dass es GOTT, mit Notwendigkeit, wirklich gibt''«</span>, <span style="color:#00B000">(nach ANSELM von Canterbury, und was spezifisch das <span style="color:#FF6000">»</span>''Privilegium der Gottheit allein''<span style="color:#FF6000">«</span> ist, nach LEIBNIZ)</span>, und Korollar-3, <span style="color:#FF6000">»''Es gibt notwendig aus sich, d.i. unverursacht, nur einen GOTT''«</span>. Das GÖDEL-Kalkül ist zu diesen Erkenntnissen gekommen, ohne die Eigenschaften, bzw. die ‚Vollkommenheiten‘ GOTTES, d.h. wer oder was GOTT ‚an sich‘ selbst ist, genauer bestimmen zu müssen, <span style="color:#00B000">(was ,für uns‘ ohnehin ,unmöglich‘ ist)</span>; außer im Theorem-2, in dem das <span style="color:#FF6000">„Dasein“</span> GOTTES als die ‚für uns‘ bestimmende und wichtigste <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT erkannt worden ist, — immer vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. Der GOTT des GÖDEL-Kalküls ist nicht mehr der an Raum und Zeit gebundene ‚Gott‘ des ARISTOTELES, sondern der von Raum und Zeit <span style="color:#FF6000">»''unabhängige''«</span> GOTT der Bibel bei ANSELM und bei LEIBNIZ. Das GÖDEL-Kalkül, <span style="color:#00B000">(wie ja auch der sog. ‚ontologische Gottesbeweis‘ ANSELMS)</span>, kann jedoch, — bei aller ‚Coolness‘ —, keinen GOTT-Glauben ‚erzeugen‘, sondern setzt vielmehr die Existenz GOTTES notwendig als gegeben schon voraus. Das Kalkül des Logiker GÖDEL beweist aber, dass der traditionelle ‚GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. logisch ,richtig‘ und <span style="color:#FF6000">»''mathematisch evident''«</span> ist, weil der ‚Nicht-GOTT-Glaube‘, <span style="color:#FF6000">»''die atheistische Weltanschauung''«</span>, im Möglichkeitsbeweis notwendig zu unlösbaren Widersprüchen führt, und somit logisch ,falsch‘ ist. <span style="color:#00B000">(Die ,Logik‘ hat aber, — bekanntlich —, bei allen wichtigen, persönlichen Entscheidungen immer nur eine untergeordnete Rolle '''!''' )</span>
Anmerkung-6 ''':''' Das erste, ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitete, Hauptergebnis im 3. Beweisgang, Term :10: <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' der Glaube, dass GOTT ,notwendig‘ existiert, ist die logische Konsequenz aus der Prämisse, Term :1: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>. Dieses erste Hauptergebnis hat also den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist daher davon ,abhängig‘, d.h. Term :10: ist der Ausdruck einer ,Glaubensüberzeugung‘. Das zweite Hauptergebnis im 3. Beweisgang, das Theorem ANSELMS ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, dagegen, ist die Darstellung der Abhängigkeit des ersten Hauptergebnisses von dem, vorher schon bewiesenen, ,Axiom‘ von der ,möglichen‘ Existenz GOTTES ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang. Dem geht folgende Beobachtung voraus ''':''' Der Term ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, hat in seiner syntaktischen Stellung hier, im Theorem-3, nicht mehr den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist damit, in seiner Position als Konsequenz-Teil im Theorem ANSELMS, auch nicht mehr davon syntaktisch abhängig, sondern stützt sich formal-syntaktisch nur auf die behauptete Möglichkeit GOTTES; daher muss diese ,angenommene‘ Möglichkeit noch bewiesen <span style="color:#00B000">( ╞ )</span> werden. Dazu die Feststellung LEIBNIZ‘, der diesen Zusammenhang, und seinen Mangel, erkannt hat ''':'''
::Das Theorem ANSELMS ist <span style="color:#FF6000">» ''ein unvollständiger Beweis, der etwas voraussetzt, was man noch hätte beweisen'' <span style="color:#00B000">( ╞ )</span> ''sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' «</span>.
Diesen <span style="color:#FF6000">»''unvollständigen Beweis''«</span> hat GÖDEL im 1. Beweisgang mit dem ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleiteten, und widerspruchfreien Möglichkeits-Korollar-1, vervollständigt, und damit hat er mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span> bewiesen ''':''' <span style="color:#FF6000">»''Diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens''«</span> enthält <span style="color:#FF6000">»''keinen Widerspruch''«</span> '''!''' Das Korollar-1 ist nur vom logischen Axiom-1 und von der mathematischen Äquivalenz der Perfektionen, <span style="color:#00B000">(der Transzendentalien)</span>, im Axiom-2 ,abhängig‘, und nicht mehr von der ,methodologischen‘ Kalkül-Prämisse, dem traditionellen GOTT-Glauben. Damit hat das Glaubens-Theorem ANSELMS die gesuchte <span style="color:#FF6000">»''mathematische Evidenz''«</span> erreicht, unabhängig von jeder Glaubensüberzeugung. Entscheidend dafür ist der mathematisch-logische Beweis GÖDELS, dass der Nicht-GOTT-Glaube zu einem Widerspruch führt.
Zusammenfassung ''':'''
Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>, ist die logische Konsequenz aus der Prämisse im 1. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, den, — <u>modal-frei</u> — gewählten, ,angenommenen‘ positiven Eigenschaften, bzw. ,Transzendentalia‘.
Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' <span style="color:#FF6000">»''GOTT-Sein ist das Wesen GOTTES''«</span>, ist die logische Konsequenz aus der Prämisse im 2. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, dem, — <u>modal-frei</u> — gewählten, ,angenommenen‘ GOTT-Glauben der Christen.
Im Unterschied dazu ist im 3. Beweisgang, das Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' der Glaube, dass es einen GOTT notwendig gibt ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, die logische Konsequenz aus dem, — <u>modal-notwendig</u> — als widerspruchsfrei ,bewiesenen‘, Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, im 1. Beweisgang, <span style="color:#00B000">(auch im Beweisgang ,Widerlegung‘ im Anhang)</span>, und damit ist das Glaubens-Theorem-3, als ganzes, ,widerspruchsfrei‘. Das Theorem ANSELMS ist, mit Korollar-1, nur vom logischen Axiom-1 der Widerspruchsfreiheit, und der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften, <span style="color:#00B000">(aller Transzendentalia)</span>, im Axiom-2, abhängig. Damit ist die Bedingung für die geforderte, spezielle <span style="color:#FF6000">»''mathematische Evidenz''«</span>, und auch für die Widerspruchsfreiheit im Glaubens-Theorem ANSELMS erfüllt; unabhängig von jeder Glaubensüberzeugung. Weil es <span style="color:#FF6000">„modal wahr“</span> ist, dass die Transzendentalien, bzw. die Vollkommenheiten ontologisch, — dem Sein nach —‚ alle <span style="color:#00B000">(zueinander)</span> widerspruchsfrei, und alle <span style="color:#00B000">(miteinander)</span> gleichwertig sind, ist es auch <span style="color:#FF6000">„modal wahr“</span>, dass es möglich ist, dass GOTT, — dem Sein nach —‚ da ist, <span style="color:#00B000">(d.h. existiert)</span>, der die unbegrenzte Summe aller ultimativen Transzendentalia, bzw. der unendlichen Vollkommenheiten allen Grades ist, wie es der ,christliche Glaube‘ des Erzbischofs ANSELM und seiner Anvertrauten ,annimmt‘.
====<div class="center"><span style="color:#660066">Widerlegung</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDEL-Kalkül : der Möglichkeitsbeweis als Widerlegung des Nicht-GOTT-Glaubens</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe_____________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist X nicht positiv“} \\
\text{(Axiom 2)} & \quad \Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaft Y in allen x, die aus der Eigenschaft X in allen x} \\
\text{ } & \quad & \ & \; \; \text{mit modaler Notwendigkeit folgt, ist eine positive Eigenschaft“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Korollar-1)} &\quad \Diamond \; \exists x \ G \ x \ & \ & \; \; \text{( „das —,x‘— steht für den GOTT, —,G‘—, der Christen“ )} \\
\text{ } & \text{„Es ist möglich, dass es den GOTT der Christen gibt“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad \; \neg \Diamond \; \exists x \ G \ x \ & \ & \text{ AE: „Es ist unmöglich, dass es diesen GOTT gibt“ (dezidierter Atheismus)} \\
\text{02} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{03} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{04} & \quad \neg\neg \Box \neg \exists x \ G \ x \ & \ & \text{:01:[ ◇A ↔ ¬□¬A ] :: (Modalregel) } \\
\text{05} & \quad \neg\neg \Box \neg\neg \forall x \neg \ G \ x \ & \ & \text{:04:[ ∃xA ↔ ¬Ɐx¬A ] :: (Quantorenregel) } \\
\text{06} & \quad \text{ ├ }\; \Box \; \forall x \neg G \ x \ & \ & \text{:05:NEG :: [ ¬¬A↔A ] :: (Gesetz der Aussagenlogik) } \\
\text{07} & \quad \Box \; \forall x \neg G \ x \Leftrightarrow\ W & \ & \text{:01:06:[ (:01:↔W) → (├:06:↔W) ] :: (Kalkülregel) } \\
\text{08} & \quad \Box \; \forall x \ G \ x \Leftrightarrow\ F & \ & \text{:07:[ (¬A↔W)↔(A↔F) ] :: (Regel für Wahrheitswerte)} \\
\text{ } & \text{„Jeder GOTT-Glaube ist notwendig falsch ! “} & \ & \Longleftarrow\; \text{die logische Konsequenz aus der Prämisse :01: !} \\
\text{09} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:02:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{10} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (\neg x = x)) & \text { } & \text{:08:09:[ (:08:↔F) → (:09:↔F) ] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{11} & \quad \Box \; \forall x (\ G \ x \Rightarrow \; (\neg x = x)) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=(¬x= ..)) } \\
\text{12} & \quad \ P (\neg x = .. ) & \ & \text{:10:11:[ Modus ponens ] :: [ A→B, A ├ B ]} \\
\text{13} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{14} & \quad \neg P (\ x = .. )\ & \ & \text{:12:13:[ Modus ponens ] :: (log. Schlussregel)}\\
\text{15} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:03:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{16} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) & \ & \text{:08:15:[ (:08:↔F) → (:15:↔W) ] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{17} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=( x= ..))} \\
\text{18} & \quad \ P (\ x = .. )\ & \ & \text{:16:17:[ Modus ponens ]}\\
\text{19} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ &
\text{:14:18:[ Konjunktion ] ⇒ Kontradiktion !}\\
\text{20} & \quad \neg \Diamond \; \exists x \ G \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:01:19:[ ├A├B╞ A→B ] :: ''KONDITIONALER BEWEIS''}\\
\text{ } & {\color{RedOrange}\text{Der Atheismus führt zu einem logischen Widerspruch ! }} & \ & \Longleftarrow\; \text{was mit Term :20: bewiesen ist !} \\
\text{21} & \quad \neg\neg \Diamond \; \exists x \ G \ x & \ & \text{:20:19:[ Modus tollendo tollens ] :: [ A→B,¬B ├ ¬A ]}\\
\text{22} & \quad \; \Diamond \; \exists x \ G \ x & \ & \text{:21:NEG }\\
\text{(Korollar-1)} & \;\text{„Es ist definitiv möglich, dass es diesen GOTT gibt“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\end{align}</math>
</small>
|}
Anmerkung-7 ''':''' <span style="color:#00B000">( Dieser Beweisgang ist praktisch identisch mit dem 1. Beweisgang, jedoch gestrafft und präzisiert nach G.J.WIRSCHING. Diese Widerlegung des Nicht-GOTT-Glaubens beginnt sofort mit dem Korollar-1 <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> aus dem 1. Beweisgang, als in Frage gestelltes ,Theorem‘, und beweist, ohne das Axiom-3 <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, und ohne die GÖDEL-Prämisse <span style="color:#4C58FF">— ,'''PX'''‘ —</span>, in einem Zwischenergebnis, die innere Widersprüchlichkeit und damit auch die Unhaltbarkeit der atheistischen Glaubens-Annahme, aus rein logischen ,Gründen‘, bzw. Axiomen. )</span>
Dieser Beweisgang geht von der Existenz GOTTES, <span style="color:#4C58FF">— ,'''G'''‘ —</span>, als Glaubens-Annahme, aus, wobei aber die Möglichkeit seiner Existenz, und damit die Sinnhaftigkeit des Glaubens an GOTT, durch die Prämisse :01: in Frage gestellt wird, und daher im Kalkül überprüft werden muss. Denn mit der Behauptung der Existenz GOTTES allein ist es nicht getan. Es muss auch seine ,Möglichkeit‘, d.h. die Sinnhaftigkeit des Glaubens an GOTT aufgewiesen werden. LEIBNIZ hat als erster, <span style="color:#00B000">(nach ANSELM)</span>, dieses Problem gesehen, und GÖDEL hat dafür die Lösung gefunden. Dieser Beweisgang, <span style="color:#00B000">(analog zum Möglichkeitsbeweis von Günther J. WIRSCHING konzipiert)</span>, setzt in den Axiomen, genau wie im 1. Beweisgang, die Existenz von etwas <span style="color:#FF6000">„Positiven“, „Perfekten“, „Vollkommenen“</span>, <span style="color:#4C58FF">— ,'''P'''‘ —</span>, <span style="color:#00B000">(d.h. die Transzendentalien)</span>, allgemein für die Welt voraus, <span style="color:#00B000">(was im Axiom-3 ''':''' <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, auch GOTT ultimativ zugeordnet wird ''':''' <span style="color:#FF6000">»''GOTT ist absolut positiv, perfekt und vollkommen''«</span>)</span>; das dann im 2. Beweisgang mit Term :13: als widerspruchsfrei, <span style="color:#00B000">(als ,wahr‘ und ,annehmbar‘ im Kontext des christlichen Glaubens)</span>, schon ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> worden ist. Die Existenz von ,Transzendentalien‘ in der Welt, ist ein, mit Beispielen belegbares, allgemeines Faktum; ihre Existenz auch in GOTT ist mit dem Term :13: des 2. Beweisganges bewiesen, die jedoch im Unendlichen, GOTT, als Transzendentalia, auch in ,ultimativer‘ Form vorliegen. Axiom-1 ,besagt‘, dass Eigenschaften nicht zugleich, vollkommen und nicht vollkommen, sein können. Axiom-2 ,besagt‘, dass, allgemein, alle Vollkommenheiten, <span style="color:#00B000">(alle Transzendentalien)</span>, gleichwertig, <span style="color:#00B000">(mathematisch äquivalent)</span>, sind. <span style="color:#00B000">(Axiom-2 wird hier um das GÖDEL-Konjunkt <span style="color:#4C58FF">— ,'''PX'''‘ —</span> verkürzt dargestellt. Damit ist auch Axiom-3 für diesen Beweisgang unnötig geworden, ohne dass sich wegen dieser Kürzung am Ergebnis etwas ändert. Axiom-2 wird jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn seine Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind, die keine ,Transzendentalia‘ sind.)</span> Die Eigenschaft <span style="color:#4C58FF">— (¬x=..) —</span> ,besagt‘, dass GOTT <span style="color:#FF6000">„unvergleichlich“</span> ist, wenn <span style="color:#4C58FF">,'''x'''‘</span> für GOTT steht. <span style="color:#00B000">(Der informelle Term, <span style="color:#4C58FF">— (¬x=..) —</span>, ersetzt hier, wie bei A. FUHRMANN, den formal korrekten Abstraktionsausdruck ''':''' <span style="color:#4C58FF">— λy.(¬x=y) —</span>, aus dem Lambda-Kalkül.)</span> Der Term :16: <span style="color:#4C58FF">— (x=x) ↔ W —</span> steht für die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚IST‘'' <span style="color:#00B000">(aus mir selbst)</span>«</span>, der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES. Der GOTT der abendländischen, christlichen Tradition wird mit <span style="color:#4C58FF">— ,'''G'''‘ —</span> bezeichnet ''':''' d.i. der <span style="color:#FF6000">„GOTT der Christen“</span>, entsprechend der ,methodologischen‘ Prämisse und der ,Genese‘ des Kalküls, syntaktisch formalisiert in der Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn es alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>, nach der Vorgabe von LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Mit Korollar-1 hat dieser Beweisgang dasselbe Endergebnis, wie der 1. Beweisgang. Der Beweis, dass der dezidierte Atheismus zu einem logischen Widerspruch führt, und damit falsch ist, ist ein Zwischenergebnis in diesem Beweisgang, und begründet mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, und unabhängig von jeder Glaubensüberzeugung, den, von LEIBNIZ gesuchten, Möglichkeitsbeweis für die Existenz GOTTES im Argument des Erzbischofs, und bestätigt damit die Sinnhaftigkeit des GOTT-Glaubens. Einmal Axiom-1 und zweimal Axiom-2 sichern hier das Ergebnis des Kalküls ''':''' das Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>''':''' <span style="color:#FF6000">»''Es ist definitiv möglich, dass es den GOTT der Christen gibt''«</span>. Diese zwei Axiome sind die einzigen, und modal-notwendigen, d.h. die transzendentalen Voraussetzungen und Bedingungen für das Endergebnis ''':''' der Widerspruchsfreiheit und Sinnhaftigkeit des Glaubens der Christen an GOTT; <span style="color:#00B000">(dasselbe gilt natürlich auch für die <span style="color:#4C58FF">„theologische“</span> Weltanschauung jeder monotheïstischen Religion '''!''' Dem Erzbischof ANSELM ging es damals nur um seinen Glauben an GOTT.)</span>.
Die Logik-Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso sequitur quotlibet, etiam verum“</big></span></span>, <span style="color:#00B000">(‚Aus Falschem folgt irgendetwas, auch Wahres‘)</span>, ist der scholastische Ausdruck für die ‚Implikation‘ <span style="color:#00B000">(Folgerung)</span> von Aussagen, die nur dann falsch, <span style="color:#4C58FF">— F —</span> ist, wenn das Antezedens wahr, <span style="color:#4C58FF">— W —</span>, und die Konsequenz falsch, <span style="color:#4C58FF">— F —</span> ist. Andernfalls ist sie immer wahr, <span style="color:#4C58FF">— W —</span>, auch wenn die Voraussetzung falsch, <span style="color:#4C58FF">— F —</span> ist ''':''' ‚Modern‘ darstellbar durch die ‚Wahrheitswertetafel‘ für die ‚materiale Implikation‘, <span style="color:#4C58FF">— ,(A → B)‘ —</span> <span style="color:#FF6000">„wenn A, dann B“</span>. Damit ist auch der <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ] </span> verstehbar; <span style="color:#00B000">(vgl. die vierte Zeile der ‚materialen Implikation‘)</span>. Der positive hypothetische Syllogismus ''':''' <span style="color:#4C58FF">[ Modus ponendo ponens ] :: [ A → B, A ├ B ] </span> ist aus der ersten Zeile ablesbar.
Die folgende Tabelle gibt für jeden ,Wahrheitswert‘ der Aussagen <math>A</math> und <math>B</math> das Resultat einiger zweiwertiger Verknüpfungen an ''':'''
{|class="wikitable hintergrundfarbe2" style="text-align:center;"
|-
!colspan="2"|''Belegung''!!Konjunktion!!Disjunktion!!materiale<br /> Implikation!!Äquivalenz<br /> Bikonditional!!kopulative<br /> Konjunktion
|-
!<math>A</math>
!<math>B</math>
!<math>A</math> und <math>B</math>
!<math>A</math> oder <math>B</math>
!wenn <math>A</math> dann <math>B</math>
!sowohl <math>A</math> als auch <math>B</math>
!entweder <math>A</math> oder <math>B</math>
|-
!W!!W
|W||W||W||W||F
|-
!W!!F
|F||W||F||F||W
|-
!F!!W
|F||W||W||F||W
|-
!F!!F
|F||F||W||W||F
|}
<span style="color:#00B000">(Eine ‚Konjunktion‘ ist nur dann ,wahr‘, wenn beide Aussagen einer ‚Konjunktion‘ wahr sind. Eine ‚kopulative Konjunktion‘ ist nur dann ,wahr‘, wenn entweder die eine, oder die andere Aussage der ‚kopulativen Konjunktion‘ wahr ist. Es besteht also eine Wenn-Dann-Verbindung zwischen beiden Aussagen — eine ,Kopplung‘. Das ist die logische Grundlage von Axiom-1 im GÖDEL-Formalismus)</span>
Um das Widersprüchliche der ,Annahme‘ nachzuweisen, dass positive Eigenschaften ,nicht konsistent‘ seien, <span style="color:#00B000">(im 1. Beweisgang)</span>, bzw. um das Unlogische und Sinnwidrige der ,Annahme‘ klarzustellen, es sei ,unmöglich‘, dass es einen GOTT gibt, <span style="color:#00B000">(hier, in der Widerlegung)</span>, verwendet das GÖDEL-Kalkül den Gegensatz ''':''' wahr, <span style="color:#4C58FF">— W —</span>, falsch, <span style="color:#4C58FF">— F —</span>, zwischen der dritten und vierten Zeile der Wahrheitswertetafel, für zwei ,wahre‘ <span style="color:#4C58FF">— W —</span> ,materiale Implikationen‘, in denen die Voraussetzung jeweils falsch, <span style="color:#4C58FF">— F —</span>, ist, entsprechend der Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso, <span style="color:#4C58FF">— F —</span>, sequitur quotlibet, <span style="color:#4C58FF">— F —</span>, etiam verum, <span style="color:#4C58FF">— W —</span>“</big></span></span>, jeweils mit der Hilfe von Axiom-1 und Axiom-2, in einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>; hier unabhängig von jeder Glaubensüberzeugung. Im Gegensatz dazu, wird, <span style="color:#00B000">(im 2. Beweisgang)</span>, aus dem Glauben an GOTT, auch mit einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, speziell mit Axiom-1, das Widersprüchliche in der ,Annahme‘ nachgewiesen, es gäbe in GOTT <span style="color:#FF6000">»''keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span>, d.h. keine ,Transzendentalia‘. In dieser <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, im 2. Beweisgang, wird vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span> ''':''' es gibt den GOTT der Christen, <span style="color:#00B000">(als Prämisse :01:)</span>, der ,unvergleichlich‘ und ,einzigartig‘ ist, und in dem auch alle ,Transzendentalia‘ <span style="color:#FF6000">„koinzident“</span> ,eins‘ sind, entsprechend Axiom-2.
Für KANT entsteht ein Widerspruch in den Prädikaten eines Satzes.
::<span style="color:#FF6000">»</span> ''Wenn ich das Prädicat in einem identischen Urtheile aufhebe'', <span style="color:#00B000">[ durch eine Negation ]</span>, ''und behalte das Subject, so entspringt ein Widerspruch''. <span style="color:#00B000">[ Wenn ich sage ''':''' ,''GOTT ist nicht allmächtig''‘, entsteht ein Widerspruch zur richtigen Aussage ''':''' ,''GOTT ist allmächtig''‘. ]</span> … ''Wenn ihr aber sagt ''':''' ,GOTT ist nicht‘, so ist weder die Allmacht, noch irgendein anderes seiner Prädicate gegeben; denn sie sind alle zusammt dem Subjecte aufgehoben'', <span style="color:#00B000">[ negiert ]</span>, ''und es zeigt sich in diesem Gedanken nicht der mindeste Widerspruch.'' <span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 398f; https://www.korpora.org/kant/aa03/398.html</ref>
Es ist richtig, wie KANT sagt, der Widerspruch entsteht nicht in dem Gedanken ''':''' <span style="color:#FF6000">»</span>''GOTT ist nicht''<span style="color:#FF6000">«</span>. GÖDEL zeigt daher, dass der Widerspruch erst dann entsteht, wenn von der Annahme ausgegangen wird ''':''' ''<span style="color:#FF6000">»</span>Es ist unmöglich, dass GOTT ist''<span style="color:#FF6000">«</span>. Daraus folgt dann ,regulär‘, mit Hilfe von Axiom-1 und Axiom-2, <span style="color:#00B000">(d.h. mit den Theoremen von den Transzendentalien)</span>, die logische ,Möglichkeit‘ GOTTES, unabhängig von jeder Glaubensüberzeugung. Wie LEIBNIZ klar erkannt hat, muss zuerst, aus dem Widerspruch des Gegenteils, die logische ,Möglichkeit‘, <span style="color:#00B000">(die Konsistenz)</span>, der Existenz GOTTES bewiesen werden ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, bevor daraus die reale ,Notwendigkeit‘ GOTTES abgeleitet werden kann ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, dessen ,Existenz‘ jedoch, aus dem ,Glauben‘, im Voraus, schon angenommen worden ist. Dieser Sachverhalt ist das ausschließliche Spezifikum GOTTES, <span style="color:#00B000">(das <span style="color:#FF6000">»''Privilegium der Gottheit allein''«</span>)</span>, und gilt nur bei GOTT, als dem Unvergleichlichen und Einzigartigen. Dieses ,Spezifikum‘ wird im Theorem ANSELMS abgebildet ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, auf Grund von Axiom-2, das den inneren Zusammenhang, die Koinzidenz auch von ,Möglichkeit‘ und ,Notwendigkeit‘ im Unendlichen, GOTT, erkennen lässt. Bis Zeile 10, im 3. Beweisgang, reicht der Geltungsbereich der ,modal‘-frei gewählten Kalkül-Prämisse :01:, der ,methodologische‘ GOTT-Glaube. In Zeile 11 liegt der ,Schwerpunkt‘ des ontologischen Beweises dann aber am, — modal als notwendig — ,bewiesenen‘ Widerspruch des Gegenteils zum GOTT-Glauben, <span style="color:#00B000"> (formal-syntaktisch dargestellt als widerspruchfreies Antezedens, <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang)</span>, und nicht mehr am ,angenommenen‘ GOTT-Glauben der Kalkül-Voraussetzung, <span style="color:#00B000">(nun dargestellt als Konsequenz <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> im Theorem ANSELMS)</span>. Das Möglichkeits-Korollar-1 muss jetzt immer, wie folgt, gelesen werden ''':''' <span style="color:#FF6000">»''Es ist <u>widerspruchfrei</u> möglich, dass GOTT ist''«</span>. Damit hat er, — angeregt durch LEIBNIZ, und mit ihm —, die fast einhellig akzeptierte Fehldeutung des ontologisch-<span style="color:#4C58FF">„theologischen“</span> Arguments ANSELMS für GOTT durch gewichtige philosophische, <span style="color:#00B000">(KANT<ref>GOTT ist absolut einzigartig und unvergleichlich. KANT macht GOTT jedoch zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, indem er die Existenz, bzw. das ,Sein‘ GOTTES mit dem ,Sein der Dinge‘ gleich setzt. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! KANT verkennt damit die Einzigartigkeit und Besonderheit GOTTES. Das ,Sein‘ der Dinge ist, — wie KANT sagt —, kein ,reales Prädikat’, d.h. Existenz ist keine Eigenschaft. Jedoch in GOTT ist ,Sein‘ ein ,reales Prädikat‘, d.h. Existieren ist ,real‘ die Wesenseigenschaft GOTTES, denn GOTT ist der, der für uns, — aus Liebe —, immer schon ,da‘ ist ''':''' in der ,Hypostatischen Union‘, sowohl als GOTT von Ewigkeit zu Ewigkeit, als auch als Mensch in unserer Zeitlichkeit. Das ist das, was GOTT für uns ausmacht —, sein Wesen.</ref>)</span>, und <span style="color:#4C58FF">„theologische“</span>, <span style="color:#00B000">(THOMAS<ref>GOTT ist absolut einzigartig und unvergleichlich. THOMAS unterscheidet die ,Natur GOTTES‘ nicht von der ,Natur der Dinge‘, indem er die ,Natur‘ des GOTTES ANSELMS irrtümlich mit der ,Natur‘ der Dinge gleich setzt. Damit reiht er GOTT unter die vielen Dinge unserer Welt ein, indem er für den GOTT ANSELMS annimmt ''':''' GOTT ,esse in rerum natura‘, d.h. wörtlich, dass der GOTT ANSELMS in der ,Natur‘ der Dinge existiert, <span style="color:#00B000">(was ANSELM nie gesagt hat)</span>. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! Die ,zeitlose-überzeitliche‘ Wirklichkeit, (Natur), GOTTES ist völlig verschieden und unabhängig von der zufälligen Wirklichkeit, (die ,Natur‘), unserer ,raum-zeitlichen‘ Welt. Daher ist sie mit dieser auch nicht vergleichbar. Thomas verkennt damit die Einzigartigkeit und Besonderheit GOTTES.</ref>)</span>, Autoritäten zurechtgerückt, welche die Einzigartigkeit und Unvergleichlichkeit des Unendlichen, GOTT, bei ihrer Beurteilung des Theorem ANSELMS nicht berücksichtigt, sondern den Unendlichen, <span style="color:#00B000">(irrtümlich)</span>, unter die endlichen Dinge unserer Welt eingereiht haben. GÖDEL hat mit dem bewiesenen Widerspruch des Gegenteils zum GOTT-Glauben, den Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Theorem ANSELMS geliefert, was, nach LEIBNIZ, für die Akzeptanz dieses Theorems noch gefehlt hat. Das Theorem ANSELMS besagt universell ''':''' Die <span style="color:#FF6000">»''theologische Weltanschauung''«</span> der Juden, Christen und Muslime, <span style="color:#00B000">(und des ägyptischen Pharaos ECHNATON und seiner Frau NOFRETETE)</span>, die ,annehmen‘, dass es mit ,Notwendigkeit‘ <span style="color:#4C58FF">— ‚'''□'''‘ —</span> <span style="color:#00B000">(nur)</span> einen GOTT gibt, ist logisch richtig und <span style="color:#FF6000">»''mathematisch evident''«</span>, weil es <u>ohne Widerspruch</u> ,denkbar‘ <span style="color:#4C58FF">— ‚'''◇'''‘ —</span> ist, dass es GOTT gibt ''':''' Nicht mehr und nicht weniger, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>.
Es geht hier bei GÖDEL nicht um Theoriefindung oder ähnliches. GÖDEL ist kein ,spekulierender‘ Theoretiker. GÖDEL ist Logiker und Mathematiker. Was er sagt, ist mathematisch wahr und logisch richtig. Wenn er sagt, dass die Aussage ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ — »''wahr''«</span> ist ''':''' <span style="color:#FF6000">»''es ist möglich, dass es Gott gibt'' ''':''' ''das ist ,wahr‘ wegen Axiom-2 (und Axiom-1)''«</span>, dann spricht er hier von der mathematischen Wahrheit. Logischerweise ist dann die konträre Aussage ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ — »''falsch''«</span> ''':''' <span style="color:#FF6000">»''es ist nicht möglich, dass es einen Gott gibt''«</span>, und zwar mathematisch falsch, weil sich aus dieser Aussage ein Widerspruch ergibt. Jeder, der die mathematische Logik GÖDELS lesen kann, kann das sehen und verstehen ''':''' Das Zwischenergebnis, <span style="color:#00B000">(Term :20:)</span>, in dieser Kalkül-Ableitung, die logische Konsequenz aus der Annahme des dezidierten Atheismus, es sei unmöglich, dass es GOTT gibt, ist der faktische, nachprüfbare, und für jeden Menschen sichtbare Beweis dafür, dass diese Annahme in einen Widerspruch mündet, und damit falsch und unlogisch ist. Das bedeutet, es ist eine Tatsache, bzw. es ist ein allgemein gültiges Faktum unser Welt, dass der Atheismus, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, wirklich falsch und unsinnig ist, und daher, mit Recht, als ,Unsinn‘ bezeichnet werden darf '''!''' Das ist nicht bloß als eine Theoriefindung, oder als eine Interpretation eines Autors zu verstehen. Das ist vielmehr genau so wahr und <span style="color:#FF6000">»''mathematisch evident''«</span>, wie, dass zwei mal zwei vier ergibt, und wirklich genau so logisch richtig, wie, dass die Erde sich um die Sonne dreht. Das ist gerade das Überraschende und Unerwartete am Gödel-Kalkül. Es geht hier nicht mehr um Theoriefindung oder Interpretationen, denen man zustimmen kann oder nicht. Es geht hier <span style="color:#FF6000">»''rein verstandesmäßig''«</span> um mathematisch-logische Fakten. Damit steht GÖDEL, in seiner Bedeutung, in gewisser Weise, neben KOPERNIKUS, weil seine Kalkül-Ergebnisse, wie die Berechnungs-Ergebnisse dieses Pioniers der damaligen Zeitenwende, heute, in unserem Äon, ebenfalls mit eingefleischte Vorurteile aufräumen, ohne aber, dass GÖDEL für sich selbst, im Glauben, logisch konsequent gewesen wäre. <span style="color:#00B000">(Er ist sich der Tragweite und der Konsequenzen seiner <span style="color:#4C58FF">„axiomatischen Theologie“</span> anscheinend nicht bewusst gewesen, wenn er sagt ''':''' Man sei heute noch <span style="color:#FF6000">»''weit davon entfernt, das theologische Weltbild wissenschaftlich begründen zu können''«</span>, nachdem sein Kalkül das <span style="color:#FF6000">„atheistische Weltbild“</span> fundamental ins Wanken gebracht und als irrationalen ,Unsinn‘ entlarvt hat. Sein Kalkül ,beweist‘ ( ╞ ) indirekt, dass das <span style="color:#FF6000">„theologische Weltbild“</span>, im Beweisgang ,Widerlegung‘, aus dem Widerspruch des Gegenteils, mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span>, offensichtlich doch, wissenschaftlich begründet werden kann)</span>.
----
Kurt GÖDEL ist auch deswegen ein Ausnahmelogiker.
----
===<div class="center"><span style="color:#660066">Epilog für Skeptiker</span></div>===
Wenn man das GÖDEL-Argument genau liest, dann ist nur die Annahme ''':''' <span style="color:#FF6000"> „es ist möglich, dass es GOTT gibt“</span> bewiesen, weil aus der Annahme ''':''' <span style="color:#FF6000">„es ist unmöglich, dass es GOTT gibt“</span> ein logischer Widerspruch ableitbar ist. Die Aussage ''':''' <span style="color:#FF6000">„es gibt GOTT“</span> ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Menschen, der dann aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann ''':''' <span style="color:#FF6000">»''es gibt GOTT wirklich''«</span>, wenn er will ''':''' <span style="color:#FF6000">»''Es stimmt also, was ich glaube '''!''''' «</span> Das ist das Argument ANSELMS, der ein christlicher Amtsträger war, und der daher von dieser Grundannahme auch ausgeht. Solange in den Voraussetzungen des Möglichkeitsbeweises im GÖDEL-Kalkül kein Widerspruch nachweisbar ist, und solange in der logischen Durchführung dieses Beweises keine schweren Mängel festgestellt werden können, ist das Ergebnis des Möglichkeitsbeweises, wie GÖDEL ihn durchgeführt hat, korrekt, und die Folgerungen daraus, logisch richtig, dass es sich hier um <span style="color:#FF6000">»''mathematische Evidenz''«</span> handelt, <span style="color:#00B000">(z. B. wie 2 x 2 = 4)</span>. Aber niemand ist gezwungen, aus der Möglichkeit, dass es GOTT gibt, daraus zu schließen, dass es GOTT auch mit Notwendigkeit gibt, wie das im Argument ANSELMS geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit LEIBNIZ, der selbst an GOTT geglaubt hat, mit Bestimmtheit sagen ''':''' <span style="color:#FF6000">»''gesetzt, dass GOTT möglich ist, so ist er, was das Privilegium der Gottheit allein ist''«</span>, weil GÖDEL mit seinem Kalkül den noch ausstehenden Beweis der Widerspruchsfreiheit dafür geliefert hat.
Wenn Du den 3. Beweisgang des GÖDEL-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument ANSELMS, der identisch ist mit dem Term in der Zeile 10, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, immer noch formallogisch abhängig ist von der methodologischen Glaubens-Prämisse, Term :01:, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den Gott der Christen''«</span>. Diese Abhängigkeit ist bis zur Zeile 10 offensichtlich und logisch korrekt. <span style="color:#00B000">(Man könnte nach dieser Zeile, ohne Weiteres, ,regulär‘ die <span style="color:#FF6000">„logische Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A→B ]</span> mit Term :01: und Term :10: als ein mögliches Korollar bilden ''':''' <span style="color:#4C58FF">— ‚'''Gx→□∃xGx'''‘ — </span>)</span>. Das bedeutet, der Konsequenz-Teil im Theorem ANSELMS, der in diesem ,regulär‘-möglichen Korollar an zweiter Stelle steht, ist damit in seiner Formal-Struktur offensichtlich ,regulär‘ von der Glaubens-Prämisse, Term :01:, abhängig, d.h. er ist der Ausdruck einer Glaubensüberzeugung. Im Theorem ANSELMS steht er jetzt, in der Zeile 11, als Konsequenz-Teil auch an zweiter Stelle, hat aber nicht mehr seine Glaubens-Prämisse als notwendige Bedingung an erster Stelle vor sich, wie im ,regulär‘-möglichen Korollar. Jetzt steht eine neue und andere Voraussetzung als Begründung vor ihm. Der Schwerpunkt des Argument ANSELMS liegt damit am Begründungs-Teil des ANSELM-Theorems, der jetzt die erste Stelle im Theorem einnimmt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist möglich, dass es GOTT gibt''«</span>, der erst dadurch entstanden ist, und davon abhängig ist, weil sein Gegenteil ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist unmöglich, dass es GOTT gibt''«</span>, zu einem Widerspruch geführt hat. Dieser Begründungs-Teil, das Antezedens, im Argument ANSELMS, ist daher nicht mehr von der methodologischen Glaubens-Prämisse, Term :01:, abhängig, sondern nur vom Axiom-1, der Widerspruchsfreiheit, und von der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften im Axiom-2, die im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, die Widerspruchsfreiheit der Möglichkeit des GOTT-Glaubens mit Notwendigkeit herbeigeführt haben. Daraus ergibt sich eine logische Verschiebung in der Argumentationskette, denn dieser Begründungs-Teil, der jetzt die Widerspruchsfreiheit für den Konsequenz-Teil liefert, ist selbst unabhängig und frei von jeder Glaubensüberzeugung. Weil widerspruchsfrei und <span style="color:#FF6000">»''mathematisch evident''«</span>, muss er als logische Begründung für die Widerspruchsfreiheit und als Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Konsequenz-Teils gelesen werden, und damit bestätigt er die Widerspruchsfreiheit und Sinnhaftigkeit der Glaubensüberzeugung eines gläubigen Menschen, <span style="color:#00B000">(was auch das Ziel ANSELMS war)</span>. Das heißt also ''':''' der Glaube dieses Menschen ist widerspruchsfrei und sinnvoll, und enthält keinen Zirkelschluss, weil sein Gegenteil, der Nicht-GOTT-Glaube, zu einem Widerspruch führt; <span style="color:#00B000">(das hat GÖDEL mit seinem Kalkül-System bewiesen, dessen Argumentationskette mit einem Computer-Programm, dem sog. ,Theorembeweiser‘, überprüft worden ist, und als <span style="color:#FF6000">»''nachweisbar korrekt''«</span> befunden wurde)</span>. Das Theorem ANSELMS beweist, nach GÖDEL, dass der Glaube an GOTT, mit <span style="color:#FF6000">»''mathematische Evidenz''«</span> notwendig widerspruchsfrei und sinnvoll ist, weil der Nicht-GOTT-Glaube notwendig zu einem Widerspruch führt. <u>Das Theorem beweist jedoch nicht, dass die Existenz GOTTES notwendig ist</u>, <span style="color:#00B000">(wie es fast immer fälschlich gelesen wurde und wird)</span>, sondern, das Theorem ANSELMS geht davon aus, als nicht hinterfragtes Faktum, dass GOTT notwendig, schon immer existiert, und beweist, mit dem GÖDEL-Kalkül, dass diese Glaubens-Annahme widerspruchsfrei und sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL abschließend sagt. GOTT hat es ja auch nicht ,nötig‘, bewiesen zu werden. Für den Erzbischof ANSELM war die Existenz GOTTES, überall und jederzeit, die ungefragte und für ihn die selbstverständlichste Voraussetzung aller seiner Bemühungen, in seinem Leben, und in seinem Beruf als christlicher Amtsträger, und auch als Theologe in den philosophischen Überlegungen über seinen Glauben. Mit diesen Überlegungen hat er, mit GÖDEL, bewiesen ''':''' Glaube ist nicht irrational, kein Sprung ins Unbekannte, sondern eine freie, vernünftige Entscheidung. Glaube ist rational und vertrauenswürdig.
Zusammengefasst heißt das Ergebnis dieser Bemühungen ANSELMS ''':''' Wenn Du an GOTT glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist auch logisch in der <u>bewiesenen Möglichkeit</u>, dass es GOTT geben kann, begründet, und damit ist er widerspruchsfrei, sinnvoll und kein Zirkelschluss. Dein Glaube an GOTT beruht jedoch, nach wie vor und in erster Linie, auf Deiner freien Entscheidung für GOTT, und nicht auf dem Zwang einer ,logischen‘ Argumentation. Wenn Du nicht an GOTT glauben willst, dann <u>musst Du, und sollst Du, auch nicht deswegen</u> an GOTT glauben, weil der Nicht-GOTT-Glaube zu einem Widerspruch führt, und damit falsch und unlogisch ist. Denn der Glaube an GOTT muss immer eine freie und Deine ganz persönliche Entscheidung für GOTT sein und bleiben. Niemand darf zum Glauben an GOTT gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Warum '''?''' Weil GOTT die Liebe ist '''!''' Und die Liebe duldet keinen Zwang '''!'''
Zum Abschluss, und für eine bessere Verständlichkeit dieser Studie, hat die KI, der ich diese Studie für die Erstellung eines Podcast übergeben habe, eine, — sogar für Kinder —, verständliche Metapher kreiert. Sie sagt, man stelle sich vor ''':''' Es sei irgendwo ein ,Schatz’ vergraben, und es gäbe auch eine ,Schatzkarte’ für diesen ,Schatz’. Kurt GÖDEL ist nun gekommen, und hat mit seinem Kalkül bewiesen, dass diese ,Schatzkarte’ korrekt ist und fehlerfrei. Ob aber jemand, mit Hilfe dieser ,Schatzkarte’ auf ,Schatzsuche’ gehen will oder nicht ''':''' das ist und bleibt jedem selbst überlassen, und ist immer eine freie, und ganz persönliche Entscheidung. Damit hat die KI erstaunlich treffend, sowohl die Bedeutung, als auch die reale Funktion des GOTT-Glaubens in der Lebens-Wirklichkeit unserer Welt und Zeit charakterisiert, in Übereinstimmung mit der Gleichniserzählung JESU vom ,Schatz im Acker’; <small><span style="color:#00B000">( vgl. {{Bibel | Matthäus-Evangelium |13|44|EU}} )</span></small>. Der ,Schatz’ ist die <span style="color:#FF6000">„<span style="font-family: Times;"><big>Βασιλεία του Θεού</big></span>“</span><span style="color:#00B000"> | ,Basileía tou Theoú’</span>, d.h. das <span style="color:#CC66FF">»''Königtum GOTTES''«</span>, oder auch das <span style="color:#CC66FF">»''Himmelreich''«</span>. Die ,Schatzkarte’ ist der Glaube an GOTT. Die ,Schatzsuche’ ist der Weg des Glaubens in der Nachfolge JESU, der uns den Weg zeigt zum Ziel, zur Erfüllung aller unserer Sehnsüchte und Wünsche.
----
----
;Fußnoten
<references />
pryib402x0uurheqazssimch441btq6
1090684
1090683
2026-09-11T07:19:01Z
Santiago
19191
/* Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘ */ Zusatz
1090684
wikitext
text/x-wiki
[[Kategorie: Buch]]
{{Regal|ort=Philosophie}}
{{Vorlage:StatusBuch|9}}
==<div class="center"><span style="color:#660066">'''Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘'''</span></div>==
<span style="font-family: Times;"><big><div class="center">לַמְנַצֵּ֗חַ לְדָ֫וִ֥ד אָ֘מַ֤ר נָבָ֣ל בְּ֭לִבּוֹ אֵ֣ין אֱלֹהִ֑ים הִֽשְׁחִ֗יתוּ הִֽתְעִ֥יבוּ עֲלִילָ֗ה אֵ֣ין עֹֽשֵׂה־טֽוֹב׃
(Psalm 14,1)</div></big></span>
----
===<div class="center"><span style="color:#660066">Vorwort</span></div>===
Zur Orientierung ''':''' Die Diskussion um GOTT läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser ANSELM gesagt ''':''' <span style="color:#FF6000">»''Ich glaube an GOTT'' … <span style="color:#00B000">[ sonst wäre er sicher
nicht Erzbischof von Canterbury geworden ]</span> … ''aber ich möchte auch wissen und verstehen, ob das stimmt und sinnvoll ist, was ich da glaube '''!''''' «</span> Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Professor und Philosoph aus Königsberg, Immanuel KANT, hat das, was ANSELM da aufgeschrieben hat, gelesen, <span style="color:#00B000">(vermittelt durch CARTESIUS)</span>, und das dann den <span style="color:#FF6000">„ontologischen Gottesbeweis“</span> genannt, <span style="color:#00B000">(obwohl es in Wirklichkeit gar kein Gottesbeweis ist; genauer ''':''' es ist kein Beweis für die Existenz GOTTES)</span>, und dieser große KANT hat dann großartig bewiesen, das, was ANSELM da aufgeschrieben hat, sei falsch. Es sei <span style="color:#FF6000">„ja gar kein“</span> Gottesbeweis '''!''' <span style="color:#00B000">( Naja, was denn sonst '''?''' )</span> Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichbaren GOTT mit hundert Talern in seinem Vermögenszustande verglichen hat. <span style="color:#00B000">(Das ist aber eine andere Geschichte.)</span> Hundert Taler und GOTT haben ,an sich‘ nichts gemeinsam, außer, wenn KANT ,wirklich‘ hundert Taler hat, und GOTT auch ,wirklich‘ existiert, <span style="color:#00B000">(wie ANSELM und gläubige Menschen glauben)</span>, dann gibt es GOTT und die Taler eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit KANT läuft die ganze Diskussion um GOTT immer nur als Diskussion um den <span style="color:#00B000">(von KANT)</span> so genannten <span style="color:#FF6000">„ontologischen, <span style="color:#00B000">[ kosmologischen, teleologischen etc. ]</span> Gottesbeweis“</span> —, obwohl es niemals einen Beweis für die Existenz GOTTES geben kann und niemals geben wird. <span style="color:#00B000">(Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich versucht zu sagen, weil keiner dieser sog. Beweise für die Existenz eines GOTTES stringent ist.)</span> Beweisen kann man die Existenz von Naturgesetzen. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie dann mit Mehrheitenbeschlüsse verändern. Wenn GOTT ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz GOTTES wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. GOTT ist <span style="color:#FF6000">„Person“</span>, — für Christgläubige ''':''' <span style="color:#FF6000">„ein GOTT in drei Personen“</span>. Und GOTT ist <span style="color:#FF6000">„Geist“</span>. Das besagt, dass GOTT nicht mit materiellen Dingen aus unserer Welt verglichen werden darf; <span style="color:#00B000">(was sowohl THOMAS von Aquin als auch Immanuel KANT doch getan haben)</span>. Und ganz wesentlich ''':''' der Zugang zu GOTT läuft nicht über den Beweis, sondern immer nur über den Glauben. Wer an GOTT glauben will, dem antwortet GOTT auf seine Weise — nämlich <span style="color:#FF6000">„geistig“</span> bzw. <span style="color:#FF6000">„geistlich“</span>. Wer nicht an GOTT glauben will, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Glaube ist immer eine freie Entscheidung des Menschen für GOTT. Niemand darf gezwungen werden. Wenn es einen Beweis für GOTT gäbe, wäre jeder vernünftige Mensch gezwungen, an GOTT zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Existenzbeweis für GOTT '''!!!''' ... Daher darf man das Kalkül des Logiker GÖDEL, <span style="color:#00B000">(und damit auch das Theorem ANSELMS)</span>, nicht als einen Existenzbeweis für GOTT lesen. Sowohl ANSELM als auch GÖDEL setzen die Existenz GOTTES notwendig als gegeben schon voraus. Das GÖDEL-System, und auch das Theorem ANSELMS, sind bloß die logische Bestätigung der Widerspruchsfreiheit der Glaubensüberzeugung eines Menschen, der sich schon entschieden hat, an GOTT zu glauben; und nicht der Grund für seine Entscheidung. Alle sogenannten ,Gottesbeweise‘, sind in Wirklichkeit nichts anderes, als nachträgliche Evaluierungen eines GOTT-Glaubens, bzw. ,Wege‘, <span style="color:#00B000">(bei THOMAS von Aquin)</span>, die aufzeigen, dass der GOTT-Glaube widerspruchsfrei, sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL sagt. GOTT hat es nicht nötig, ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> zu werden.
===<div class="center"><span style="color:#660066">Einleitung</span></div>===
Eine Studie zum GÖDEL-Kalkül. Der Logiker Kurt GÖDEL <span style="color:#00B000">(1906-1978)</span> hat mit diesem Kalkül eine moderne Rekonstruktion des, <span style="color:#00B000">(von KANT)</span>, so genannten ‚ontologischen Gottesbeweises‘ nach ANSELM von Canterbury auf modal-logischer Basis vorgelegt. Damit hat er die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt, d.h. sie soll für jeden Menschen nachvollziehbar sein, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie er sagt. GÖDEL ,nimmt‘ als Logiker, angeregt durch den Philosophen und Mathematiker Gottfried Wilhelm LEIBNIZ, rein theoretisch, fürs Erste, einmal ‚an‘, <span style="color:#00B000">(als Prämisse, d.i. der Term :01: im 3. Beweisgang zum Theorem ANSELMS im Anhang)</span>, dass es GOTT gibt ''':''' d.i. ein sog. ,methodologischer GOTT-Glaube‘, und untersucht die logischen Konsequenzen. Dabei zeigt sich, beim genaueren Hinsehen, dass der ‚Nicht-GOTT-Glaube‘, der ‚dezidierte‘ Atheismus, <span style="color:#00B000">(im Beweisgang ,Widerlegung‘ im Anhang)</span>, überraschender Weise, zu einem Widerspruch führt, und damit logisch ,falsch‘ ist. Jedoch, GÖDEL kann und will mit seinem Kalkül keinen ,GOTT-Glauben‘ ,erzeugen‘, d.h. das GÖDEL-Kalkül ist kein <span style="color:#FF6000">„Existenz-Beweis"</span> für den GOTT der Bibel, sondern, es setzt die Existenz eines GOTTES, einfach als gegeben, schon voraus. GÖDEL beweist dann mit seinem System, dass der traditionelle abendländische ,GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, <span style="color:#00B000">(d.i. die Kalkül-Prämisse, und das, daraus ,regulär‘ (├ ) abgeleitete, Theorem ANSELMS)</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> <span style="color:#00B000">(d.h. logisch ,richtig‘)</span> ist, im Gegensatz zum ,Nicht-GOTT-Glauben‘, der davon ausgeht, dass es keinen GOTT gibt. GÖDEL beweist mit seinem System ''':''' der traditionelle GOTT-Glaube ist, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, widerspruchfrei und daher wahr. <span style="color:#00B000">(Der Beweis aus dem Widerspruch des Gegenteils ist ein ,indirekter Beweis‘ und kein ,Zirkelbeweis‘ '''!''' )</span> GÖDEL blieb bis zu seinem Tod ohne ein dezidiertes religiöses Bekenntnis. <span style="color:#00B000">(Das Leben ist nicht immer ,logisch‘.)</span>
Entsprechend der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> ist GOTT der Größte, <span style="color:#FF6000">»''über dem nichts Größeres mehr gedacht werden kann''«</span>, <span style="color:#00B000">(ANSELM)</span>; bzw. <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>, und der für uns immer schon ,da‘ ist. Das ist die methodologische Prämisse des GÖDEL-Kalküls. Davon ausgehend, zeigen seine Axiome und Definitionen, dass es zu einem Widerspruch führt, falls man ,annimmt‘, es sei nicht möglich, dass es <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> gibt. Aus dem Widerspruch des Gegenteils wird von GÖDEL, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, dann ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> ''':''' es ist doch möglich, dass es <span style="color:#FF6000">„GOTT“</span> wirklich gibt. Somit ist der Glaube an <span style="color:#FF6000">„GOTT“</span>, — weil widerspruchsfrei —, mit den Worten GÖDELS ''':''' <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span>.
Immanuel KANT <span style="color:#00B000">(1724-1804)</span> scheint diesen Fall vorausgesehen zu haben, dass versucht werden könnte, die ,Möglichkeit‘ GOTTES aus einem Widerspruch zu ,beweisen‘ ''':'''
::<span style="color:#FF6000">»</span> <span style="color:#00B000">[ Angenommen, es gibt ]</span> ''doch einen und zwar nur diesen '''Einen''' Begriff'' <span style="color:#00B000">[ ,GOTT‘, so dass ]</span> ''das Nichtsein oder das Aufheben seines Gegenstandes'' <span style="color:#00B000">[ GOTT ]</span>, ''in ,sich selbst‘ widersprechend sei; und dieses ist der Begriff des allerrealsten Wesens. Es hat, sagt ihr, alle Realität'', <span style="color:#00B000">[ bzw. alle Vollkommenheit ]</span>, ''und ihr seid berechtigt, ein solches Wesen als ,möglich‘ anzunehmen'' ... <span style="color:#00B000">[ denn das GÖDEL-Kalkül ,beweist‘ ( ╞ ) in der ,Widerlegung‘ im Anhang, wie auch im 1. Beweisgang, aus einem Widerspruch, dass die Existenz GOTTES definitiv logisch ,möglich‘ ist. ]</span> … ''obgleich der sich nicht widersprechende'', <span style="color:#00B000">[ ,mögliche‘ ]</span>, ''Begriff'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''noch lange nicht die'' <span style="color:#00B000">[ reale ]</span> ''Möglichkeit des Gegenstandes'', <span style="color:#00B000">[ GOTT ]</span>, ''beweiset. … Das ist eine Warnung, von der Möglichkeit der Begriffe (logische)'', <span style="color:#4C58FF">— '''◇''' —</span>, ''nicht sofort auf die Möglichkeit der Dinge (reale)'', <span style="color:#4C58FF">— '''□''' —</span>, ''zu schließen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 399; https://www.korpora.org/kant/aa03/399.html</ref>. <span style="color:#00B000">[ Trotz dieser Warnung, wird dieser Schluss dennoch im Theorem ANSELMS vollzogen, bzw. mit GÖDEL im 3. Beweisgang ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> '''!''' ]</span>. <span style="color:#FF6000">«</span>
Warum das <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist, und inwieweit KANT sich irrt, wird in dieser Studie gezeigt.
===<div class="center"><span style="color:#660066">Der Schlüsselbegriff im Kalkül</span></div>===
Der ‚Schlüsselbegriff‘ in diesem Kalkül ist <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Perfektion“, „Vollkommenheit“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Für diesen wichtigen Begriff gibt es aber im Kalkül selbst keine explizite Definition, sondern er wird nur durch seine Verwendung innerhalb des Kalküls indirekt ‚definiert‘. <span style="color:#00B000">(Das heißt ''':''' <span style="color:#4C58FF"> — ‚'''P'''‘ — </span> bezeichnet ein System von ,Eigenschaften‘, die ,positiv‘, bzw. ,vollkommen‘ | ,perfekt‘ | genannt werden, von denen im Kalkül wohl beweisbar ist, dass sie sich gegenseitig ,nicht widersprechen‘, weil sie im System als solche ,gleichwertig‘, bzw. gleich ,wahr‘ sind, jedoch ohne sie erschöpfend aufzählen zu können, oder auch nur sagen zu können, was sie alle im einzelnen bedeuten, außer, dass sie kompatibel sind.)</span> Mit der Wahl dieses Schlüsselbegriffes hat GÖDEL eine wesentliche Vorentscheidung für die Ergebnisse des Kalküls getroffen '''!''' In seinen Notizen zum ‚ontologischen Beweis‘ vom 10. Februar 1970 gibt GÖDEL, — für die nachträgliche Interpretation dieses Begriffes <span style="color:#00B000">(und auch für das Kalkül selbst)</span> —, die richtungsweisende Erklärung ''':'''
::<span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne...''«</span>
::Und er fügt in Klammer hinzu ''':'''
::<span style="color:#FF6000">»...''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span><ref>GÖDEL, Kurt, ''<span style="font-family: Times;"><big>‚Ontological proof‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Collected Works‘</big></span>'', vol. III, ed. S.FEFERMAN et al., Oxford (U.P.), 1995; 403–404.</ref>
GÖDEL-Axiom-1 ''':''' <span style="color:#4C58FF">— ‚('''PX <small><math>{ \color{Blue} \dot\lor}</math></small> P¬X''')‘ ↔<span style="color:#00B000"> ‚('''¬PX ↔ P¬X''')‘</span> — </span> ''':''' <span style="color:#FF6000"> »''Entweder die Eigenschaft'' <span style="color:#4C58FF">‚'''X'''‘</span> ''oder ihre Negation'' <span style="color:#4C58FF">‚'''¬X'''‘</span> ''ist positiv''«</span>. Hier ist der Hauptkritikpunkt, dass es Eigenschaften gibt, die ,an sich‘ weder positiv noch negativ sind. Beispiele wären ''':''' ‚rothaarig‘ oder ‚schwerwiegend‘; solche Eigenschaften können aber ,für mich‘ entweder positiv oder negativ sein, abhängig von meiner Betrachtungsweise und subjektiven Vorlieben. Diese Eigenschaften, wie ‚rothaarig‘ an sich, oder meine positiv-negativen ‚Betrachtungsweisen‘, sind jedoch der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> entnommen und treffen nicht den <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Er orientierte sich an LEIBNIZ, welcher im Bezug zum ‚ontologischen Beweis‘ definiert ''':'''
::<span style="color:#FF6000">»''Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''nenne ich jede einfache Eigenschaft, die sowohl positiv als auch absolut ist, oder dasjenige, was sie ausdrückt, ohne jede Begrenzung ausdrückt''.«</span><ref>Zitiert nach Thomas GAWLICK, in ''<span style="font-family: Times;"><big>‚Was sind und was sollen mathematische Gottesbeweise ?‘</big></span>'', Predigt vom 8.1.2012 in der Kreuzkirche zu Hannover. https://web.archive.org/web/20130524164359/http://www.idmp.uni-hannover.de/fileadmin/institut/IDMP-Studium-Mathematik/downloads/Gawlick/Predigt_Gawlick_Gottesbeweise.pdf</ref>
Die Seins-Eigentümlichkeiten <span style="color:#00B000">(Daseinsmodi, Perfektionen)</span> wie ‚wahr‘, ‚gut‘, ‚edel‘ usw. entsprechen dem <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Das sind Beispiele für ‚absolut‘ positive Begriffe aus der Lehre der Seinsanalogie ''':''' <span style="font-family: Times;"><big>‚verissimum‘, ‚optimum‘, ‚nobilissimum‘</big></span>, usw., die, an sich, <span style="color:#FF6000">»''ohne jede Begrenzung gelten''«</span>; zu finden in der <span style="font-family: Times;"><big>‚Via quarta‘</big></span>, bei THOMAS von Aquin, über die <span style="color:#FF6000">„analoge"</span> Abstufung im ‚Sein‘ der Dinge. Diese <span style="color:#FF6000">„analoge"</span> ‚Abstufung‘ ist dann die faktische Begrenztheit <span style="color:#00B000">(d.h. Unvollkommenheit)</span> im <span style="color:#FF6000">»''zufälligen''«</span> ‚Sein‘ der Dinge —. Die <span style="color:#FF6000">„positiven Eigenschaften“</span> GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, wie Wahrheit, Einheit, Gutheit, <span style="color:#00B000">(von ,Güte‘)</span>, Schönheit, Adel, <span style="color:#00B000">(von ,edel‘)</span>, Gleichheit, Andersheit, Wirklichkeit, ,Sein‘ im Sinne von Etwas-sein, etc. werden <span style="color:#FF6000">„Perfektionen“</span>, oder auch <span style="color:#FF6000">„Transzendentalia“</span> genannt, <span style="color:#00B000">(von lateinisch ''':''' <span style="font-family: Times;"><big>transcendere</big></span>, <span style="color:#FF6000">„übersteigen“</span>)</span>. In der mittelalterlichen Scholastik sind Transzendentalien die Grundbegriffe, die allem Seienden als <span style="color:#FF6000">„Modus“</span>, <span style="color:#00B000">(d.h. ,Eigentümlichkeit‘, als allgemeine Seinsweisen)</span>, zukommen. Wegen ihrer Allgemeinheit ,übersteigen‘ sie die besonderen Seinsweisen, welche ARISTOTELES die ,Kategorien‘ nannte. Ontologisch betrachtet, werden die Transzendentalien als das allem Seienden Gemeinsame aufgefasst, da sie von allem ausgesagt werden können. Von der KI werden sie, nicht unpassend, als <span style="color:#FF6000">„ultimative Eigenschaften des Seins“</span> bezeichnet, die <span style="color:#FF6000">„jenseits der materiellen Welt existieren“</span>, <span style="color:#00B000">(da sie ,ultimativ‘ nur von GOTT, als den unbegrenzt Vollkommenen, ausgesagt werden können, die jedoch, auch von allen übrigen Seienden, wegen deren seinsmäßigen Unvollkommenheit und Begrenztheit, abgestuft, d.h. <span style="color:#FF6000">„analog"</span>, ausgesagt werden)</span>. Diese Transzendentalien sind ,inakzident‘, das heißt, sie entstehen nicht aus anderen Begriffen, sondern sind erste, unteilbare Bestimmungen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> des Denkens und des Seins, die allen Seienden ''':''' <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span>, unabhängig von ihren speziellen Eigenschaften, als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(bzw. Unvollkommenheiten)</span>, mit ,modaler‘ Notwendigkeit, <span style="color:#4C58FF">— ‚□‘ —</span>, <span style="color:#FF6000">„analogisch"</span> zukommen, d.h. sie sind in allen Seienden, seinsmäßig abgestuft und abgegrenzt, ,relativ‘ zum unbegrenzt Unendlichen ihrer selbst, und <span style="color:#FF6000">»''dasjenige, was sie ausdrücken, drücken sie ohne jede Begrenzung aus''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>; und damit stehen sie ontologisch in einer <span style="color:#FF6000">„analogen"</span> ,Beziehung‘ zu GOTT, dem absolut Vollkommenen und unbegrenzt Unendlichen. In der Erkenntnisordnung wirken sie als die ersten Begriffe des menschlichen Verstehens, die eine Basis für alle weiteren wissenschaftlichen Erkenntnisse bilden. In der Seinsordnung sind die Transzendentalien ontologisch eins, gleichwertig, <span style="color:#00B000">(,mathematisch äquivalent‘)</span>, und daher konvertierbar, d.h. austauschbar, <span style="color:#00B000">(vgl. z. B. den scholastischen ,Merksatz‘ ''':''' <span style="font-family: Times;"><big>,ens et verum convertuntur‘</big></span>)</span>. Damit sind sie auch von einander abhängig, was GÖDEL sowohl im Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, für positive Eigenschaften, als auch in der Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, für die Wesenseigenschaften, syntaktisch formalisiert hat mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, weil sie sich gegenseitig, — mit ,modaler‘ Notwendigkeit —, gleichwertig ,implizieren‘, d.h. einschließen, <span style="color:#00B000">(im Axiom-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span>, und in der Definition-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''y'''‘ — </span>)</span>. Man kann die Transzendentalia, <span style="color:#00B000">(wie GÖDEL)</span>, auch ,Wesenseigenschaften‘ ''':''' <span style="color:#4C58FF"> — ‚'''X'''<sub>ess</sub>‘ —</span>, nennen, weil sie allem Seienden <span style="color:#FF6000">„wesentlich analog"</span> zukommen. Weil Transzendentalien miteinander austauschbar sind, sind sie auch widerspruchsfrei, was GÖDEL mit Axiom-1 syntaktisch darstellt. Die Gültigkeit und Wahrheit, d.h. die mathematisch-logische Evidenz von Axiom-1 und Axiom-2, beruht auf der ontologischen Allgemeinheit und Gültigkeit der Transzendentalia, die GÖDEL mit Definition-2, in sein Kalkül explizit eingeführt und als Wesenseigenschaften ,bestimmt‘ hat. <span style="color:#00B000">(Definitionen werden formal-syntaktisch durch das Äquivalenzzeichen <span style="color:#4C58FF">,'''↔'''‘</span> angezeigt, gelesen als <span style="color:#FF6000">„...ist genau dann ... wenn...“</span>)</span> Die GÖDEL-Axiome und -Definitionen werden jedoch sofort <span style="color:#FF6000">„modal falsch"</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit ,Nicht-Transzendentalia‘, wie z. B. ,rot‘ oder ,schwer‘, belegt werden. <span style="color:#00B000">(Dieser ,Sachverhalt‘ wird von Kritikern des GÖDEL-Systems, — zu vorschnell —, verwendet, um ihre Behauptungen zu ,belegen‘, das GÖDEL-Kalkül und seine Konsequenzen seien ,falsch‘.)</span>
Zum Überblick ''':''' <span style="color:#FF6000">„Transzendentalia“</span> sind universale, alles Seiende charakterisierende Begriffe, die über kategoriale Einteilungen hinausgehen, und sowohl in der klassischen Scholastik, als auch in der modernen Philosophie, <span style="color:#00B000">(KANT, Uwe MEIXNER<ref>vgl. die ,transzendentalen‘ Bedingungen möglicher Erkenntnisse bei KANT; und auch in der ,Axiomatischen Ontologie‘ bei Uwe MEIXNER</ref>)</span>, als Grundlage der Metaphysik und Erkenntnistheorie dienen. Sie sind die <span style="color:#FF6000">„ersten Begriffe des Seins“</span>, die jedem Ding als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(Perfektionen)</span>, inhärent sind, <span style="color:#FF6000">„analogisch"</span> abgestuft, auf einen ,ultimativ‘-unbegrenzten Bezugspunkt ausgerichtet, und die sich im Denken, <span style="color:#00B000">(für uns als wahr)</span>, und in der moralischen Wertung, <span style="color:#00B000">(für uns als gut und edel)</span>, manifestieren, relativ zum ,ultimativ‘-unbegrenzten Bezugspunkt ihrer selbst. Die faktische, zusätzliche Unvollkommenheit, die sich generell in der notwendigen, und unausweichlichen Vergänglichkeit aller Dinge zeigt, ist einem ontologischen Defekt ,geschuldet‘, der stark zeitabhängig ist, d.h. der einen Anfang und ein Ende hat.
Das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''Notwendige Existenz ist eine positive Eigenschaft''«</span>, ist immer falsch, wenn es auf etwas aus der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> angewendet wird, wie z. B. auf einen <span style="color:#FF6000">„Tsunami“</span>, dessen ‚Existenz‘ für uns nicht ‚positiv‘ ist. KANT hat schon festgestellt ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Das gilt für alles, was <span style="color:#FF6000">„existiert“</span>. Das Axiom-5 hat nur dann seine Gültigkeit, ist nur dann ,wahr‘, wenn <span style="color:#FF6000">„Dasein“</span> <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span> <span style="color:#00B000">(Essenz)</span> in eins zusammenfallen. Bei allen Dingen, die ‚da‘ sind, ist ihr ‚Da-Sein‘ ontologisch immer verschieden zu dem ‚was‘ sie sind ''':''' zu ihrem ,Was-Sein‘. In der philosophischen Tradition, seit ARISTOTELES, wird die ontologische Identität, d.i. die Koinzidenz, der innere Zusammenhang von ‚Sein‘ und ‚Wesen‘ allein nur dem <span style="color:#FF6000">„selbst ‚unbewegten‘ Erstbewegenden“</span> zugeschrieben, dem <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“</span><span style="color:#00B000"> | ,prôton kinoûn akinêton‘</span>, von dem ARISTOTELES etwas später sagt ''':''' <span style="color:#FF6000">»''denn dies ist der Gott''«</span> und dann hinzufügt ''':''' <span style="color:#FF6000">»''so sagen wir ja''«</span>; d.h. das ist eine Interpretation aus dem Glaubenskontext des ARISTOTELES. Er war ein Gott-gläubiger Grieche. Wer an GOTT glaubt, kann das nachvollziehen. GÖDEL musste dieses Axiom-5 postulieren, sonst wäre sein Kalkül nicht aufgegangen, ohne dass er deswegen schon an GOTT glauben müsste. Er hat für sein Kalkül das ontologische Theorem von der Identität von ‚Sein‘ und ‚Wesen‘ im ‚unbewegten Erstbeweger‘ des ARISTOTELES benutzt, ohne diese Herkunft explizit referenziert zu haben. <span style="color:#00B000">(Gilt auch für Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit, das GOTT-Sein, das ‚Dasein‘ GOTTES, ist eine positive Wesenseigenschaft, eine Perfektion; d.h. ist das ‚Wesen‘ GOTTES ''':''' GOTT ist perfekt''«</span>)</span>. Die ontologische Identität von Sein und Wesen, Existenz und Essenz, wie auch die Koinzidenz von Möglichkeit und Wirklichkeit, von Ursache und Wirkung, sowie auch die ontologische Einheit von <span style="color:#00B000">(Erkenntnis-)</span>Subjekt und <span style="color:#00B000">(Erkenntnis-)</span>Objekt im <span style="color:#FF6000">»''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“</span><span style="color:#00B000"> | ,noêseôs noêsis‘ <small>(<span style="font-family: Times;"><big>,''Metaphysik''‘</big></span> XII 9, 1074b34)</small></span>, und der innere Zusammenhang der <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, gilt nur in der <span style="color:#FF6000">„unverursachten Letztursache"</span>, auf die ARISTOTELES bei seiner Prinzipienforschung gestoßen ist.
Es gibt verschiedene Versuche, die GÖDEL-Axiome durch sog. ,Modelle‘, relativ zu einfacheren ,Welten‘, zu verifizieren, um damit ihre relative Konsistenz nachzuweisen. Für GÖDEL aber <span style="color:#FF6000">»''sind die Axiome nur dann'' <span style="color:#00B000">[ in unserer ,realen‘ Welt ]</span> ''wahr'' <span style="color:#00B000">[ und annehmbar ]</span>«</span>, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt'' <span style="color:#00B000">[ d.h. jeder auch nur ,möglichen‘ Welt ]</span> ''sind''«</span>. Diese Bedingung verweist jede Verifikation und jede Interpretation der Axiome auf das ,Nicht-Zufällige‘, das ,Notwendige‘, ,Absolute‘, in dem die Axiome und Definitionen des GÖDEL-Kalküls erst dadurch ihren Sinn und ihre Bedeutung bekommen, wenn sie vom ,Absoluten‘ und ,Unendlichen‘ her erklärt und verstanden werden. Damit insistiert GÖDEL auf eine genuin <span style="color:#4C58FF">,theologische‘</span> Interpretation seines Kalküls, mit der <span style="color:#4C58FF">„Theologie“</span> zum Begriff GOTT, dem unbegrenzt Unendlichen, als Verifikationskriterium. Das entspricht auch der ,methodologischen‘ Prämisse seines Kalküls. Die wichtigsten Axiome und Definitionen im GÖDEL-Kalkül sind jedoch bloße ,Annahmen‘, deren Evidenz, sowohl die ,mathematische‘ als auch die <span style="color:#4C58FF">,theologische‘</span>, erst evaluiert, d.h. ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> werden muss. Das bedeutet ''':''' die logische Verifikation der Axiome und Definitionen von GOTT und seinen Vollkommenheiten kann nur Kalkül-intern durch den Aufweis ihrer Widerspruchsfreiheit erfolgen, d.i. <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span>. Logisch evaluierte und verifizierte Axiome und Definitionen sind die ,modal‘ notwendigen, d.h. die ,transzendentalen‘ Voraussetzungen für die Ergebnisse eines Kalküls, damit seine Theoreme und Korollare in unserer ,realen‘ Welt als logisch ,wahr‘ und damit für uns auch als ,annehmbar‘ gelten können, während die Prämissen eines Kalküls, <span style="color:#00B000">(die Argument Einführung, <span style="color:#4C58FF">— '''AE:''' —</span> )</span>, nicht notwendige, und somit ,modal‘ frei gewählte ,Annahmen‘ sind. Jedoch aus diesen ,modal‘ frei gewählten, ,möglichen‘ <span style="color:#00B000">( <span style="color:#4C58FF">'''◇'''</span> )</span> Prämissen folgen mit Hilfe der ,bewiesenen‘ <span style="color:#00B000">( ╞ )</span> Axiome und Definitionen die Ergebnisse mit ,modaler‘ Notwendigkeit <span style="color:#00B000">( <span style="color:#4C58FF">'''□'''</span> )</span>.
Die Logik des GÖDEL-Systems ist eine ,Prädikatenlogik‘ zweiter Stufe, in der die Quantoren nicht nur Individuum-Variable, sondern auch Eigenschafts-Variable, <span style="color:#00B000">(als noch ,unbestimmte‘ Prädikate im Allgemeinen)</span>, binden können. Die formale Struktur des GÖDEL-Kalküls besteht aus fünf Axiomen und drei Definitionen, mit deren Hilfe in drei Beweisgängen drei Theoreme und mehrere Korollare aus seiner ,methodologischen‘ Prämisse ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitet werden können, wobei die beiden ersten Beweisgänge, mit ihren Ergebnissen, den dritten vorbereiten, in dem es dann um das Theorem ANSELMS geht. Die Prämisse des GÖDEL-Kalküls in allen Beweisgängen ist der traditionelle ,GOTT-Glaube‘, in der Formulierung speziell nach LEIBNIZ. Ein Axiom, eine Definition, zwei Theoreme und alle Korollare im GÖDEL-Kalkül sind Aussagen über <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>. Alle fünf Axiome, eine Definition und ein Theorem, <span style="color:#00B000">(und das Korollar aus Axiom-4)</span>, sind auch Aussagen über die Eigenschaft <span style="color:#FF6000">„Vollkommenheit“, „Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, die in der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> als die Wesenseigenschaft GOTTES gilt ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist vollkommen''«</span> bzw. <span style="color:#FF6000">»''GOTT ist das Vollkommenste der Wesen''«</span>, <span style="color:#00B000">(DESCARTES)</span>. Zwei Definitionen sind Aussagen über die allgemeinen Wesenseigenschaften aller Seienden, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, die Transzendentalien, die, als notwendige Existenz, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, auch GOTT zugeordnet werden, mit der Besonderheit bei GOTT, dass sowohl alle Eigenschaften, als auch alle anderen Zuordnungen, wie Sein und Wesen, wie Ursache und Wirkung, usw., im Unendlichen, GOTT, <span style="color:#FF6000">„koinzident“</span> sind, d.h. in GOTT paarweise perspektivisch in ,eins‘ zusammenfallen, und die auch, als Transzendentalia, konvertierbar, d.h. austauschbar sind. Diese Sachverhalte machen deutlich, dass eine spezifische ,Verifikation‘ und sachgerechte ,Evaluierung‘ der GÖDEL-Axiomatik nur genuin <span style="color:#4C58FF">,theologisch‘</span> erfolgen kann. Die Evaluierung der <span style="color:#FF6000">»''mathematischen Evidenz''«</span> des GÖDEL-Systems, im Allgemeinen, muss jedoch entsprechend der Maßstäbe einer modalen Prädikatenlogik zweiter Stufe durchgeführt werden.
Das GÖDEL-Kalkül unterscheidet <span style="color:#00B000">(in Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>)</span> formal-syntaktisch zwischen der Eigenschaft ,Existenz‘, <span style="color:#4C58FF"> — ‚'''E'''‘ —</span>, die nur GOTT zugeordnet werden kann, und dem Existenz-Operator, <span style="color:#4C58FF">— ‚'''∃'''‘ —</span>, der auch allem Übrigen, das nicht GOTT ist, zugeordnet wird. Es gibt hier auch den formal-syntaktischen Unterschied zwischen der, <span style="color:#00B000">(von mir notierten, jedoch von GÖDEL schon intendierten und angesprochenen)</span>, speziellen ,Notwendigkeit‘, <span style="color:#4C58FF"> — <sub>not</sub> —</span>, die nur der Existenz GOTTES zugeordnet ist, und der modalen ,Notwendigkeit‘, <span style="color:#4C58FF">— ‚'''□'''‘ —</span>, die auf Verschiedenes bezogen werden kann. Diese Unterschiede sind Hinweise, dass GÖDEL in seiner Kalkül-Logik und -Syntax, die Außerordentlichkeit und Eigenständigkeit GOTTES berücksichtigt, der, als Schöpfer der Welt, prinzipiell und absolut <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span> ist, die erst durch GOTT auch das ist, was sie ist.
===<div class="center"><span style="color:#660066">Die Genese des Kalküls</span></div>===
Wie kommt GÖDEL zu seinem Kalkül '''?''' Sein Gewährsmann war Gottfried Wilhelm LEIBNIZ, <span style="color:#00B000">(1646-1716)</span>, den er sehr schätzte. Die rekonstruierbare Genese seines Kalküls findet man in LEIBNIZ ''':''' ''<span style="font-family: Times;"><big>‚Neue Abhandlungen über den menschlichen Verstand‘</big></span>'', <span style="color:#00B000">(1704)</span>‚ ''<span style="font-family: Times;"><big>Viertes Buch, Kapitel X ''':''' ‚Von unserer Erkenntnis des Daseins Gottes‘</big></span>'', Seite 475f.
Hier der <span style="color:#00B000">[ kommentierte ]</span> Textausschnitt zum sog. ontologischen ‚Gottesbeweis‘''':'''
::<span style="color:#FF6000">»</span>''Folgendes etwa ist der Gang seines'' <span style="color:#00B000">[ d.h. ANSELMS, Erzbischof von Canterbury; 1033-1109, ]</span> ''Beweises ''':''' GOTT ist das Größte'', <span style="color:#00B000">[ ANSELM spricht vom biblischen GOTT des Glaubens, als ''':''' <span style="color:#FF6000">»''den, über dem ,Größeres‘'' | <span style="font-family: Times;"><big>‚maius‘</big></span> | ''nicht mehr gedacht werden kann''«</span> ]</span>, ''oder, wie DESCARTES es ausdrückt ''':''' das Vollkommenste der Wesen oder auch ein Wesen von äußerster Größe und Vollkommenheit'' ''':''' <span style="color:#00B000"> [ GÖDEL ''':''' </span><span style="color:#4C58FF">‚'''P'''‘</span> <span style="color:#00B000">:= ‚Perfektion‘, ‚positive Eigenschaft‘ ]</span>, ''das alle Grade derselben in sich schließt.''<span style="color:#00B000"> [ GÖDEL-Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>. Definition-1 bildet die traditionelle Vorstellung von GOTT ab. ]</span> ''Dies also ist der Begriff GOTTES.'' <span style="color:#00B000">[ Der Term <span style="color:#4C58FF">— ,'''G'''‘ —</span> steht hier für den biblischen ‚Begriff‘ <span style="color:#FF6000">„GOTT“</span> als ,Individuumname‘ '''!''' ]</span> ''Sehen wir nun, wie aus diesem Begriff das ‚Dasein’ folgt.''<span style="color:#00B000"> [ GÖDEL ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist notwendig aus sich ‚da‘''«</span> ''':''' Term :10:, 1. Hauptergebnis im 3. Beweisgang. ]</span> ''Es ist etwas <u>mehr</u>, ‚da‘ zu sein, als nicht ‚da‘ zu sein, oder auch das ‚Dasein‘ fügt der Größe oder der Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''einen Grad hinzu, und wie DESCARTES es ausspricht, das ‚Dasein‘ ist selbst eine Vollkommenheit.''<span style="color:#FF6000">«</span>
<span style="color:#00B000">(Diesen Ausspruch DESCARTES übernimmt GÖDEL im Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''notwendige Existenz''</span> [ alias ‚Dasein GOTTES’ ] <span style="color:#FF6000">''ist eine positive Eigenschaft''</span> [ alias Vollkommenheit ]<span style="color:#FF6000">«</span>. Dem widerspricht KANT ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>. Das Axiom-5 ist daher nur dann ‚wahr‘, wenn ‚Wirklichsein‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια οὖσα</big></span>“</span> | ‚enérgeia oúsa‘ | d.h. ‚Dasein‘ und ‚Wesen‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ | — genauer ''':''' ‚Wesenseigenschaften’ —, ontologisch ,eins‘ sind, d.h. wenn <span style="color:#FF6000">„Existieren“</span> immer schon die <span style="color:#FF6000">„Wesenseigenschaft“</span> GOTTES ist. Was nach ARISTOTELES nur im <span style="color:#FF6000">„unbewegten Erstbeweger“</span> der Fall ist; bzw. mit LEIBNIZ ''':''' <span style="color:#FF6000">»''was das Privilegium der Gottheit allein ist''«</span> '''!''' Aus der ,methodologischen‘ ,Annahme‘ im 2. Beweisgang GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den GOTT der Christen''«</span>, und mit Hilfe von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, bzw. <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, mit Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind notwendig aus sich, — von Natur aus —, positiv''«</span>, mit Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span> ''':''' <span style="color:#FF6000">»''Zum Wesen gehören notwendig auch alle Konsequenzen aus einer Wesenseigenschaft''«</span>, und mit Axiom-1 und der Definition für GOTT, folgt nach einigen logischen Umformungen das GÖDEL-Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist genau dann der GOTT der Christen, wenn das Wesen dieses GOTTES sein eigenes Sein ist''«</span>. Dasein und Wesen sind im Unendlichen, GOTT <span style="color:#FF6000">„koinzident“</span> ,eins‘, übereinstimmend mit dem Theorem des ARISTOTELES. Mit diesem, im Kalkül <u>ohne</u> Axiom-5 ,regulär‘ (├ ) abgeleiteten Theorem, widerlegt er KANT für den individuellen Spezialfall <span style="color:#4C58FF">‚'''G'''‘</span> := <span style="color:#FF6000">„GOTT“</span>. Nachprüfbar im Anhang ''':''' im ‚ontologischen‘ Beweis für das Basis-Theorem-2. Somit ist Axiom-5 ,wahr‘, und KANT, der <span style="color:#FF6000">»''eine Abneigung gegen das Gebet hatte''«</span> und auch <span style="color:#FF6000">»''nie zu den sonntäglichen Kirchgängern zählte''«</span><ref>Uwe SCHULTZ ''':''' ‚''<span style="font-family: Times;"><big>Immanuel Kant</big></span>''‘, Rowohlt Monographie 50659, Seite 12</ref>, hat sich hier, im Bezug auf GOTT, geirrt. <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, war für KANT nie eine ernstzunehmende Option. Die <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, die natürlich immer auch verbunden sein muss mit der täglichen ,Erfahrung‘ einer Glaubens-Praxis, im Gebet und in den Gottesdienst-Feiern des <span style="color:#4C58FF">„Theologen“</span>, und die daraus entsteht, ist eine ziemlich ,ausgereifte‘ Disziplin. Es haben sich, durch Jahrhunderte hindurch, viele gläubige und auch gescheite Menschen, schon im Judentum, und dann im Christentum, und ebenfalls im Islam, darum bemüht.)</span>
:: <span style="color:#FF6000">»</span>''Darum ist dieser Grad von Größe und Vollkommenheit oder auch diese Vollkommenheit, welche im ‚Dasein‘ besteht, in diesem höchsten, durchaus großen, ganz vollkommenen Wesen, denn sonst würde ihm ein Grad fehlen, was gegen seine Definition wäre. Und folglich ist dies höchste Wesen ‚da‘. Die Scholastiker, ohne selbst ihren'' <span style="font-family: Times;"><big>doctor angelicus</big></span> <span style="color:#00B000">[ := THOMAS von Aquin ]</span> ''auszunehmen, haben diesen Beweis verachtet'', <span style="color:#00B000">[ wie später auch Immanuel KANT ]</span>, ''und ihn als einen Paralogismus'' <span style="color:#00B000">[ := Fehlschluss ]</span> ''betrachtet, worin sie sehr unrecht gehabt haben; und DESCARTES, welcher die scholastische Philosophie im Kolleg der Jesuiten zu La Flèche lange genug studiert hatte, hat sehr recht gehabt, ihn wieder zu Ehren zu bringen. Es ist nicht ein Paralogismus, sondern ein unvollständiger Beweis'', <span style="color:#00B000">[ den GÖDEL vervollständigt hat ]</span>, ''der etwas voraussetzt, was man noch hätte beweisen sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' <span style="color:#00B000">[ '''::''' <span style="color:#4C58FF">— '''◇''' —</span> '''::''' ,möglich‘, ,konsistent‘, ,denkbar‘; GÖDEL beweist im 1. Beweisgang aus Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, <span style="color:#FF6000">»''positive Eigenschaften'', <span style="color:#00B000">[ die allgemeinen Transzendentalien ]</span>, ''sind widerspruchsfrei''«</span>, mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, folgt Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist widerspruchsfrei möglich''«</span> ]</span>. ''Und es ist schon etwas, dass man durch diese Bemerkung beweist ''':''' gesetzt, dass GOTT'' <span style="color:#00B000">['' <span style="color:#FF6000">»widerspruchsfrei«</span> '']</span> '',möglich‘ ist, so ‚ist‘ er'' <span style="color:#00B000">[ ,notwendig‘ '''::''' <span style="color:#4C58FF">— '''□''' —</span> '''::''' für jede mögliche Welt auch wirklich aus sich ‚da‘ ]</span>, ''was das Privilegium der Gottheit allein ist'' ''':''' <span style="color:#00B000">[ Im 3. Beweisgang, Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' ‚ANSELMS Prinzip‘ ''':''' <span style="color:#FF6000">»''Weil GOTT widerspruchsfrei ,möglich‘ ist, darum ist auch der Glaube widerspruchsfrei, der annimmt, dass GOTT aus sich ,notwendig‘ da ist''«</span>; mit Korollar-3 ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ —</span>, <span style="color:#FF6000">»''Es gibt notwendig nur einen einzigen GOTT''«</span>. Damit ist auch der Monotheïsmus bewiesen. ]</span> ''Man hat recht, die Möglichkeit eines jeden Wesens anzunehmen und vor allem die GOTTES, bis ein anderer das Gegenteil beweist''. <span style="color:#00B000">[ Das Gegenteil besagt, dass GOTT ,unmöglich‘ ist. Hier setzt der Möglichkeitsbeweis im GÖDEL-Kalkül an, und beweist, dass diese Aussage zu einem Widerspruch führt. ]</span> ''Somit gibt dieser metaphysische Beweis schon einen moralischen zwingenden Schluss ab, wonach wir dem gegenwärtigen Stande unserer Erkenntnisse zufolge urteilen müssen, dass GOTT ‚da‘ sei, und demgemäß handeln.'' <span style="color:#00B000">[ Aber nicht logisch zwingend '''!''' Denn die Interpretation <span style="color:#4C58FF">— ‚'''G'''‘ —</span> mit dem GOTT der Bibel, als ,methodologische‘ Kalkül-Prämisse, ist nicht zwingend, jedoch ,modal‘ möglich, <span style="color:#4C58FF">— '''◇''' —</span>, und im christlichen Glaubenskontext sinnvoll, was mit einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls gezeigt werden kann. Damit wäre dann auch die Frage beantwortet, ob das GÖDEL-System sich plausibel als eine Theorie von GOTT und seinen Eigenschaften interpretieren lässt, bzw. als eine <span style="color:#FF6000">»''axiomatische''«</span> <span style="color:#4C58FF">„Theologie“</span>, wie sie André FUHRMANN apostrophiert. Das <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ist der ,Individuumname‘ für den GOTT der Bibel, — ,GOTT‘ groß geschrieben —, im monotheïstischen, christlichen Glaubenskontext, den auch LEIBNIZ teilt. Dann steht der ,Name‘ auch synonym für das ,existierende‘ Individuum, d.h. für dessen ,Existenz‘. ]</span> ''Es wäre aber doch zu wünschen, dass gescheite Männer'' <span style="color:#00B000">[ sic ! ]</span> ''den Beweis mit der Strenge einer mathematischen Evidenz vollendeten'', <span style="color:#00B000">[ was GÖDEL veranlasst hat, seine Version eines ‚ontologischen Beweises’ zu kreieren, dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> man heute mit Computerprogrammen<ref>siehe Fußnote 12</ref> schon nachgewiesen hat ]</span> ... <span style="color:#FF6000">«</span>.
Für GÖDEL war dieser Text eine intellektuelle Herausforderung, und er hat sie angenommen. Das war für GÖDEL sicher keine Glaubensangelegenheit. GOTT hat es ja auch nicht nötig, ‚bewiesen‘ zu werden. Wer <span style="color:#4C58FF">— ‚'''G'''‘ —</span> z. B. mit dem sog. ‚Urknall‘ gleich setzt, macht die <span style="color:#FF6000">»''zufällige Struktur der Welt''«</span> im ‚Urknall‘, <span style="color:#00B000">(pantheistisch)</span> zu einem ,Gott‘, was GÖDEL dezidiert für sein Kalkül ausgeschlossen haben wollte.
Kurt GÖDEL schreibt 1961 in einem Brief, in Anlehnung an den obigen Text ''':'''
::<span style="color:#FF6000">»...''ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig ''<span style="color:#00B000">[ sic '''!''' ]</span>, ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', <span style="color:#00B000">[ dass es GOTT gibt ]</span>, ''mit allen bekannten Tatsachen'', <span style="color:#00B000">[ z. B. mit den Maßstäben einer modernen Logik ]</span>, ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker LEIBNIZ versucht''.«</span><ref>Zitiert nach SCHIMANOVICH-GALIDESCU, M.-E. ''':''' ‚''<span style="font-family: Times;"><big>Princeton–Wien 1946–1966. Briefe an die Mutter</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kurt Gödel – Leben und Werk</big></span>''‘, Hg. B.BULDT et alia, Wien (HÖLDER–PICHLER–TEMSKY), 2001, Band 1</ref>
===<div class="center"><span style="color:#660066">Die Interpretation des Kalküls</span></div>===
Wenn man sich das GÖDEL-Kalkül ansieht, wie es heute formalisiert vorliegt, stellt sich die Frage ''':''' <span style="color:#FF6000">„Lässt sich dieses System plausibel als eine Theorie von GOTT <span style="color:#00B000">(als eine ‚Rede von GOTT’ := <span style="color:#4C58FF">,Theologie’</span>)</span> und seiner Eigenschaften verstehen '''?''' “ — „Ist hier eine genuin <span style="color:#4C58FF">,theologische’</span> Interpretation möglich '''?''' “</span> Seine Herkunft aus der intellektuellen Auseinandersetzung des Logikers GÖDEL mit dem GOTT-gläubigen Philosophen LEIBNIZ und dem christlichen Theologen und Erzbischof ANSELM rechtfertigt diese Frage. Die <span style="color:#FF6000">„mathematische Evidenz“</span> des GÖDEL-Formalismus, <span style="color:#00B000">(im Anhang nachgestellt)</span>, ist allgemein anerkannt, <span style="color:#00B000">(Vorbehalte dagegen gibt es nur bei der Interpretation seiner Syntax, d.h. ob die Axiome und Definitionen, wie GÖDEL sie konzipiert hat, bzw. ob die Theoreme und Korollare, die aus diesen Axiomen ,regulär’ (├ ) abgeleitet werden, auch in unserer realen Welt ,wahr’ und ,annehmbar’ sind)</span>. Die <span style="color:#FF6000">„theologische Evidenz“</span> des GÖDEL-Systems wird durch eine ,Verankerung’ der Axiome und Definitionen in den <span style="color:#4C58FF">,theologisch’</span>-philosophischen Diskurs über GOTT evaluiert, der schon seit zweieinhalbtausend Jahren läuft. In diesen zweieinhalbtausend Jahren hat sich, — gegen ARISTOTELES und die antike Philosophie —, die Erkenntnis durchgesetzt, dass GOTT <span style="color:#FF6000">»''unabhängig''«</span> von der <span style="color:#FF6000">»''zufälligen''«</span> Raum-Zeit-Struktur unserer vergänglichen Welt ist. In meiner Darstellung des GÖDEL-Kalküls folge ich, <span style="color:#00B000">(im Unterschied zum Autographen GÖDELS, vom 10. Feb 1970)</span>, in der Axiom-Formulierung und -Nummerierung, in der Syntax, und in der Beweis-Struktur, der Arbeit von André FUHRMANN ''':''' ''<span style="font-family: Times;"><big>‚Existenz und Notwendigkeit. Kurt Gödels axiomatische Theologie‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Logik in der Philosophie‘</big></span>'' Hg. SCHROEDER-HEISTER, SPOHN und OLSSON, 2005, Synchron, Heidelberg, Seite 349–374. <span style="color:#00B000">(Die tiefer gestellte Notation der spezifischen ,Eigenschaft‘ einer Eigenschaft ist meine Ergänzung zur formalen Syntax, z. B. ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>'''x'''‘ — </span>, angeregt durch die indizierende Schreibweise GÖDELS ''':''' <span style="color:#4C58FF">— ,'''G''' Ess. '''x'''’ —</span>.)</span> Die Erkenntnisse zur Straffung und Präzisierung der GÖDEL-Syntax, <span style="color:#00B000">(besonders im Möglichkeitsbeweis)</span>, stammen aus der Arbeit von Günther J. WIRSCHING ''':''' ,''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, im Web <ref>https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf</ref>. <span style="color:#00B000">(Auch der Hinweis auf AVICENNA kommt von WIRSCHING.)</span> Die Zitate von THOMAS von Aquin´s Stellungnahme zum Theorem ANSELMS, und von Georg Wilhelm Friedrich HEGEL zur Immanuel KANTS Ablehnung des Theorem ANSELMS, befinden sich in Franz SCHUPP, ,<span style="font-family: Times;"><big>''Geschichte der Philosophie im Überblick''</big></span>‘, Band 2 ‚<span style="font-family: Times;"><big>''Christliche Antike, Mittelalter''</big></span>‘, Hamburg 2003, Seite 168 und Seite 170.
Meines Erachtens ist der entscheidende Ansatzpunkt einer <span style="color:#4C58FF">„theologischen“</span> Interpretation das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>.
‚Frei‘ nach KANT ‚formuliere‘ ich ‚kurz‘ ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Hier die Positionen KANTS zum Thema ‚Existenz‘ und ‚Eigenschaften‘ ''':'''
::<span style="color:#FF6000">»</span>''… unbeschadet der wirklichen Existenz äußerer Dinge'', <span style="color:#00B000">[ kann man ]</span> ''von einer Menge ihrer Prädikate'', <span style="color:#00B000">[ d.h. Eigenschaften ],</span> ''sagen'' … ''':''' ''sie gehöreten nicht zu diesen ‚Dingen an sich selbst‘, sondern nur zu ihren Erscheinungen, und hätten außer unserer Vorstellung'' <span style="color:#00B000">[ ihrer, als ,wirklich‘ gedachten Erscheinung, ]</span> ''keine eigene Existenz, … weil ich finde, dass … '''alle Eigenschaften, die die Anschauung eines Körpers ausmachen''', bloß zu seiner Erscheinung gehören; denn die Existenz des Dinges, was erscheint, wird dadurch nicht … aufgehoben, sondern nur gezeigt, dass wir es'', <span style="color:#00B000">[ das Ding ]</span>, ''wie es ‚an sich selbst‘ sei'', <span style="color:#00B000">[ d.h. existiert ]</span>, ''durch Sinne gar nicht erkennen können''.<span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Prolegomena zu einer jeden künftigen Metaphysik, die als Wissenschaft wird auftreten können</big></span>''‘, Seite 289; https://www.korpora.org/kant/aa04/289.html</ref> <span style="color:#00B000"><small>(Hervorhebung durch KANT.)</small> [ Seine Prädikate, d.h. Eigenschaften, jedoch können wir mit unseren Sinnen ,anschauen‘, aber nur in Kombination mit unserer Vorstellung ihrer, als ,wirklich‘ gedachten Erscheinung, vermittelt durch den sog. ,transzendentalen Schematismus‘ unserer Einbildungskraft ''':'''</span> <span style="color:#FF6000">»</span>''Eine verborgene Kunst in den Tiefen der menschlichen Seele''<span style="color:#FF6000">«</span>, <span style="color:#00B000">jedoch auch eines der ,dunkelsten‘ Kapitel in der K.d.r.V., bedingt durch KANTS Konzept von ,Wirklichkeit‘, bzw. ,Sein‘. ]</span>
Mit anderen Worten, man kann die ‚Existenz‘, bzw. das ‚Sein‘ der Dinge, <span style="color:#00B000">(das ‚Ding an sich’ bei KANT)</span>, nicht unter dem Mikroskop finden. Die ‚Existenz‘ bzw. das ‚Sein‘ ist keine sinnlich registrierbare ‚Eigenschaft‘ z. B. des rekonstruierten ‚Stadt-Schlosses‘ in Berlin. <span style="color:#00B000">(‚Sein‘ ist kein reales ‚Prädikat‘.)</span> Dafür haben wir andere Fähigkeiten ''':''' Ich kann seine ‚Existenz‘ mit meinem Verstand einsehen, weil auch ich selbst ‚existiere‘. Seine ‚Ansicht‘, wie ‚gefällig‘ es ist, und auch weitere ‚Eigenschaften‘, die mir auffallen, kann ich mit einem Handy-Foto dokumentieren. Diese ‚Eigenschaften‘ sind nicht die Ursache, dass das ‚Berliner Schloss‘ existiert. Wohl aber die Rekonstruktion dieses Schlosses ist die ‚Ursache‘, dass es ,existiert‘, und jetzt so aussieht. Insofern ist ‚Existenz‘ keine ‚Eigenschaft‘, sondern die ‚Existenz‘ des Dinges ist die Voraussetzung, der ‚Grund‘, dass ich die ‚Eigenschaften‘ des Dinges mit meinen Sinnen feststellen kann.
In einer Auseinandersetzung mit CARTESIUS schreibt KANT, philosophisch ‚tiefgründig‘ und logisch ‚exakt‘, über dessen <span style="color:#FF6000"><span style="font-family: Times;"><big>„Cogito, ergo sum“</big></span></span> ''':'''
::<span style="color:#FF6000">»</span>''Das ‚Ich denke‘ ist ein empirischer Satz, und hält den Satz ‚Ich existiere‘ in sich. Ich kann aber nicht sagen ''':''' ‚Alles, was denkt, existiert‘; denn da würde die Eigenschaft des Denkens'', <span style="color:#00B000">[ eine essentielle Eigenschaft ]</span>, ''alle Wesen, die sie besitzen, zu notwendigen'' <span style="color:#00B000">[ d.h. notwendig existierenden ]</span> ''Wesen machen''. <span style="color:#00B000">[ Was allein nur von GOTT ausgesagt werden kann; mit AVICENNA, als anerkannter ARISTOTELES-Kommentator ''':''' <span style="color:#FF6000">»''GOTT ist das einzige Sein, bei dem Essenz'' <span style="color:#00B000">[ ‚Wesenseigenschaften‘ ]</span> ''und Existenz'' <span style="color:#00B000">[ ‚Dasein‘ ]</span> ''nicht zu trennen sind und das daher notwendig an sich da ist''«, <span style="color:#00B000">— konform mit GÖDEL ''':'''</span> »''notwendige Existenz ist eine positive'' <span style="color:#00B000">[ essentielle ]</span> ''Eigenschaft''«</span> ].</span> ''Daher kann meine Existenz auch nicht aus dem Satz, ‚Ich denke‘, als'' <span style="color:#00B000">[ logisch ]</span> ''gefolgert angesehen werden, wie CARTESIUS dafür hielt (weil sonst der Obersatz : ‚Alles, was denkt, existiert‘, vorausgehen müsste), sondern ist mit ihm identisch.'' <span style="color:#00B000">[ Eine einfache Schlussfolgerung ''':''' meine ‚Existenz‘ ist auch nicht von meiner ‚Eigenschaft‘ Denken ‚verursacht‘. ,Existenz‘ ist nicht bloß ein ,Gedanke‘ von mir. ]</span><span style="color:#FF6000">«</span> <span style="color:#00B000">(Aus der Anmerkung 41 zu den ‚''<span style="font-family: Times;"><big>Paralogismen der reinen Vernunft</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 275,<ref>https://korpora.org/kant/aa03/275.html</ref> mit meinem Einschub des AVICENNA-Zitat aus Wikipedia.<ref>{{w|Avicenna#Metaphysik}}</ref>)</span>
Mit anderen Worten ''':''' <span style="color:#FF6000">„Die Eigenschaft, dass ich denken kann, ist nicht die Ursache meiner ‚Existenz‘“</span>, sondern, <span style="color:#FF6000">„Die Liebe meiner Eltern und ihre Entscheidung füreinander ist die Ursache meiner ‚Existenz‘. Daher ‚bin’ ich. Und weil ich ein Mensch ‚bin‘, kann ich denken.“</span> Auch mit diesen Anmerkungen ist leicht einsehbar, dass ‚Existenz‘ keine ‚Eigenschaft‘ ist — außer bei GOTT. In GOTT ist ‚Dasein‘ die ‚Wesenseigenschaft‘ GOTTES, d.h. ‚Dasein‘ und ‚Wesen‘ sind in GOTT untrennbar verbunden; sind <span style="color:#FF6000">„koinzident“</span> ‚eins‘. Das ist die Einzigartigkeit im Wesen GOTTES, dass GOTT immer schon ‚da‘ ist. Die Frage nach dem ‚Wesen‘ GOTTES lautet ''':''' <span style="color:#FF6000">„Was bist du ? “</span>/<span style="color:#CC66FF">„Wer bist Du ? “</span> Antwort, Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'' <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Weil GOTT für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, hat GOTT es nicht nötig, ‚bewiesen‘ zu werden. <span style="color:#00B000">(In der Mathematik ist ein ‚Satz‘ erst dann ‚wahr‘ und ‚existent‘, wenn er bewiesen ist. Bei GOTT ist es jedoch nicht so ''':''' GOTTES ‚Existenz‘ ist nicht erst dann ‚wahr‘, wenn seine ‚Existenz‘ von uns ‚bewiesen‘ ist. Sein ‚Dasein‘ ist jedem unserer ‚Beweisversuche‘ immer schon voraus. Der Zugang zu GOTT ist nicht der ,Beweis‘, sondern der ,Glaube‘. Wer an GOTT glauben ,will‘, dem antwortet GOTT. Wer nicht an GOTT glauben ,will‘, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Die Glaubens-Entscheidung hat jedoch für jeden Menschen eine existenzielle Konsequenz ''':''' <span style="color:#CC66FF">»''Wer glaubt und sich taufen lässt, wird gerettet; wer aber nicht glaubt'', <span style="color:#00B000">[ und diese Entscheidung auch im Augenblick der ,Wahrheit‘, im Tod, in der sog. ,Endentscheidung‘, nicht widerruft ]</span>, ''wird verurteilt werden''«,</span> <small>({{Bibel | Markus Evangelium |16|16|EU}})</small>. Das Urteil lautet ''':''' <span style="color:#CC66FF">»''zweiter Tod ''':''' der Feuersee''«</span>, <small>({{Bibel | Offenbarung |20|14f|EU}})</small>, ohne Berufungsmöglichkeit. <span style="color:#CC66FF">»''Ohne Glauben aber ist es unmöglich, Gott zu gefallen; denn wer zu Gott kommen will, muss glauben, dass er ist und dass er denen, die ihn suchen, ihren Lohn geben wird''«.</span> <small>({{Bibel | Hebräer Brief |11|6|LUT}})</small>)</span>
Das GÖDEL-Axiom-5 ist m.E. der entscheidende Ansatzpunkt einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation der GÖDEL-Axiomatik.
===<div class="center"><span style="color:#660066">Das Kalkül ist kein Existenz-Beweis für GOTT</span></div>===
Die allgemeine <span style="color:#FF6000">»''mathematische Evidenz''«</span> des GÖDEL-Formalismus, d.h. seine ‚Schlusskraft‘, ist von kompetenten Leuten<ref>„GÖDELS Argumentationskette ist nachweisbar korrekt – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO nun gezeigt;“ vgl. https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html</ref> schon festgestellt worden, <span style="color:#00B000">(im Anhang ‚nachrechenbar‘ mit den Regeln und Gesetzen einer modalen Prädikatenlogik 2. Stufe)</span>. Das GÖDEL-Kalkül ist jedoch kein ‚moderner‘<span style="color:#FF6000">„Existenz-Beweis“</span> für GOTT, wofür es gehalten oder meistens bezweifelt wird, sondern setzt, <span style="color:#00B000">(theoretisch methodisch)</span>, den <span style="color:#FF6000">„Glauben an die Existenz GOTTES“</span> schon voraus, ohne ihn zu hinterfragen. Das <span style="color:#FF6000">„Dasein“</span> bzw. die <span style="color:#FF6000">„Existenz“</span> GOTTES wird mit der Definition-1 für <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, bzw. mit dem Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, im Kalkül ‚definitorisch‘ bzw. ‚axiomatisch‘ als Kalkül-,Annahme‘, als <span style="color:#FF6000">„Prämisse“</span>, eingeführt, unter der Voraussetzung, dass die ‚Eigenschaft‘ <span style="color:#4C58FF">‚'''G'''‘ := </span><span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(Essenz)</span> und das <span style="color:#FF6000">„Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> <span style="color:#00B000">(Existenz)</span>, ontologisch ‚identisch‘, genauer ''':''' <span style="color:#FF6000">„koinzident“</span> sind, was GÖDEL im Axiom-5 definitiv für sein System vorschreibt ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>. Das <span style="color:#FF6000">„Dasein GOTTES“</span> ist faktisch äquivalent zur <span style="color:#FF6000">„notwendigen Existenz als GOTT“</span>; und <span style="color:#FF6000">„Göttlichkeit“</span> ist die <span style="color:#FF6000">„positive Eigenschaft in GOTT“</span>. Beides ist nach Axiom-5 ‚identisch‘, d.h. dem ‚Sein nach‘ dasselbe, und daher konvertierbar. Beide, <span style="color:#00B000">(sowohl die Essenz, als auch die Existenz GOTTES)</span>, werden daher auch mit demselben Term ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span> im Kalkül dargestellt. Der traditionelle, christliche ,GOTT-Glaube‘ wird zugleich mit diesem Term <span style="color:#4C58FF">‚'''G'''‘ := </span> <span style="color:#FF6000">„GOTT“ <span style="color:#00B000">|</span> „göttlich“</span>, im 2. Beweisgang, dem Basisbeweis, und im 3. Beweisgang für das Theorem ANSELMS, jeweils als ,methodologische‘ Prämisse :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> regulär <span style="color:#00B000">( ├ )</span> und explizit eingeführt ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht für den GOTT'' <span style="color:#4C58FF">‚'''G'''‘</span> ''der Christen''«</span>. Das ist die ,modal‘-frei gewählte, <span style="color:#4C58FF">„theologische“</span> Kalkül-,Annahme‘, <span style="color:#00B000">(als ,Argument-Einführung‘ := <span style="color:#4C58FF">‚'''AE:'''‘</span> )</span>, und wird dann mit Definition-1 näher ,bestimmt‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ — </span> ''':''' <span style="color:#FF6000"> »''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht genau dann für ‚GOTT‘'' <span style="color:#00B000">|</span> ''‚göttlich‘'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle positiven Eigenschaften, bzw. Vollkommenheiten'', <span style="color:#4C58FF">‚'''PX'''‘</span>, ''hat''«</span>, entsprechend dem ‚Quelltext‘ bei LEIBNIZ. <span style="color:#00B000">(Das ,postulierte‘ Axiom-3 ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, wird standardmäßig gelesen als <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, hat aber auch die alternative Leseart ''':''' <span style="color:#FF6000">»''GOTT ist perfekt d.h. vollkommen''«</span>, was <span style="color:#4C58FF">„theologisch“</span> auch richtig ist; mit <span style="color:#4C58FF">‚'''P'''‘ </span> := <span style="color:#FF6000">„Perfektion“/„Vollkommenheit“</span> ist dann die Summe aller <span style="color:#FF6000">„positiven Eigenschaften“</span>.)</span> Mit Axiom-3, — in dieser <span style="color:#4C58FF">„theologischen“</span> Leseart —, ist der ‚Wenn-Satz‘ in Definition-1 ‚aufgelöst‘ ''':''' <span style="color:#FF6000">»''GOTT hat alle positiven Eigenschaften, weil er ‚perfekt‘ ist''«</span>.
In Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, wird die ,für uns‘ <span style="color:#FF6000">„notwendige Existenz“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —, </span> durch die ,aus sich‘ <span style="color:#FF6000">„notwendig“</span> <span style="color:#4C58FF">— '''□''' —</span> instanziierten <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(als zu den Transzendentalia gehörig)</span>, bestimmt. Das GÖDEL-Kalkül setzt sowohl in Definition-3 als auch im Axiom-5 das Theorem des ARISTOTELES von der ontologischen ‚Identität‘, d.i. die Koinzidenz von <span style="color:#FF6000">„Dasein“</span>, <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#00B000">(Essenz)</span> im prinzipiell <span style="color:#FF6000">„unbewegten Erstbewegenden“</span> voraus. Ohne diese Annahme bzw. ohne Axiom-5, würde das GÖDEL-Kalkül nicht ‚funktionieren‘. Das GÖDEL-Theorem-2.1 ''':''' <span style="color:#4C58FF">— ‚'''Gx→G'''<sub>ess</sub>'''x'''‘ —</span>, kann unter dieser Voraussetzung dann, <span style="color:#4C58FF">„theologisch“</span> richtig und eindeutig, so gelesen werden ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für GOTT'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''als Individuum steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span>, ''das Wesen'', <span style="color:#4C58FF">—<sub>ess</sub>—, </span> <span style="color:#00B000">(,Essenz‘)</span>, ''GOTTES'' <span style="color:#4C58FF">‚'''x'''‘</span>«</span><ref>vgl. z.B. THOMAS von Aquin ''':''' ,''<span style="font-family: Times;"><big>De Ente et Essentia</big></span>''’, Kapitel 5 ''':''' „Deus, cuius essentia est ipsummet suum esse“ ''':''' „GOTT, dessen Wesen sein eigenes Sein ist“.</ref>, statt der <span style="color:#4C58FF">„theologisch“</span> unrichtigen Lesearten in der Wikipedia ''':''' <span style="color:#FF6000">»''Göttlich ist eine essentielle Eigenschaft jedes göttlichen Wesens''«</span><ref>{{w|Gottesbeweis#Kurt_Gödel|Gottesbeweis 2.1.2, Theorem 2}}; Version vom 10.09.2025</ref>, oder bei Christoph BENZMÜLLER et alia, im sog. ,Theorembeweiser‘ ''':''' <span style="color:#FF6000">»''Gottähnlich zu sein ist eine Essenz von jeder gottähnlichen Entität''«</span><ref>[https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html ‚Gödels „Gottesbeweis“ bestätigt’, Theorem 2]</ref>, mit der suggestiven Annahme, es gäbe polytheïstisch, mehrere ,göttliche Wesen‘, bzw. ,gottähnliche Entitäten‘, was der monotheïstischen, abendländischen Tradition, bzw. dem <span style="color:#4C58FF">„theologischen“</span> Theorem von der ,Unvergleichlichkeit‘ und ,Einzigartigkeit‘ GOTTES widerspricht, das im GÖDEL-Kalkül mit Korollar-3 bestätigt wird. <span style="color:#00B000">(Die Interpretation <span style="color:#4C58FF">‚'''G'''‘ :=</span> <span style="color:#FF6000">„GOTT“</span>, als ,Individuumname‘, ist synonym zum <span style="color:#FF6000">„Dasein <span style="color:#00B000">(Existenz)</span> GOTTES“</span>, und äquivalent zur ‚positiven Eigenschaft‘ <span style="color:#FF6000">„Göttlichkeit“</span>, alias <span style="color:#FF6000">„göttlich zu sein“</span> = <span style="color:#FF6000">„GOTT zu sein“</span> = <span style="color:#FF6000">„GOTT-Sein“</span>; und mit dem GÖDEL-Term ''':''' <span style="color:#4C58FF">‚'''G'''<sub>ess</sub>‘ :=</span> <span style="color:#FF6000">„das Wesen <span style="color:#00B000">(Essenz)</span> GOTTES“</span>.)</span>
<div class="center"><span style="color:#FF6000"><span style="color:#4C58FF">‚'''G'''‘ :=</span> „'''G'''öttlichkeit“ <span style="color:#4C58FF">↔</span> „'''G'''OTT“ <span style="color:#4C58FF">↔</span> „'''G'''OTT-Sein“</span> </div>
Die Rechtfertigung für diese <span style="color:#4C58FF">„theologische“</span> Dreifach-Äquivalenz für <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, im GÖDEL-Kalkül, gibt Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''die positive <u>Eigenschaft</u>'', <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ''Göttlichkeit'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''äquivalent zu GOTT als Individuum-Name'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''ist auch äquivalent zum Dasein GOTTES'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''gleichbedeutend mit notwendiger <u>Existenz</u>'', <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>'', dem <u>Sein</u> GOTTES für uns''«</span>. Hier hat GÖDEL explizit <span style="color:#FF6000">„Eigenschaft“</span> mit <span style="color:#FF6000">„Existenz“</span> bzw. <span style="color:#FF6000">„Sein“</span> gleichgesetzt; <span style="color:#00B000">(was jedoch nach KANT für alles, was in unserer Welt ‚existiert‘, bzw. für alles, was zur <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> gehört, wie GÖDEL selbst sagt, in jedem Fall ‚unstatthaft‘ ist ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>)</span>. Jedoch wegen dieser ‚Gleichsetzung‘, die einzig und allein, der aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition entsprechend, singulär nur in GOTT ‚statthaft‘ ist, kann jetzt die ‚positive Eigenschaft‘ <span style="color:#00B000">(Essenz)</span> <span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(ontologisch korrekt)</span> gelesen werden als <span style="color:#FF6000">„das, was GOTT zu dem macht, ‚was‘ GOTT an sich selbst ist“</span>, nämlich zu seinem <span style="color:#FF6000">„GOTT-Sein“</span> <span style="color:#00B000">(Existenz)</span>, zu seinem <span style="color:#FF6000">„Dasein als GOTT“</span>; zur Tatsache, dass <span style="color:#FF6000">„GOTT GOTT ist“</span>, d.h. dass <span style="color:#FF6000">„GOTT als GOTT ‚da‘ ist“</span>. Das ist, <span style="color:#00B000">(und da folgt ARISTOTELES seinem Lehrer PLATO)</span>, nach traditioneller Auslegung, die übliche, ontologische Funktion des ‚Wesens‘<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ |</span> eines Seienden ''':''' es ‚macht‘ das Seiende zu dem, ‚was‘ es ist; es ist die ‚Ursache‘ dafür, dass das Seiende, das ‚ist‘, ‚was‘ es ist | ‚Was-Sein‘ — ‚Wesen‘. <span style="color:#00B000">(ARISTOTELES lokalisiert jedoch das ,Wesen‘ im Seienden, im Gegensatz zu PLATO, der das ,Wesen‘, — ,getrennt‘ vom Seienden —, in den allgemeinen ,Ideen‘ lokalisiert.)</span>
Da aber in ‚Gott‘, <span style="color:#00B000">(dem <span style="color:#FF6000">„unbewegten, ‚unverursachten‘ Erstbeweger“</span>)</span>, Prozesshaftes, ‚Ursächliches‘ auszuschließen ist, ist die übliche prozesshafte, ‚ursächliche‘ Funktion von <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span><span style="color:#00B000"> | ‚ousía‘ |</span> ,Wesen‘ im <span style="color:#FF6000">„Erstbewegenden“</span> nach ARISTOTELES, sozusagen, schon ‚zum Abschluss‘ gekommen, schon ‚verwirklicht‘, — <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐν-έργεια οὖσα</big></span>“</span><span style="color:#00B000"> | ‚en-érgeia oúsa‘</span> —, schon ‚ins-Werk‘ gesetzt; <span style="color:#00B000">(<span style="color:#FF6000">„<span style="font-family: Times;"><big>τὸ ἔργον</big></span>“</span> | ‚to érgon‘ | ‚das Werk‘; <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια</big></span>“</span> | ‚enérgeia‘ | ,Wirksamkeit‘, ,Wirklichkeit‘, ,Aktualität‘, ,Energie‘; und <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὖσα</big></span>“</span> | ,oúsa‘ | feminin Nominativ Singular von <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὤν</big></span>“</span> | ‚ón‘ | ‚seiend‘)</span>. Sein ,Wesen‘ ist im ,Dasein‘ vollendet, ist ,wirkliches, verwirklichendes Sein‘, ‚seiende Aktualität‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>actus purus</big></span>“</span> ''':''' sein Wesen ist ‚reine Tätigkeit‘, ,reine verwirklichende Gegenwärtigkeit‘, d.h. ,existent‘, ohne jede prozesshafte ‚Potenzialität‘. Aus der wichtigen und richtigen Erkenntnis, dass GOTT <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer Welt''«</span> ist, folgt mit der ontologischen Identität von ,Dasein‘ und ,Wesen‘ in GOTT ''':''' Der zeitlos ewige GOTT ist <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''immer schon da''«</span>, m.a.W. ist <span style="color:#FF6000">„zeitlos-ursprungslos“</span>. Insofern ist <span style="color:#FF6000">„Göttlichkeit“</span> die <span style="color:#FF6000">„Wesenseigenschaft“</span>, die im <span style="color:#FF6000">„Dasein GOTTES“</span> d.h. in <span style="color:#FF6000">„GOTT“</span>, schon ihr ‚Ziel‘, ihre Vollendung, — <span style="color:#FF6000">„Perfektion“</span>, Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, erreicht hat. GOTT ist <span style="color:#FF6000">»''vollkommen''«</span> und darum auch <span style="color:#FF6000">»''notwendig für uns immer schon ‚da‘''«</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ — </span>. GOTT ist in seinem ‚zeitlosen Wesen‘ <span style="color:#FF6000">„unverursacht“</span>, da er <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''vollkommen''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''□PG'''‘ —</span>, <span style="color:#00B000">(eine Instanz von Axiom-4)</span>. <span style="color:#FF6000">„Vollkommenheit“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ist die <span style="color:#FF6000">„Wesenseigenschaft“</span>, bzw. das <span style="color:#FF6000">„Wesen GOTTES“</span> ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>. <span style="color:#FF6000">»''GOTT ist ,der‘ Vollkommenste''«</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, d.h. <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist die unbegrenzte Summe der unendlichen Vollkommenheiten''«</span>. Und zur absoluten <span style="color:#FF6000">„Vollkommenheit“</span> gehört <span style="color:#FF6000">„notwendig“</span> auch das <span style="color:#FF6000">„Existieren“</span> ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span>. <span style="color:#FF6000">„Notwendige Existenz“</span> gehört zu den ,ultimativen‘ Transzendentalia in GOTT, was GÖDEL mit Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, syntaktisch formalisiert hat, wenn sowohl das <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, als auch alle <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span> im Kalkül, für den Dreifaltigen GOTT der Christen stehen, was dann im Korollar-3, mit der Identität, <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, bzw. der Koinzidenz beider Individuum-Variablen, explizit gezeigt wird.
Entscheidend für diese Interpretation des GÖDEL-Systems ist ''':''' nur unter der ,modal‘ notwendigen Voraussetzung der ontologischen ‚Identität‘ von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, Theorem-2 ''':''' <span style="color:#4C58FF"> — '''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>, bzw. der ‚Gleichsetzung‘, <span style="color:#00B000">(Koinzidenz)</span>, von <span style="color:#FF6000">„notwendiger Existenz“</span> mit den ‚positiven‘ Wesenseigenschaften, der <span style="color:#FF6000">„Essenz“</span> in GOTT, Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, ‚funktioniert‘ die GÖDEL-Axiomatik '''!''' Diese ‚Identität‘, bzw. ,Koinzidenz‘ wird in ARISTOTELES, ‚''<span style="font-family: Times;"><big>Metaphysik</big></span>''‘, Buch XII 7, in einem Indizienbeweis erbracht, der mit der Methode der philosophischen Induktion zum Ergebnis kommt ''':'''
::<span style="color:#FF6000">» … ''es muss'' <span style="color:#00B000">[ notwendig ]</span> ''etwas geben, das, ohne selbst ‚bewegt‘'' <span style="color:#00B000">[ </span>''worden''<span style="color:#00B000"> ]</span> ''zu sein'', <span style="color:#00B000">[ ‚unentstanden‘ ]</span>, ''alles Übrige wie ein Geliebtes ‚bewegt‘'' <span style="color:#00B000">[ ‚entstehen lässt‘ ]</span>«</span>, das darum selbst ‚zugleich‘ <span style="color:#FF6000">„<span style="font-family: Times;"><big>αἴδιον καί οὐσία καί ἐνέργεια οὖσα</big></span>“ <span style="color:#00B000">| ,aídion kai ousía kai enérgeia oúsa‘ |</span> »<span style="color:#00B000">[ zeitlich-]</span>''ewig, sowohl <u>Wesen</u>'', <span style="color:#00B000">[ etwas Konkretes, Essentielles ]</span>, ''als auch seiende Wirksamkeit — ''<span style="color:#00B000">[ </span>„<span style="font-family: Times;"><big>actus purus</big></span>“, „reine Tätigkeit“<span style="color:#00B000"> ]</span> ''— verwirklichendes, wirkliches <u>Sein</u> ist'', <span style="color:#00B000">[ ein Existierendes, das alles Übrige ,zur Existenz‘ bringen kann ]</span> «</span>, bzw. <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὀρεκτόν καί νοητόν</big></span>“ <span style="color:#00B000"> | ,orektón kai noêtón‘ | </span>»''das ersehnt und erkennbar ist''.«</span> <span style="color:#00B000">(''<span style="font-family: Times;"><big>vgl. ,Metaphysik</big></span>''‘ XII 7, 1072a,23 – 1072b,4)</span>
Was <span style="color:#FF6000">»''alles Übrige''«</span> ,zur Existenz‘ bringen kann, bzw. ,verwirklichen‘ kann, ohne selbst ,entstanden‘ zu sein, muß auch selbst, als etwas Konkretes, Essentielles, immer schon ,existieren‘, bzw. ,wirklich sein‘. Die, daraus abgeleitete, und damit ,erkannte‘, ontologische ‚Identität‘, — ,Koinzidenz‘ —, von ‚Wesen‘ und ‚Sein‘, <span style="color:#00B000">(Ziel aller Sehnsucht und jedes Erkenntnisstrebens)</span>, <span style="color:#FF6000">»''ist das Privilegium der Gottheit allein''«</span> ''':''' mit Gottfried Wilhelm LEIBNIZ interpretiert, entsprechend einer adäquaten, aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition. Dieses induktive, ‚ontologisch‘ a-posteriori Ergebnis aus der ‚Prinzipienforschung‘ des ARISTOTELES ist die metaphysische und logische Voraussetzung, dass GÖDEL seine Axiomatik im Kalkül des sog. ‚ontologischen Gottesbeweises‘ a-priori des ANSELM von Canterbury, und nach LEIBNIZ, deduktiv korrekt formulieren konnte; <span style="color:#00B000">(vgl. 3. Beweisgang)</span>.
Angenommen, die Variable <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für den <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, der Christen, <span style="color:#00B000">(siehe Anhang, Term :01: im 2. Beweisgang)</span>, dann ist, — auf Grund von diesem Beweisgang —, in unserer Welt ,wahr‘ und evident ''':''' sowohl die ‚positive Eigenschaft‘ <span style="color:#FF6000">»''Göttlichkeit''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als auch das faktische <span style="color:#FF6000">»''‚Da‘-Sein'' <span style="color:#00B000">[ Existenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ‚benennen‘, ontologisch ident, denselben Sachverhalt ''':''' nämlich das, was wir das <span style="color:#FF6000">»''Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>, nennen. <span style="color:#FF6000">»''Göttlichkeit'', bzw. ''GOTT-‚Sein‘ ist das Wesen GOTTES''«</span>, <span style="color:#00B000">(Theorem-2.1)</span>, und dann umgedreht und äquivalent ''':''' <span style="color:#FF6000">»''Das Wesen GOTTES ist sein ‚Da‘-Sein als GOTT'', bzw. ''seine Göttlichkeit''«</span>, <span style="color:#00B000">(Theorem-2.2)</span>, m.a.W. ''':''' <span style="color:#FF6000">»''GOTT ist wesentlich ‚grundlos‘'' <span style="color:#00B000">[ d.h. </span> ''notwendig aus sich''<span style="color:#00B000"> ]</span> ''‚da‘''«</span>. Das ist das Einzigartige im <span style="color:#FF6000">»''Wesen GOTTES''«</span> ''':''' GOTT ist ohne zeitlichen Anfang, zeitlos-ewig, für uns immer schon ‚da‘, und das ‚ist‘ sein <span style="color:#FF6000">»''Wesen''«</span>; vorausgesetzt, ,angenommen‘, man glaubt an GOTT ''':''' Term :01:. <span style="color:#00B000">(Der schon von GÖDEL indizierte Term <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ — </span> ,expliziert‘ nur eine der drei Lesearten, die der Term <span style="color:#4C58FF"> — ‚'''G'''‘ — „theologisch“</span> ,impliziert‘.)</span> Theorem-2 hat somit die syntaktische Form einer Definition ''':'''
<div class="center"><span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span></div>
Somit kann GOTT ‚explizit‘ <span style="color:#00B000">(aus einer bewiesenen Kalkül-Definition)</span> <span style="color:#4C58FF">„theologisch“</span> genauer ‚bestimmt‘ werden ''':''' <span style="color:#FF6000">»''GOTT ist gerade deswegen GOTT, weil sein überzeitlich-ewiges und an sich ‚grundloses‘'' <span style="color:#00B000">[ aber für uns notwendiges ]</span> ''Dasein'' <span style="color:#00B000">[ Existenz ]</span> ''als GOTT, ontologisch, — dem Sein nach —, identisch ist mit seinem persönlichen und für uns liebevollen Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''als GOTT; diese Identität von Dasein und Wesen gilt einzig und allein nur bei GOTT.''«</span> Die philosophische Frage nach dem <span style="color:#FF6000">„Wesen GOTTES“</span> lautet, <span style="color:#00B000">(auf die Person bezogen)</span> ''':''' <span style="color:#FF6000">„Was bist du ? “</span> Sie ist äquivalent zur <span style="color:#4C58FF">,theologisch’</span>-biblischen Frage des MOSE ''':''' <span style="color:#CC66FF">„Wer bist Du ? “</span> Die bekannte Antwort des GOTTES-JHWH aus ‚Exodus 3,14‘, im Dornbusch, thematisiert das persönliche, für uns liebevolle und für immer notwendige <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'', <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Mit diesem Zitat aus der Bibel ist die GÖDEL-Axiomatik, sozusagen, <span style="color:#4C58FF">„theologisch“</span> ‚verifiziert‘. Sie hat einerseits im Theorem-2 ihren philosophischen ‚Abschluss’ erreicht, und andererseits damit formal-syntaktisch den ‚Anschluss‘ an eine allgemeine Basis-Glaubensaussage gefunden, die ‚an sich‘ für jeden CHRIST-gläubigen Menschen ‚selbstverständlich‘ ist. Was in der Metaphysik des ARISTOTELES das Ergebnis einer philosophischen ,Induktion‘ a-posteriori ist ''':''' <span style="color:#FF6000">„,Dasein‘ ist das ,Wesen‘ GOTTES“</span>, — <span style="color:#00B000">(das mit Theorem-2, auch ein Ergebnis der deduktiven GÖDEL-Axiomatik a-priori ist ''':''' die Beweisgrundlage für den Konsequenz-Teil im Theorem AMSELMS)</span>, — das ist in der Bibel die Grundüberzeugung jedes Menschen, der an GOTT glaubt ''':''' GOTT ist für uns immer schon <span style="color:#FF6000">„da“</span>, weil er uns liebt. Das ist das, <span style="color:#FF6000">„was“</span> GOTT für uns als GOTT ausmacht, — sein Wesen ''':''' <span style="color:#CC66FF">»''Wir haben die Liebe, die GOTT zu uns hat, erkannt und gläubig angenommen. GOTT ist Liebe, und wer in der Liebe bleibt, bleibt in GOTT und GOTT bleibt in ihm''«</span>, <small>({{Bibel | 1. Johannesbrief |4|16|EU}})</small>.
Das eigentliche Ergebnis der GÖDEL-Axiomatik ist somit die ‚triviale‘ Erkenntnis, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, vorausgesetzt <span style="color:#00B000">(‚angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#CC66FF">»''Ehe die Berge geboren wurden, ehe die Erde entstand und das Weltall erschaffen wurden, bist du, o GOTT, von Ewigkeit zu Ewigkeit''«</span>, <small>({{Bibel | Psalm |90|2|LUT}})</small>. <span style="color:#00B000">(Der Glaube an die Zeitlosigkeit GOTTES ist mit der ‚Annahme‘ von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, und der ‚Annahme‘ der Definition-1 für <span style="color:#4C58FF"> ‚'''Gx'''‘ := </span> den <span style="color:#FF6000">„GOTT der Christen“</span>, im Kalkül ‚implizit‘ schon eingeführt, da die Axiome und Definitionen, — nach GÖDEL —, nur dann <span style="color:#FF6000">»''wahr''«</span> sind, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen''</span> [ Raum-Zeit-]<span style="color:#FF6000">''Struktur''«</span> unserer Welt sind. Das ,impliziert‘ auch, dass der GOTT von Axiom-3 und Definition-1 ebenfalls <span style="color:#FF6000">»''unabhängig''«</span> von Raum und Zeit, d.h. zeitlos-ewig ist '''!''' )</span>
Wer an den GOTT der Bibel glaubt, kann sich von der ‚Vernünftigkeit‘ seines Glaubens mit Hilfe des sog. ,ontologischen‘ Gottesbeweises nach ANSELM von Canterbury, mit Kurt GÖDEL <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, überzeugen. <span style="color:#00B000">(Das war auch die Absicht ANSEMS '''!''' )</span> Die Annahme, es sei ‚unmöglich‘, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span>, <span style="color:#00B000">(dezidierter Atheismus)</span>, führt im GÖDEL-Kalkül formal zu einem logischen Widerspruch; vgl. z. B. ‚''<span style="font-family: Times;"><big>Gödels Möglichkeitsbeweis</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, Seite 17, von Günther J. WIRSCHING; (https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf), d.h. es ist also nicht ‚unmöglich‘, dass es GOTT gibt. Der GOTT-Glaube ist mit den Maßstäben einer modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> und darum ,vernünftig‘. Damit steht fest ''':''' das GÖDEL-Kalkül ist kein moderner ‚Existenz-Beweis‘ für den GOTT der Bibel, sondern es setzt, <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, ,methodologisch‘, den Glauben an die Existenz eines zeitlos-ewigen GOTTES voraus, der, — <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer '' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> —, für uns immer schon ‚da‘ ist. Wenn aber einmal als fix ‚angenommen‘ worden ist, <span style="color:#00B000">(als Prämisse)</span>, dass es wahr ist, dass GOTT ‚existiert‘, dann ist natürlich die ‚Annahme‘, dass GOTT ‚nicht existiert‘, falsch. Aber sie ist auch ,unlogisch‘ und ,unsinnig‘, weil die Annahme ''':''' <span style="color:#FF6000">»''Es ist unmöglich, dass es einen GOTT gibt''«</span>, offensichtlich und eindeutig zu einem Widerspruch führt; was z. B. Günther J. WIRSCHING mit seiner Version des <span style="color:#00B000">(nicht umkehrbaren)</span> ‚Möglichkeitsbeweises‘ für ,GOTT‘, explizit vorexerziert hat; <span style="color:#00B000">( nachgestellt im Anhang ''':''' GÖDELS ‚Möglichkeitsbeweis‘ als ,Widerlegung‘ eines Nicht-GOTT-Glaubens; in Entsprechung zu Psalm 14,1 und Psalm 53,2 ''':''' <span style="color:#CC66FF">»''Der'' <span style="color:#00B000">[ ,unvernünftige‘ ]</span> ''Tor sagt in seinem Herzen ''':''' Es gibt keinen Gott. Sie handeln verderbt, handeln abscheulich; da ist keiner, der Gutes tut''«</span>. Historischer Hintergrund zu diesem Psalm-Text ''':''' Die Zerstörung des Tempels in Jerusalem 586 v.Ch. durch die Truppen des NEBUKADNEZAR II.)</span> Der Logiker GÖDEL hat in seinem System zum ,ontologischen Beweis‘ keine ‚formale Unentscheidbarkeit‘ <span style="color:#00B000">(Agnostizismus)</span> feststellen können, wie auf einem anderen Feld seiner Forschungsarbeiten.
Das GÖDEL-Konsequenz-Teil von der ‚Notwendigkeit‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, <span style="color:#00B000">(die ‚Konsequenz’ aus dem ‚widerspruchsfreien‘ Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —,</span>)</span> im ‚Theorem ANSELMS‘, ist <span style="color:#00B000">(im 3. Beweisgang, Term :10:)</span> dann auch eine weitere Explikation des Basis-Theorems-2 des Kalküls ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span>, über die ‚ontologische Identität‘ vom <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, mit seinem <span style="color:#FF6000">„Wesen“</span> ''':''' <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, nach einem <span style="color:#4C58FF">[ Modus ponens ]</span>, dargestellt mit Term :09:.
<span style="color:#00B000">(Die ontologische Identität von Dasein und Wesen in GOTT, ist die, für uns, <span style="color:#FF6000">„notwendige Präsenz <span style="color:#00B000">[ das Sein, <span style="color:#4C58FF">— ‚'''E'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, die äquivalent, bzw. koinzident ist zur <span style="color:#FF6000">„Vollkommenheit <span style="color:#00B000">[ das Wesen, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>. Diese Identität von Sein und Wesen in GOTT ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub> —</span>, bedeutet <span style="color:#4C58FF">,theologisch‘</span> konkret ''':''' die, für uns, notwendige Gegenwärtigkeit GOTTES, [ sein Dasein ], ist verwirklicht worden in der liebevollen [ Wesens-]Zuwendung GOTTES zu uns Menschen, in seiner Kindwerdung in Bethlehem, durch die Jungfrau MARIA ''':''' GOTTES Wesen ist ,Sein-mit-uns‘ ''':''' <span style="color:#CC66FF">»''sein Name'', <span style="color:#00B000">[ sein Wesen ]</span>, ''ist IMMANUEL, das heiß übersetzt ''':''' GOTT-ist-mit-uns''«, <small>({{Bibel | Matthäus Evangelium |1|23|EU}})</small></span>, der unsere Not-,wenden‘-wird, d.h. der uns und die Welt von der Korruption der Sünde und des Todes <span style="color:#4C58FF">,erlösen‘</span> will und wird; jedoch nicht ohne uns. Die <span style="color:#4C58FF">„Menschwerdung“</span> GOTTES in JESUS CHRISTUS, die <span style="color:#4C58FF">„Hypostatische Union“</span>, bzw. diese außergewöhnliche und einzigartige <span style="color:#FF6000">„Koinzidenz“</span> von GOTT und Mensch, ist der wirkliche und historische Beginn der <span style="color:#4C58FF">„Erlösung“</span> des Menschen und der Welt; vergegenwärtigt für jede Generation der Menschen in und durch die <span style="color:#4C58FF">„Kirche“</span> JESU CHRISTI.)</span>
Die, von GÖDEL im 1. Beweisgang, als Prämissen schon vorausgesetzten und ,angenommenen‘ Perfektionen, bzw. Vollkommenheiten, <span style="color:#00B000">(das sind die allgemeinen ,Transzendentalia‘ für alles Nicht-Göttliche in der Welt)</span>, werden im ersten Teil des 2. Beweisganges, mit Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dann auch als <span style="color:#FF6000">„positive Wesenseigenschaften“</span>, <span style="color:#00B000">(als die ultimativen ,Transzendentalia‘)</span>, in GOTT ‚definitiv‘ <span style="color:#00B000">( ╞ )</span> bestätigt; <span style="color:#00B000">(siehe Anhang, 2. Beweisgang, Anmerkung-2)</span>.
Im 3. Beweisgang ist das Basis-Theorem-2 die ,modal‘ notwendige, bzw. transzendentale, Voraussetzung, sowohl für das <span style="color:#FF6000">„an sich notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, im Term :10:, als auch für die <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, in den Ressourcen dieses Beweisganges ''':''' in der Definition-3, und im Axiom-5; <span style="color:#00B000">(das <span style="color:#4C58FF">— ‚'''E'''‘ —</span> wird nur GOTT zugeordnet; vgl. auch Anhang, 3. Beweisgang, Anmerkung-4)</span>. Dieses Basis-Theorem-2 ist auch zugleich die Antwort auf die Frage nach dem ‚Ursprung‘ GOTTES ''':''' GOTT ist <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> ‚da‘, von <span style="color:#CC66FF">„Ewigkeit zu Ewigkeit“</span>, denn es ‚ist‘ sein <span style="color:#FF6000">„Wesen“</span>, <span style="color:#00B000">(überzeitlich-ewig)</span> für uns immer schon ‚da‘ zu sein. Weitere ‚Einzelheiten‘ über Wesen und Eigenschaften GOTTES gehören in die Mystik, bzw. in die <span style="color:#4C58FF">„Theologie“</span>.
===<div class="center"><span style="color:#660066">Die Bedeutung des Kalküls</span></div>===
<div class="center">Immanuel KANT und Kurt GÖDEL im ‚Dialog‘</div>
KANT sagt ''':'''
::<span style="color:#FF6000">»</span>'''''Sein''' ist offenbar kein reales Prädikat''. ... ''Es ist bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Position'' <span style="color:#00B000">[ latinisiert, deutsch für ''':''' ,Setzung‘ ]</span> ''eines Dinges ... Nehme ich nun das Subjekt (Gott) mit allen seinen Prädikaten'' <span style="color:#00B000">[ d.h. Eigenschaften ]</span> ''(worunter auch die Allmacht gehört) zusammen, und sage ''':''' ‚'''Gott ist'''‘'', <span style="color:#00B000">[ ,GOTT existiert wirklich‘ ]</span>, ''oder ‚es ist ein Gott‘, so <u>setze</u> ich kein neues Prädikat'' <span style="color:#00B000">[ keine neue Eigenschaft ]</span> ''zum ‚Begriffe‘ von Gott ''':''''' <span style="color:#00B000">[ <span style="color:#0000FF; background-color:#FFFF00">‚Sein’ ist kein ‚reales Prädikat’ in GOTT</span>; ‚Existenz‘ ist in GOTT keine ‚Eigenschaft‘ ],</span> ... ''es kann daher zu dem Begriffe'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''der bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Möglichkeit ausdrückt, darum, dass ich dessen Gegenstand'', <span style="color:#00B000">[ GOTT ]</span>, ''als schlechthin gegeben (durch den Ausdruck ''':''' er ist'', <span style="color:#00B000">[ GOTT ist wirklich ]</span>'' ) <u>denke</u>, nichts weiter hinzukommen.'' <span style="color:#00B000">[ Beides ist ,bloß gedacht‘ '''!''' ]</span> ''Und so enthält das Wirkliche nichts mehr als das bloß Mögliche. Hundert ‚wirkliche‘ Taler enthalten nicht das mindeste <u>mehr</u>, als hundert ‚mögliche‘. Denn, da diese den'' <span style="color:#00B000">[ gedachten ]</span>'' ‚Begriff‘, jene aber den Gegenstand und dessen'' <span style="color:#00B000">[ gedachte ]</span>'' Position an sich selbst bedeuten, so würde, im Fall dieser'', <span style="color:#00B000">[ die 100, als ,wirklich‘ bloß gedachten Taler ]</span>, ''<u>mehr</u> enthielte als jener,'' <span style="color:#00B000">[ als ihr ‚gedachter‘ Begriff im Verstand, wie ΑNSELM von Canterbury für GOTT, als ‚wirklich‘ Existierenden, argumentierte, …''so würde'' ]</span> ''mein ‚Begriff‘'' <span style="color:#00B000">[ die 100 im Verstand ‚gedachten‘ Taler ]</span> ''nicht den ganzen Gegenstand ausdrücken, und also auch <u>nicht der angemessene Begriff</u> von ihm sein. Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben'', <span style="color:#00B000">[ als bei 100 bloß ‚gedachten‘ Talern ]</span> ... <span style="color:#FF6000">«</span> <span style="color:#00B000"><ref>‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 401; https://www.korpora.org/kant/aa03/401.html</ref></span>.
GÖDEL würde darauf <span style="color:#00B000">(korrespondierend zur aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition von der Identität von Sein und Wesen in GOTT)</span> antworten ''':'''
::<span style="color:#FF6000">»</span>Die <span style="color:#FF6000">„100 Taler“</span> sind der <span style="color:#FF6000">»''zufälligen Struktur der'' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> entnommen, und sind daher nicht mit GOTT vergleichbar, der, <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer Welt, <span style="color:#FF6000">„über“</span> dieser Welt steht. Einzig und allein nur von GOTT gilt ''':''' Der mit Dingen aus unserer Welt ,nicht vergleichbare‘ GOTT, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#FF6000">„existiert notwendig für uns“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, und <span style="color:#FF6000">„notwendiges Existieren, <u>Sein</u>“</span> ,ist‘ eine <span style="color:#FF6000">„positive <u>Wesen</u>seigenschaft“</span> in GOTT, <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, weil GOTT aus sich <span style="color:#FF6000">„vollkommen“ <span style="color:#00B000">|</span> „perfekt“</span> ist, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#0000FF; background-color:#FFFF00">‚Sein‘ ist in GOTT ein ‚reales Prädikat‘</span>; <span style="color:#00B000">(notwendige ‚Existenz’ ist eine positive ‚Wesenseigenschaft’ in GOTT)</span>, und nur bei GOTT '''!''' Zum zeitlos-ewigen GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(als methodologische Kalkül-Prämisse)</span>, kann man sagen ''':''' Weil es, wegen Axiom-1 und Axiom-2, <span style="color:#FF6000">„widerspruchsfrei möglich"</span> ist, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, darum ist GOTT auch das ‚einzige‘ <span style="color:#FF6000">„Wesen“</span>, <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, von dem ein Christ sagen kann, dass es <span style="color:#FF6000">„notwendig aus sich“</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, d.h. <span style="color:#FF6000">„grundlos“ <span style="color:#00B000">|</span> „unverursacht“</span>, für uns immer schon ‚da’ ist, und immer ,da’ sein wird; und zusätzlich gilt ''':''' Es gibt für jede mögliche Welt ‚nur‘ diesen einen GOTT ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ — </span><span style="color:#00B000">(Monotheïsmus, Korollar-3)</span>; vorausgesetzt, man geht von der ,Existenz’ dieses GOTTES aus, wobei diese Annahme für GÖDEL <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist.<span style="color:#FF6000">«</span>
Eine Beobachtung ''':''' KANT sagt, gleichsam als ,krönenden‘ Abschluss seiner Widerlegung des, — von ihm so genannten —, ,ontologischen Gottesbeweises‘ ''':''' <span style="color:#FF6000">»</span>''Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben, (d.i. ihrer Möglichkeit).''<span style="color:#FF6000">«</span> Diese Feststellung KANTS entspricht jedoch genau der Argumentation ANSELMS ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span>, d.h. GOTT ,existiert auch in Wirklichkeit‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was <u>mehr</u> ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ein bloßer Begriff ,im Verstand zu sein‘. Der ,Mehr-Wert‘ ergibt sich in beiden Fällen, sowohl bei den Talern als auch bei GOTT, aus der ,Wirklichkeit‘ ihrer Existenz, im Gegensatz zur bloßen, <span style="color:#00B000">(im Begriff gedachten)</span>, ,Möglichkeit‘ ihrer Existenz, so dass, in jedem Fall, der ,Begriff‘ im Verstand ohne Abstriche <span style="color:#FF6000">»</span>''den ganzen Gegenstand ausdrückt''<span style="color:#FF6000">«</span>, und von diesem auch <span style="color:#FF6000">»</span>''der angemessene Begriff''<span style="color:#FF6000">«</span> ist. Alles andere wäre eine ,Lüge‘. Mit dieser ,Beobachtung‘ ist das implizit ,Widersprüchliche‘ in KANTS Argumentation aufgedeckt ''':''' Das Wirkliche in KANTS Vermögenszustande enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, konträr zu seiner vorigen Behauptung ''':''' <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#FF6000">«</span> enthalte <span style="color:#FF6000">»'',nichts mehr‘</span> als das bloß Mögliche''<span style="color:#FF6000">«</span>. Diese Behauptung ist offensichtlich falsch. Das ist somit ein indirekter Beweis und damit eine Bestätigung für die analoge Argumentation ANSELMS aus dem Wiederspruch des Gegenteils, am Beispiel KANTS <span style="color:#FF6000">»</span>''Vermögenzustandes bei hundert wirklichen Talern''<span style="color:#FF6000">«</span>, in dem in Wirklichkeit <span style="color:#FF6000">,doch mehr‘</span> ist, <span style="color:#FF6000">»</span>''als bei dem bloßen Begriffe derselben''<span style="color:#FF6000">«</span>.
<span style="color:#00B000">(Diese ,Beobachtung‘ ist zugleich auch das entscheidende Indiz dafür, dass das systembedingte Konzept KANTS von der ,Existenz‘, bzw. vom ,Sein‘ eines jeden Gegenstandes, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.i. als seine ,Setzung‘ bloß im- und durch den Verstand, ,falsch‘ ist, — d.h. im Klartext ''':''' für KANT ist das ,Sein‘ eines Gegenstandes bloß ein ,Gedanke‘ in uns, wenn er meint, dass uns ein Gegenstand erst dann wirklich ,gegeben‘ sei, wenn wir uns den</span> <span style="color:#FF6000">»</span>''Gegenstand als schlechthin gegeben (durch den Ausdruck : <u>er ist</u>) <u>denken</u>''<span style="color:#FF6000">«</span>, <span style="color:#00B000">was nur dem Irrtum einer falschen System-Konzeption geschuldet sein kann. Auf Grund dieser Konzeption ist das</span> <span style="color:#FF6000">»</span>''Ding, wie es an sich selbst ist''<span style="color:#FF6000">«</span>, <span style="color:#00B000">für KANT systembedingt weder ,anschaubar‘, noch ,erkennbar‘. Diese falsche Konzeption über die ,Existenz‘, bzw. das ,Sein‘ eines Dinges, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">ist für KANT letztendlich auch die Beweisgrundlage und Voraussetzung für seine Ablehnung des ontologischen Argumentes für GOTT im Theorem ANSELMS. Wenn das ,wirkliche‘ Sein eines Dinges nichts anderes ist, als</span> <span style="color:#FF6000">»</span>''dessen'' <span style="color:#00B000">[ bloß gedachte ]</span> ''Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.h. als seine ,mögliche‘ Setzung bloß im- und durch den Verstand, — das ist das, als ,wirklich‘ bloß nur ,gedachte‘ Ding —, dann</span> <span style="color:#FF6000">»</span>''enthält''<span style="color:#FF6000">«</span> <span style="color:#00B000">natürlich</span> <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#00B000">, [ als die bloß gedachte Existenz ],</span> ''nichts mehr als das bloß Mögliche''<span style="color:#00B000">, [ als der gedachte Begriff ]<span style="color:#FF6000">«</span>, was offensichtlich unhaltbar ist. <span style="color:#4C58FF">[ Modus tollendo tollens ] </span> ''':''' Wenn die Konsequenz einer Wenn-Dann-Folgerung ,falsch‘ ist, dann ist auch ihre Voraussetzung, das System-Konzept KANTS, ,falsch‘ ''':''' d.i. seine ,Kopernikanische Wende‘ für die Metaphysik, soweit sie KANTS ,Sein’-Konzept betrifft. Korrekt und ,wahr‘ ist in jedem Fall ''':''' Das Wirkliche enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, und die Dinge ,existieren‘ schon immer unabhängig von unserem Denken. ,Existenz‘, das ,Sein‘, ist <span style="color:#FF6000">,doch mehr‘</span>, als bloß ein ,Gedanke‘ von uns.)</span>
Somit ist die Argumentation KANTS gegen den ontologischen Beweis ANSELMS für GOTT ,falsch‘ und unhaltbar, weil sie auf der ,falschen‘ Voraussetzung beruht ''':''' die ,Existenz‘, bzw. das ,Sein‘ eines jeden ,Gegenstandes‘, — wie z. B. auch die Existenz bei GOTT —, sei bloß dessen gedachte ,Position‘ an sich selbst, d.h. bloß seine ,Setzung‘ im- und durch den Verstand. Damit ,macht‘ er GOTT außerdem zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, und verkennt so, — wie vor ihm THOMAS von Aquin —, auch die Einzigartigkeit und Exklusivität GOTTES im Theorem ANSELMS.
<div class="center">Die <span style="color:#FF6000">„Rede von GOTT“</span> in der philosophischen Tradition</div>
Wenn man die philosophische Tradition der <span style="color:#FF6000">„Rede von GOTT“</span> im Lichte der Ergebnisse der <span style="color:#4C58FF">„axiomatischen Theologie“</span> GÖDELS liest, dann stellt sie sich am Beispiel bei ARISTOTELES, — AVICENNA, — ANSELM, und bei GÖDEL wie folgt dar ''':'''
<span style="color:#FF6000">»''Das Erstbewegende,'' (<span style="font-family: Times;"><big>,πρῶτον κινοῦν‘</big></span>), ''das, ohne selbst ‚bewegt‘ zu sein'', (<span style="font-family: Times;"><big>,ἀκίνητον‘</big></span> <span style="color:#00B000">| ''unverursacht, ,entstehungslos‘'' |</span> ), ''alles Übrige wie ein Geliebtes ‚bewegt‘'', (<span style="font-family: Times;"><big>,κινεῖ δὴ ὡς ἐρώμενον‘</big></span> <span style="color:#00B000"> | ''-verursacht, ,entstehen‘ lässt'' |</span> ), ''ist sowohl'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚Wesen‘'', (<span style="font-family: Times;"><big>,ἀΐδιον καί οὐσία‘</big></span> <span style="color:#00B000">| ''‚Substanz‘'' |</span> ), ''als auch'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚wirksames, verwirklichendes Sein‘'', (<span style="font-family: Times;"><big>‚ἀΐδιον καί ἐνέργεια οὖσα‘ = ‚actus purus‘</big></span><span style="color:#00B000"> | '',reine Tätigkeit‘'' |</span> ), … ''ersehnt'', (<span style="font-family: Times;"><big>,ὀρεκτόν‘</big></span>), ''und erkennbar'', (<span style="font-family: Times;"><big>,νοητόν‘</big></span>), ... ''denn dies ist der ‚Gott‘'', (<span style="font-family: Times;"><big>,τοῦτο γὰρ ὁ θεός‘</big></span>), <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, ''der'' <span style="color:#00B000">[ zeitlich-]</span>''Ewige'', (<span style="font-family: Times;"><big>,ἀΐδιον‘</big></span>), — ''der Unvergleichliche'', (<span style="font-family: Times;"><big>,ἄριστον‘</big></span> <span style="color:#00B000">| ''‚der Beste‘'' |</span> ), — ''der Lebendige'', (<span style="font-family: Times;"><big>,ζῷον‘</big></span> <span style="color:#00B000">| ,''das Leben selbst‘'' |</span> ), — ... ''so sagen wir ja'', (<span style="font-family: Times;"><big>,φαμὲν δὴ‘</big></span>), — ...«</span> ''':''' <span style="color:#00B000">(ARISTOTELES — Grieche)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als ,Individuumname‘, ist synonym mit <span style="color:#FF6000">„göttliches ‚Da-Sein’“</span>, das sowohl <span style="color:#FF6000">„aus sich vollkommen“</span>, als auch <span style="color:#FF6000">„notwendig für uns“</span> ‚da‘ ist; <span style="color:#00B000">(das ist das, an sich, vollkommene ‚Was-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, das zugleich, für uns, das notwendige ‚Da-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> — ist)</span>; <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span>. Das ist der <u>angemessene Begriff</u> von GOTT, und gilt ‚nur‘ von GOTT. Weil GOTT <span style="color:#FF6000">„vollkommen“</span> ist, ist <span style="color:#FF6000">„Da-Sein“ <span style="color:#00B000">|</span> „GOTT-Sein“ <span style="color:#00B000">|</span> „Göttlichkeit“</span> das <span style="color:#FF6000">„Wesen“</span> GOTTES ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>. Im Unendlichen, GOTT, sind <span style="color:#FF6000">„Essenz“</span> und <span style="color:#FF6000">„Existenz“</span> koinzident ,eins‘, und daher untrennbar, und <span style="color:#FF6000">»''darum ist GOTT das einzige ‚Sein’, das notwendig an sich ‚da‘ ist''«</span> ''':''' <span style="color:#00B000">(ABU ALI SINA alias AVICENNA — Muslim)</span>.
Der <span style="color:#00B000">(gedachte)</span> ‚Eigenschafts-Begriff‘ <span style="color:#FF6000">„Vollkommenheit (die Größe) GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#00B000">(‚Perfektion‘, die unbegrenzte Summe aller ‚positiven Eigenschaften‘ in GOTT)</span> schließt koinzident die ‚Eigenschaft’ <span style="color:#FF6000">„notwendige Existenz für uns“</span> mit ein ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>. GOTT wäre nicht <span style="color:#FF6000">„vollkommen“</span>, wenn er nicht auch real für uns ‚da‘ wäre, wenn er nicht ,immer schon’ <span style="color:#FF6000">„existierte“</span>. ‚Sein’ ist <u>mehr</u> als ‚Nicht-Sein’. ,Sein’, bzw. ,Existenz’ gehört in GOTT zu den ,Transzendentalia’. Das sind die <span style="color:#00B000">(ultimativen)</span> ,Wesenseigenschaften’ in GOTT. Der unbegrenzt Unendliche, GOTT, ist daher das <span style="color:#FF6000">»''vollkommenste Wesen, über das nichts ,Größeres‘ d.h. Vollkommeneres <u>mehr</u> ‚gedacht‘ werden kann''«</span> ''':''' <span style="color:#00B000">(ANSELM von Canterbury — Christ)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„Perfektion GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schließt koinzident das <span style="color:#FF6000">„notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> —, für uns mit ein, ohne einen zeitlichen Anfang und ohne ein zeitliches Ende. Das ist die ‚zeitlos-ewige‘, an sich absolute, und <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#00B000">(Das ist ein ,regulär‘-mögliches Korollar im 2. Beweisgang aus Term :16: ''':''' <span style="color:#4C58FF">— ‚'''Gy→Yy'''‘ —</span>, mit der <span style="color:#4C58FF">[ Instanz(Y:=E<sub>not</sub>) ]</span>, und der <span style="color:#4C58FF">[ FUB(y:=x) ]</span>; und auch ein ,regulär‘-mögliches Korollar im 3. Beweisgang ''':''' entsprechend der <span style="color:#FF6000">„logischen Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A → B ]</span> von Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> und Term :05: <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span> aus diesem Beweisgang. In Worten ''':''' <span style="color:#FF6000">»</span>''Angenommen, '' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> ''steht für den GOTT der Christen'' ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ — </span>, ''dann existiert dieser GOTT'', <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, ''für uns notwendig'', <span style="color:#4C58FF">— <sub>not</sub> —</span> <span style="color:#FF6000">«</span>.)</span> Der Unendliche, GOTT, ist <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer ‚vergänglichen‘, ,endlichen‘ Welt, welche prinzipiell vom dreidimensionalen Raum und von der unwiederbringlich ‚vergehenden‘ Zeit geprägt ist. Der ,GOTT der Christen‘ ist <span style="color:#FF6000">»''unabhängig''«</span> von dieser <span style="color:#FF6600">„vergehenden Raum-Zeit“, — »''jenes rätselhafte und anscheinend in sich widersprüchliche Etwas''« <span style="color:#00B000">(GÖDEL)<ref>Kurt GÖDEL, ‚''<span style="font-family: Times;"><big>Eine Bemerkung über die Beziehungen zwischen der Relativitätstheorie und der idealistischen Philosophie‘</big></span>'', in P.A.SCHILPP (Hg.): ‚''<span style="font-family: Times;"><big>Albert Einstein, Philosoph und Naturforscher‘</big></span>'', Seite 406</ref></span> —</span>. Ohne ‚Zeit‘ gibt es keinen zeitlichen Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘, <span style="color:#00B000">(beides ist zeitlos ,eins‘)</span>, und so ist der zeitlos-ewige GOTT, der <span style="color:#FF6000">»''notwendig aus sich ,existiert‘'' «</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ — </span>, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> für uns immer schon ‚da‘ ''':''' <span style="color:#00B000">(GÖDEL — ohne religiöses Bekenntnis)</span>.
Mit dem GÖDEL-Kalkül ist die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt worden, und ist somit für jeden Menschen nachvollziehbar, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie obige Beispiele zeigen.
'''Resümee :'''
Das GÖDEL-Kalkül zeigt mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, was notwendig folgt, wenn die Axiome ‚wahr‘ sind, <span style="color:#00B000">(die Axiome bilden formal-syntaktisch <span style="color:#FF6000">»''die theologische Weltanschauung''«</span> ab)</span>, unter der Voraussetzung, dass die Axiome <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>'' Struktur''«</span> unserer Welt sind. Die ,Verifikation‘ der Axiome und Definitionen von GOTT und seiner Vollkommenheiten gelingt GÖDEL, — entsprechend seiner Unabhängigkeits-Bedingung —, durch den Aufweis ihrer Widerspruchsfreiheit ''':''' sie sind somit ,wahr‘ und, — im Kontext einer <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> —, auch ,annehmbar‘ in unserer ,realen‘ Welt ''':''' <span style="color:#00B000">(siehe Anhang, 2. Beweisgang und Anmerkung-2)</span>. Er vermeidet damit den Fehler, der immer wieder im Diskurs über Gottesbeweise gemacht wird ''':''' GOTT mit seinen Geschöpfen zu vergleichen. Diese logisch-philosophische Rede von GOTT <span style="color:#00B000">(<span style="color:#FF6000">»''ohne sich auf den Glauben an irgendeine Religion zu stützen''«</span>)</span> hat eine <u>mehr</u> als zweitausendjährige Tradition hinter sich. Der <span style="color:#FF6000">„100-Taler-Gott“</span> des Philosophen KANT, hat heute, nachdem der Logiker und Systemtheoretiker GÖDEL sein System vorgelegt hat, an ‚Strahlkraft‘ verloren.
Kurt GÖDEL ''':'''
::<span style="color:#FF6000">» ''Die theologische Weltanschauung'', <span style="color:#00B000">[ dass GOTT für uns immer schon ‚da‘ ist ]</span>, ''ist rein verstandesmäßig mit allen bekannten Tatsachen durchaus vereinbar'';«</span> <span style="color:#00B000">[ d.h. sie ist das ,Resultat‘ der, — vom Glauben geleiteten —, ‚theoretischen Vernunft‘, alias ‚reinen Vernunft‘, und nicht bloß das ‚Postulat‘ einer ‚praktischen Vernunft‘, wie KANT meint ]. <span style="color:#FF6000">»''Der'' <span style="color:#00B000">[ christliche ]</span> ''Glaube ist die ‚Pupille‘ im ‚Auge‘ unseres Verstandes.''«</span> (Heilige KATHARINA von Siena, Lehrerin der Kirche, Patronin Europas<ref>vgl. <span style="font-family: Times;"><big>''Gebet 7 ‚Für die neuen Kardinäle‘, Rom, 21. Dezember 1378,''</big></span> aus <span style="font-family: Times;"><big>''Caterina von Siena ,Die Gebete‘.''</big></span> Kleinhain 2019, online: https://caterina.at/werke/gebete/gebete-detailansicht/gebet-7.html</ref> )</span>
Der sonst so rationale KANT, hier doch etwas emotionell, <span style="color:#00B000">(als wolle er die Ergebnisse im GÖDEL-Kalkül nicht wahr haben, die belegen, dass er sich bei GOTT geirrt, und die Funktion des christlichen Glaubens für die Philosophie falsch eingeschätzt hat)</span> ''':'''
::<span style="color:#FF6000">»</span> ''Es war etwas ganz Unnatürliches und eine bloße Neuerung des Schulwitzes, aus einer ganz willkürlich entworfenen Idee das Dasein des ihr entsprechenden Gegenstandes selbst ausklauben zu wollen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 403. https://www.korpora.org/kant/aa03/403.html</ref>.<span style="color:#FF6000">«</span>
Für KANT, für die Scholastiker, <span style="color:#00B000">(und auch für uns)</span>, ist es natürlich ‚logisch‘, dass aus einem als ‚möglich’ gedachten Begriff, <span style="color:#FF6000">»</span>''aus einer ganz willkürlich entworfenen Idee''<span style="color:#FF6000">«</span>, keine Existenzaussage abgeleitet werden kann. <span style="color:#00B000">(Aus dem bloß gedachten Begriff ,goldene Berge‘ folgt natürlich nicht, dass es solche in Wirklichkeit auch gibt.)</span> In der philosophisch-<span style="color:#4C58FF">,theologischen’</span> Tradition, die von ARISTOTELES herkommt, ist der Begriff <span style="color:#FF6000">»''GOTT''«</span> jedoch von allen anderen Begriffen so verschieden, so dass für GOTT diese Logik KANTS nicht mehr gilt. GOTT ist ,unvergleichlich‘ und ,einzigartig‘.
Dazu der Kommentar von HEGEL ''':'''
::<span style="color:#FF6000">»''Wenn KANT sagt, man könne aus dem Begriff'' <span style="color:#00B000">[ ‚GOTT‘ ]</span> ''die Realität nicht ,herausklauben‘, so ist da der Begriff als endlich gefasst''.« <span style="color:#00B000">[ In der Endlichkeit unserer Welt trifft die Logik KANTS zu, dass dem ‚Begriff‘ nicht ,notwendig‘ das ‚Sein‘ folgt, denn es gibt in ihr die ,Lüge‘, die das ,Wirklich-Sein‘ im Begriff bloß behauptet, ohne dass es ,in Wirklichkeit‘ zutrifft, was sie behauptet. Es gilt hier nach KANT ''':''' »''Sein ist kein reales Prädikat''«. Somit ist ]</span> »''...der Begriff ohne'' <span style="color:#00B000">[ reales ]</span> ''Sein ein Einseitiges und Unwahres, und ebenso das Sein, in dem kein Begriff ist'', <span style="color:#00B000">[ ist ]</span> ''das begrifflose Sein,'' <span style="color:#00B000">[ d.i. das relative ,Noch-Nicht-Begriffene‘ ]</span>.'' Dieser Gegensatz, der in die Endlichkeit fällt'' <span style="color:#00B000">[ im Endlichen zutrifft ]</span>, ''kann bei dem Unendlichen, GOTT, gar nicht statthaben''<ref>Georg Wilhelm Friedrich HEGEL, ‚<span style="font-family: Times;"><big>''Ausführungen des ontologischen Beweises''</big></span>‘ in den ‚<span style="font-family: Times;"><big>''Vorlesungen über die Philosophie der Religion vom Jahr 1831''</big></span>‘ . Hamburg 1966, Seiten 175 bzw. 174</ref>; <span style="color:#00B000">[ denn ,Begriff‘, bzw. ,Denken‘ und ,Sein‘ sind in dem Unendlichen, GOTT, untrennbar und real immer dasselbe. Auf Grund dieser ontologischen Identität ,personifiziert‘ und ,repräsentiert‘ GOTT die ,Wahrheit‘ ''':''' GOTT ist die ,Wahrheit‘. In GOTT, dem <span style="color:#FF6000">„Schöpfer der Welt“</span>, folgt dem ,Begriff‘ immer ,notwendig‘ das ,Sein‘ ''':''' <span style="color:#CC66FF">»''GOTT sprach ''':''' Es werde ,Licht‘. Und es wurde Licht''«, <small>{{Bibel | Genesis |1|3|EU}}</small>;</span> oder auch ''':''' <span style="color:#CC66FF">»''Der Herr sprach, und sogleich geschah es; er gebot, und alles war da''«,</span> <small>{{Bibel | Psalm |33|9|EU}}</small>.]</span>«</span>
Das Entscheidende bei der <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls ist, dass der <span style="color:#00B000">(Begriff)</span> GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, nicht auf die Ebene seiner ,endlichen‘ Geschöpfe und unserer Welt gestellt wird, <span style="color:#00B000">(d.i. das ‚Universum‘ im ,Urknall‘, die ‚100-Taler‘, ein ‚Tsunami‘, auch ,einfache Modelle‘ von unserer Welt, etc.)</span>, und damit verglichen wird, sondern, dass der GOTT der Christen in seiner Einzigartigkeit und Besonderheit als <span style="color:#FF6000">»''der Unendliche''«</span> belassen und als <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer vergänglichen Welt, — als <span style="color:#FF6000">»''der Unvergleichliche''«</span> —, verstanden wird. <span style="color:#00B000">(Alle Kritiken des sog. ,ontologischen‘ Gottesbeweises übersehen die Einzigartigkeit und Besonderheit des <span style="color:#FF6000">»''Unendlichen''«</span>, und/oder wollen diese nicht ,wahr‘ haben.)</span> Auch THOMAS von Aquin ,verortet‘ den GOTT ANSELMS, — in seiner Kritik an dessen Theorem —, irrtümlich unter die ,Dinge‘ der uns umgebenden ,Natur‘, wenn er sagt ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse in rerum natura</big></span>“</span>, d.h. wörtlich, dass der GOTT ANSELMS <span style="color:#FF6000">»</span>''in der Natur der Dinge'' <span style="color:#00B000">(unserer Welt)</span> ''existiert''<span style="color:#FF6000">«</span>, und verkennt somit, — wie nach ihm auch KANT —, die ,Unvergleichlichkeit‘ GOTTES, <span style="color:#00B000">(vgl. STh I q.2 a.1 ad 2<ref>„Deus … illud quo maius cogitari non potest; non tamen propter hoc sequitur quod intelligat id quod significatur per nomen, esse in rerum natura; sed in apprehensione intellectus tantum.“ ——— »''GOTT ist'' (nach ANSELM) ''der, über den Größeres nicht mehr gedacht werden kann. Aber nicht deswegen, weil er'', (der Narr von Psalm 14.1, den ANSELM zitiert), ''das versteht, was durch diesen Namen,'' (d.h. mit dem Begriff ,GOTT‘, als der ,Größte‘, im Theorem ANSELMS), ''bezeichnet wird, folgt daraus'', (wie ANSELM meint), ''dass er auch versteht, dass er'', (der GOTT ANSELMS), ''auch in der ,Natur‘ der Dinge'' (unserer Welt) ''existiert''; <span style="color:#00B000">[ was ANSELM so nie gesagt hat ]</span>. ''Daraus folgt nur, dass er'', (als ,GOTT‘), ''bloß in der Auffassung seines Verstandes'', (d.h. nur im Denken des Narren als ,Begriff‘), ''existiert.''« ——— Hier ,verortet‘ THOMAS einerseits den unendlichen GOTT, von dem das Theorem ANSELMS spricht, irrtümlich unter die endlichen Dinge der uns umgebenden ,Natur‘, was sachlich dem theologischen Theorem der Unvergleichlichkeit GOTTES widerspricht, der nicht unter die Dinge unserer Welt eingereiht werden darf. Anderseits verliert er dadurch auch den ,Blick‘ für die Außerordentlichkeit und Besonderheit GOTTES, dessen Natur völlig verschieden und unabhängig von der ,Natur‘ unserer raum-zeitlichen Welt ist. GÖDEL beweist jedoch, mit ANSELM, weil es notwendig, ohne Widerspruch, (»''bloß in der Auffassung unseres Verstandes''«), möglich ist, dass GOTT existiert, ist es korrekt, daraus auch mit Notwendigkeit zu folgern, dass der Glaube des Erzbischofs ANSELM, und der Glaube seiner Anvertrauten, von der Wirklichkeit GOTTES, widerspruchsfrei, logisch richtig, und damit sinnvoll ist; denn Möglichkeit und Wirklichkeit sind in GOTT koinzident ,eins‘. Das ist das Privilegium GOTTES allein, der einzigartig und unvergleichlich ist. Damit zeigt er auf, dass THOMAS die Unvergleichlichkeit und Einzigartigkeit GOTTES in seinem Vorhalt nicht bedacht hat; und außerdem ANSELM missverstanden hat.</ref>)</span>; jedenfalls hier in der Auseinandersetzung mit ANSELM. Dagegen spricht ANSELM im ,''<span style="font-family: Times;"><big>Proslogion</big></span>''‘, Seite 85f, nur von einem <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span> GOTTES, d.h. dass GOTT ,auch in Wirklichkeit existiert‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was ,größer‘, bzw. ,mehr‘ ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ,im Verstand zu sein‘; wobei die ,zeitlose-überzeitliche‘ Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES jedoch völlig verschieden und <span style="color:#FF6000">»''unabhängig von der zufälligen''«</span> Wirklichkeit <span style="color:#00B000">(die ,Natur‘)</span> der ,raum-zeitlichen‘ Welt der Dinge ist. Daher ist sie mit dieser auch nicht vergleichbar. GOTT ist <span style="color:#FF6000">„vollkommen“</span> und alle <span style="color:#FF6000">„Vollkommenheiten“</span> in GOTT, <span style="color:#00B000">(die ultimativen ,Transzendentalia‘)</span>, sind koinzident ,eins‘, — ,fallen <span style="color:#FF6000">„notwendig“</span> perspektivisch in eins zusammen‘, und sind daher konvertierbar. Darum ist auch die Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES ,einzigartig‘ und ,unvergleichlich‘.
Mit Korollar-3 ist die Exklusivität und Außerordentlichkeit GOTTES definitiv im Kalkül ,bewiesen‘ <span style="color:#00B000">( ╞ )</span>. Der abendländische Monotheïsmus ist somit eine ,logische‘ Konsequenz aus den GÖDEL-Axiomen. <span style="color:#00B000">(Das <span style="color:#4C58FF">„theologische“</span> Theorem von der ,Einzigartigkeit‘ und Exklusivität GOTTES, d.h. hier im Kontext ''':''' die exklusive Einheit von GOTT und Mensch in JESUS CHRISTUS; von Vater, Sohn und Geist im <span style="color:#4C58FF">„Dreifaltigen“</span>; von Essenz und Existenz, von Begriff und Sein, von Ursache und Wirkung, von Subjekt und Objekt, von Möglichkeit und Wirklichkeit, und die unbegrenzte Summeneinheit und Koinzidenz der unendlichen Transzendentalien in GOTT, ist, — mit HEGEL —, die Voraussetzung und Bedingung jeder Philosophie ''':''' <span style="color:#FF6000">»''Die Einheit muss am Anfang der Philosophie stehen''«</span>; und ist zugleich auch ihr gesuchtes und bewiesenes Endergebnis und Ziel ''':''' <span style="color:#FF6000">»''Diese Einheit muss auch das Resultat der Philosophie sein''«</span><ref>https://hegel-system.de/de/gottesbeweis.htm#hegels-kritik-an-kant</ref>, was hier im GÖDEL-Kalkül ,logisch‘ mit Korollar-3 verifiziert wird ''':''' <span style="color:#4C58FF">— ‚'''□(∃xGx ∧ ∀y(Gy→x=y))'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist exklusiv einzigartig''«</span>.)</span>
Die Einzigartigkeit GOTTES bedingt die Koinzidenz, den inneren Zusammenhang aller seiner Vollkommenheiten und Zuschreibungen, <span style="color:#00B000">(Axiom-2)</span>, d.h. ihr paarweise, perspektivisches ,Zusammenfallen in eins‘ im Unendlichen, GOTT. ——— Aus der Notwendigkeit aller positiven Eigenschaften und Zuschreibungen, <span style="color:#00B000">(d.h. aus den, an sich, notwendigen, ultimativen Transzendentalien, Axiom-4)</span>, die in GOTT paarweise, als ,Wesenseigenschaften‘ koinzident ,eins‘ sind, <span style="color:#00B000">(Definition-2)</span>, ist die Einzigkeit GOTTES für uns erschließbar, <span style="color:#00B000">(Korollar-3)</span>. Axiom-4 ist die erste, ,modal‘ <span style="color:#FF6000">„notwendige“</span>, d.h. die transzendentale Voraussetzung für Korollar-3.
Wenn im Korollar-3 das <span style="color:#4C58FF">— ‚'''x'''‘ —</span> z. B. für GOTT, dem ,Vater‘ der Christen, und das <span style="color:#4C58FF">— ‚'''y'''‘ —</span> für GOTT, dem ,Sohn‘, d.h. für ,JESUS CHRISTUS‘ steht, oder für den ,HEILIGEN GEIST‘, <span style="color:#00B000">(den ,Dreifaltigen GOTT‘ der Christenheit)</span>; oder auch für die Gottesbezeichnung ,GOTT-ADONAI‘ der Juden, oder für die Gottesbezeichnung ,ALLAH‘ der Muslime steht, dann weist dieses Korollar, für <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span>, mit der ,ontologischen Identität‘ ''':''' <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, auf die ,Koinzidenz‘ des <span style="color:#4C58FF">„Dreifaltigen“</span>, und auf die <span style="color:#4C58FF">„Hypostatische Union“</span> der Naturen von GOTT und Mensch in JESUS CHRISTUS,
bzw. auch auf den inneren Zusammenhang der drei Buch-Religionen hin.
===<div class="center"><span style="color:#660066">Anhang : das GÖDEL-Kalkül</span></div>===
In der ,Legende zum GÖDEL-Kalkül‘ wird an einige Basics erinnert, und diese für die operative Praxis im anstehenden Kalkül, mit Hilfe von logischen Meta-Terme, adaptiert. Zusätzliche, notwendige Regeln und Gesetze werden dann ,benannt‘, wenn sie in der Kalkül-Durchführung auftreten.
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">Legende zum GÖDEL-Kalkül</span></div>
|-
|
<small>
<math>\begin{align}
{\color{blue}\text{ ◇}} \text{ :: konsistent ↔ widerspruchsfrei ↔ möglich ↔ denkbar, } & {\color{blue}\text{ □}} \text{ :: notwendig ↔ wirklich, für jede mögliche Welt ↔ exklusiv} \\
\text{logischer Meta-Term ::} {\color{blue}\text{ [ A ├ B ]}} \text{ ::} & \text{ „aus A folgt im Kalkül ,regulär‘ (├ ) B.“} \\
\text{ A, B sind Aussagen über Eigenschaften, (A ist keine Eigenschaft);} & \text{ die Aussage, z.B. in der Kalkül-Zeile 10, wird als ,Term :10:‘ bezeichnet} \\
{\color{blue}\text{ AE}} \text{ ::} & \text{ Argument Einführung, Prämisse, Postulat } \\
{\color{blue}\text{ Xx}} \text{ ::} & \text{ „X ist eine Eigenschaft der Individuum-Variable x.“ } \\
{\color{blue}\text{ ¬PX}} \text{ ::} & \text{ „X ist keine positive Eigenschaft, ist keine Perfektion, ist nicht vollkommen.“ } \\
{\color{blue}\text{ Instanz(X := Y)}} \text{ ::} & \text{ Substitution der Eigenschaft X durch die ,bestimmte‘ Eigenschaft Y } \\
\text{ (Eine ,Instanz‘ ist ein Exemplar aus einer Menge gleichartiger Dinge;} & \text{ hier die ,bestimmte‘ Eigenschaft Y, als Ersatz für das unbestimmte X.) } \\
{\color{blue}\text{ FUB(x := y)}} \text{ ::} & \text{ Freie-Um-Benennung der Individuum-Variable x in y } \\
\text{ ,modal‘-frei gewählte Kalkül-Prämisse ::} {\color{blue}\text{ Gx}} \text{ ::} & \text{ „Die Variable x steht für den GOTT der Christen.“ } \\
{\color{blue}\text{ [ G(y) ├ ⱯyG(y) ]}} \text{ ::} & \text{ All-Operator-Einführung der Variable y für GOTT } \\
\text{ „Angenommen, die Variable y steht für GOTT, dann } & \text{folgt ,regulär‘ (├ ), dass auch jedes y im Kalkül für GOTT steht.“}\\
{\color{blue}\text{[ ⱯXA(X) ├ A(X) ]}} \text{ ::} & \text{ All-Operator-Beseitigung für die substituierte Eigenschaft X } \\
\text{ „Wenn X durch eine ,bestimmte‘ Eigenschaft ,instanziiert‘ ist oder } & \text{wird, dann kann der All-Operator von X ,regulär‘ (├ ) beseitigt werden.}\\
{\color{blue}\text{ KOMM(↔)}} \text{ ::} & \;{\color{blue}\text{[ (A↔ B) ↔ (B ↔ A) ]}} \text{ :: Kommutativgesetz für ( ↔ )}\\
{\color{blue}\text{ DIST(□∧)}} \text{ ::} & \;{\color{blue}\text{[ (□A ∧ □B) ↔ □(A ∧ B) ]}} \text{ :: Distributivgesetz für (□∧ )} \\
\text{ (hypothetischer Syllogismus, häufige logische Schlussregel) ::} & \;{\color{blue}\text{[ A → B, A ├ B ]}} \text{ :: (Modus ponendo ponens) :: Abtrennregel.} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn A wahr ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch B wahr ist.“} \\
\text{ (negativer hypothetischer Syllogismus) ::} & \;{\color{blue}\text{[ A → B, ¬B ├ ¬A ]}} \text{ :: (Modus tollendo tollens)} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn B falsch ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch A falsch ist.“} \\
\text{''KONDITIONALER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ A ├ B ╞ A → B ]}} \text{ :: (logische Implikation)} \\
\text{ „Angenommen, A ist ,regulär‘ Axiom oder Prämisse, und B ist im } & \text{Kalkül ,regulär‘ abgeleitet, dann ist ,bewiesen‘ ( ╞ ) : A impliziert B, ist wahr.“} \\
\text{''INDIREKTER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ ¬A → F ╞ A ]}} \text{ :: (Reductio ad absurdum)} \\
\text{ „Wenn im Kalkül aus ¬A ,regulär‘ eine Kontradiktion } & \text{F folgt, dann ist A ,bewiesen‘ ( ╞ ) : A ist ,wahr‘.“} \\
\end{align}</math>
</small>
|}
A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Eine Prädikatenlogik zweiter Stufe ist eine Logik, in der die Quantoren auch Eigenschaftsausdrücke <span style="color:#00B000">(<span style="color:#FF6000">„Prädikate”</span>)</span> binden können''. <span style="color:#00B000">[ Die ,Prädikate‘ werden in einem Kalkül dieser Logik durch Definitionen ,bestimmt‘ ]</span>. ''Wir werden uns im folgenden recht frei einer dafür geeigneten formalen Sprache bedienen. Äußere Quantoren werden meist weggelassen und wir schreiben kurz'' <span style="color:#4C58FF">— ‚'''Xx'''‘ — </span> ''bzw.'' <span style="color:#4C58FF">— ‚'''PX'''‘ — </span> ''um auszudrücken, dass das Individuum'' <span style="color:#4C58FF">— ‚'''x'''‘ — </span> ''die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''hat, bzw. dass die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''die höherstufige Eigenschaft'' <span style="color:#4C58FF">— ‚'''P'''‘ — </span> ''<span style="color:#00B000">(für <span style="color:#FF6000">„positiv”</span>)</span> hat;'' <span style="color:#00B000"> [ wobei die Eigenschaft <span style="color:#4C58FF">— ‚'''P'''‘ — </span> als einzige im Kalkül ,unbestimmt‘ bleibt ]</span>. <span style="color:#FF6000">«</span><ref>A. FUHRMANN ‚''<span style="font-family: Times;"><big>‚G‘ wie Gödel. Kurt Gödels axiomatische Theologie</big></span>''‘, Seite 6, Anmerkung 3. Konform mit seinem Artikel in ‚''<span style="font-family: Times;"><big>Logik in der Philosophie</big></span>''‘ hg. v. P. SCHROEDER-HEISTER, W. SPOHN und E. OLSSON. 2005, Synchron, Heidelberg.</ref>
Der All-Quantor für Eigenschaften, hier im GÖDEL-Kalkül der ,modalen‘ Prädikatenlogik zweiter Stufe, bindet die ,unbestimmte‘ Eigenschafts-Variable <span style="color:#4C58FF">— ‚'''X'''‘ —</span> ausschließlich nur in den Definitionen im 2. und 3. Beweisgang; <span style="color:#00B000">(im ersten Beweisgang gibt es keine Definition)</span>. Wobei diese Definitionen nur dann <span style="color:#FF6000">„wahr und widerspruchsfrei”</span> sind, wenn ihre Eigenschafts-Variablen ausschließlich mit ,Transzendentalien‘ belegt werden. Andernfalls sind sie sofort <span style="color:#FF6000">„modal falsch”</span>. Dieser All-Quantor wird dann jedes Mal in der Beweis-Durchführung durch die Substitution ''':''' <span style="color:#4C58FF"> [ Instanz(X:= ..) ]</span> mit ,bestimmte‘ Eigenschafts-Konstanten wie <span style="color:#4C58FF">— (X:= G) —</span>, bzw. <span style="color:#4C58FF">— (X:= ¬Y) —</span>, oder <span style="color:#4C58FF">— (X:= E<sub>not</sub>) —</span> ,regulär‘ <span style="color:#00B000">(├ )</span> beseitigt ''':''' <span style="color:#4C58FF"> [ ⱯXA(X) ├ A(X) ]</span>; wobei die Eigenschafts-Konstante im Kalkül entweder als Zwischenergebnis ,regulär‘ abgeleitet, <span style="color:#00B000">(,errechnet‘)</span>, oder mit einer Definition schon ,bestimmt‘ worden ist.
Die spezifische ‚Eigenschaft‘ einer Eigenschaft wird hier, in der formalen Syntax der ,modalen‘ Prädikatenlogik zweiter Stufe, als eine tiefer gestellte Abkürzung <span style="color:#00B000">(als Index)</span> an ihre Trägereigenschaft angehängt, wie z. B. ‚wesentlich‘, bzw. ‚essentiell‘ durch <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, oder ‚notwendig‘ durch <span style="color:#4C58FF"> — <sub>not</sub> —</span>. In der Definition-3 steht der Term ''':''' <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span>, um auszudrücken, dass das Individuum <span style="color:#4C58FF">— ‚'''x'''‘ —</span> notwendig <span style="color:#4C58FF">— <sub>not</sub> —</span> die Eigenschaft ''':''' <span style="color:#4C58FF">— ‚'''E'''‘ —</span>, für ,Existenz‘, hat, d.h. <span style="color:#FF6000">»''das <span style="color:#4C58FF">‚'''x'''‘</span> existiert notwendig''«</span>. Der schon von GÖDEL indizierte Term ''':''' <span style="color:#4C58FF">—‚'''G'''<sub>ess</sub>'''x'''‘ —</span> kann gelesen werden als ''':''' <span style="color:#FF6000">»''Das Individuum <span style="color:#4C58FF">‚'''x'''‘</span> hat die Wesenseigenschaft, <span style="color:#4C58FF"> — <sub>ess</sub> — </span> ''':''' GOTT zu sein, <span style="color:#4C58FF">‚'''G'''‘ </span>''«</span>, statt der ,an sich‘ konformen, aber <span style="color:#4C58FF">„theologisch“</span> etwas ungenauen Formulierung ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist wesentlich göttlich''«</span>; oder mit der Voraussetzung ''':''' <span style="color:#4C58FF">— ‚'''Gx'''→'''G'''<sub>ess</sub>'''x'''‘ — </span> deutlicher und <span style="color:#4C58FF">„theologisch“</span> korrekt ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für den GOTT der Christen'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span> ''das Wesen dieses GOTTES'', <span style="color:#4C58FF">— <sub>ess</sub>‚'''x'''‘ —</span>, <span style="color:#00B000">(,Essenz‘)</span>«</span>; wobei, — entsprechend der ,methodologischen‘ Prämisse des Kalküls <span style="color:#00B000">(<span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> ''':''' das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den ,GOTT der Christen‘)</span> —, bei der Interpretation der Terme dieses besonderen Kalküls, die <span style="color:#4C58FF">„christliche Theologie”</span> für den Begriff <span style="color:#FF6000">„GOTT”</span>, Korrektur und die leitende Instanz ist. Dabei muss die Dreifach-Äquivalenz von <span style="color:#4C58FF"><span style="color:#4C58FF">— ‚'''G'''‘ — </span></span>berücksichtigt werden. Welche der drei Äquivalenzen, bzw. Lesearten von <span style="color:#4C58FF">— ‚'''G'''‘ — </span> bei einem bestimmten Term im Kalkül zulässig ist, muss <span style="color:#4C58FF">„theologisch”</span> überprüft und evaluiert werden. Bei manchen können sogar alle drei Lesearten <span style="color:#4C58FF">„theologisch”</span> zulässig sein.
Warum es in der modalen Prädikatenlogik zweiter Stufe, im GÖDEL-System, ,Definitionen‘ gibt, erklärt GÖDEL formal-syntaktisch ''':''' <span style="color:#FF6000">»''Definitionen dienen ja nur der kürzeren Schreibwelse und sind daher prinzipiell überflüssig.''«</span> <span style="color:#00B000">(Aus der Anmerkung 6 in seinem Hauptwerk ''':''' ,''<span style="font-family: Times;"><big>Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I</big></span>''‘.)</span> Für die <span style="color:#4C58FF">„theologische”</span> Interpretation und Hermeneutik seines Kalküls, sind die ,Definitionen‘ im GÖDEL-System jedoch wesentlich, und letztlich entscheidend. Erst dadurch wird sein Axiomensystem zur <span style="color:#4C58FF">„axiomatischen Theologie”</span>. GÖDEL gibt selbst den hermeneutischen Hinweis dazu, wenn er über den höherstufigen Eigenschaftsbegriff <span style="color:#FF6000">»''positiv''«</span> sagt, der nur ,indirekt‘ definiert wird, jedoch mit seinem gesamten Axiomensystem ''':''' <span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne, (unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span> Die Deutung dieses ,höherstufigen‘ Begriffs als ein anderes Wort für <span style="color:#FF6000">„Transzendentalia“</span> ergibt sich aus der <span style="color:#4C58FF">„theologischen”</span> Evaluierung, d.h. der Einordnung des GÖDEL-Systems in die ,laufende‘ <span style="color:#FF6000">„Rede von GOTT“</span>, seit Menschen, sich über den Sinn der Welt und unseres Lebens in ihr, Gedanken machen. GOTT, der ,transzendent‘, — unabhängig —, zur Welt ist, ist Thema im Theorem ANSELMS, um das es ja im GÖDEL-Kalkül geht. Eine <span style="color:#4C58FF">„theologische”</span> Hermeneutik des GÖDEL-Systems ist daher legitim, die, als ein Bemühen um ein überzeugendes Verstehen, aus dem <span style="color:#4C58FF">„theologischen”</span> Vorwissen vieler Generationen schöpft.
Um philosophische, und sogar <span style="color:#4C58FF">„theologische”</span> Theoreme exakt zu formulieren, und untersuchen zu können, hat der Ausnahmelogiker GÖDEL, im 20. Jahrhundert, ein Tor aufgestoßen, das uns ermöglichen kann, <span style="color:#FF6000">»''mathematisch evident''«</span>, und logisch objektiv nachprüfbar, in diesen Disziplinen zu argumentieren. Mit seiner modalen Prädikatenlogik zweiter Stufe, <span style="color:#00B000">(speziell ,zugeschnitten‘ auf seinen ,ontologischen‘ Beweis)</span>, hat GÖDEL dem alten Wunsch eines Raimundus LULLUS, eines Gottfried Wilhelm LEIBNIZ, eines Immanuel KANT, und anderer, nach einer nachprüfbaren ,Universalsprache‘ in den Geisteswissenschaften, entsprochen; analog zur Mathematik, als Universalsprache in den Naturwissenschaften. Der sog. ,Theorembeweiser‘ der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO, mit Hilfe eines Computers, im 21. Jahrhundert, ist die kongeniale und logische Folge aus diesem Quanten-Schritt GÖDELS.
In der folgenden Neu-Kalkülisierung, wird jeder einzelne operative Logik-Schritt des Kalküls in der '''linken Spalte''' nummeriert und als Term-Ergebnis angezeigt, und in der '''rechten Spalte''' werden die dafür benötigten Term-Komponenten und die dabei angewendeten Logik-Regeln und -Gesetze, mit Meta-Terme, dokumentiert. Am Anfang stehen die Ressourcen und das angestrebte Ziel des Beweisganges, <span style="color:#00B000">(das Theorem)</span>. Die GÖDEL Axiome und Definitionen, die Theoreme und Korollare, die Zwischenergebnisse, das Endergebnis, und die logischen Meta-Terme, <span style="color:#00B000">[ in eckigen Klammern ]</span>, werden kontextabhängig, <span style="color:#00B000">(durch ''„Benennungen“'')</span>, interpretiert, <span style="color:#00B000">(angezeigt durch ,Interpretationspunkte‘ — '''::''' —, falls nötig)</span>. Der jeweilige Beweisgang wird in den Anmerkungen ausführlich und umfassend kommentiert. Die Kalkül-Prämissen, <span style="color:#00B000">(<span style="color:#4C58FF">'''AE:'''</span> Argument Einführung)</span>, sind der modal-frei gewählte Einstieg in das Kalkül. Sie dokumentieren, zusammen mit dem angestrebten Beweis-Ziel, eine bestimmte Problemlage in einem externen Diskurs, der mit dem modalen Logik-System hier, formal-syntaktisch überprüft, und gegebenenfalls, verifiziert oder falsifiziert werden soll. Korollare sind einfache, logische Folgerungen aus dem jeweiligen Beweisgang. Theoreme und Korollare sind ,modal‘ gleichwertig.
====<div class="center"><span style="color:#660066">1. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 1, (Möglichkeitsbeweis)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe__________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist die Eigenschaft X nicht positiv“} \\
\text{(Axiom 2)} & \quad (P\ X \wedge \;\Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x)) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaften Y, die aus einer positiven Eigenschaft X modal} \\
\text{ } & \quad & \ & \; \; \text{notwendig folgen, sind auch positive Eigenschaften“} \\
\text{(Axiom 3)} & \quad P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Theorem 1)} &\quad P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{ (◇ :: „möglich“ ↔ „konsistent“ ↔ „denkbar“; □ :: „notwendig“) } \\
\text{ } & \text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad P\ X \ & \ & \text{ AE: „Angenommen, es gibt positive Eigenschaften, Perfektionen“} \\
\text{02} & \quad P\ X \;\Rightarrow\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{ AE: „Angenommen, positive Eigenschaften sind nicht konsistent“} \\
\text{03} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{04} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{05} & \quad \text{ ├ }\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{:01:02:[Modus ponendo ponens] :: [A, A → B├ B] :AE:} \\
\text{06} & \quad \neg\neg \Box \neg \exists x \ X \ x \ & \ & \text{:05:[ ◇A ↔ ¬□¬A] :: (Modalregel)} \\
\text{07} & \quad \neg\neg \Box \neg\neg \forall x \neg X \ x \ & \ & \text{:06:[∃xA ↔ ¬Ɐx¬A] :: (Quantoren Regel)} \\
\text{08} & \quad \text{ ├ }\; \Box \; \forall x \neg X \ x \ & \ & \text{:07:NEG :: [¬¬A↔A] :: (Gesetz der Aussagenlogik)} \\
\text{09} & \quad \Box \; \forall x \neg X \ x \Leftrightarrow\ W & \ & \text{:02:08:[(:02:↔W) → (├:08:↔W)] :: (Kalkülregel)} \\
\text{10} & \quad \Box \; \forall x \ X \ x \Leftrightarrow\ F & \ & \text{:09:[(¬A↔W)↔(A↔F)] :: (Regel für Wahrheitswerte)} \\
\text{11} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:03:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{12} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \text{ } & \text{:10:11:[(:10:↔F) → (:11:↔F)] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{13} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \ & \text{:01:12:[Konjunktion] :: [A, B ├ A∧B]} \\
\text{14} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow \; (\neg x = x))) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(Y:=( ¬x= ..)) :: (Substitution für Eigenschaften)} \\
\text{15} & \quad \ P (\neg x = .. ) & \ & \text{:13:14:[Modus ponens] :: (logische Schlussregel)} \\
\text{16} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{17} & \quad \neg P (\ x = .. )\ & \ & \text{:15:16:[Modus ponens]}\\
\text{18} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:04:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{19} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \text{ } & \text{:10:18:[(:10:↔F) → (:18:↔W)] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{20} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \ & \text{:01:19:[Konjunktion] } \\
\text{21} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x))) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(Y:=(x=..))} \\
\text{22} & \quad \ P (\ x = .. )\ & \ & \text{:20:21:[Modus ponens]}\\
\text{23} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ & \text{:17:22:[Konjunktion] ⇒ Kontradiktion !}\\
\text{24} & \quad \neg \Diamond \; \exists x \ X \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:05:23:[├A├B╞ A→B] :: ''KONDITIONALER BEWEIS''}\\
\text{25} & \quad \neg\neg \Diamond \; \exists x \ X \ x & \ & \text{:24:23:[Modus tollendo tollens] :: [A→B,¬B ├ ¬A]}\\
\text{26} & \quad \text{ ├ }\; \Diamond \; \exists x \ X \ x & \ & \text{:25:NEG; bzw. :05:23:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS''}\\
\text{27} & \quad \ P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{:01:26:[├A├B ╞ A→B]} \\
\text{(Theorem 1)} & \;\text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\text{28} & \quad \ P\ G \;\Longrightarrow\; \Diamond \; \exists x \ G \ x \ & \ & \text{:27:Instanz(X:=G) } \\
\text{29} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{(A3):28:[Modus ponens]} \\
\text{(Korollar 1)} & \;\text{„Das Dasein GOTTES ist definitiv denkbar“} & \ & \text{„Es ist widerspruchsfrei möglich, dass es GOTT gibt“} \\
\end{align}</math>
</small>
|}
Anmerkung-1 ''':''' <span style="color:#00B000">(Der GÖDEL-Term <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, im Axiom-2 ist an sich überflüssig, da dieser hier als Prämisse :01: ohnehin ,angenommen‘ wird. Der Beweisgang kommt mit Axiom-2 auch ohne diesen GÖDEL-Term zum selben Ergebnis, und verkürzt sich damit sogar um zwei Schritte ''':''' Zeile 13 und Zeile 20 sind dann unnötig.)</span>
Der Beweisgang geht mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als Kalkül-Ressource, prinzipiell von der Existenz eines GOTTES aus. Mit der Prämisse :01: <span style="color:#00B000">(hier im 1. Beweisgang)</span> postuliert GÖDEL vorerst allgemein, dass es <span style="color:#FF6000">»''Vollkommenheit, d.h. positive Eigenschaften''«</span> in unserer Welt gibt ''':''' <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, ohne im Kalkül zu definieren, was darunter zu verstehen ist. Definiert wird dann <span style="color:#00B000">(im 2. Beweisgang)</span>, was eine <span style="color:#FF6000">»''wesentliche Eigenschaft''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(im Sinne von ,Transzendentalia‘)</span>; und mit Hilfe dieser Eigenschaft definiert GÖDEL <span style="color:#00B000">(im 3. Beweisgang)</span>, was eine <span style="color:#FF6000">»''notwendige Existenz''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, die er <span style="color:#00B000">(im selben Beweisgang)</span> axiomatisch mit den <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> gleich setzt ''':''' Axiom-5 ''':''' <span style="color:#4C58FF"> —‚'''PE'''<sub>not</sub>‘ —</span>. Erst im 2. Beweisgang wird mit Term :13:, nach einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, definitiv bewiesen <span style="color:#00B000">( ╞ )</span>, dass die, von GÖDEL, hier postulierten, <span style="color:#00B000">(allgemeinen)</span>, positiven Eigenschaften, <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, tatsächlich auch in GOTT <span style="color:#FF6000">»''positive Eigenschaften''«</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, sind; <span style="color:#00B000">(das sind die ultimativen ,Transzendentalia‘ in GOTT)</span>. Jetzt aber muss vorerst der ,Wunsch‘, bzw. die LEIBNIZ-Frage beantwortet werden ''':''' Ob, mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, <span style="color:#FF6000">»''GOTT''«</span> ,möglich‘ ist, der, nach traditioneller Auffassung, <span style="color:#FF6000">»''ein Wesen von äußerster Größe und Vollkommenheit'' <span style="color:#00B000">[ ist ]</span>, ''das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(nach LEIBNIZ; was GÖDEL mit Definition-1 ,abbildet‘)</span>. Wenn man also beweisen will, dass die Existenz eines solchen ''<span style="color:#FF6000">»GOTTES«</span>'' ,möglich‘ sein soll, dann muss man beweisen, dass dieses postulierte System der <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> möglich und formal ,widerspruchsfrei‘ ist. Das Ergebnis des 1. Beweisganges, das ,Theorem-1‘, <span style="color:#00B000">(,Erster Satz‘)</span>, fasst A. FUHRMANN zusammen als ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>. Wenn sie nicht konsistent wären, käme es zu unlösbaren Widersprüchen, <span style="color:#00B000">(Term :24:)</span>. Term :27: ,besagt‘ ''':''' <span style="color:#FF6000">»''Es ist definitiv, d.h. ohne Widerspruch möglich, dass es positive Eigenschaften gibt''«</span>; denn die Behauptung, es sei nicht möglich, dass es positive Eigenschaften, <span style="color:#00B000">(das sind die ,Transzendentalia‘)</span>, in unserer Welt gibt, führt zu einem Widerspruch, und ist daher falsch und ,unlogisch’. Einmal Axiom-1 und zweimal Axiom-2, <span style="color:#00B000">(das die Gleichwertigkeit aller positiven Eigenschaften nachdrücklich klarstellt)</span>, sichern hier die Konsistenz <span style="color:#FF6000">»''aller positiven Eigenschaften in der Welt'', <span style="color:#00B000">[ die ,Transzendentalien‘ ]</span>, ''und damit auch die, die in GOTT sind''«</span>. <span style="color:#00B000">(Der 2. Beweisgang bestätigt, dass es in GOTT tatsächlich positive Eigenschaften gibt.)</span> Die ,Gleichwertigkeit‘ aller Transzendentalia, <span style="color:#00B000">(ihre ,Äquivalenz‘)</span>, ist formal-syntaktisch daran erkennbar, dass die beiden Eigenschafts-Variablen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> im Axiom-2 für beliebige, unterschiedliche ,positive‘ Eigenschaften gegenseitig austauschbar, <span style="color:#00B000">(,konvertierbar‘)</span>, sind. Das heißt, dass beliebige, unterschiedliche ,positive‘ Eigenschaften, für die diese Variablen stehen, sich paarweise, wechselseitig ,implizieren‘, einschließen, und damit notwendig voneinander abhängen, d.h. koinzident ,eins‘ sind, konvertierbar, und somit gleichwertig sind; entsprechend dem Theorem von den Transzendentalia. Zu Term :29:, dem Korollar zu Theorem-1, notiert GÖDEL am 10. Feb. 1970, <span style="color:#00B000">(übersetzt von Joachim BROMAND)</span> ''':''' <span style="color:#FF6000">»''◇∃xG(x) besagt, dass das System aller positiver Eigenschaften kompatibel ist'',</span> <span style="color:#00B000">[ d.h. miteinander verträglich, weil ohne Widersprüche ].</span> <span style="color:#FF6000">''Dies ist ,wahr‘ auf Grund von Axiom-2,'' <span style="color:#00B000">[ weil alle positiven Eigenschaften, d.h. die Transzendentalien, koinzident gleichwertig und konvertierbar sind ]</span>.«</span> Darum ist es definitiv ,möglich‘, dass es diesen GOTT gibt, der <span style="color:#FF6000">»''alle Grade der Vollkommenheit in sich schließt''«</span> und <span style="color:#FF6000">»''über dem ,Größeres‘ nicht mehr gedacht werden kann''«</span>, und, in weiterer Konsequenz, ist der GOTT-Glaube deshalb ,notwendig‘ widerspruchsfrei und sinnvoll, nach Theorem-3 ''':''' <u>Wenn</u> es ,ohne Widerspruch‘ ''<span style="color:#FF6000">»möglich, bzw. denkbar«</span>'' ist, dass es ''<span style="color:#FF6000">»GOTT«</span>'' gibt, <u>dann</u> folgt daraus ''<span style="color:#FF6000">»notwendig«</span>'' ''':''' es ist auch ,widerspruchsfrei‘, wenn man als Voraussetzung ,annimmt‘, dass es ''<span style="color:#FF6000">»GOTT wirklich, für jede mögliche Welt«</span>'' gibt ''':''' Term :11: im 3. Beweisgang. Der Wenn-Satz ist hier mit Korollar-1 bewiesen; der Dann-Satz wird im 3. Beweisgang bewiesen <span style="color:#00B000">( ╞ )</span>, d.i. die Widerspruchsfreiheit und Sinnhaftigkeit des GOTT-Glaubens.
Die ontologische ,Identität‘, d.h. die ,Gleichsetzung‘, bzw. die ,Koinzidenz‘ von Strukturen, die in der Endlichkeit für uns verschieden sind, jedoch in dem unbegrenzt Unendlichen, GOTT, paarweise, perspektivisch in eins zusammenfallen, wie ,Sein‘ und ,Wesen‘, wie ,Ursache‘ und ,Wirkung‘ usw., und auch die Äquivalenz und Austauschbarkeit der Transzendentalien, haben im GÖDEL-Kalkül die logisch-syntaktische Form einer, aus sich, ,modal‘ notwendigen Implikation zwischen zwei verschiedenen, gegenseitig austauschbaren Eigenschafts-Variablen ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>. Dieses Term-Element stellt formal-syntaktisch die Gleichwertigkeit, <span style="color:#00B000">(Äquivalenz)</span>, bzw. die paarweise Koinzidenz aller positiven Eigenschaften und Zuordnungen in GOTT dar; sowohl hier im Axiom-2, als auch in der Definition-2 über die ,Wesenseigenschaften‘, im 2. Beweisgang, mit jeweils verschiedenen, frei umbenennbaren, Individuum-Variablen. Dieses Term-Element ,gilt‘ allgemein jedoch nur für positive Eigenschaften, alias ,Transzendentalia‘, und wird sofort <span style="color:#FF6000">„modal falsch“</span>, wenn für <span style="color:#4C58FF">— ‚'''X'''‘ —</span>, oder <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, Eigenschaften eingesetzt werden, die, — von Natur aus —, weder positiv noch negativ sind, wie z. B. ,rot‘ oder ,schwer‘. Die wechselseitige Austauschbarkeit der noch ,unbestimmten‘ Eigenschafts-Variablen, für beliebige positive Eigenschaften, ist formal äquivalent zur freien Umbenennung der noch ,unbestimmten‘ Individuum-Variablen ''':''' <span style="color:#4C58FF">[ FUB(x:=y) ]</span>. Der formale, gegenseitige, allgemeine Austausch der positiven Eigenschafts-Variablen, bzw. die formale Gleichsetzung beliebiger positiver Eigenschaften, kann, auf Grund der Äquivalenz aller Vollkommenheiten, bzw. ,Transzendentalia‘, auch dann noch durchgeführt werden, wenn eine, von zwei Eigenschafts-Variablen, durch eine Definition oder eine Schlussfolgerung ,bestimmt‘ worden ist, und dadurch zu einer positiven Eigenschafts-Konstante, d.h. zu einer ,bestimmten‘, positiven Eigenschaft geworden ist. Das ist z. B. bei einer instanziierenden Substitution der Fall ''':''' <span style="color:#4C58FF">[ Instanz(X:=..) ]</span>. Das ist eine spezifische Eigenheit der GÖDEL-Axiomatik, weil alle relevanten, positiven Eigenschaften und Zuordnungen in GOTT, als <span style="color:#FF6000">„ultimative Transzendentalia“</span>, immer auch miteinander kompatibel sind. Mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, wird formal die <span style="color:#FF6000">„Koinzidenz“</span> aller ,Transzententalia‘ in der Welt, und auch der ,Zusammenfall‘ aller Gegensätze in GOTT, abgebildet.
Da die Variable <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht, <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(im Korollar-1)</span>, ist die Eigenschaft ''':''' ''<span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'' ''':''' <span style="color:#4C58FF">(¬x=..)</span>, d.h. das <span style="color:#FF6000">„Ungleichsein“</span>, das <span style="color:#FF6000">„Anderssein“</span> GOTTES, <span style="color:#00B000">(Prämisse :03:)</span>, die entscheidende Voraussetzung und Norm für jeden Diskurs über GOTT ''':''' um der <span style="color:#FF6000">„Unvergleichlichkeit“</span>
GOTTES gerecht zu werden, darf GOTT niemals mit etwas aus der ''<span style="color:#FF6000">»zufälligen Struktur der Welt«</span>'' verglichen, d.h. gleich gesetzt werden. Der Term :18: <span style="color:#4C58FF">(x=x) ↔ W</span> erinnert an die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin‘''«</span>. <span style="color:#00B000">(In der mystischen Tradition, im ''<span style="font-family: Times;"><big>‚Dialog über die Vorsehung‘</big></span>'', dem Hauptwerk der Heiligen KATHARINA von Siena, Mystikerin und Lehrerin der Kirche, sagt GOTT-VATER zur KATHARINA ''':''' <span style="color:#FF6000">»''ICH BIN der IST'', <span style="color:#00B000">[ aus mir selbst ]</span>, ''du bist, die nicht ist'', <span style="color:#00B000">[ aus dir selbst ]</span>.«</span> Das ist eine wichtige, deutende Ergänzung, und die authentische <span style="color:#4C58FF">,theologische‘</span> Interpretation dieser Exodus Text-Stelle. Das ist der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES.)</span>
Zum Term :03: notiert A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Die Notation'' <span style="color:#4C58FF">(¬x=..)</span> ''für die Eigenschaft ''':''' <span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'', <span style="color:#00B000">[ d.h. <span style="color:#FF6000">„Ungleichheit“, „Anderssein“</span>, bzw. die Notation <span style="color:#4C58FF">(x=..)</span> für den Existenzmodus-Perfektion ''':''' <span style="color:#FF6000">„Gleichheit“, „Idendität“</span> ]</span>, ''ist suggestiv und informell und ersetzt hier einen formal korrekten Abstraktionsausdruck wie'' <span style="color:#4C58FF">λy.(¬x=y)</span>, <span style="color:#00B000">[ bzw. <span style="color:#4C58FF">λy.(x=y)</span> ]</span>. ''Für die formal korrektere Notation bedarf es der zusätzlichen Vereinbarung, dass der Ausdruck'' <span style="color:#4C58FF">λy.(¬x=y)</span> ''gleichbedeutend sei mit dem Ausdruck'' <span style="color:#4C58FF">¬λy.(x=y)</span>. ''Diese Vereinbarung ist harmlos, da wir aufgrund der Regel der λ–Konversion'' ''':''' <span style="color:#4C58FF">λy.Xy.x ↔ Xx</span>, <span style="color:#00B000">[ mit der <span style="color:#4C58FF">Instanz(X:=(¬x=..))</span> ]</span>, ''so schließen dürfen'' ''':''' <span style="color:#4C58FF">λy.(¬x=y).x ↔ ¬x=x ↔ <span style="color:#00B000">¬(x=x)</span> ↔ ¬λy.(x=y).x</span> .<span style="color:#FF6000">«</span> <ref>A. FUHRMANN a.a.O. Seite 7, Anmerkung 4 (von mir korrigiert und ergänzt)</ref>
In der Kalkül-Zeile 29 wird das Möglichkeits-Korollar-1 durch einen <span style="color:#4C58FF">[ Modus ponens ]</span> mit Axiom-3 von der Kalkül-Prämisse-Term :01: ,abgekoppelt‘, d.h. es ist nicht mehr vom Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span> logisch abhängig. Das Möglichkeits-Korollar-1 behält jedoch die bewiesene Widerspruchsfreiheit von Theorem-1, und ist damit nur mehr von Axiom-1 und Axiom-2 abhängig, was für das Theorem-ANSELMS am Schluss entscheidend ist. Erklärung zu Term :05: Das Ergebnis einer Logik-Operation zwischen Prämissen ist ,regulär‘ <span style="color:#00B000">(├ )</span> den Prämissen zuzurechnen.
Das Modale-Prinzip KRIPKE-Γ-Ɐx, <span style="color:#4C58FF">['''RK''']</span>, in Worten ''':''' <span style="color:#FF6000">»''Wenn mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''gilt, und daraus logisch folgt, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''auch die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''gilt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar'' ''':''' ''es ist wahr, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''aus der Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''logisch folgt''«</span>. Der Term <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span> steht formal-syndaktisch, allgemein für ,Transzendentalia‘, und ist für alle ,Nicht-Transzendentalia‘ <span style="color:#FF6000">„modal falsch“</span>.
====<div class="center"><span style="color:#660066">2. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 2, (,Basisbeweis‘)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe____________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.2)} & \quad \neg P\ X \;\Longrightarrow\;\ P\neg X\ & \ & \text{„Wenn X nicht positiv ist, dann ist die Negation ¬X positiv“} \\
\text{(Axiom 3)} & \quad \ P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{(Axiom 4)} & \quad \ P\ X \;\Longrightarrow\; \Box \; \ P\ X \ & \ & \text{„Positive Eigenschaften sind notwendig aus sich positiv“} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 2)} & \quad \ X_{ess}\ x \;\Leftrightarrow X\ x \wedge \forall Y \left(\ Y\ x \Rightarrow \Box \; \forall y (\ X\ y \Rightarrow \ Y\ y)\right) & \ & \text{„X ist genau dann eine wesentliche Eigenschaft von x, wenn x sie hat, und} \\
\text{ } & \quad & \text { } & \;\;\text{alle anderen Eigenschaften Y von x notwendig aus dieser Eigenschaft X folgen“} \\
\text{[RM]} &\quad \ A \;\Longrightarrow\;\ B\; \text{ ├ }\;\Box \; A \Longrightarrow\;\Box\; \ B\ & \ & \text{( :: Modales Prinzip)} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{(,G‘ :: „Göttlichkeit“ ↔ „GOTT“ ↔ „Dasein GOTTES“)} \\
\text{ } &\;\text{„Das Wesen GOTTES ist sein Dasein“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} &\quad \ G\ x \ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} &\quad \ Y\ x \ & \ & \text{ AE: „Angenommen, GOTT hat die Eigenschaften Y“} \\
\text{03} &\quad \neg P\ Y & \ & \text{ AE: „Angenommen, die Y in GOTT sind nicht positiv“} \\
\text{04} &\quad \neg P \ Y \Rightarrow \ P \neg Y\ & \ &\text{(A1.2):Instanz(X:=Y) :: (Substitution für Eigenschaften) } \\
\text{05} &\quad \ P \neg Y \ & \ & \text {:03:04:[Modus ponens] :: [A, A → B├ B] } \\
\text{06} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{07} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:06:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{08} &\quad \ P \neg Y \Rightarrow \neg Y \ x\ & \ &\text{:07:Instanz(X:=¬Y)} \\
\text{09} &\quad \neg Y \ x\ & \ &\text{:05:08:[Modus ponens]} \\
\text{10} &\quad \text{ ├ }\; (Y\ x \wedge \neg Y \ x) \;\Leftrightarrow\;\ F\ & \ & \text{:02:09:[Konjunktion] ⇒ Kontradiktion !} \\
\text{11} &\quad \neg P\ Y \; \Rightarrow \; (Y\ x \wedge \neg Y \ x )\ & \ &\text{:03:10:[├A├B ╞ A → B] :: ''KONDITIONALER BEWEIS''} \\
\text{12} &\quad \neg\neg P\ Y \ & \ &\text{:11:10:[Modus tollendo tollens] :: [A → B,¬B├ ¬A]} \\
\text{13} &\quad \text{ ├ }\; P\ Y \ & \ &\text{:12:NEG; bzw. :03:10:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS'' :AE:} \\
\text{14} &\quad \ P\ Y \;\Rightarrow\;\Box \; \ P\ Y \ & \ & \text{(A4):Instanz(X:=Y)} \\
\text{15} &\quad \Box \; \ P\ Y \ & \ & \text{:13:14:[Modus ponens]} \\
\text{16} &\quad \ G \ y \Rightarrow \ Y \ y\ & \ &\text{:01:02:[├A├B ╞ A→B]:FUB(x:=y)} \\
\text{17} &\quad \text{ ├ }\; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:16:[G(y) ├ ⱯyG(y)]} \\
\text{18} &\quad \Box \; \ P\ Y \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:13:17:[├A├B ╞ A→B]:[RM]} \\
\text{19} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:15:18:[Modus ponens]} \\
\text{20} &\quad \ Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:02:19:[├A├B ╞ A→B]} \\
\text{21} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x & \ &\text{:20:01:[Konjunktion] :: [A, B├ A ∧ B]} \\
\text{22} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ X \ y \Rightarrow \ Y \ y)) \wedge \ X \ x\;\Leftrightarrow\; X_{ess}\ x \ & \ &\text{(D2):KOMM(↔):KOMM(∧):[ⱯYA(Y) ├ A(Y)] wegen :13:} \\
\text{23} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x\;\Leftrightarrow\; G_{ess}\ x \ & \ &\text{:22:Instanz(X:=G)} \\
\text{24} & \quad \text{ ├ }\; G_{ess}\ x \ & \ &\text{:21:23:[Modus ponens]:AE: wegen :30:} \\
\text{25} &\quad \ G\ x \;\Rightarrow\; \ G_{ess}\ x \ & \ & \text{:01:24:[├A├B ╞ A→B] :: Theorem 2.1} \\
\text{26} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] } \\
\text{27} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:26:[ⱯXA(X) ├ A(X)]} \\
\text{28} &\quad \ P \ G \Rightarrow \ G \ x\ & \ &\text{:27:Instanz(X:=G)} \\
\text{29} &\quad \text{ ├ }\; G \ x\ & \ &\text{(A3):28:[Modus ponens]} \\
\text{30} &\quad \ G_{ess}\ x \;\Rightarrow \ G \ x\ & \ &\text{:24:29:[├A├B ╞ A→B] :: Theorem 2.2 } \\
\text{31} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{:25:30:[Konjunktion]:BIKONDITIONAL :: [(A→B) ∧ (B→A) ↔ (A↔B)] } \\
\text{(Theorem 2)} &\; \text{„Dasein, GOTT-Sein, ist das Wesen GOTTES“} & \ & \Longleftarrow\; \text{was zu beweisen war ! } \\
\text{32} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:19:Instanz(Y:=(x=..))} \\
\text{33} &\quad \ G\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:01:32:[├A├B ╞ A→B]} \\
\text{(Korollar 2)} & \;\text{„Es gibt notwendig höchstens einen GOTT“} & \ & \text{„Wenn es GOTT gibt, dann gibt es für jede mögliche Welt nur einen GOTT“} \\
\end{align}</math>
</small>
|}
<span style="color:#00B000"><small>(In den Kalkül-Zeilen 16, 18, 31 mussten zwei-, und in Zeile 22 drei Kalkül-Schritte, d.h. Logik-Operationen in eine Zeile zusammengezogen werden, weil der Parser dieser speziellen Mathematik-Funktion in Wikibooks jedes Mal wegen Puffer-Überlauf abstürzt, wenn zu den bestehenden Zeilen noch eine neue Zeile, oder ein Text-Element, zusätzlich eingefügt wird. Das vermindert etwas die Transparenz des Kalküls.)</small></span>
Anmerkung-2 ''':''' <span style="color:#00B000">(Dieser Beweisgang kommt auch ohne das ,unbestimmte‘ Konjunkt <span style="color:#4C58FF"> — ‚'''Xx'''‘ —</span> in der Definition-2 zum gleichen Ergebnis, und wird dadurch um eine Zeile verkürzt ''':''' Zeile 21 entfällt, und <span style="color:#4C58FF">[ KOMM(∧) ]</span> ist dann unnötig. Dieses Konjunkt wird hier ebenfalls schon in der Kalkül-Prämisse :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, als ,Annahme‘ gesetzt, vorentschieden und ,bestimmt‘ mit der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>. Es war also logisch korrekt, dass GÖDEL, in seiner Notiz vom 10. Feb. 1970 zum ontologischen Beweis, dieses Konjunkt weggelassen hat, was ihm von Kommentatoren als ein Flüchtigkeitsfehler angerechnet worden war. Der gesamte 2. Beweisgang bewegt sich im Geltungsbereich der Prämisse Term :01:, d.h. ist in jeder Zeile von der Annahme abhängig ''':''' die Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span> steht für den GOTT der Christen. In der Kalkül-Zeile 33 wird mit Korollar-2 diese Abhängigkeit, für den Term :32:, explizit dargestellt.)</span>
Der Beweisgang geht mit der Prämisse :01: prinzipiell, als ,modal‘ freigewählte Voraussetzung, von der Existenz eines GOTTES aus. Im 1. Beweisgang wurde bewiesen, dass die von GÖDEL ,postulierten‘ <span style="color:#FF6000">»''allgemeinen positiven Eigenschaften, Vollkommenheiten, Perfektionen'', <span style="color:#00B000">[ die sog. ,Transzendentalien‘ ]</span> ''konsistent''«</span>, d.i. widerspruchsfrei sind. Hier, in diesem Beweisgang wird nun die Prämisse vom 1. Beweisgang, <span style="color:#4C58FF"> — ‚'''PX'''‘ —</span>, im Bezug auf GOTT hinterfragt ''':''' Gibt es auch in GOTT so Etwas, wie <span style="color:#FF6000">»''Vollkommenheit, Positives, Perfektes''«</span> '''?''' Die ,Annahme‘ jedoch, dass es <span style="color:#FF6000">»''in GOTT keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span> <span style="color:#00B000">(keine Transzendentalien)</span> gibt, <span style="color:#00B000">(Prämisse Term :03:)</span>,<span style="color:#4C58FF"> — ‚'''¬PY'''‘ —</span>, d.h. dass die <span style="color:#00B000">(wesentlichen)</span> Eigenschaften in GOTT keine <span style="color:#FF6000">„Vollkommenheiten“</span> seien, führt aber zu einem unlösbaren Widerspruch, <span style="color:#00B000">(Term :10:)</span>. Mit Term :13:, als 1. Hauptergebnis, ist damit, — als ,neue‘ Prämisse, <span style="color:#00B000">(ersetzt Term :03:)</span> —, definitiv ,bewiesen‘ <span style="color:#00B000">( ╞ , d.h. es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, dass alle Eigenschaften, die hier mit <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> symbolisiert werden, <span style="color:#FF6000">„positive Eigenschaften“</span>, d.h. <span style="color:#FF6000">„Perfektionen“</span> sind, von denen das Kalkül ,annimmt‘, <span style="color:#00B000">(Prämissen Term :01:, Term :02: und speziell Term :16:)</span>, dass der GOTT der Christen sie besitzt. Alle ,Wesenseigenschaften‘ in GOTT ''':''' <span style="color:#4C58FF">— ‚'''Y'''<sub>ess</sub>‘ —</span>, die durch den Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —, </span> dargestellt werden, sind somit <span style="color:#FF6000">„Vollkommenheiten“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span><span style="color:#00B000">, (,ultimative Transzendentalien‘, aller ,Grade‘)</span>. Damit ist definitiv ‚bestätigt‘, <span style="color:#00B000">( ╞ , es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, was mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schon ‚angenommen‘ worden ist ''':''' <span style="color:#FF6000">»''GOTT ist perfekt; er hat alle positiven Eigenschaften''«</span>; und auch Definition-1 ist damit ,verifiziert‘ ''':''' <span style="color:#FF6000">»''GOTT ist genau deswegen GOTT, weil er, als GOTT, positive Eigenschaften aller Grade in sich schließt''«</span>; entsprechend dem Quelltext bei LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. <span style="color:#00B000">(Der ,Schlüsselbegriff‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> ist der ,Schlüssel‘ zur Erkenntnis, dass GOTT ,notwendig‘, sowohl ,wesentlich‘ für uns, als auch an sich ,grundlos‘, immer schon ,da‘ ist.)</span> Hier, <span style="color:#00B000">(im 2. Beweisgang)</span>, hat Axiom-1, <span style="color:#00B000">(im Term :04:)</span>, sicher gestellt, dass die Eigenschaften in GOTT, <span style="color:#00B000">(Definition-1; Term :06:)</span>, tatsächlich <span style="color:#FF6000">„ultimativ positiv, perfekt und vollkommen“</span> sind ''':''' <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>. Das GÖDEL-Axiom-1 bezieht seine ,Potenz‘ aus dem Prinzip vom ,auszuschließenden‘ Widerspruch ''':''' eine Eigenschaft kann nicht zugleich ,positiv‘ und ,nicht positiv‘ sein '''!'''
Formal lässt sich das 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' schon aus Term :23: in diesem Beweisgang mit der <span style="color:#4C58FF">[ Vereinfachung ] :: [ A∧B ├ B ]</span> ohne Weiteres ,regulär‘ ableiten, — analog zu den Vorgehensweisen bei A. FUHRMANN und G.J. WIRSCHING. <span style="color:#00B000">(Beide Aussagen dieser ,Konjunktion‘ sind ,gleichwertig‘ und wahr, daher partizipiert das Theorem-2 auch am Ergebnis der Widerspruchsfreiheit von Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dem 1. Hauptergebnis. Beide Aussagen im Term :23: interpretieren sich gegenseitig.)</span> Der hier gewählte, etwas längere Weg zum Ergebnis, soll die innere Struktur und Abhängigkeit der Ergebnisse von bestimmten Voraussetzungen offen legen, und ihren ,Zweck‘ verdeutlichen. Die beiden Hauptergebnisse im Basisbeweis gehen vom vorgefundenen und traditionell vorgegebenen Begriff von ,GOTT‘ aus, <span style="color:#00B000">(Term :06:, Term :16: und Term :26:)</span>. Das ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 1. Hauptergebnis, hier im 2. Beweisgang, Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span> ''':''' <span style="color:#FF6000">»''die Eigenschaften in GOTT sind vollkommen, d.h. sind die ultimativen Transzendentalia''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als auch die Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span>, für die Annahme ''':''' den ,GOTT der Christen‘, der deswegen GOTT ist, weil er alle Grade der Vollkommenheit in sich schließt. Und das ebenfalls ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 2. Hauptergebnis, hier im selben Beweisgang, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''das Wesen GOTTES ist sein eigenes Sein''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, als auch die Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, für die Wesenseigenschaft ''':''' ,notwendige Existenz‘, und widerlegt den Einwand KANTS, für den Spezialfall ''':''' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für ,GOTT‘. Zwei Axiome und zwei Definitionen von GOTT und seinen Vollkommenheiten werden durch die Ergebnisse im Basisbeweis des GÖDEL-Kalküls in unserer realen Welt als ,wahr‘, <span style="color:#00B000">(genauer als ,widerspruchsfrei‘)</span>, und, — im Rahmen des christlichen Glaubens —, als ,annehmbar‘ bestätigt. <span style="color:#00B000">(Anmerkung zu Term :24: ''':''' eine Prämisse ist regulär-,modal‘ immer ,frei‘ wählbar.)</span>
Zusammengefasst heißt das ''':''' die ,strittige‘ Begründung der ,methodologischen‘ Prämisse des GÖDEL-Kalküls ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#00B000">(Prämisse, Term :01:)</span>, weil <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#00B000">(Korollar-1)</span> ''':''' <span style="color:#FF6000">»''Das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den GOTT der Christen, für den es ohne Widerspruch denkbar ist, dass es ihn gibt''«</span>, <span style="color:#00B000">(ANSELMS Prinzip, trotz der ,Warnung‘ KANTS)</span>, ist ,wahr‘ und für uns ,annehmbar, denn es ist auch, auf Grund der Ergebnisse des 2. Beweisganges, in unserer realen Welt ,wahr‘ und ,annehmbar‘, weil schon als ,widerspruchsfrei‘ verifiziert ''':''' <span style="color:#FF6000">»''Der GOTT der Christen'' <span style="color:#00B000">(Term :01:)</span> '',existiert‘ für uns ,notwendig‘''«</span> ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, <span style="color:#00B000">(d.i. das ,regulär‘-mögliche Korollar sowohl im 2. als auch im 3. Beweisgang)</span>, denn dieser GOTT ist aus sich ,vollkommen‘ ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, und zu seiner ,Vollkommenheit‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> gehört auch notwendig sein ,Existieren‘ ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. <span style="color:#00B000">(Jeder dieser Terme ist im-, und durch den 2. Beweisgang, im Geltungsbereich der Prämisse Term :01:, als ,wahr‘ und ,annehmbar‘ bewiesen, bzw. verifiziert.)</span> Das ist der ,Kern‘ des ontologischen Arguments, und somit ist auch diese ,strittige‘ Begründung der Prämisse des GÖDEL-Kalküls mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. sie ist logisch ,richtig‘ und, im Kontext des christlichen Glaubens, vernünftig. Die Annahme des Gegenteils zu dieser Prämisse ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Es ist undenkbar, dass es diesen GOTT gibt''«</span>, führt jedoch, unabhängig von jeder Glaubensüberzeugung, zu einem Widerspruch — ist unlogisch und daher ,falsch‘, <span style="color:#00B000">(siehe Anhang ''':''' Widerlegung)</span>. Die Behauptung einer ,formalen Unentscheidbarkeit‘ zu den Annahmen über die Existenz GOTTES, ob oder nicht, <span style="color:#00B000">(d.h. ein ,methodologischer‘ Agnostizismus)</span>, ist gegen jede ,Logik‘; und ist auch ,falsch‘, d.h. der Agnostizismus ist einfach nur ein ,logischer Irrtum‘. Denn aus dem, im Kalkül abgeleiteten, Widerspruch aus der einen Annahme, und damit ihrer Unrichtigkeit, folgt notwendig die Richtigkeit der gegenteiligen Annahme. Damit ist eine klare Entscheidung getroffen.
Das Modale-Prinzip <span style="color:#4C58FF">['''RM''']</span> in Worten ''':''' <span style="color:#FF6000">»''Wenn es wahr ist, dass aus'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> ''ein'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> ''logisch folgt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar, dass, wenn'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist, auch'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist''«</span>. <span style="color:#00B000">(Das <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> in Term :18: ist als ,modal notwendig‘ durch den Term :15: verifiziert '''!''' )</span>
Mit dem 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#FF6000">»'',Dasein‘ ist das ,Wesen‘ GOTTES''«</span>, folgt die GÖDEL-Axiomatik der philosophisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition der ,Rede von GOTT‘ seit ARISTOTELES, und schließt sich damit formal-syntaktisch zugleich auch der religiösen Überzeugung der Christen an, die glauben, dass GOTT, als unser Vater, aus Liebe, in seinem Sohn, JESUS CHRISTUS, für uns immer schon <span style="color:#FF6000">»''da''«</span> ist, <span style="color:#00B000">(der Sohn ist koinzident ,eins‘ mit GOTT, dem Vater und dem GEIST)</span>, wirksam in und durch seine <span style="color:#4C58F0">„Kirche“</span>, im HEILIGEN GEIST, bis ans Ende der Zeit. Das ist das, <span style="color:#FF6000">»''was''«</span> GOTT eigentlich für uns ausmacht, — die Selbstmitteilung seines unergründlichen Wesens in den Sakramenten der <span style="color:#4C58F0">„Kirche“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin da für euch und für immer, als der ich ''<span style="color:#00B000">[ immer schon gewesen ]</span> ''bin''«</span>; <span style="color:#00B000">(d.i. das <span style="color:#4C58FF">,theologisch‘</span>-exegetische ,Axiom‘ der Christen, und eine <span style="color:#4C58FF">,theologisch‘</span> korrekte Explikation der ,regulären‘ Kalkül-Prämisse Term :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, jeweils im 2. und 3. Beweisgang)</span>. Das heißt aber nicht, dass der Autor des Kalküls sich mit diesem Glauben identifiziert hat, <span style="color:#00B000">(,hat‘ er auch nicht)</span>, oder dass der Leser des ontologischen Beweises von Kurt GÖDEL sich damit identifizieren muss, wenn er dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> anerkennt.
Zur erweiterten <span style="color:#4C58FF">„theologischen“</span> Explikation der Kalkül-Prämisse ''':''' Die <span style="color:#4C58F0">„Kirche“</span> ist das ,Meisterwerk‘ GOTTES ''':''' In ihr ist es GOTT gelungen, etwas Göttliches und Unzerstörbares in unsere korrupte Welt einzupflanzen ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Etwas Göttliches existiert notwendig, d.h. ,unzerstörbar‘ in unserer Welt''«</span>. Sie ist, durch die Menschwerdung des GOTTES Sohnes, JESUS CHRISTUS, dessen <span style="color:#4C58F0">„Leib“</span> die <span style="color:#4C58F0">„Kirche“</span> ist, untrennbar mit Menschen verbunden, die schon, von allem Anfang an, und jetzt immer noch, durch die Sünde korrumpiert sind. Mit ihr will und wird GOTT unsere Welt und die Menschheit, bis ans Ende der Zeit, von der Sünde und von deren Konsequenz, dem <span style="color:#00B000">(ewigen)</span> Tod <span style="color:#4C58FF">„erlösen“</span>, <span style="color:#00B000">(jedoch nicht ohne die Zustimmung des Menschen)</span>. Mit dieser Explikation wird die Tragweite des ontologischen Arguments ANSELMS, und damit auch die <span style="color:#4C58FF">„theologische“</span> Relevanz der GÖDEL-Axiomatik erkennbar. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT, <span style="color:#00B000">(Term :01:)</span>.
====<div class="center"><span style="color:#660066">3. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 3, (ANSELMS Theorem)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe___________________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 5)} & \quad P\ E_{not}\; \ & \text { } & \text{„Notwendige Existenz ist eine positive Eigenschaft“} \\
\text{ } & \text{( :: Das ist nur dann wahr, wenn ,Dasein‘ und ,Wesen‘ } & \ & \text{( :: dagegen KANT : ,Existenz‘ ist keine ,Eigenschaft‘,} \\
\text{ } & \;\;\text{in eins zusammenfallen ! ARISTOTELES : Theorem-2)}\ & \ & \;\;\text{,Sein‘ ist für alles, was existiert, kein ,reales Prädikat‘ ! )} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 3)} & \quad \ E_{not}\ x \;\Longleftrightarrow\;\ \forall X \left(\ X_{ess}\ x \Longrightarrow \Box \; \exists y \ X\ y \right) & \ & \text{„Notwendige Existenz ist genau dann eine Eigenschaft von x, wenn} \\
\text{ } & \quad & \ & \;\;\text{alle wesentl. Eigenschaften von x notwendig instanziiert sind“} \\
\text{(Korollar 1)} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{„Es ist widespruchsfrei möglich, dass es GOTT gibt“} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ &\text{„Dasein, GOTT-Sein, Existenz ist das Wesen, die Essenz GOTTES“} \\
\text{(Korollar 2)} &\quad \ G\ x \;\Longrightarrow\; \Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{„Wenn es GOTT gibt, dann gibt es notwendig nur einen GOTT“} \\
\text{(Theorem 3)} & \quad \Diamond \; \exists x \ G \ x \;\Longrightarrow\; \Box \; \exists x \ G \ x \ & \ & \text{( :: ANSELMS Prinzip)} \\
\text{ } & \text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{01} & \quad \ G \ x\ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} & \quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ & \text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{03} & \quad \ P \ X \Rightarrow \ X \ x\ & \ & \text{:02:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{04} & \quad \ P \ E_{not}\;\Rightarrow \ E_{not}\ x\ & \ & \text{:03:Instanz(X:= Enot) :: (Substitution für Eigenschaften)} \\
\text{05} & \quad \ E_{not}\ x\ & \ & \text{(A5):04:[Modus ponens] :: [A, A → B├ B]} \\
\text{06} & \quad \forall X \left(\ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y \right) & \ & \text{(D3):05:[Modus ponens]} \\
\text{07} & \quad \ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y & \ & \text{:06:[ⱯXA(X) ├ A(X)]} \\
\text{08} & \quad \ G_{ess}\ x \Rightarrow \Box \; \exists y \ G\ y & \ & \text{:07:Instanz(X:= G)} \\
\text{09} & \quad \ G_{ess}\ x \ & \ & \text{(Th2):01:[Modus ponens]} \\
\text{10} & \quad \text{ ├ }\;\Box \; \exists x \ G\ x & \ & \text{:08:09:[Modus ponens]:FUB(y:=x) :: (Freie-Um-Benennung der Var.)} \\
\text{ } & \text{„Es gibt GOTT wirklich, für jede mögliche Welt“} & \ & \Longleftarrow\; \text{1. Hauptergebnis !} \\
\text{11} & \quad \;\Diamond \exists x \ G \ x \;\Longrightarrow \; \Box \; \exists x \ G\ x & \ & \text{(K1):10:[├A├B ╞ A→B] :: ''KONDITIONALER BEWEIS''} \\
\text{(Theorem 3)} & \;\text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen war ! 2. Hauptergebnis ! } \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{12} & \quad \;\Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{(K2):01:[Modus ponens]} \\
\text{13} & \quad \;\Box \; (\exists x \ G\ x \wedge \; \forall y(\ G \ y \Longrightarrow \ (x = y)))\ & \ & \text{:10:12:[Konjunktion]:DIST(□∧)} \\
\text{(Korollar 3)} & \;\text{„Es gibt notwendig genau nur einen GOTT“} & \ & \text{„Es gibt für jede mögliche Welt nur den GOTT der Christen“} \\
\end{align}</math>
</small>
|}
Anmerkung-3 ''':''' <span style="color:#00B000">(Ein Theorem und zwei Korollare, aus den beiden vorhergehenden Beweisgängen, werden hier, im 3. Beweisgang, zu ,Axiomen‘, die das Theorem-ANSELMS und sein Korollar mit-verifizieren und bestätigen.)</span>
Dieser Beweisgang ist das Ziel aller Bemühungen. Hier wird der sog. ,ontologische Gottesbeweis‘ nach ANSELM von Canterbury formal-syntaktisch dargestellt und als logisch nachvollziehbar von GÖDEL bestätigt. Damit hat er aber auch klar gestellt, dass der ontologische Beweis ANSELMS kein Beweis für die ,Existenz‘ des GOTTES der Bibel sein kann, bzw. sein ,will‘ ''':''' Denn mit der Prämisse, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(Term :01:, wie auch schon im ,Basisbeweis‘, und ausformuliert hier in Term :02:, mit der Definition für GOTT)</span>, wird mit dem traditionellen, abendländischen ,GOTT-Glauben‘, der ,glaubt‘, dass der Gott der Christen tatsächlich existiert, — methodologisch als ,Annahme‘ —, der Beweisgang schon regulär und explizit eröffnet, aus dem sich dann, logisch korrekt, mit Hilfe der GÖDEL-Axiome und Definitionen, das ,Theorem ANSELMS‘ ergibt; <span style="color:#00B000">(hier jedoch, mit Günther J. WIRSCHING, ohne den Umweg bei GÖDEL über den <span style="color:#4C58FF">[ Modus Barbara ] :: [ A → B, B → C ├ A → C ] </span>, mit dem modalen Axiom-BECKER ''':''' <span style="color:#4C58FF">— ‚'''◇□A→□A'''‘ —</span>, als <span style="color:#4C58FF">‚B → C‘</span> im kategorischen Syllogismus, das André FUHRMANN recherchiert hat)</span>. GÖDEL verwendet zur Darstellung des sog. ,ontologischen Gottesbeweises‘ nach ANSELM die Struktur eines modal-logischen Kalküls. Ein modal-logisches Kalkül ist ein genau geregeltes Schema, in dem bei bestimmten ,Annahmen‘ <span style="color:#00B000">(Axiome, Definitionen, Prämissen)</span> etwas anderes als das Vorausgesetzte, auf Grund des Vorausgesetzten mit Notwendigkeit folgt. Entsprechend der ,Modalität‘ der sechs ,modal‘ notwendigen, d.h. transzendentalen Voraussetzungen, hier, für den 3. Beweisgang, die in den <span style="color:#00B000">(und durch die)</span> beiden vorhergehenden Beweisgängen schon als <span style="color:#FF6000">„modal wahr“</span>, bzw. als logisch annehmbar, verifiziert und/oder ,bewiesen‘ wurden, sind auch die beiden ,Schlusssätze‘ <span style="color:#00B000">(Theorem-3 und Korollar-3)</span> <span style="color:#FF6000">„modal wahr“</span>, bzw. logisch annehmbar '''!''' Die Wahl der Prämisse :01: dagegen ist nicht ,modal‘ notwendig, sondern beruht auf einer freien Entscheidung, und damit ist auch ihre Interpretation eine freie Entscheidung, mit der Voraussetzung, dass man das Kalkül mit Theoremen aus der <span style="color:#4C58FF">„christlichen Theologie“</span> evaluieren, und damit interpretieren will. Dazu berechtigt die Genese des Kalküls. Der Glaube an den GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, beruht immer auf einer freien Entscheidung. Das Kalkül, als solches, unabhängig von jeder Interpretation seiner Syntax, ist genau dann ,allgemein‘ <span style="color:#FF6000">»''mathematisch evident''«</span>, d.h. ,ist allgemein gültig‘, wenn es gültigen Logik-Regeln folgt. Die Bestimmung seiner Syntax jedoch, d.h. seine Interpretation, unterliegt hermeneutischen Kriterien, die nicht von Logik-Regeln abhängen, wie hier ''':''' <span style="color:#FF6000">»''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''«</span>, wie GÖDEL selbst hinzufügt. Mit der, — von GÖDEL eingeforderten —, ‚Unabhängigkeit‘ der Kalkül-Axiome von der zufälligen Struktur der Welt, wird implizit für das Kalkül auch festgelegt, dass <span style="color:#FF6000">„GOTT“</span> ‚unabhängig‘ von der zufälligen <span style="color:#00B000">(Raum-Zeit-)</span>Struktur unserer vergänglichen Welt, und daher ,zeitlos-ewig‘ ist, <span style="color:#00B000">(was <span style="color:#4C58FF">„theologisch“</span> korrekt ist)</span>, begründet durch Definition-1 und Axiom-3. Aus der zeitlosen Ewigkeit GOTTES folgt, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, denn bei Zeitlosigkeit gibt es keinen ,zeitlichen‘ und damit auch keinen ,ontologischen‘ Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘. Beides ist dann koinzident ,eins‘ ''':''' wie ,Wesen‘ und ,Dasein‘ in GOTT, bzw. wie ,Begriff‘ und ,Sein‘, oder ,Möglichkeit‘ und ,Wirklichkeit‘. <span style="color:#00B000">(Man vergleiche damit auch die ,postulierte‘ Einheit von ,Erkenntnisobjekt‘ und ,Erkenntnissubjekt‘ im ,Gott‘ des ARISTOTELES ''':''' im <span style="color:#FF6000">»<span style="color:#00B000">[ selbstbewussten ]</span> ''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“<span style="color:#00B000"> | </span>„noêseôs noêsis“</span> <small>(‚<span style="font-family: Times;"><big>''Metaphysik''</big></span>‘ XII 9, 1074b34)</small>, im Vollzug seiner Funktion als ,unbewegtes Bewegungsprinzip‘, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“<span style="color:#00B000"> | </span>„prôton kinoûn akinêton“</span> der Welt, das alles Übrige <span style="color:#FF6000">»''wie ein Geliebtes''«<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὡς ἐρώμενον</big></span>“</span> | <span style="color:#FF6000">„hôs erômenon“</span> bewegt; d.h. christlich ''':''' <span style="color:#FF6000">»''aus Liebe''«</span> ,entstehen‘ lässt.)</span>
Anmerkung-4 ''':''' Das <span style="color:#00B000">(im 2. Beweisgang)</span> schon bewiesene Theorem-2, d.i. die Koinzidenz von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, <span style="color:#00B000">(‚Existenz‘</span> und <span style="color:#00B000">‚Essenz‘)</span>, rechtfertigt sowohl Axiom-5 als auch die Definition-3, und widerlegt den Einwand KANTS. Somit ist deren Setzung <span style="color:#00B000">(hier, im 3. Beweisgang)</span> korrekt, und durch das Theorem-2 schon vorbestimmt und bestätigt, d.h. beide sind <span style="color:#FF6000">„modal wahr“</span> und ,logisch‘ annehmbar, da sie durch die Gültigkeit von Theorem-2 ,verifiziert‘ worden sind. Damit wird klar erkennbar, dass das Theorem-2 tatsächlich die Basis des GÖDEL-Kalküls ist. Und wenn damit Axiom-5 im GÖDEL-Kalkül ‚gerechtfertigt‘ ist, dann ist auch, <span style="color:#00B000">(als Voraussetzung dafür)</span>, das Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ — ''':''' </span> <span style="color:#FF6000">»''Positive Eigenschaften'', <span style="color:#00B000">[ ,Transzendentalia‘ ]</span>, ''sind notwendig aus sich'', <span style="color:#00B000">[ von Natur aus ]</span>, ''positiv''«</span>, im 2. Beweisgang erklärbar, in dem die ‚Positivität‘, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, einer Eigenschaft schon als ‚notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, charakterisiert worden ist, äquivalent zu Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, in dem die ‚Notwendigkeit‘, <span style="color:#4C58FF">— <sub>not</sub> —</span>, <span style="color:#00B000">(der Existenz <span style="color:#4C58FF">— ‚'''E'''‘ —</span>)</span>, dann als ‚positive‘ Eigenschaft, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ‚bestimmt‘ wird; <span style="color:#00B000">(unter der speziellen Voraussetzung, dass <span style="color:#FF6000">„Existieren“</span> definitiv als eine <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT ,instanziiert‘ ist; vgl. Definition-3. Eine ,bestimmte‘ Eigenschaft ist genau dann ,instanziiert‘, wenn sie an einem Träger real ,existiert‘. Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, besagt, dass die, von GÖDEL ,postulierte‘, und im Basis-Theorem-2 verifizierte, <span style="color:#FF6000">„notwendige Existenz“</span> zu den ,ultimativen‘ Transzendentalia in GOTT gehört. Genauer ''':''' Sie ist die ,Summe‘ aller Transzendentalia.)</span> Zum Axiom-4, <span style="color:#00B000">(bzw. zum Term :14:, im 2. Beweisgang)</span>, erklärt GÖDEL in seinen Notizen zum Kalkül ''':''' <span style="color:#FF6000">»''da es'' <span style="color:#00B000">[ das Notwendigsein, <span style="color:#4C58FF">— '''□''' —</span> ]</span> ''aus der Natur der'' <span style="color:#00B000">[ positiven ]</span> ''Eigenschaft folgt'', <span style="color:#00B000">[ deren Positivität, im selben Beweisgang, mit Term :13: vorher schon ,bewiesen‘ (╞ ) worden ist ]</span>«</span>. Die GÖDEL-Erklärung zum Axiom-4 entspricht der Modal-Regel zur sog. ,Nezessisierung‘ in der KRIPKE-Logik nach GÖDEL. <span style="color:#4C58FF">[ Nezessisierungsregel ] '''::''' [ ├ A →├ □ A ]</span> ''':''' <span style="color:#FF6000">»''Angenommen'', <span style="color:#4C58FF">‚'''A'''‘</span> ''ist in einem Kalkül eine Prämisse, oder darin regulär'' <span style="color:#4C58FF">(├ )</span> ''abgeleitet, dann folgt in diesem Kalkül regulär'' <span style="color:#4C58FF">(├ )</span>, ''dass dieses'' <span style="color:#4C58FF">‚'''A'''‘</span> ''auch ,modal‘ notwendig'' <span style="color:#4C58FF">— ,□‘ —</span> ''ist''«</span>. GÖDEL hat jedoch diese modale Notwendigkeit nur in der ,Natur‘ der positiven Eigenschaften, alias ,Transzendentalia‘, gesehen, und mit den Aussagen im Axiom-4 expliziert ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt, nur dann sind die Axiome wahr''«</span>. Ob dieselbe modale Notwendigkeit auch auf Aussagen über Eigenschaften, wie ,rot‘ oder ,schwer‘, die weder positiv noch negativ sind, zutrifft, ist nicht erwiesen. Hier kann nur von modaler ,Kontingenz‘ gesprochen werden, die universal, alles Seiende innerhalb der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> betrifft. Somit sind die Aussagen <span style="color:#4C58FF">— ‚'''A'''‘ —</span> in der GÖDEL-Regel, nur auf Aussagen über ,positive‘ Eigenschaften eingeschränkt, und nicht allgemein gültig. Die <span style="color:#4C58FF">[ Nezessisierungsregel ]</span> ist nur für <span style="color:#FF6000">„Transzendentalia“ „modal wahr“</span>, und für ,Nicht-Transzendentalia‘ immer <span style="color:#FF6000">„modal falsch“</span>.
Der unbegrenzt Unendliche, GOTT, — im Glauben der Christen —, ist deswegen ,notwendig für uns da‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, weil er als GOTT ,vollkommen‘, ,perfekt‘ und absolut ,positiv‘, d.h. absolut ,gut allein‘ ist, ohne jede Negativität ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>; <span style="color:#00B000">(was auch schon im 2. Beweisgang mit Term :13: verifiziert wurde)</span>. Und wenn GOTT ,vollkommen‘, ,perfekt‘, ,positiv‘, und absolut ,gut‘ ist, dann ist er das auch ,notwendig aus sich‘ ''':''' <span style="color:#4C58FF">— ‚'''PG → □PG'''‘ — ::</span> <span style="color:#00B000">(als Zusatz-Korollar im 2. Beweisgang mit Axiom-4 und der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>)</span>, d.h. ,aus seinem Wesen‘. Das ist gerade das, ,was‘ GOTT als GOTT ausmacht ''':''' sein ,Wesen‘, bzw. seine <span style="color:#FF6000">„Natur“</span>. Zusammen mit der Definition-1 für GOTT, <span style="color:#00B000">(und der Definition-2 ''':''' Alle Wesenseigenschaften hängen notwendig gleichwertig aus sich zusammen)</span>, ist dieses, aus der <span style="color:#FF6000">„Natur“</span> GOTTES sich ergebende, ‚Notwendigsein‘, <span style="color:#4C58FF">— '''□''' —</span>, aller ‚positiven‘ Eigenschaften im Axiom-4, und ihr logischer Zusammenhang, d.i. die Koinzidenz aller ,Vollkommenheiten‘ und ,Zuschreibungen‘ im Unendlichen, GOTT, ihr ,Zusammenfallen in eins‘, die entscheidende Voraussetzung, aus der sich dann für GÖDEL <span style="color:#00B000">(im 2. Beweisgang)</span> auch der logische Zusammenhang, bzw. die ontologische Identität, <span style="color:#00B000">(die Koinzidenz)</span>, von <span style="color:#FF6000">„Dasein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, im Basis-Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> mit Notwendigkeit ergibt. Damit hat GÖDEL ein altes <span style="color:#4C58FF">„theologisches“</span> Theorem der Vergessenheit entrissen. Das Theorem-2 ist dann, in weiterer Folge, die ,modal‘ notwendige, d.h. die transzendentale Voraussetzung auch für den Konsequenz-Teil im Theorem ANSELMS, <span style="color:#00B000">(Term :09: hier im 3. Beweisgang)</span>. <span style="color:#FF6000">„Positive Eigenschaften“<span style="color:#00B000"> | </span>„Vollkommenheiten“</span> sind ,immer‘ auch <span style="color:#FF6000">„notwendige Eigenschaften“</span>, daher ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. Das ,Dasein‘, die <span style="color:#FF6000">„Existenz“</span> ist ,immer‘ etwas <span style="color:#FF6000">„Positives“</span>, speziell in GOTT, dem Schöpfer jeder ,Existenz‘, bzw. allen ,Seins‘. Axiom-4 begründet im GÖDEL-Kalkül das Basis-Theorem-2, <span style="color:#00B000">(wie auch das Korollar-3 von der exklusiven Einzigartigkeit GOTTES)</span>, und ,verankert‘ diese Theoreme damit zugleich in der <span style="color:#4C58FF">,theologisch‘</span>-philosophischen Tradition der ,Rede von GOTT‘ bei ARISTOTELES, — AVICENNA, — ANSELM, — DESCARTES, — LEIBNIZ, — HEGEL, — und bei GÖDEL mit äußerster ,logischer‘ Klarheit.
Anmerkung-5 ''':''' Der ‚Schlüsselbegriff‘ in diesem Kalkül ''':''' <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Vollkommenheit“<span style="color:#00B000"> | </span>„Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, dominiert alle Axiome des GÖDEL-Kalküls, jedoch ohne inhaltlich genauer ‚bestimmt‘ worden zu sein. Für <span style="color:#4C58FF">— ‚'''P'''‘ — </span> gibt es keine explizite Definition '''!''' <span style="color:#00B000">(Das Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, besagt nur, dass die ,postulierten‘, positiven Eigenschaften, die <span style="color:#FF6000">„Transzendentalia“</span>, formal miteinander verträglich, d.h. ‚widerspruchsfrei‘ sind, wegen Axiom-2. Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, besagt, dass positive Eigenschaften ,gleichwertig‘ sind, d.h. gleich ,wahr‘ sind, weil sie ,notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, aus sich, alle paarweise mit- und voneinander ,impliziert‘ sind, sich gegenseitig ,einschließen‘, und damit eine Einheit bilden, d.h. in GOTT ,eins‘ sind. Axiom-2 ist somit zugleich eine ,indirekte‘ Definition für ,positive‘ Eigenschaften ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, besagt ''':''' Weil die ,gleichwertigen‘, positiven Eigenschaften sich gegenseitig implizieren, und damit notwendig von einander abhängen, d.h. koinzident in GOTT ,eins‘ sind, — wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht —, dann sind sie somit auch die ,wesentlichen‘ Eigenschaften, die <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, in GOTT, der, wesentlich und exklusiv, notwendig ,Einer‘ ist. Die Definition-2 ist nur dann <span style="color:#FF6000">„modal wahr“</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit positive Eigenschaften, d.h. mit <span style="color:#FF6000">„Transzendentalien“</span>, besetzt werden. Diese Definition ist jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn ihre Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind. Fußnote zu Definition-2 in der GÖDEL-Notiz ''':''' <span style="color:#FF6000">»''any two essences of x are nec. equivalent''«</span>. Die paarweise, notwendige Äquivalenz von zwei beliebigen Wesenseigenschaften der Individuum-Variable <span style="color:#4C58FF">‚'''x'''‘</span>, wird hier, spezifisch für GOTT, d.h. wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT, dem ,Einen‘, steht, zur <span style="color:#FF6000">„Koinzidenz“</span>, — zum paarweise ,Zusammenfallen aller Gegensätze in Einem‘ —, dem inneren Zusammenhang aller seiner <span style="color:#FF6000">„ultimativen“</span> Vollkommenheiten, d.h. aller <span style="color:#FF6000">„Transzendentalia“</span> und Zuschreibungen, in dem unbegrenzt Unendlichen, GOTT, den schon der Philosoph und Kardinal NIKOLAUS von Cues als <span style="font-family: Times;"><big>,coincidentia oppositorum‘</big></span> verstanden hat.)</span>
In den entscheidenden ‚Schlusssätzen‘ des Kalküls ist der ‚Schlüsselbegriff‘ verschwunden. Hier ist nur mehr von GOTT, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, die Rede ''':''' Korollar-1, <span style="color:#FF6000">»''Es ist definitiv denkbar, dass es GOTT gibt''«</span>, Theorem-2, <span style="color:#FF6000">»''Dasein, GOTT-Sein, Göttlichkeit ist das Wesen GOTTES''«</span>, Theorem-3, <span style="color:#FF6000">»''Weil GOTT definitiv denkbar, d.h. widerspruchsfrei möglich ist, darum ist auch der Glaube an GOTT widerspruchsfrei, logisch richtig und mathematisch evident, der annimmt, dass es GOTT, mit Notwendigkeit, wirklich gibt''«</span>, <span style="color:#00B000">(nach ANSELM von Canterbury, und was spezifisch das <span style="color:#FF6000">»</span>''Privilegium der Gottheit allein''<span style="color:#FF6000">«</span> ist, nach LEIBNIZ)</span>, und Korollar-3, <span style="color:#FF6000">»''Es gibt notwendig aus sich, d.i. unverursacht, nur einen GOTT''«</span>. Das GÖDEL-Kalkül ist zu diesen Erkenntnissen gekommen, ohne die Eigenschaften, bzw. die ‚Vollkommenheiten‘ GOTTES, d.h. wer oder was GOTT ‚an sich‘ selbst ist, genauer bestimmen zu müssen, <span style="color:#00B000">(was ,für uns‘ ohnehin ,unmöglich‘ ist)</span>; außer im Theorem-2, in dem das <span style="color:#FF6000">„Dasein“</span> GOTTES als die ‚für uns‘ bestimmende und wichtigste <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT erkannt worden ist, — immer vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. Der GOTT des GÖDEL-Kalküls ist nicht mehr der an Raum und Zeit gebundene ‚Gott‘ des ARISTOTELES, sondern der von Raum und Zeit <span style="color:#FF6000">»''unabhängige''«</span> GOTT der Bibel bei ANSELM und bei LEIBNIZ. Das GÖDEL-Kalkül, <span style="color:#00B000">(wie ja auch der sog. ‚ontologische Gottesbeweis‘ ANSELMS)</span>, kann jedoch, — bei aller ‚Coolness‘ —, keinen GOTT-Glauben ‚erzeugen‘, sondern setzt vielmehr die Existenz GOTTES notwendig als gegeben schon voraus. Das Kalkül des Logiker GÖDEL beweist aber, dass der traditionelle ‚GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. logisch ,richtig‘ und <span style="color:#FF6000">»''mathematisch evident''«</span> ist, weil der ‚Nicht-GOTT-Glaube‘, <span style="color:#FF6000">»''die atheistische Weltanschauung''«</span>, im Möglichkeitsbeweis notwendig zu unlösbaren Widersprüchen führt, und somit logisch ,falsch‘ ist. <span style="color:#00B000">(Die ,Logik‘ hat aber, — bekanntlich —, bei allen wichtigen, persönlichen Entscheidungen immer nur eine untergeordnete Rolle '''!''' )</span>
Anmerkung-6 ''':''' Das erste, ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitete, Hauptergebnis im 3. Beweisgang, Term :10: <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' der Glaube, dass GOTT ,notwendig‘ existiert, ist die logische Konsequenz aus der Prämisse, Term :1: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>. Dieses erste Hauptergebnis hat also den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist daher davon ,abhängig‘, d.h. Term :10: ist der Ausdruck einer ,Glaubensüberzeugung‘. Das zweite Hauptergebnis im 3. Beweisgang, das Theorem ANSELMS ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, dagegen, ist die Darstellung der Abhängigkeit des ersten Hauptergebnisses von dem, vorher schon bewiesenen, ,Axiom‘ von der ,möglichen‘ Existenz GOTTES ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang. Dem geht folgende Beobachtung voraus ''':''' Der Term ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, hat in seiner syntaktischen Stellung hier, im Theorem-3, nicht mehr den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist damit, in seiner Position als Konsequenz-Teil im Theorem ANSELMS, auch nicht mehr davon syntaktisch abhängig, sondern stützt sich formal-syntaktisch nur auf die behauptete Möglichkeit GOTTES; daher muss diese ,angenommene‘ Möglichkeit noch bewiesen <span style="color:#00B000">( ╞ )</span> werden. Dazu die Feststellung LEIBNIZ‘, der diesen Zusammenhang, und seinen Mangel, erkannt hat ''':'''
::Das Theorem ANSELMS ist <span style="color:#FF6000">» ''ein unvollständiger Beweis, der etwas voraussetzt, was man noch hätte beweisen'' <span style="color:#00B000">( ╞ )</span> ''sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' «</span>.
Diesen <span style="color:#FF6000">»''unvollständigen Beweis''«</span> hat GÖDEL im 1. Beweisgang mit dem ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleiteten, und widerspruchfreien Möglichkeits-Korollar-1, vervollständigt, und damit hat er mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span> bewiesen ''':''' <span style="color:#FF6000">»''Diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens''«</span> enthält <span style="color:#FF6000">»''keinen Widerspruch''«</span> '''!''' Das Korollar-1 ist nur vom logischen Axiom-1 und von der mathematischen Äquivalenz der Perfektionen, <span style="color:#00B000">(der Transzendentalien)</span>, im Axiom-2 ,abhängig‘, und nicht mehr von der ,methodologischen‘ Kalkül-Prämisse, dem traditionellen GOTT-Glauben. Damit hat das Glaubens-Theorem ANSELMS die gesuchte <span style="color:#FF6000">»''mathematische Evidenz''«</span> erreicht, unabhängig von jeder Glaubensüberzeugung. Entscheidend dafür ist der mathematisch-logische Beweis GÖDELS, dass der Nicht-GOTT-Glaube zu einem Widerspruch führt.
Zusammenfassung ''':'''
Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>, ist die logische Konsequenz aus der Prämisse im 1. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, den, — <u>modal-frei</u> — gewählten, ,angenommenen‘ positiven Eigenschaften, bzw. ,Transzendentalia‘.
Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' <span style="color:#FF6000">»''GOTT-Sein ist das Wesen GOTTES''«</span>, ist die logische Konsequenz aus der Prämisse im 2. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, dem, — <u>modal-frei</u> — gewählten, ,angenommenen‘ GOTT-Glauben der Christen.
Im Unterschied dazu ist im 3. Beweisgang, das Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' der Glaube, dass es einen GOTT notwendig gibt ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, die logische Konsequenz aus dem, — <u>modal-notwendig</u> — als widerspruchsfrei ,bewiesenen‘, Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, im 1. Beweisgang, <span style="color:#00B000">(auch im Beweisgang ,Widerlegung‘ im Anhang)</span>, und damit ist das Glaubens-Theorem-3, als ganzes, ,widerspruchsfrei‘. Das Theorem ANSELMS ist, mit Korollar-1, nur vom logischen Axiom-1 der Widerspruchsfreiheit, und der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften, <span style="color:#00B000">(aller Transzendentalia)</span>, im Axiom-2, abhängig. Damit ist die Bedingung für die geforderte, spezielle <span style="color:#FF6000">»''mathematische Evidenz''«</span>, und auch für die Widerspruchsfreiheit im Glaubens-Theorem ANSELMS erfüllt; unabhängig von jeder Glaubensüberzeugung. Weil es <span style="color:#FF6000">„modal wahr“</span> ist, dass die Transzendentalien, bzw. die Vollkommenheiten ontologisch, — dem Sein nach —‚ alle <span style="color:#00B000">(zueinander)</span> widerspruchsfrei, und alle <span style="color:#00B000">(miteinander)</span> gleichwertig sind, ist es auch <span style="color:#FF6000">„modal wahr“</span>, dass es möglich ist, dass GOTT, — dem Sein nach —‚ da ist, <span style="color:#00B000">(d.h. existiert)</span>, der die unbegrenzte Summe aller ultimativen Transzendentalia, bzw. der unendlichen Vollkommenheiten allen Grades ist, wie es der ,christliche Glaube‘ des Erzbischofs ANSELM und seiner Anvertrauten ,annimmt‘.
====<div class="center"><span style="color:#660066">Widerlegung</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDEL-Kalkül : der Möglichkeitsbeweis als Widerlegung des Nicht-GOTT-Glaubens</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe_____________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist X nicht positiv“} \\
\text{(Axiom 2)} & \quad \Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaft Y in allen x, die aus der Eigenschaft X in allen x} \\
\text{ } & \quad & \ & \; \; \text{mit modaler Notwendigkeit folgt, ist eine positive Eigenschaft“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Korollar-1)} &\quad \Diamond \; \exists x \ G \ x \ & \ & \; \; \text{( „das —,x‘— steht für den GOTT, —,G‘—, der Christen“ )} \\
\text{ } & \text{„Es ist möglich, dass es den GOTT der Christen gibt“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad \; \neg \Diamond \; \exists x \ G \ x \ & \ & \text{ AE: „Es ist unmöglich, dass es diesen GOTT gibt“ (dezidierter Atheismus)} \\
\text{02} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{03} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{04} & \quad \neg\neg \Box \neg \exists x \ G \ x \ & \ & \text{:01:[ ◇A ↔ ¬□¬A ] :: (Modalregel) } \\
\text{05} & \quad \neg\neg \Box \neg\neg \forall x \neg \ G \ x \ & \ & \text{:04:[ ∃xA ↔ ¬Ɐx¬A ] :: (Quantorenregel) } \\
\text{06} & \quad \text{ ├ }\; \Box \; \forall x \neg G \ x \ & \ & \text{:05:NEG :: [ ¬¬A↔A ] :: (Gesetz der Aussagenlogik) } \\
\text{07} & \quad \Box \; \forall x \neg G \ x \Leftrightarrow\ W & \ & \text{:01:06:[ (:01:↔W) → (├:06:↔W) ] :: (Kalkülregel) } \\
\text{08} & \quad \Box \; \forall x \ G \ x \Leftrightarrow\ F & \ & \text{:07:[ (¬A↔W)↔(A↔F) ] :: (Regel für Wahrheitswerte)} \\
\text{ } & \text{„Jeder GOTT-Glaube ist notwendig falsch ! “} & \ & \Longleftarrow\; \text{die logische Konsequenz aus der Prämisse :01: !} \\
\text{09} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:02:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{10} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (\neg x = x)) & \text { } & \text{:08:09:[ (:08:↔F) → (:09:↔F) ] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{11} & \quad \Box \; \forall x (\ G \ x \Rightarrow \; (\neg x = x)) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=(¬x= ..)) } \\
\text{12} & \quad \ P (\neg x = .. ) & \ & \text{:10:11:[ Modus ponens ] :: [ A→B, A ├ B ]} \\
\text{13} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{14} & \quad \neg P (\ x = .. )\ & \ & \text{:12:13:[ Modus ponens ] :: (log. Schlussregel)}\\
\text{15} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:03:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{16} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) & \ & \text{:08:15:[ (:08:↔F) → (:15:↔W) ] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{17} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=( x= ..))} \\
\text{18} & \quad \ P (\ x = .. )\ & \ & \text{:16:17:[ Modus ponens ]}\\
\text{19} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ &
\text{:14:18:[ Konjunktion ] ⇒ Kontradiktion !}\\
\text{20} & \quad \neg \Diamond \; \exists x \ G \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:01:19:[ ├A├B╞ A→B ] :: ''KONDITIONALER BEWEIS''}\\
\text{ } & {\color{RedOrange}\text{Der Atheismus führt zu einem logischen Widerspruch ! }} & \ & \Longleftarrow\; \text{was mit Term :20: bewiesen ist !} \\
\text{21} & \quad \neg\neg \Diamond \; \exists x \ G \ x & \ & \text{:20:19:[ Modus tollendo tollens ] :: [ A→B,¬B ├ ¬A ]}\\
\text{22} & \quad \; \Diamond \; \exists x \ G \ x & \ & \text{:21:NEG }\\
\text{(Korollar-1)} & \;\text{„Es ist definitiv möglich, dass es diesen GOTT gibt“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\end{align}</math>
</small>
|}
Anmerkung-7 ''':''' <span style="color:#00B000">( Dieser Beweisgang ist praktisch identisch mit dem 1. Beweisgang, jedoch gestrafft und präzisiert nach G.J.WIRSCHING. Diese Widerlegung des Nicht-GOTT-Glaubens beginnt sofort mit dem Korollar-1 <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> aus dem 1. Beweisgang, als in Frage gestelltes ,Theorem‘, und beweist, ohne das Axiom-3 <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, und ohne die GÖDEL-Prämisse <span style="color:#4C58FF">— ,'''PX'''‘ —</span>, in einem Zwischenergebnis, die innere Widersprüchlichkeit und damit auch die Unhaltbarkeit der atheistischen Glaubens-Annahme, aus rein logischen ,Gründen‘, bzw. Axiomen. )</span>
Dieser Beweisgang geht von der Existenz GOTTES, <span style="color:#4C58FF">— ,'''G'''‘ —</span>, als Glaubens-Annahme, aus, wobei aber die Möglichkeit seiner Existenz, und damit die Sinnhaftigkeit des Glaubens an GOTT, durch die Prämisse :01: in Frage gestellt wird, und daher im Kalkül überprüft werden muss. Denn mit der Behauptung der Existenz GOTTES allein ist es nicht getan. Es muss auch seine ,Möglichkeit‘, d.h. die Sinnhaftigkeit des Glaubens an GOTT aufgewiesen werden. LEIBNIZ hat als erster, <span style="color:#00B000">(nach ANSELM)</span>, dieses Problem gesehen, und GÖDEL hat dafür die Lösung gefunden. Dieser Beweisgang, <span style="color:#00B000">(analog zum Möglichkeitsbeweis von Günther J. WIRSCHING konzipiert)</span>, setzt in den Axiomen, genau wie im 1. Beweisgang, die Existenz von etwas <span style="color:#FF6000">„Positiven“, „Perfekten“, „Vollkommenen“</span>, <span style="color:#4C58FF">— ,'''P'''‘ —</span>, <span style="color:#00B000">(d.h. die Transzendentalien)</span>, allgemein für die Welt voraus, <span style="color:#00B000">(was im Axiom-3 ''':''' <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, auch GOTT ultimativ zugeordnet wird ''':''' <span style="color:#FF6000">»''GOTT ist absolut positiv, perfekt und vollkommen''«</span>)</span>; das dann im 2. Beweisgang mit Term :13: als widerspruchsfrei, <span style="color:#00B000">(als ,wahr‘ und ,annehmbar‘ im Kontext des christlichen Glaubens)</span>, schon ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> worden ist. Die Existenz von ,Transzendentalien‘ in der Welt, ist ein, mit Beispielen belegbares, allgemeines Faktum; ihre Existenz auch in GOTT ist mit dem Term :13: des 2. Beweisganges bewiesen, die jedoch im Unendlichen, GOTT, als Transzendentalia, auch in ,ultimativer‘ Form vorliegen. Axiom-1 ,besagt‘, dass Eigenschaften nicht zugleich, vollkommen und nicht vollkommen, sein können. Axiom-2 ,besagt‘, dass, allgemein, alle Vollkommenheiten, <span style="color:#00B000">(alle Transzendentalien)</span>, gleichwertig, <span style="color:#00B000">(mathematisch äquivalent)</span>, sind. <span style="color:#00B000">(Axiom-2 wird hier um das GÖDEL-Konjunkt <span style="color:#4C58FF">— ,'''PX'''‘ —</span> verkürzt dargestellt. Damit ist auch Axiom-3 für diesen Beweisgang unnötig geworden, ohne dass sich wegen dieser Kürzung am Ergebnis etwas ändert. Axiom-2 wird jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn seine Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind, die keine ,Transzendentalia‘ sind.)</span> Die Eigenschaft <span style="color:#4C58FF">— (¬x=..) —</span> ,besagt‘, dass GOTT <span style="color:#FF6000">„unvergleichlich“</span> ist, wenn <span style="color:#4C58FF">,'''x'''‘</span> für GOTT steht. <span style="color:#00B000">(Der informelle Term, <span style="color:#4C58FF">— (¬x=..) —</span>, ersetzt hier, wie bei A. FUHRMANN, den formal korrekten Abstraktionsausdruck ''':''' <span style="color:#4C58FF">— λy.(¬x=y) —</span>, aus dem Lambda-Kalkül.)</span> Der Term :16: <span style="color:#4C58FF">— (x=x) ↔ W —</span> steht für die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚IST‘'' <span style="color:#00B000">(aus mir selbst)</span>«</span>, der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES. Der GOTT der abendländischen, christlichen Tradition wird mit <span style="color:#4C58FF">— ,'''G'''‘ —</span> bezeichnet ''':''' d.i. der <span style="color:#FF6000">„GOTT der Christen“</span>, entsprechend der ,methodologischen‘ Prämisse und der ,Genese‘ des Kalküls, syntaktisch formalisiert in der Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn es alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>, nach der Vorgabe von LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Mit Korollar-1 hat dieser Beweisgang dasselbe Endergebnis, wie der 1. Beweisgang. Der Beweis, dass der dezidierte Atheismus zu einem logischen Widerspruch führt, und damit falsch ist, ist ein Zwischenergebnis in diesem Beweisgang, und begründet mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, und unabhängig von jeder Glaubensüberzeugung, den, von LEIBNIZ gesuchten, Möglichkeitsbeweis für die Existenz GOTTES im Argument des Erzbischofs, und bestätigt damit die Sinnhaftigkeit des GOTT-Glaubens. Einmal Axiom-1 und zweimal Axiom-2 sichern hier das Ergebnis des Kalküls ''':''' das Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>''':''' <span style="color:#FF6000">»''Es ist definitiv möglich, dass es den GOTT der Christen gibt''«</span>. Diese zwei Axiome sind die einzigen, und modal-notwendigen, d.h. die transzendentalen Voraussetzungen und Bedingungen für das Endergebnis ''':''' der Widerspruchsfreiheit und Sinnhaftigkeit des Glaubens der Christen an GOTT; <span style="color:#00B000">(dasselbe gilt natürlich auch für die <span style="color:#4C58FF">„theologische“</span> Weltanschauung jeder monotheïstischen Religion '''!''' Dem Erzbischof ANSELM ging es damals nur um seinen Glauben an GOTT.)</span>.
Die Logik-Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso sequitur quotlibet, etiam verum“</big></span></span>, <span style="color:#00B000">(‚Aus Falschem folgt irgendetwas, auch Wahres‘)</span>, ist der scholastische Ausdruck für die ‚Implikation‘ <span style="color:#00B000">(Folgerung)</span> von Aussagen, die nur dann falsch, <span style="color:#4C58FF">— F —</span> ist, wenn das Antezedens wahr, <span style="color:#4C58FF">— W —</span>, und die Konsequenz falsch, <span style="color:#4C58FF">— F —</span> ist. Andernfalls ist sie immer wahr, <span style="color:#4C58FF">— W —</span>, auch wenn die Voraussetzung falsch, <span style="color:#4C58FF">— F —</span> ist ''':''' ‚Modern‘ darstellbar durch die ‚Wahrheitswertetafel‘ für die ‚materiale Implikation‘, <span style="color:#4C58FF">— ,(A → B)‘ —</span> <span style="color:#FF6000">„wenn A, dann B“</span>. Damit ist auch der <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ] </span> verstehbar; <span style="color:#00B000">(vgl. die vierte Zeile der ‚materialen Implikation‘)</span>. Der positive hypothetische Syllogismus ''':''' <span style="color:#4C58FF">[ Modus ponendo ponens ] :: [ A → B, A ├ B ] </span> ist aus der ersten Zeile ablesbar.
Die folgende Tabelle gibt für jeden ,Wahrheitswert‘ der Aussagen <math>A</math> und <math>B</math> das Resultat einiger zweiwertiger Verknüpfungen an ''':'''
{|class="wikitable hintergrundfarbe2" style="text-align:center;"
|-
!colspan="2"|''Belegung''!!Konjunktion!!Disjunktion!!materiale<br /> Implikation!!Äquivalenz<br /> Bikonditional!!kopulative<br /> Konjunktion
|-
!<math>A</math>
!<math>B</math>
!<math>A</math> und <math>B</math>
!<math>A</math> oder <math>B</math>
!wenn <math>A</math> dann <math>B</math>
!sowohl <math>A</math> als auch <math>B</math>
!entweder <math>A</math> oder <math>B</math>
|-
!W!!W
|W||W||W||W||F
|-
!W!!F
|F||W||F||F||W
|-
!F!!W
|F||W||W||F||W
|-
!F!!F
|F||F||W||W||F
|}
<span style="color:#00B000">(Eine ‚Konjunktion‘ ist nur dann ,wahr‘, wenn beide Aussagen einer ‚Konjunktion‘ wahr sind. Eine ‚kopulative Konjunktion‘ ist nur dann ,wahr‘, wenn entweder die eine, oder die andere Aussage der ‚kopulativen Konjunktion‘ wahr ist. Es besteht also eine Wenn-Dann-Verbindung zwischen beiden Aussagen — eine ,Kopplung‘. Das ist die logische Grundlage von Axiom-1 im GÖDEL-Formalismus)</span>
Um das Widersprüchliche der ,Annahme‘ nachzuweisen, dass positive Eigenschaften ,nicht konsistent‘ seien, <span style="color:#00B000">(im 1. Beweisgang)</span>, bzw. um das Unlogische und Sinnwidrige der ,Annahme‘ klarzustellen, es sei ,unmöglich‘, dass es einen GOTT gibt, <span style="color:#00B000">(hier, in der Widerlegung)</span>, verwendet das GÖDEL-Kalkül den Gegensatz ''':''' wahr, <span style="color:#4C58FF">— W —</span>, falsch, <span style="color:#4C58FF">— F —</span>, zwischen der dritten und vierten Zeile der Wahrheitswertetafel, für zwei ,wahre‘ <span style="color:#4C58FF">— W —</span> ,materiale Implikationen‘, in denen die Voraussetzung jeweils falsch, <span style="color:#4C58FF">— F —</span>, ist, entsprechend der Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso, <span style="color:#4C58FF">— F —</span>, sequitur quotlibet, <span style="color:#4C58FF">— F —</span>, etiam verum, <span style="color:#4C58FF">— W —</span>“</big></span></span>, jeweils mit der Hilfe von Axiom-1 und Axiom-2, in einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>; hier unabhängig von jeder Glaubensüberzeugung. Im Gegensatz dazu, wird, <span style="color:#00B000">(im 2. Beweisgang)</span>, aus dem Glauben an GOTT, auch mit einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, speziell mit Axiom-1, das Widersprüchliche in der ,Annahme‘ nachgewiesen, es gäbe in GOTT <span style="color:#FF6000">»''keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span>, d.h. keine ,Transzendentalia‘. In dieser <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, im 2. Beweisgang, wird vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span> ''':''' es gibt den GOTT der Christen, <span style="color:#00B000">(als Prämisse :01:)</span>, der ,unvergleichlich‘ und ,einzigartig‘ ist, und in dem auch alle ,Transzendentalia‘ <span style="color:#FF6000">„koinzident“</span> ,eins‘ sind, entsprechend Axiom-2.
Für KANT entsteht ein Widerspruch in den Prädikaten eines Satzes.
::<span style="color:#FF6000">»</span> ''Wenn ich das Prädicat in einem identischen Urtheile aufhebe'', <span style="color:#00B000">[ durch eine Negation ]</span>, ''und behalte das Subject, so entspringt ein Widerspruch''. <span style="color:#00B000">[ Wenn ich sage ''':''' ,''GOTT ist nicht allmächtig''‘, entsteht ein Widerspruch zur richtigen Aussage ''':''' ,''GOTT ist allmächtig''‘. ]</span> … ''Wenn ihr aber sagt ''':''' ,GOTT ist nicht‘, so ist weder die Allmacht, noch irgendein anderes seiner Prädicate gegeben; denn sie sind alle zusammt dem Subjecte aufgehoben'', <span style="color:#00B000">[ negiert ]</span>, ''und es zeigt sich in diesem Gedanken nicht der mindeste Widerspruch.'' <span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 398f; https://www.korpora.org/kant/aa03/398.html</ref>
Es ist richtig, wie KANT sagt, der Widerspruch entsteht nicht in dem Gedanken ''':''' <span style="color:#FF6000">»</span>''GOTT ist nicht''<span style="color:#FF6000">«</span>. GÖDEL zeigt daher, dass der Widerspruch erst dann entsteht, wenn von der Annahme ausgegangen wird ''':''' ''<span style="color:#FF6000">»</span>Es ist unmöglich, dass GOTT ist''<span style="color:#FF6000">«</span>. Daraus folgt dann ,regulär‘, mit Hilfe von Axiom-1 und Axiom-2, <span style="color:#00B000">(d.h. mit den Theoremen von den Transzendentalien)</span>, die logische ,Möglichkeit‘ GOTTES, unabhängig von jeder Glaubensüberzeugung. Wie LEIBNIZ klar erkannt hat, muss zuerst, aus dem Widerspruch des Gegenteils, die logische ,Möglichkeit‘, <span style="color:#00B000">(die Konsistenz)</span>, der Existenz GOTTES bewiesen werden ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, bevor daraus die reale ,Notwendigkeit‘ GOTTES abgeleitet werden kann ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, dessen ,Existenz‘ jedoch, aus dem ,Glauben‘, im Voraus, schon angenommen worden ist. Dieser Sachverhalt ist das ausschließliche Spezifikum GOTTES, <span style="color:#00B000">(das <span style="color:#FF6000">»''Privilegium der Gottheit allein''«</span>)</span>, und gilt nur bei GOTT, als dem Unvergleichlichen und Einzigartigen. Dieses ,Spezifikum‘ wird im Theorem ANSELMS abgebildet ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, auf Grund von Axiom-2, das den inneren Zusammenhang, die Koinzidenz auch von ,Möglichkeit‘ und ,Notwendigkeit‘ im Unendlichen, GOTT, erkennen lässt. Bis Zeile 10, im 3. Beweisgang, reicht der Geltungsbereich der ,modal‘-frei gewählten Kalkül-Prämisse :01:, der ,methodologische‘ GOTT-Glaube. In Zeile 11 liegt der ,Schwerpunkt‘ des ontologischen Beweises dann aber am, — modal als notwendig — ,bewiesenen‘ Widerspruch des Gegenteils zum GOTT-Glauben, <span style="color:#00B000"> (formal-syntaktisch dargestellt als widerspruchfreies Antezedens, <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang)</span>, und nicht mehr am ,angenommenen‘ GOTT-Glauben der Kalkül-Voraussetzung, <span style="color:#00B000">(nun dargestellt als Konsequenz <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> im Theorem ANSELMS)</span>. Das Möglichkeits-Korollar-1 muss jetzt immer, wie folgt, gelesen werden ''':''' <span style="color:#FF6000">»''Es ist <u>widerspruchfrei</u> möglich, dass GOTT ist''«</span>. Damit hat er, — angeregt durch LEIBNIZ, und mit ihm —, die fast einhellig akzeptierte Fehldeutung des ontologisch-<span style="color:#4C58FF">„theologischen“</span> Arguments ANSELMS für GOTT durch gewichtige philosophische, <span style="color:#00B000">(KANT<ref>GOTT ist absolut einzigartig und unvergleichlich. KANT macht GOTT jedoch zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, indem er die Existenz, bzw. das ,Sein‘ GOTTES mit dem ,Sein der Dinge‘ gleich setzt. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! KANT verkennt damit die Einzigartigkeit und Besonderheit GOTTES. Das ,Sein‘ der Dinge ist, — wie KANT sagt —, kein ,reales Prädikat’, d.h. Existenz ist keine Eigenschaft. Jedoch in GOTT ist ,Sein‘ ein ,reales Prädikat‘, d.h. Existieren ist ,real‘ die Wesenseigenschaft GOTTES, denn GOTT ist der, der für uns, — aus Liebe —, immer schon ,da‘ ist ''':''' in der ,Hypostatischen Union‘, sowohl als GOTT von Ewigkeit zu Ewigkeit, als auch als Mensch in unserer Zeitlichkeit. Das ist das, was GOTT für uns ausmacht —, sein Wesen.</ref>)</span>, und <span style="color:#4C58FF">„theologische“</span>, <span style="color:#00B000">(THOMAS<ref>GOTT ist absolut einzigartig und unvergleichlich. THOMAS unterscheidet die ,Natur GOTTES‘ nicht von der ,Natur der Dinge‘, indem er die ,Natur‘ des GOTTES ANSELMS irrtümlich mit der ,Natur‘ der Dinge gleich setzt. Damit reiht er GOTT unter die vielen Dinge unserer Welt ein, indem er für den GOTT ANSELMS annimmt ''':''' GOTT ,esse in rerum natura‘, d.h. wörtlich, dass der GOTT ANSELMS in der ,Natur‘ der Dinge existiert, <span style="color:#00B000">(was ANSELM nie gesagt hat)</span>. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! Die ,zeitlose-überzeitliche‘ Wirklichkeit, (Natur), GOTTES ist völlig verschieden und unabhängig von der zufälligen Wirklichkeit, (die ,Natur‘), unserer ,raum-zeitlichen‘ Welt. Daher ist sie mit dieser auch nicht vergleichbar. Thomas verkennt damit die Einzigartigkeit und Besonderheit GOTTES.</ref>)</span>, Autoritäten zurechtgerückt, welche die Einzigartigkeit und Unvergleichlichkeit des Unendlichen, GOTT, bei ihrer Beurteilung des Theorem ANSELMS nicht berücksichtigt, sondern den Unendlichen, <span style="color:#00B000">(irrtümlich)</span>, unter die endlichen Dinge unserer Welt eingereiht haben. GÖDEL hat mit dem bewiesenen Widerspruch des Gegenteils zum GOTT-Glauben, den Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Theorem ANSELMS geliefert, was, nach LEIBNIZ, für die Akzeptanz dieses Theorems noch gefehlt hat. Das Theorem ANSELMS besagt universell ''':''' Die <span style="color:#FF6000">»''theologische Weltanschauung''«</span> der Juden, Christen und Muslime, <span style="color:#00B000">(und des ägyptischen Pharaos ECHNATON und seiner Frau NOFRETETE)</span>, die ,annehmen‘, dass es mit ,Notwendigkeit‘ <span style="color:#4C58FF">— ‚'''□'''‘ —</span> <span style="color:#00B000">(nur)</span> einen GOTT gibt, ist logisch richtig und <span style="color:#FF6000">»''mathematisch evident''«</span>, weil es <u>ohne Widerspruch</u> ,denkbar‘ <span style="color:#4C58FF">— ‚'''◇'''‘ —</span> ist, dass es GOTT gibt ''':''' Nicht mehr und nicht weniger, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>.
Es geht hier bei GÖDEL nicht um Theoriefindung oder ähnliches. GÖDEL ist kein ,spekulierender‘ Theoretiker. GÖDEL ist Logiker und Mathematiker. Was er sagt, ist mathematisch wahr und logisch richtig. Wenn er sagt, dass die Aussage ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ — »''wahr''«</span> ist ''':''' <span style="color:#FF6000">»''es ist möglich, dass es Gott gibt'' ''':''' ''das ist ,wahr‘ wegen Axiom-2 (und Axiom-1)''«</span>, dann spricht er hier von der mathematischen Wahrheit. Logischerweise ist dann die konträre Aussage ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ — »''falsch''«</span> ''':''' <span style="color:#FF6000">»''es ist nicht möglich, dass es einen Gott gibt''«</span>, und zwar mathematisch falsch, weil sich aus dieser Aussage ein Widerspruch ergibt. Jeder, der die mathematische Logik GÖDELS lesen kann, kann das sehen und verstehen ''':''' Das Zwischenergebnis, <span style="color:#00B000">(Term :20:)</span>, in dieser Kalkül-Ableitung, die logische Konsequenz aus der Annahme des dezidierten Atheismus, es sei unmöglich, dass es GOTT gibt, ist der faktische, nachprüfbare, und für jeden Menschen sichtbare Beweis dafür, dass diese Annahme in einen Widerspruch mündet, und damit falsch und unlogisch ist. Das bedeutet, es ist eine Tatsache, bzw. es ist ein allgemein gültiges Faktum unser Welt, dass der Atheismus, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, wirklich falsch und unsinnig ist, und daher, mit Recht, als ,Unsinn‘ bezeichnet werden darf '''!''' Das ist nicht bloß als eine Theoriefindung, oder als eine Interpretation eines Autors zu verstehen. Das ist vielmehr genau so wahr und <span style="color:#FF6000">»''mathematisch evident''«</span>, wie, dass zwei mal zwei vier ergibt, und wirklich genau so logisch richtig, wie, dass die Erde sich um die Sonne dreht. Das ist gerade das Überraschende und Unerwartete am Gödel-Kalkül. Es geht hier nicht mehr um Theoriefindung oder Interpretationen, denen man zustimmen kann oder nicht. Es geht hier <span style="color:#FF6000">»''rein verstandesmäßig''«</span> um mathematisch-logische Fakten. Damit steht GÖDEL, in seiner Bedeutung, in gewisser Weise, neben KOPERNIKUS, weil seine Kalkül-Ergebnisse, wie die Berechnungs-Ergebnisse dieses Pioniers der damaligen Zeitenwende, heute, in unserem Äon, ebenfalls mit eingefleischte Vorurteile aufräumen, ohne aber, dass GÖDEL für sich selbst, im Glauben, logisch konsequent gewesen wäre. <span style="color:#00B000">(Er ist sich der Tragweite und der Konsequenzen seiner <span style="color:#4C58FF">„axiomatischen Theologie“</span> anscheinend nicht bewusst gewesen, wenn er sagt ''':''' Man sei heute noch <span style="color:#FF6000">»''weit davon entfernt, das theologische Weltbild wissenschaftlich begründen zu können''«</span>, nachdem sein Kalkül das <span style="color:#FF6000">„atheistische Weltbild“</span> fundamental ins Wanken gebracht und als irrationalen ,Unsinn‘ entlarvt hat. Sein Kalkül ,beweist‘ ( ╞ ) indirekt, dass das <span style="color:#FF6000">„theologische Weltbild“</span>, im Beweisgang ,Widerlegung‘, aus dem Widerspruch des Gegenteils, mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span>, offensichtlich doch, wissenschaftlich begründet werden kann)</span>.
----
Kurt GÖDEL ist auch deswegen ein Ausnahmelogiker.
----
===<div class="center"><span style="color:#660066">Epilog für Skeptiker</span></div>===
Wenn man das GÖDEL-Argument genau liest, dann ist nur die Annahme ''':''' <span style="color:#FF6000"> „es ist möglich, dass es GOTT gibt“</span> bewiesen, weil aus der Annahme ''':''' <span style="color:#FF6000">„es ist unmöglich, dass es GOTT gibt“</span> ein logischer Widerspruch ableitbar ist. Die Aussage ''':''' <span style="color:#FF6000">„es gibt GOTT“</span> ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Menschen, der dann aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann ''':''' <span style="color:#FF6000">»''es gibt GOTT wirklich''«</span>, wenn er will ''':''' <span style="color:#FF6000">»''Es stimmt also, was ich glaube '''!''''' «</span> Das ist das Argument ANSELMS, der ein christlicher Amtsträger war, und der daher von dieser Grundannahme auch ausgeht. Solange in den Voraussetzungen des Möglichkeitsbeweises im GÖDEL-Kalkül kein Widerspruch nachweisbar ist, und solange in der logischen Durchführung dieses Beweises keine schweren Mängel festgestellt werden können, ist das Ergebnis des Möglichkeitsbeweises, wie GÖDEL ihn durchgeführt hat, korrekt, und die Folgerungen daraus, logisch richtig, dass es sich hier um <span style="color:#FF6000">»''mathematische Evidenz''«</span> handelt, <span style="color:#00B000">(z. B. wie 2 x 2 = 4)</span>. Aber niemand ist gezwungen, aus der Möglichkeit, dass es GOTT gibt, daraus zu schließen, dass es GOTT auch mit Notwendigkeit gibt, wie das im Argument ANSELMS geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit LEIBNIZ, der selbst an GOTT geglaubt hat, mit Bestimmtheit sagen ''':''' <span style="color:#FF6000">»''gesetzt, dass GOTT möglich ist, so ist er, was das Privilegium der Gottheit allein ist''«</span>, weil GÖDEL mit seinem Kalkül den noch ausstehenden Beweis der Widerspruchsfreiheit dafür geliefert hat.
Wenn Du den 3. Beweisgang des GÖDEL-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument ANSELMS, der identisch ist mit dem Term in der Zeile 10, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, immer noch formallogisch abhängig ist von der methodologischen Glaubens-Prämisse, Term :01:, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den Gott der Christen''«</span>. Diese Abhängigkeit ist bis zur Zeile 10 offensichtlich und logisch korrekt. <span style="color:#00B000">(Man könnte nach dieser Zeile, ohne Weiteres, ,regulär‘ die <span style="color:#FF6000">„logische Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A→B ]</span> mit Term :01: und Term :10: als ein mögliches Korollar bilden ''':''' <span style="color:#4C58FF">— ‚'''Gx→□∃xGx'''‘ — </span>)</span>. Das bedeutet, der Konsequenz-Teil im Theorem ANSELMS, der in diesem ,regulär‘-möglichen Korollar an zweiter Stelle steht, ist damit in seiner Formal-Struktur offensichtlich ,regulär‘ von der Glaubens-Prämisse, Term :01:, abhängig, d.h. er ist der Ausdruck einer Glaubensüberzeugung. Im Theorem ANSELMS steht er jetzt, in der Zeile 11, als Konsequenz-Teil auch an zweiter Stelle, hat aber nicht mehr seine Glaubens-Prämisse als notwendige Bedingung an erster Stelle vor sich, wie im ,regulär‘-möglichen Korollar. Jetzt steht eine neue und andere Voraussetzung als Begründung vor ihm. Der Schwerpunkt des Argument ANSELMS liegt damit am Begründungs-Teil des ANSELM-Theorems, der jetzt die erste Stelle im Theorem einnimmt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist möglich, dass es GOTT gibt''«</span>, der erst dadurch entstanden ist, und davon abhängig ist, weil sein Gegenteil ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist unmöglich, dass es GOTT gibt''«</span>, zu einem Widerspruch geführt hat. Dieser Begründungs-Teil, das Antezedens, im Argument ANSELMS, ist daher nicht mehr von der methodologischen Glaubens-Prämisse, Term :01:, abhängig, sondern nur vom Axiom-1, der Widerspruchsfreiheit, und von der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften im Axiom-2, die im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, die Widerspruchsfreiheit der Möglichkeit des GOTT-Glaubens mit Notwendigkeit herbeigeführt haben. Daraus ergibt sich eine logische Verschiebung in der Argumentationskette, denn dieser Begründungs-Teil, der jetzt die Widerspruchsfreiheit für den Konsequenz-Teil liefert, ist selbst unabhängig und frei von jeder Glaubensüberzeugung. Weil widerspruchsfrei und <span style="color:#FF6000">»''mathematisch evident''«</span>, muss er als logische Begründung für die Widerspruchsfreiheit und als Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Konsequenz-Teils gelesen werden, und damit bestätigt er die Widerspruchsfreiheit und Sinnhaftigkeit der Glaubensüberzeugung eines gläubigen Menschen, <span style="color:#00B000">(was auch das Ziel ANSELMS war)</span>. Das heißt also ''':''' der Glaube dieses Menschen ist widerspruchsfrei und sinnvoll, und enthält keinen Zirkelschluss, weil sein Gegenteil, der Nicht-GOTT-Glaube, zu einem Widerspruch führt; <span style="color:#00B000">(das hat GÖDEL mit seinem Kalkül-System bewiesen, dessen Argumentationskette mit einem Computer-Programm, dem sog. ,Theorembeweiser‘, überprüft worden ist, und als <span style="color:#FF6000">»''nachweisbar korrekt''«</span> befunden wurde)</span>. Das Theorem ANSELMS beweist, nach GÖDEL, dass der Glaube an GOTT, mit <span style="color:#FF6000">»''mathematische Evidenz''«</span> notwendig widerspruchsfrei und sinnvoll ist, weil der Nicht-GOTT-Glaube notwendig zu einem Widerspruch führt. <u>Das Theorem beweist jedoch nicht, dass die Existenz GOTTES notwendig ist</u>, <span style="color:#00B000">(wie es fast immer fälschlich gelesen wurde und wird)</span>, sondern, das Theorem ANSELMS geht davon aus, als nicht hinterfragtes Faktum, dass GOTT notwendig, schon immer existiert, und beweist, mit dem GÖDEL-Kalkül, dass diese Glaubens-Annahme widerspruchsfrei und sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL abschließend sagt. GOTT hat es ja auch nicht ,nötig‘, bewiesen zu werden. Für den Erzbischof ANSELM war die Existenz GOTTES, überall und jederzeit, die ungefragte und für ihn die selbstverständlichste Voraussetzung aller seiner Bemühungen, in seinem Leben, und in seinem Beruf als christlicher Amtsträger, und auch als Theologe in den philosophischen Überlegungen über seinen Glauben. Mit diesen Überlegungen hat er, mit GÖDEL, bewiesen ''':''' Glaube ist nicht irrational, kein Sprung ins Unbekannte, sondern eine freie, vernünftige Entscheidung. Glaube ist rational und vertrauenswürdig.
Zusammengefasst heißt das Ergebnis dieser Bemühungen ANSELMS ''':''' Wenn Du an GOTT glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist auch logisch in der <u>bewiesenen Möglichkeit</u>, dass es GOTT geben kann, begründet, und damit ist er widerspruchsfrei, sinnvoll und kein Zirkelschluss. Dein Glaube an GOTT beruht jedoch, nach wie vor und in erster Linie, auf Deiner freien Entscheidung für GOTT, und nicht auf dem Zwang einer ,logischen‘ Argumentation. Wenn Du nicht an GOTT glauben willst, dann <u>musst Du, und sollst Du, auch nicht deswegen</u> an GOTT glauben, weil der Nicht-GOTT-Glaube zu einem Widerspruch führt, und damit falsch und unlogisch ist. Denn der Glaube an GOTT muss immer eine freie und Deine ganz persönliche Entscheidung für GOTT sein und bleiben. Niemand darf zum Glauben an GOTT gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Warum '''?''' Weil GOTT die Liebe ist '''!''' Und die Liebe duldet keinen Zwang '''!'''
Zum Abschluss, und für eine bessere Verständlichkeit dieser Studie, hat die KI, der ich diese Studie für die Erstellung eines Podcast übergeben habe, eine, — sogar für Kinder —, verständliche Metapher kreiert. Sie sagt, man stelle sich vor ''':''' Es sei irgendwo ein ,Schatz’ vergraben, und es gäbe auch eine ,Schatzkarte’ für diesen ,Schatz’. Kurt GÖDEL ist nun gekommen, und hat mit seinem Kalkül bewiesen, dass diese ,Schatzkarte’ korrekt ist und fehlerfrei. Ob aber jemand, mit Hilfe dieser ,Schatzkarte’ auf ,Schatzsuche’ gehen will oder nicht ''':''' das ist und bleibt jedem selbst überlassen, und ist immer eine freie, und ganz persönliche Entscheidung. Damit hat die KI erstaunlich treffend, sowohl die Bedeutung, als auch die reale Funktion des GOTT-Glaubens in der Lebens-Wirklichkeit unserer Welt und Zeit charakterisiert, in Übereinstimmung mit der Gleichniserzählung JESU vom ,Schatz im Acker’; <small><span style="color:#00B000">( vgl. {{Bibel | Matthäus-Evangelium |13|44|EU}} )</span></small>. Der ,Schatz’ ist die <span style="color:#FF6000">„<span style="font-family: Times;"><big>Βασιλεία του Θεού</big></span>“</span><span style="color:#00B000"> | ,Basileía tou Theoú’</span>, d.h. das <span style="color:#CC66FF">»''Königtum GOTTES''«</span>, oder auch das <span style="color:#CC66FF">»''Himmelreich''«</span>. Die ,Schatzkarte’ ist der Glaube an GOTT. Die ,Schatzsuche’ ist der Weg des Glaubens in der Nachfolge JESU, der uns den Weg zeigt zum Ziel, zur Erfüllung aller unserer Sehnsüchte und Wünsche.
----
----
;Fußnoten
<references />
9cx7irb61yneym6d7t4y8hat3rlcwev
1090685
1090684
2026-09-11T07:23:36Z
Santiago
19191
/* Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘ */ ::auch:: hinzugefügt
1090685
wikitext
text/x-wiki
[[Kategorie: Buch]]
{{Regal|ort=Philosophie}}
{{Vorlage:StatusBuch|9}}
==<div class="center"><span style="color:#660066">'''Kurt GÖDEL und der sog. ‚ontologische Gottesbeweis‘'''</span></div>==
<span style="font-family: Times;"><big><div class="center">לַמְנַצֵּ֗חַ לְדָ֫וִ֥ד אָ֘מַ֤ר נָבָ֣ל בְּ֭לִבּוֹ אֵ֣ין אֱלֹהִ֑ים הִֽשְׁחִ֗יתוּ הִֽתְעִ֥יבוּ עֲלִילָ֗ה אֵ֣ין עֹֽשֵׂה־טֽוֹב׃
(Psalm 14,1)</div></big></span>
----
===<div class="center"><span style="color:#660066">Vorwort</span></div>===
Zur Orientierung ''':''' Die Diskussion um GOTT läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser ANSELM gesagt ''':''' <span style="color:#FF6000">»''Ich glaube an GOTT'' … <span style="color:#00B000">[ sonst wäre er sicher
nicht Erzbischof von Canterbury geworden ]</span> … ''aber ich möchte auch wissen und verstehen, ob das stimmt und sinnvoll ist, was ich da glaube '''!''''' «</span> Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Professor und Philosoph aus Königsberg, Immanuel KANT, hat das, was ANSELM da aufgeschrieben hat, gelesen, <span style="color:#00B000">(vermittelt durch CARTESIUS)</span>, und das dann den <span style="color:#FF6000">„ontologischen Gottesbeweis“</span> genannt, <span style="color:#00B000">(obwohl es in Wirklichkeit gar kein Gottesbeweis ist; genauer ''':''' es ist kein Beweis für die Existenz GOTTES)</span>, und dieser große KANT hat dann großartig bewiesen, das, was ANSELM da aufgeschrieben hat, sei falsch. Es sei <span style="color:#FF6000">„ja gar kein“</span> Gottesbeweis '''!''' <span style="color:#00B000">( Naja, was denn sonst '''?''' )</span> Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichbaren GOTT mit hundert Talern in seinem Vermögenszustande verglichen hat. <span style="color:#00B000">(Das ist aber eine andere Geschichte.)</span> Hundert Taler und GOTT haben ,an sich‘ nichts gemeinsam, außer, wenn KANT ,wirklich‘ hundert Taler hat, und GOTT auch ,wirklich‘ existiert, <span style="color:#00B000">(wie ANSELM und gläubige Menschen glauben)</span>, dann gibt es GOTT und die Taler eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit KANT läuft die ganze Diskussion um GOTT immer nur als Diskussion um den <span style="color:#00B000">(von KANT)</span> so genannten <span style="color:#FF6000">„ontologischen, <span style="color:#00B000">[ kosmologischen, teleologischen etc. ]</span> Gottesbeweis“</span> —, obwohl es niemals einen Beweis für die Existenz GOTTES geben kann und niemals geben wird. <span style="color:#00B000">(Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich versucht zu sagen, weil keiner dieser sog. Beweise für die Existenz eines GOTTES stringent ist.)</span> Beweisen kann man die Existenz von Naturgesetzen. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie dann mit Mehrheitenbeschlüsse verändern. Wenn GOTT ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz GOTTES wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. GOTT ist <span style="color:#FF6000">„Person“</span>, — für Christgläubige ''':''' <span style="color:#FF6000">„ein GOTT in drei Personen“</span>. Und GOTT ist <span style="color:#FF6000">„Geist“</span>. Das besagt, dass GOTT nicht mit materiellen Dingen aus unserer Welt verglichen werden darf; <span style="color:#00B000">(was sowohl THOMAS von Aquin als auch Immanuel KANT doch getan haben)</span>. Und ganz wesentlich ''':''' der Zugang zu GOTT läuft nicht über den Beweis, sondern immer nur über den Glauben. Wer an GOTT glauben will, dem antwortet GOTT auf seine Weise — nämlich <span style="color:#FF6000">„geistig“</span> bzw. <span style="color:#FF6000">„geistlich“</span>. Wer nicht an GOTT glauben will, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Glaube ist immer eine freie Entscheidung des Menschen für GOTT. Niemand darf gezwungen werden. Wenn es einen Beweis für GOTT gäbe, wäre jeder vernünftige Mensch gezwungen, an GOTT zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Existenzbeweis für GOTT '''!!!''' ... Daher darf man das Kalkül des Logiker GÖDEL, <span style="color:#00B000">(und damit auch das Theorem ANSELMS)</span>, nicht als einen Existenzbeweis für GOTT lesen. Sowohl ANSELM als auch GÖDEL setzen die Existenz GOTTES notwendig als gegeben schon voraus. Das GÖDEL-System, und auch das Theorem ANSELMS, sind bloß die logische Bestätigung der Widerspruchsfreiheit der Glaubensüberzeugung eines Menschen, der sich schon entschieden hat, an GOTT zu glauben; und nicht der Grund für seine Entscheidung. Alle sogenannten ,Gottesbeweise‘, sind in Wirklichkeit nichts anderes, als nachträgliche Evaluierungen eines GOTT-Glaubens, bzw. ,Wege‘, <span style="color:#00B000">(bei THOMAS von Aquin)</span>, die aufzeigen, dass der GOTT-Glaube widerspruchsfrei, sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL sagt. GOTT hat es nicht nötig, ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> zu werden.
===<div class="center"><span style="color:#660066">Einleitung</span></div>===
Eine Studie zum GÖDEL-Kalkül. Der Logiker Kurt GÖDEL <span style="color:#00B000">(1906-1978)</span> hat mit diesem Kalkül eine moderne Rekonstruktion des, <span style="color:#00B000">(von KANT)</span>, so genannten ‚ontologischen Gottesbeweises‘ nach ANSELM von Canterbury auf modal-logischer Basis vorgelegt. Damit hat er die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt, d.h. sie soll für jeden Menschen nachvollziehbar sein, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie er sagt. GÖDEL ,nimmt‘ als Logiker, angeregt durch den Philosophen und Mathematiker Gottfried Wilhelm LEIBNIZ, rein theoretisch, fürs Erste, einmal ‚an‘, <span style="color:#00B000">(als Prämisse, d.i. der Term :01: im 3. Beweisgang zum Theorem ANSELMS im Anhang)</span>, dass es GOTT gibt ''':''' d.i. ein sog. ,methodologischer GOTT-Glaube‘, und untersucht die logischen Konsequenzen. Dabei zeigt sich, beim genaueren Hinsehen, dass der ‚Nicht-GOTT-Glaube‘, der ‚dezidierte‘ Atheismus, <span style="color:#00B000">(im Beweisgang ,Widerlegung‘ im Anhang)</span>, überraschender Weise, zu einem Widerspruch führt, und damit logisch ,falsch‘ ist. Jedoch, GÖDEL kann und will mit seinem Kalkül keinen ,GOTT-Glauben‘ ,erzeugen‘, d.h. das GÖDEL-Kalkül ist kein <span style="color:#FF6000">„Existenz-Beweis"</span> für den GOTT der Bibel, sondern, es setzt die Existenz eines GOTTES, einfach als gegeben, schon voraus. GÖDEL beweist dann mit seinem System, dass der traditionelle abendländische ,GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, <span style="color:#00B000">(d.i. die Kalkül-Prämisse, und das, daraus ,regulär‘ (├ ) abgeleitete, Theorem ANSELMS)</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> <span style="color:#00B000">(d.h. logisch ,richtig‘)</span> ist, im Gegensatz zum ,Nicht-GOTT-Glauben‘, der davon ausgeht, dass es keinen GOTT gibt. GÖDEL beweist mit seinem System ''':''' der traditionelle GOTT-Glaube ist, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, widerspruchfrei und daher wahr. <span style="color:#00B000">(Der Beweis aus dem Widerspruch des Gegenteils ist ein ,indirekter Beweis‘ und kein ,Zirkelbeweis‘ '''!''' )</span> GÖDEL blieb bis zu seinem Tod ohne ein dezidiertes religiöses Bekenntnis. <span style="color:#00B000">(Das Leben ist nicht immer ,logisch‘.)</span>
Entsprechend der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> ist GOTT der Größte, <span style="color:#FF6000">»''über dem nichts Größeres mehr gedacht werden kann''«</span>, <span style="color:#00B000">(ANSELM)</span>; bzw. <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>, und der für uns immer schon ,da‘ ist. Das ist die methodologische Prämisse des GÖDEL-Kalküls. Davon ausgehend, zeigen seine Axiome und Definitionen, dass es zu einem Widerspruch führt, falls man ,annimmt‘, es sei nicht möglich, dass es <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> gibt. Aus dem Widerspruch des Gegenteils wird von GÖDEL, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, dann ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> ''':''' es ist doch möglich, dass es <span style="color:#FF6000">„GOTT“</span> wirklich gibt. Somit ist der Glaube an <span style="color:#FF6000">„GOTT“</span>, — weil widerspruchsfrei —, mit den Worten GÖDELS ''':''' <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span>.
Immanuel KANT <span style="color:#00B000">(1724-1804)</span> scheint diesen Fall vorausgesehen zu haben, dass versucht werden könnte, die ,Möglichkeit‘ GOTTES aus einem Widerspruch zu ,beweisen‘ ''':'''
::<span style="color:#FF6000">»</span> <span style="color:#00B000">[ Angenommen, es gibt ]</span> ''doch einen und zwar nur diesen '''Einen''' Begriff'' <span style="color:#00B000">[ ,GOTT‘, so dass ]</span> ''das Nichtsein oder das Aufheben seines Gegenstandes'' <span style="color:#00B000">[ GOTT ]</span>, ''in ,sich selbst‘ widersprechend sei; und dieses ist der Begriff des allerrealsten Wesens. Es hat, sagt ihr, alle Realität'', <span style="color:#00B000">[ bzw. alle Vollkommenheit ]</span>, ''und ihr seid berechtigt, ein solches Wesen als ,möglich‘ anzunehmen'' ... <span style="color:#00B000">[ denn das GÖDEL-Kalkül ,beweist‘ ( ╞ ) in der ,Widerlegung‘ im Anhang, wie auch im 1. Beweisgang, aus einem Widerspruch, dass die Existenz GOTTES definitiv logisch ,möglich‘ ist. ]</span> … ''obgleich der sich nicht widersprechende'', <span style="color:#00B000">[ ,mögliche‘ ]</span>, ''Begriff'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''noch lange nicht die'' <span style="color:#00B000">[ reale ]</span> ''Möglichkeit des Gegenstandes'', <span style="color:#00B000">[ GOTT ]</span>, ''beweiset. … Das ist eine Warnung, von der Möglichkeit der Begriffe (logische)'', <span style="color:#4C58FF">— '''◇''' —</span>, ''nicht sofort auf die Möglichkeit der Dinge (reale)'', <span style="color:#4C58FF">— '''□''' —</span>, ''zu schließen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 399; https://www.korpora.org/kant/aa03/399.html</ref>. <span style="color:#00B000">[ Trotz dieser Warnung, wird dieser Schluss dennoch im Theorem ANSELMS vollzogen, bzw. mit GÖDEL im 3. Beweisgang ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> '''!''' ]</span>. <span style="color:#FF6000">«</span>
Warum das <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist, und inwieweit KANT sich irrt, wird in dieser Studie gezeigt.
===<div class="center"><span style="color:#660066">Der Schlüsselbegriff im Kalkül</span></div>===
Der ‚Schlüsselbegriff‘ in diesem Kalkül ist <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Perfektion“, „Vollkommenheit“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Für diesen wichtigen Begriff gibt es aber im Kalkül selbst keine explizite Definition, sondern er wird nur durch seine Verwendung innerhalb des Kalküls indirekt ‚definiert‘. <span style="color:#00B000">(Das heißt ''':''' <span style="color:#4C58FF"> — ‚'''P'''‘ — </span> bezeichnet ein System von ,Eigenschaften‘, die ,positiv‘, bzw. ,vollkommen‘ | ,perfekt‘ | genannt werden, von denen im Kalkül wohl beweisbar ist, dass sie sich gegenseitig ,nicht widersprechen‘, weil sie im System als solche ,gleichwertig‘, bzw. gleich ,wahr‘ sind, jedoch ohne sie erschöpfend aufzählen zu können, oder auch nur sagen zu können, was sie alle im einzelnen bedeuten, außer, dass sie kompatibel sind.)</span> Mit der Wahl dieses Schlüsselbegriffes hat GÖDEL eine wesentliche Vorentscheidung für die Ergebnisse des Kalküls getroffen '''!''' In seinen Notizen zum ‚ontologischen Beweis‘ vom 10. Februar 1970 gibt GÖDEL, — für die nachträgliche Interpretation dieses Begriffes <span style="color:#00B000">(und auch für das Kalkül selbst)</span> —, die richtungsweisende Erklärung ''':'''
::<span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne...''«</span>
::Und er fügt in Klammer hinzu ''':'''
::<span style="color:#FF6000">»...''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span><ref>GÖDEL, Kurt, ''<span style="font-family: Times;"><big>‚Ontological proof‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Collected Works‘</big></span>'', vol. III, ed. S.FEFERMAN et al., Oxford (U.P.), 1995; 403–404.</ref>
GÖDEL-Axiom-1 ''':''' <span style="color:#4C58FF">— ‚('''PX <small><math>{ \color{Blue} \dot\lor}</math></small> P¬X''')‘ ↔<span style="color:#00B000"> ‚('''¬PX ↔ P¬X''')‘</span> — </span> ''':''' <span style="color:#FF6000"> »''Entweder die Eigenschaft'' <span style="color:#4C58FF">‚'''X'''‘</span> ''oder ihre Negation'' <span style="color:#4C58FF">‚'''¬X'''‘</span> ''ist positiv''«</span>. Hier ist der Hauptkritikpunkt, dass es Eigenschaften gibt, die ,an sich‘ weder positiv noch negativ sind. Beispiele wären ''':''' ‚rothaarig‘ oder ‚schwerwiegend‘; solche Eigenschaften können aber ,für mich‘ entweder positiv oder negativ sein, abhängig von meiner Betrachtungsweise und subjektiven Vorlieben. Diese Eigenschaften, wie ‚rothaarig‘ an sich, oder meine positiv-negativen ‚Betrachtungsweisen‘, sind jedoch der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> entnommen und treffen nicht den <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Er orientierte sich an LEIBNIZ, welcher im Bezug zum ‚ontologischen Beweis‘ definiert ''':'''
::<span style="color:#FF6000">»''Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''nenne ich jede einfache Eigenschaft, die sowohl positiv als auch absolut ist, oder dasjenige, was sie ausdrückt, ohne jede Begrenzung ausdrückt''.«</span><ref>Zitiert nach Thomas GAWLICK, in ''<span style="font-family: Times;"><big>‚Was sind und was sollen mathematische Gottesbeweise ?‘</big></span>'', Predigt vom 8.1.2012 in der Kreuzkirche zu Hannover. https://web.archive.org/web/20130524164359/http://www.idmp.uni-hannover.de/fileadmin/institut/IDMP-Studium-Mathematik/downloads/Gawlick/Predigt_Gawlick_Gottesbeweise.pdf</ref>
Die Seins-Eigentümlichkeiten <span style="color:#00B000">(Daseinsmodi, Perfektionen)</span> wie ‚wahr‘, ‚gut‘, ‚edel‘ usw. entsprechen dem <span style="color:#FF6000">»''moralisch ästhetischen Sinn''«</span> von <span style="color:#FF6000">»''positiv''«</span> bei GÖDEL. Das sind Beispiele für ‚absolut‘ positive Begriffe aus der Lehre der Seinsanalogie ''':''' <span style="font-family: Times;"><big>‚verissimum‘, ‚optimum‘, ‚nobilissimum‘</big></span>, usw., die, an sich, <span style="color:#FF6000">»''ohne jede Begrenzung gelten''«</span>; zu finden in der <span style="font-family: Times;"><big>‚Via quarta‘</big></span>, bei THOMAS von Aquin, über die <span style="color:#FF6000">„analoge"</span> Abstufung im ‚Sein‘ der Dinge. Diese <span style="color:#FF6000">„analoge"</span> ‚Abstufung‘ ist dann die faktische Begrenztheit <span style="color:#00B000">(d.h. Unvollkommenheit)</span> im <span style="color:#FF6000">»''zufälligen''«</span> ‚Sein‘ der Dinge —. Die <span style="color:#FF6000">„positiven Eigenschaften“</span> GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, wie Wahrheit, Einheit, Gutheit, <span style="color:#00B000">(von ,Güte‘)</span>, Schönheit, Adel, <span style="color:#00B000">(von ,edel‘)</span>, Gleichheit, Andersheit, Wirklichkeit, ,Sein‘ im Sinne von Etwas-sein, etc. werden <span style="color:#FF6000">„Perfektionen“</span>, oder auch <span style="color:#FF6000">„Transzendentalia“</span> genannt, <span style="color:#00B000">(von lateinisch ''':''' <span style="font-family: Times;"><big>transcendere</big></span>, <span style="color:#FF6000">„übersteigen“</span>)</span>. In der mittelalterlichen Scholastik sind Transzendentalien die Grundbegriffe, die allem Seienden als <span style="color:#FF6000">„Modus“</span>, <span style="color:#00B000">(d.h. ,Eigentümlichkeit‘, als allgemeine Seinsweisen)</span>, zukommen. Wegen ihrer Allgemeinheit ,übersteigen‘ sie die besonderen Seinsweisen, welche ARISTOTELES die ,Kategorien‘ nannte. Ontologisch betrachtet, werden die Transzendentalien als das allem Seienden Gemeinsame aufgefasst, da sie von allem ausgesagt werden können. Von der KI werden sie, nicht unpassend, als <span style="color:#FF6000">„ultimative Eigenschaften des Seins“</span> bezeichnet, die <span style="color:#FF6000">„jenseits der materiellen Welt existieren“</span>, <span style="color:#00B000">(da sie ,ultimativ‘ nur von GOTT, als den unbegrenzt Vollkommenen, ausgesagt werden können, die jedoch, auch von allen übrigen Seienden, wegen deren seinsmäßigen Unvollkommenheit und Begrenztheit, abgestuft, d.h. <span style="color:#FF6000">„analog"</span>, ausgesagt werden)</span>. Diese Transzendentalien sind ,inakzident‘, das heißt, sie entstehen nicht aus anderen Begriffen, sondern sind erste, unteilbare Bestimmungen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> des Denkens und des Seins, die allen Seienden ''':''' <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span>, unabhängig von ihren speziellen Eigenschaften, als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(bzw. Unvollkommenheiten)</span>, mit ,modaler‘ Notwendigkeit, <span style="color:#4C58FF">— ‚□‘ —</span>, <span style="color:#FF6000">„analogisch"</span> zukommen, d.h. sie sind in allen Seienden, seinsmäßig abgestuft und abgegrenzt, ,relativ‘ zum unbegrenzt Unendlichen ihrer selbst, und <span style="color:#FF6000">»''dasjenige, was sie ausdrücken, drücken sie ohne jede Begrenzung aus''«</span>, <span style="color:#00B000">(LEIBNIZ)</span>; und damit stehen sie ontologisch in einer <span style="color:#FF6000">„analogen"</span> ,Beziehung‘ zu GOTT, dem absolut Vollkommenen und unbegrenzt Unendlichen. In der Erkenntnisordnung wirken sie als die ersten Begriffe des menschlichen Verstehens, die eine Basis für alle weiteren wissenschaftlichen Erkenntnisse bilden. In der Seinsordnung sind die Transzendentalien ontologisch eins, gleichwertig, <span style="color:#00B000">(,mathematisch äquivalent‘)</span>, und daher konvertierbar, d.h. austauschbar, <span style="color:#00B000">(vgl. z. B. den scholastischen ,Merksatz‘ ''':''' <span style="font-family: Times;"><big>,ens et verum convertuntur‘</big></span>)</span>. Damit sind sie auch von einander abhängig, was GÖDEL sowohl im Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, für positive Eigenschaften, als auch in der Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, für die Wesenseigenschaften, syntaktisch formalisiert hat mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, weil sie sich gegenseitig, — mit ,modaler‘ Notwendigkeit —, gleichwertig ,implizieren‘, d.h. einschließen, <span style="color:#00B000">(im Axiom-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span>, und in der Definition-2 mit der Individuum-Variable <span style="color:#4C58FF"> — ‚'''y'''‘ — </span>)</span>. Man kann die Transzendentalia, <span style="color:#00B000">(wie GÖDEL)</span>, auch ,Wesenseigenschaften‘ ''':''' <span style="color:#4C58FF"> — ‚'''X'''<sub>ess</sub>‘ —</span>, nennen, weil sie allem Seienden <span style="color:#FF6000">„wesentlich analog"</span> zukommen. Weil Transzendentalien miteinander austauschbar sind, sind sie auch widerspruchsfrei, was GÖDEL mit Axiom-1 syntaktisch darstellt. Die Gültigkeit und Wahrheit, d.h. die mathematisch-logische Evidenz von Axiom-1 und Axiom-2, beruht auf der ontologischen Allgemeinheit und Gültigkeit der Transzendentalia, die GÖDEL mit Definition-2, in sein Kalkül explizit eingeführt und als Wesenseigenschaften ,bestimmt‘ hat. <span style="color:#00B000">(Definitionen werden formal-syntaktisch durch das Äquivalenzzeichen <span style="color:#4C58FF">,'''↔'''‘</span> angezeigt, gelesen als <span style="color:#FF6000">„...ist genau dann ... wenn...“</span>)</span> Die GÖDEL-Axiome und -Definitionen werden jedoch sofort <span style="color:#FF6000">„modal falsch"</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit ,Nicht-Transzendentalia‘, wie z. B. ,rot‘ oder ,schwer‘, belegt werden. <span style="color:#00B000">(Dieser ,Sachverhalt‘ wird von Kritikern des GÖDEL-Systems, — zu vorschnell —, verwendet, um ihre Behauptungen zu ,belegen‘, das GÖDEL-Kalkül und seine Konsequenzen seien ,falsch‘.)</span>
Zum Überblick ''':''' <span style="color:#FF6000">„Transzendentalia“</span> sind universale, alles Seiende charakterisierende Begriffe, die über kategoriale Einteilungen hinausgehen, und sowohl in der klassischen Scholastik, als auch in der modernen Philosophie, <span style="color:#00B000">(KANT, Uwe MEIXNER<ref>vgl. die ,transzendentalen‘ Bedingungen möglicher Erkenntnisse bei KANT; und auch in der ,Axiomatischen Ontologie‘ bei Uwe MEIXNER</ref>)</span>, als Grundlage der Metaphysik und Erkenntnistheorie dienen. Sie sind die <span style="color:#FF6000">„ersten Begriffe des Seins“</span>, die jedem Ding als ,relative‘ Vollkommenheiten, <span style="color:#00B000">(Perfektionen)</span>, inhärent sind, <span style="color:#FF6000">„analogisch"</span> abgestuft, auf einen ,ultimativ‘-unbegrenzten Bezugspunkt ausgerichtet, und die sich im Denken, <span style="color:#00B000">(für uns als wahr)</span>, und in der moralischen Wertung, <span style="color:#00B000">(für uns als gut und edel)</span>, manifestieren, relativ zum ,ultimativ‘-unbegrenzten Bezugspunkt ihrer selbst. Die faktische, zusätzliche Unvollkommenheit, die sich generell in der notwendigen, und unausweichlichen Vergänglichkeit aller Dinge zeigt, ist einem ontologischen Defekt ,geschuldet‘, der stark zeitabhängig ist, d.h. der einen Anfang und ein Ende hat.
Das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''Notwendige Existenz ist eine positive Eigenschaft''«</span>, ist immer falsch, wenn es auf etwas aus der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> angewendet wird, wie z. B. auf einen <span style="color:#FF6000">„Tsunami“</span>, dessen ‚Existenz‘ für uns nicht ‚positiv‘ ist. KANT hat schon festgestellt ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Das gilt für alles, was <span style="color:#FF6000">„existiert“</span>. Das Axiom-5 hat nur dann seine Gültigkeit, ist nur dann ,wahr‘, wenn <span style="color:#FF6000">„Dasein“</span> <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span> <span style="color:#00B000">(Essenz)</span> in eins zusammenfallen. Bei allen Dingen, die ‚da‘ sind, ist ihr ‚Da-Sein‘ ontologisch immer verschieden zu dem ‚was‘ sie sind ''':''' zu ihrem ,Was-Sein‘. In der philosophischen Tradition, seit ARISTOTELES, wird die ontologische Identität, d.i. die Koinzidenz, der innere Zusammenhang von ‚Sein‘ und ‚Wesen‘ allein nur dem <span style="color:#FF6000">„selbst ‚unbewegten‘ Erstbewegenden“</span> zugeschrieben, dem <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“</span><span style="color:#00B000"> | ,prôton kinoûn akinêton‘</span>, von dem ARISTOTELES etwas später sagt ''':''' <span style="color:#FF6000">»''denn dies ist der Gott''«</span> und dann hinzufügt ''':''' <span style="color:#FF6000">»''so sagen wir ja''«</span>; d.h. das ist eine Interpretation aus dem Glaubenskontext des ARISTOTELES. Er war ein Gott-gläubiger Grieche. Wer an GOTT glaubt, kann das nachvollziehen. GÖDEL musste dieses Axiom-5 postulieren, sonst wäre sein Kalkül nicht aufgegangen, ohne dass er deswegen schon an GOTT glauben müsste. Er hat für sein Kalkül das ontologische Theorem von der Identität von ‚Sein‘ und ‚Wesen‘ im ‚unbewegten Erstbeweger‘ des ARISTOTELES benutzt, ohne diese Herkunft explizit referenziert zu haben. <span style="color:#00B000">(Gilt auch für Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit, das GOTT-Sein, das ‚Dasein‘ GOTTES, ist eine positive Wesenseigenschaft, eine Perfektion; d.h. ist das ‚Wesen‘ GOTTES ''':''' GOTT ist perfekt''«</span>)</span>. Die ontologische Identität von Sein und Wesen, Existenz und Essenz, wie auch die Koinzidenz von Möglichkeit und Wirklichkeit, von Ursache und Wirkung, sowie auch die ontologische Einheit von <span style="color:#00B000">(Erkenntnis-)</span>Subjekt und <span style="color:#00B000">(Erkenntnis-)</span>Objekt im <span style="color:#FF6000">»''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“</span><span style="color:#00B000"> | ,noêseôs noêsis‘ <small>(<span style="font-family: Times;"><big>,''Metaphysik''‘</big></span> XII 9, 1074b34)</small></span>, und der innere Zusammenhang der <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, gilt nur in der <span style="color:#FF6000">„unverursachten Letztursache"</span>, auf die ARISTOTELES bei seiner Prinzipienforschung gestoßen ist.
Es gibt verschiedene Versuche, die GÖDEL-Axiome durch sog. ,Modelle‘, relativ zu einfacheren ,Welten‘, zu verifizieren, um damit ihre relative Konsistenz nachzuweisen. Für GÖDEL aber <span style="color:#FF6000">»''sind die Axiome nur dann'' <span style="color:#00B000">[ in unserer ,realen‘ Welt ]</span> ''wahr'' <span style="color:#00B000">[ und annehmbar ]</span>«</span>, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt'' <span style="color:#00B000">[ d.h. jeder auch nur ,möglichen‘ Welt ]</span> ''sind''«</span>. Diese Bedingung verweist jede Verifikation und jede Interpretation der Axiome auf das ,Nicht-Zufällige‘, das ,Notwendige‘, ,Absolute‘, in dem die Axiome und Definitionen des GÖDEL-Kalküls erst dadurch ihren Sinn und ihre Bedeutung bekommen, wenn sie vom ,Absoluten‘ und ,Unendlichen‘ her erklärt und verstanden werden. Damit insistiert GÖDEL auf eine genuin <span style="color:#4C58FF">,theologische‘</span> Interpretation seines Kalküls, mit der <span style="color:#4C58FF">„Theologie“</span> zum Begriff GOTT, dem unbegrenzt Unendlichen, als Verifikationskriterium. Das entspricht auch der ,methodologischen‘ Prämisse seines Kalküls. Die wichtigsten Axiome und Definitionen im GÖDEL-Kalkül sind jedoch bloße ,Annahmen‘, deren Evidenz, sowohl die ,mathematische‘ als auch die <span style="color:#4C58FF">,theologische‘</span>, erst evaluiert, d.h. ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> werden muss. Das bedeutet ''':''' die logische Verifikation der Axiome und Definitionen von GOTT und seinen Vollkommenheiten kann nur Kalkül-intern durch den Aufweis ihrer Widerspruchsfreiheit erfolgen, d.i. <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span>. Logisch evaluierte und verifizierte Axiome und Definitionen sind die ,modal‘ notwendigen, d.h. die ,transzendentalen‘ Voraussetzungen für die Ergebnisse eines Kalküls, damit seine Theoreme und Korollare in unserer ,realen‘ Welt als logisch ,wahr‘ und damit für uns auch als ,annehmbar‘ gelten können, während die Prämissen eines Kalküls, <span style="color:#00B000">(die Argument Einführung, <span style="color:#4C58FF">— '''AE:''' —</span> )</span>, nicht notwendige, und somit ,modal‘ frei gewählte ,Annahmen‘ sind. Jedoch aus diesen ,modal‘ frei gewählten, ,möglichen‘ <span style="color:#00B000">( <span style="color:#4C58FF">'''◇'''</span> )</span> Prämissen folgen mit Hilfe der ,bewiesenen‘ <span style="color:#00B000">( ╞ )</span> Axiome und Definitionen die Ergebnisse mit ,modaler‘ Notwendigkeit <span style="color:#00B000">( <span style="color:#4C58FF">'''□'''</span> )</span>.
Die Logik des GÖDEL-Systems ist eine ,Prädikatenlogik‘ zweiter Stufe, in der die Quantoren nicht nur Individuum-Variable, sondern auch Eigenschafts-Variable, <span style="color:#00B000">(als noch ,unbestimmte‘ Prädikate im Allgemeinen)</span>, binden können. Die formale Struktur des GÖDEL-Kalküls besteht aus fünf Axiomen und drei Definitionen, mit deren Hilfe in drei Beweisgängen drei Theoreme und mehrere Korollare aus seiner ,methodologischen‘ Prämisse ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitet werden können, wobei die beiden ersten Beweisgänge, mit ihren Ergebnissen, den dritten vorbereiten, in dem es dann um das Theorem ANSELMS geht. Die Prämisse des GÖDEL-Kalküls in allen Beweisgängen ist der traditionelle ,GOTT-Glaube‘, in der Formulierung speziell nach LEIBNIZ. Ein Axiom, eine Definition, zwei Theoreme und alle Korollare im GÖDEL-Kalkül sind Aussagen über <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>. Alle fünf Axiome, eine Definition und ein Theorem, <span style="color:#00B000">(und das Korollar aus Axiom-4)</span>, sind auch Aussagen über die Eigenschaft <span style="color:#FF6000">„Vollkommenheit“, „Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, die in der <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> als die Wesenseigenschaft GOTTES gilt ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist vollkommen''«</span> bzw. <span style="color:#FF6000">»''GOTT ist das Vollkommenste der Wesen''«</span>, <span style="color:#00B000">(DESCARTES)</span>. Zwei Definitionen sind Aussagen über die allgemeinen Wesenseigenschaften aller Seienden, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, die Transzendentalien, die, als notwendige Existenz, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, auch GOTT zugeordnet werden, mit der Besonderheit bei GOTT, dass sowohl alle Eigenschaften, als auch alle anderen Zuordnungen, wie Sein und Wesen, wie Ursache und Wirkung, usw., im Unendlichen, GOTT, <span style="color:#FF6000">„koinzident“</span> sind, d.h. in GOTT paarweise perspektivisch in ,eins‘ zusammenfallen, und die auch, als Transzendentalia, konvertierbar, d.h. austauschbar sind. Diese Sachverhalte machen deutlich, dass eine spezifische ,Verifikation‘ und sachgerechte ,Evaluierung‘ der GÖDEL-Axiomatik nur genuin <span style="color:#4C58FF">,theologisch‘</span> erfolgen kann. Die Evaluierung der <span style="color:#FF6000">»''mathematischen Evidenz''«</span> des GÖDEL-Systems, im Allgemeinen, muss jedoch entsprechend der Maßstäbe einer modalen Prädikatenlogik zweiter Stufe durchgeführt werden.
Das GÖDEL-Kalkül unterscheidet <span style="color:#00B000">(in Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>)</span> formal-syntaktisch zwischen der Eigenschaft ,Existenz‘, <span style="color:#4C58FF"> — ‚'''E'''‘ —</span>, die nur GOTT zugeordnet werden kann, und dem Existenz-Operator, <span style="color:#4C58FF">— ‚'''∃'''‘ —</span>, der auch allem Übrigen, das nicht GOTT ist, zugeordnet wird. Es gibt hier auch den formal-syntaktischen Unterschied zwischen der, <span style="color:#00B000">(von mir notierten, jedoch von GÖDEL schon intendierten und angesprochenen)</span>, speziellen ,Notwendigkeit‘, <span style="color:#4C58FF"> — <sub>not</sub> —</span>, die nur der Existenz GOTTES zugeordnet ist, und der modalen ,Notwendigkeit‘, <span style="color:#4C58FF">— ‚'''□'''‘ —</span>, die auf Verschiedenes bezogen werden kann. Diese Unterschiede sind Hinweise, dass GÖDEL in seiner Kalkül-Logik und -Syntax, die Außerordentlichkeit und Eigenständigkeit GOTTES berücksichtigt, der, als Schöpfer der Welt, prinzipiell und absolut <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt''«</span> ist, die erst durch GOTT auch das ist, was sie ist.
===<div class="center"><span style="color:#660066">Die Genese des Kalküls</span></div>===
Wie kommt GÖDEL zu seinem Kalkül '''?''' Sein Gewährsmann war Gottfried Wilhelm LEIBNIZ, <span style="color:#00B000">(1646-1716)</span>, den er sehr schätzte. Die rekonstruierbare Genese seines Kalküls findet man in LEIBNIZ ''':''' ''<span style="font-family: Times;"><big>‚Neue Abhandlungen über den menschlichen Verstand‘</big></span>'', <span style="color:#00B000">(1704)</span>‚ ''<span style="font-family: Times;"><big>Viertes Buch, Kapitel X ''':''' ‚Von unserer Erkenntnis des Daseins Gottes‘</big></span>'', Seite 475f.
Hier der <span style="color:#00B000">[ kommentierte ]</span> Textausschnitt zum sog. ontologischen ‚Gottesbeweis‘''':'''
::<span style="color:#FF6000">»</span>''Folgendes etwa ist der Gang seines'' <span style="color:#00B000">[ d.h. ANSELMS, Erzbischof von Canterbury; 1033-1109, ]</span> ''Beweises ''':''' GOTT ist das Größte'', <span style="color:#00B000">[ ANSELM spricht vom biblischen GOTT des Glaubens, als ''':''' <span style="color:#FF6000">»''den, über dem ,Größeres‘'' | <span style="font-family: Times;"><big>‚maius‘</big></span> | ''nicht mehr gedacht werden kann''«</span> ]</span>, ''oder, wie DESCARTES es ausdrückt ''':''' das Vollkommenste der Wesen oder auch ein Wesen von äußerster Größe und Vollkommenheit'' ''':''' <span style="color:#00B000"> [ GÖDEL ''':''' </span><span style="color:#4C58FF">‚'''P'''‘</span> <span style="color:#00B000">:= ‚Perfektion‘, ‚positive Eigenschaft‘ ]</span>, ''das alle Grade derselben in sich schließt.''<span style="color:#00B000"> [ GÖDEL-Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>. Definition-1 bildet die traditionelle Vorstellung von GOTT ab. ]</span> ''Dies also ist der Begriff GOTTES.'' <span style="color:#00B000">[ Der Term <span style="color:#4C58FF">— ,'''G'''‘ —</span> steht hier für den biblischen ‚Begriff‘ <span style="color:#FF6000">„GOTT“</span> als ,Individuumname‘ '''!''' ]</span> ''Sehen wir nun, wie aus diesem Begriff das ‚Dasein’ folgt.''<span style="color:#00B000"> [ GÖDEL ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist notwendig aus sich ‚da‘''«</span> ''':''' Term :10:, 1. Hauptergebnis im 3. Beweisgang. ]</span> ''Es ist etwas <u>mehr</u>, ‚da‘ zu sein, als nicht ‚da‘ zu sein, oder auch das ‚Dasein‘ fügt der Größe oder der Vollkommenheit'' <span style="color:#00B000">[ GOTTES ]</span> ''einen Grad hinzu, und wie DESCARTES es ausspricht, das ‚Dasein‘ ist selbst eine Vollkommenheit.''<span style="color:#FF6000">«</span>
<span style="color:#00B000">(Diesen Ausspruch DESCARTES übernimmt GÖDEL im Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span> ''':''' <span style="color:#FF6000">»''notwendige Existenz''</span> [ alias ‚Dasein GOTTES’ ] <span style="color:#FF6000">''ist eine positive Eigenschaft''</span> [ alias Vollkommenheit ]<span style="color:#FF6000">«</span>. Dem widerspricht KANT ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>. Das Axiom-5 ist daher nur dann ‚wahr‘, wenn ‚Wirklichsein‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια οὖσα</big></span>“</span> | ‚enérgeia oúsa‘ | d.h. ‚Dasein‘ und ‚Wesen‘ | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ | — genauer ''':''' ‚Wesenseigenschaften’ —, ontologisch ,eins‘ sind, d.h. wenn <span style="color:#FF6000">„Existieren“</span> immer schon die <span style="color:#FF6000">„Wesenseigenschaft“</span> GOTTES ist. Was nach ARISTOTELES nur im <span style="color:#FF6000">„unbewegten Erstbeweger“</span> der Fall ist; bzw. mit LEIBNIZ ''':''' <span style="color:#FF6000">»''was das Privilegium der Gottheit allein ist''«</span> '''!''' Aus der ,methodologischen‘ ,Annahme‘ im 2. Beweisgang GÖDELS ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den GOTT der Christen''«</span>, und mit Hilfe von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, bzw. <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, mit Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind notwendig aus sich, — von Natur aus —, positiv''«</span>, mit Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span> ''':''' <span style="color:#FF6000">»''Zum Wesen gehören notwendig auch alle Konsequenzen aus einer Wesenseigenschaft''«</span>, und mit Axiom-1 und der Definition für GOTT, folgt nach einigen logischen Umformungen das GÖDEL-Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist genau dann der GOTT der Christen, wenn das Wesen dieses GOTTES sein eigenes Sein ist''«</span>. Dasein und Wesen sind im Unendlichen, GOTT <span style="color:#FF6000">„koinzident“</span> ,eins‘, übereinstimmend mit dem Theorem des ARISTOTELES. Mit diesem, im Kalkül <u>ohne</u> Axiom-5 ,regulär‘ (├ ) abgeleiteten Theorem, widerlegt er KANT für den individuellen Spezialfall <span style="color:#4C58FF">‚'''G'''‘</span> := <span style="color:#FF6000">„GOTT“</span>. Nachprüfbar im Anhang ''':''' im ‚ontologischen‘ Beweis für das Basis-Theorem-2. Somit ist Axiom-5 ,wahr‘, und KANT, der <span style="color:#FF6000">»''eine Abneigung gegen das Gebet hatte''«</span> und auch <span style="color:#FF6000">»''nie zu den sonntäglichen Kirchgängern zählte''«</span><ref>Uwe SCHULTZ ''':''' ‚''<span style="font-family: Times;"><big>Immanuel Kant</big></span>''‘, Rowohlt Monographie 50659, Seite 12</ref>, hat sich hier, im Bezug auf GOTT, geirrt. <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, war für KANT nie eine ernstzunehmende Option. Die <span style="color:#4C58FF">„Theologie“</span>, als Wissenschaft von GOTT, die natürlich immer auch verbunden sein muss mit der täglichen ,Erfahrung‘ einer Glaubens-Praxis, im Gebet und in den Gottesdienst-Feiern des <span style="color:#4C58FF">„Theologen“</span>, und die daraus entsteht, ist eine ziemlich ,ausgereifte‘ Disziplin. Es haben sich, durch Jahrhunderte hindurch, viele gläubige und auch gescheite Menschen, schon im Judentum, und dann im Christentum, und ebenfalls im Islam, darum bemüht.)</span>
:: <span style="color:#FF6000">»</span>''Darum ist dieser Grad von Größe und Vollkommenheit oder auch diese Vollkommenheit, welche im ‚Dasein‘ besteht, in diesem höchsten, durchaus großen, ganz vollkommenen Wesen, denn sonst würde ihm ein Grad fehlen, was gegen seine Definition wäre. Und folglich ist dies höchste Wesen ‚da‘. Die Scholastiker, ohne selbst ihren'' <span style="font-family: Times;"><big>doctor angelicus</big></span> <span style="color:#00B000">[ := THOMAS von Aquin ]</span> ''auszunehmen, haben diesen Beweis verachtet'', <span style="color:#00B000">[ wie später auch Immanuel KANT ]</span>, ''und ihn als einen Paralogismus'' <span style="color:#00B000">[ := Fehlschluss ]</span> ''betrachtet, worin sie sehr unrecht gehabt haben; und DESCARTES, welcher die scholastische Philosophie im Kolleg der Jesuiten zu La Flèche lange genug studiert hatte, hat sehr recht gehabt, ihn wieder zu Ehren zu bringen. Es ist nicht ein Paralogismus, sondern ein unvollständiger Beweis'', <span style="color:#00B000">[ den GÖDEL vervollständigt hat ]</span>, ''der etwas voraussetzt, was man noch hätte beweisen sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' <span style="color:#00B000">[ '''::''' <span style="color:#4C58FF">— '''◇''' —</span> '''::''' ,möglich‘, ,konsistent‘, ,denkbar‘; GÖDEL beweist im 1. Beweisgang aus Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, <span style="color:#FF6000">»''positive Eigenschaften'', <span style="color:#00B000">[ die allgemeinen Transzendentalien ]</span>, ''sind widerspruchsfrei''«</span>, mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, folgt Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, <span style="color:#FF6000">»''GOTT ist widerspruchsfrei möglich''«</span> ]</span>. ''Und es ist schon etwas, dass man durch diese Bemerkung beweist ''':''' gesetzt, dass GOTT'' <span style="color:#00B000">['' <span style="color:#FF6000">»widerspruchsfrei«</span> '']</span> '',möglich‘ ist, so ‚ist‘ er'' <span style="color:#00B000">[ ,notwendig‘ '''::''' <span style="color:#4C58FF">— '''□''' —</span> '''::''' für jede mögliche Welt auch wirklich aus sich ‚da‘ ]</span>, ''was das Privilegium der Gottheit allein ist'' ''':''' <span style="color:#00B000">[ Im 3. Beweisgang, Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' ‚ANSELMS Prinzip‘ ''':''' <span style="color:#FF6000">»''Weil GOTT widerspruchsfrei ,möglich‘ ist, darum ist auch der Glaube widerspruchsfrei, der annimmt, dass GOTT aus sich ,notwendig‘ da ist''«</span>; mit Korollar-3 ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ —</span>, <span style="color:#FF6000">»''Es gibt notwendig nur einen einzigen GOTT''«</span>. Damit ist auch der Monotheïsmus bewiesen. ]</span> ''Man hat recht, die Möglichkeit eines jeden Wesens anzunehmen und vor allem die GOTTES, bis ein anderer das Gegenteil beweist''. <span style="color:#00B000">[ Das Gegenteil besagt, dass GOTT ,unmöglich‘ ist. Hier setzt der Möglichkeitsbeweis im GÖDEL-Kalkül an, und beweist, dass diese Aussage zu einem Widerspruch führt. ]</span> ''Somit gibt dieser metaphysische Beweis schon einen moralischen zwingenden Schluss ab, wonach wir dem gegenwärtigen Stande unserer Erkenntnisse zufolge urteilen müssen, dass GOTT ‚da‘ sei, und demgemäß handeln.'' <span style="color:#00B000">[ Aber nicht logisch zwingend '''!''' Denn die Interpretation <span style="color:#4C58FF">— ‚'''G'''‘ —</span> mit dem GOTT der Bibel, als ,methodologische‘ Kalkül-Prämisse, ist nicht zwingend, jedoch ,modal‘ möglich, <span style="color:#4C58FF">— '''◇''' —</span>, und im christlichen Glaubenskontext sinnvoll, was mit einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls gezeigt werden kann. Damit wäre dann auch die Frage beantwortet, ob das GÖDEL-System sich plausibel als eine Theorie von GOTT und seinen Eigenschaften interpretieren lässt, bzw. als eine <span style="color:#FF6000">»''axiomatische''«</span> <span style="color:#4C58FF">„Theologie“</span>, wie sie André FUHRMANN apostrophiert. Das <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ist der ,Individuumname‘ für den GOTT der Bibel, — ,GOTT‘ groß geschrieben —, im monotheïstischen, christlichen Glaubenskontext, den auch LEIBNIZ teilt. Dann steht der ,Name‘ auch synonym für das ,existierende‘ Individuum, d.h. für dessen ,Existenz‘. ]</span> ''Es wäre aber doch zu wünschen, dass gescheite Männer'' <span style="color:#00B000">[ sic ! ]</span> ''den Beweis mit der Strenge einer mathematischen Evidenz vollendeten'', <span style="color:#00B000">[ was GÖDEL veranlasst hat, seine Version eines ‚ontologischen Beweises’ zu kreieren, dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> man heute mit Computerprogrammen<ref>siehe Fußnote 12</ref> schon nachgewiesen hat ]</span> ... <span style="color:#FF6000">«</span>.
Für GÖDEL war dieser Text eine intellektuelle Herausforderung, und er hat sie angenommen. Das war für GÖDEL sicher keine Glaubensangelegenheit. GOTT hat es ja auch nicht nötig, ‚bewiesen‘ zu werden. Wer <span style="color:#4C58FF">— ‚'''G'''‘ —</span> z. B. mit dem sog. ‚Urknall‘ gleich setzt, macht die <span style="color:#FF6000">»''zufällige Struktur der Welt''«</span> im ‚Urknall‘, <span style="color:#00B000">(pantheistisch)</span> zu einem ,Gott‘, was GÖDEL dezidiert für sein Kalkül ausgeschlossen haben wollte.
Kurt GÖDEL schreibt 1961 in einem Brief, in Anlehnung an den obigen Text ''':'''
::<span style="color:#FF6000">»...''ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig ''<span style="color:#00B000">[ sic '''!''' ]</span>, ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', <span style="color:#00B000">[ dass es GOTT gibt ]</span>, ''mit allen bekannten Tatsachen'', <span style="color:#00B000">[ z. B. mit den Maßstäben einer modernen Logik ]</span>, ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker LEIBNIZ versucht''.«</span><ref>Zitiert nach SCHIMANOVICH-GALIDESCU, M.-E. ''':''' ‚''<span style="font-family: Times;"><big>Princeton–Wien 1946–1966. Briefe an die Mutter</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kurt Gödel – Leben und Werk</big></span>''‘, Hg. B.BULDT et alia, Wien (HÖLDER–PICHLER–TEMSKY), 2001, Band 1</ref>
===<div class="center"><span style="color:#660066">Die Interpretation des Kalküls</span></div>===
Wenn man sich das GÖDEL-Kalkül ansieht, wie es heute formalisiert vorliegt, stellt sich die Frage ''':''' <span style="color:#FF6000">„Lässt sich dieses System plausibel als eine Theorie von GOTT <span style="color:#00B000">(als eine ‚Rede von GOTT’ := <span style="color:#4C58FF">,Theologie’</span>)</span> und seiner Eigenschaften verstehen '''?''' “ — „Ist hier eine genuin <span style="color:#4C58FF">,theologische’</span> Interpretation möglich '''?''' “</span> Seine Herkunft aus der intellektuellen Auseinandersetzung des Logikers GÖDEL mit dem GOTT-gläubigen Philosophen LEIBNIZ und dem christlichen Theologen und Erzbischof ANSELM rechtfertigt diese Frage. Die <span style="color:#FF6000">„mathematische Evidenz“</span> des GÖDEL-Formalismus, <span style="color:#00B000">(im Anhang nachgestellt)</span>, ist allgemein anerkannt, <span style="color:#00B000">(Vorbehalte dagegen gibt es nur bei der Interpretation seiner Syntax, d.h. ob die Axiome und Definitionen, wie GÖDEL sie konzipiert hat, bzw. ob die Theoreme und Korollare, die aus diesen Axiomen ,regulär’ (├ ) abgeleitet werden, auch in unserer realen Welt ,wahr’ und ,annehmbar’ sind)</span>. Die <span style="color:#FF6000">„theologische Evidenz“</span> des GÖDEL-Systems wird durch eine ,Verankerung’ der Axiome und Definitionen in den <span style="color:#4C58FF">,theologisch’</span>-philosophischen Diskurs über GOTT evaluiert, der schon seit zweieinhalbtausend Jahren läuft. In diesen zweieinhalbtausend Jahren hat sich, — gegen ARISTOTELES und die antike Philosophie —, die Erkenntnis durchgesetzt, dass GOTT <span style="color:#FF6000">»''unabhängig''«</span> von der <span style="color:#FF6000">»''zufälligen''«</span> Raum-Zeit-Struktur unserer vergänglichen Welt ist. In meiner Darstellung des GÖDEL-Kalküls folge ich, <span style="color:#00B000">(im Unterschied zum Autographen GÖDELS, vom 10. Feb 1970)</span>, in der Axiom-Formulierung und -Nummerierung, in der Syntax, und in der Beweis-Struktur, der Arbeit von André FUHRMANN ''':''' ''<span style="font-family: Times;"><big>‚Existenz und Notwendigkeit. Kurt Gödels axiomatische Theologie‘</big></span>'' in ''<span style="font-family: Times;"><big>‚Logik in der Philosophie‘</big></span>'' Hg. SCHROEDER-HEISTER, SPOHN und OLSSON, 2005, Synchron, Heidelberg, Seite 349–374. <span style="color:#00B000">(Die tiefer gestellte Notation der spezifischen ,Eigenschaft‘ einer Eigenschaft ist meine Ergänzung zur formalen Syntax, z. B. ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>'''x'''‘ — </span>, angeregt durch die indizierende Schreibweise GÖDELS ''':''' <span style="color:#4C58FF">— ,'''G''' Ess. '''x'''’ —</span>.)</span> Die Erkenntnisse zur Straffung und Präzisierung der GÖDEL-Syntax, <span style="color:#00B000">(besonders im Möglichkeitsbeweis)</span>, stammen aus der Arbeit von Günther J. WIRSCHING ''':''' ,''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, im Web <ref>https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf</ref>. <span style="color:#00B000">(Auch der Hinweis auf AVICENNA kommt von WIRSCHING.)</span> Die Zitate von THOMAS von Aquin´s Stellungnahme zum Theorem ANSELMS, und von Georg Wilhelm Friedrich HEGEL zur Immanuel KANTS Ablehnung des Theorem ANSELMS, befinden sich in Franz SCHUPP, ,<span style="font-family: Times;"><big>''Geschichte der Philosophie im Überblick''</big></span>‘, Band 2 ‚<span style="font-family: Times;"><big>''Christliche Antike, Mittelalter''</big></span>‘, Hamburg 2003, Seite 168 und Seite 170.
Meines Erachtens ist der entscheidende Ansatzpunkt einer <span style="color:#4C58FF">„theologischen“</span> Interpretation das GÖDEL-Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>.
‚Frei‘ nach KANT ‚formuliere‘ ich ‚kurz‘ ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>. Hier die Positionen KANTS zum Thema ‚Existenz‘ und ‚Eigenschaften‘ ''':'''
::<span style="color:#FF6000">»</span>''… unbeschadet der wirklichen Existenz äußerer Dinge'', <span style="color:#00B000">[ kann man ]</span> ''von einer Menge ihrer Prädikate'', <span style="color:#00B000">[ d.h. Eigenschaften ],</span> ''sagen'' … ''':''' ''sie gehöreten nicht zu diesen ‚Dingen an sich selbst‘, sondern nur zu ihren Erscheinungen, und hätten außer unserer Vorstellung'' <span style="color:#00B000">[ ihrer, als ,wirklich‘ gedachten Erscheinung, ]</span> ''keine eigene Existenz, … weil ich finde, dass … '''alle Eigenschaften, die die Anschauung eines Körpers ausmachen''', bloß zu seiner Erscheinung gehören; denn die Existenz des Dinges, was erscheint, wird dadurch nicht … aufgehoben, sondern nur gezeigt, dass wir es'', <span style="color:#00B000">[ das Ding ]</span>, ''wie es ‚an sich selbst‘ sei'', <span style="color:#00B000">[ d.h. existiert ]</span>, ''durch Sinne gar nicht erkennen können''.<span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Prolegomena zu einer jeden künftigen Metaphysik, die als Wissenschaft wird auftreten können</big></span>''‘, Seite 289; https://www.korpora.org/kant/aa04/289.html</ref> <span style="color:#00B000"><small>(Hervorhebung durch KANT.)</small> [ Seine Prädikate, d.h. Eigenschaften, jedoch können wir mit unseren Sinnen ,anschauen‘, aber nur in Kombination mit unserer Vorstellung ihrer, als ,wirklich‘ gedachten Erscheinung, vermittelt durch den sog. ,transzendentalen Schematismus‘ unserer Einbildungskraft ''':'''</span> <span style="color:#FF6000">»</span>''Eine verborgene Kunst in den Tiefen der menschlichen Seele''<span style="color:#FF6000">«</span>, <span style="color:#00B000">jedoch auch eines der ,dunkelsten‘ Kapitel in der K.d.r.V., bedingt durch KANTS Konzept von ,Wirklichkeit‘, bzw. ,Sein‘. ]</span>
Mit anderen Worten, man kann die ‚Existenz‘, bzw. das ‚Sein‘ der Dinge, <span style="color:#00B000">(das ‚Ding an sich’ bei KANT)</span>, nicht unter dem Mikroskop finden. Die ‚Existenz‘ bzw. das ‚Sein‘ ist keine sinnlich registrierbare ‚Eigenschaft‘ z. B. des rekonstruierten ‚Stadt-Schlosses‘ in Berlin. <span style="color:#00B000">(‚Sein‘ ist kein reales ‚Prädikat‘.)</span> Dafür haben wir andere Fähigkeiten ''':''' Ich kann seine ‚Existenz‘ mit meinem Verstand einsehen, weil auch ich selbst ‚existiere‘. Seine ‚Ansicht‘, wie ‚gefällig‘ es ist, und auch weitere ‚Eigenschaften‘, die mir auffallen, kann ich mit einem Handy-Foto dokumentieren. Diese ‚Eigenschaften‘ sind nicht die Ursache, dass das ‚Berliner Schloss‘ existiert. Wohl aber die Rekonstruktion dieses Schlosses ist die ‚Ursache‘, dass es ,existiert‘, und jetzt so aussieht. Insofern ist ‚Existenz‘ keine ‚Eigenschaft‘, sondern die ‚Existenz‘ des Dinges ist die Voraussetzung, der ‚Grund‘, dass ich die ‚Eigenschaften‘ des Dinges mit meinen Sinnen feststellen kann.
In einer Auseinandersetzung mit CARTESIUS schreibt KANT, philosophisch ‚tiefgründig‘ und logisch ‚exakt‘, über dessen <span style="color:#FF6000"><span style="font-family: Times;"><big>„Cogito, ergo sum“</big></span></span> ''':'''
::<span style="color:#FF6000">»</span>''Das ‚Ich denke‘ ist ein empirischer Satz, und hält den Satz ‚Ich existiere‘ in sich. Ich kann aber nicht sagen ''':''' ‚Alles, was denkt, existiert‘; denn da würde die Eigenschaft des Denkens'', <span style="color:#00B000">[ eine essentielle Eigenschaft ]</span>, ''alle Wesen, die sie besitzen, zu notwendigen'' <span style="color:#00B000">[ d.h. notwendig existierenden ]</span> ''Wesen machen''. <span style="color:#00B000">[ Was allein nur von GOTT ausgesagt werden kann; mit AVICENNA, als anerkannter ARISTOTELES-Kommentator ''':''' <span style="color:#FF6000">»''GOTT ist das einzige Sein, bei dem Essenz'' <span style="color:#00B000">[ ‚Wesenseigenschaften‘ ]</span> ''und Existenz'' <span style="color:#00B000">[ ‚Dasein‘ ]</span> ''nicht zu trennen sind und das daher notwendig an sich da ist''«, <span style="color:#00B000">— konform mit GÖDEL ''':'''</span> »''notwendige Existenz ist eine positive'' <span style="color:#00B000">[ essentielle ]</span> ''Eigenschaft''«</span> ].</span> ''Daher kann meine Existenz auch nicht aus dem Satz, ‚Ich denke‘, als'' <span style="color:#00B000">[ logisch ]</span> ''gefolgert angesehen werden, wie CARTESIUS dafür hielt (weil sonst der Obersatz : ‚Alles, was denkt, existiert‘, vorausgehen müsste), sondern ist mit ihm identisch.'' <span style="color:#00B000">[ Eine einfache Schlussfolgerung ''':''' meine ‚Existenz‘ ist auch nicht von meiner ‚Eigenschaft‘ Denken ‚verursacht‘. ,Existenz‘ ist nicht bloß ein ,Gedanke‘ von mir. ]</span><span style="color:#FF6000">«</span> <span style="color:#00B000">(Aus der Anmerkung 41 zu den ‚''<span style="font-family: Times;"><big>Paralogismen der reinen Vernunft</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 275,<ref>https://korpora.org/kant/aa03/275.html</ref> mit meinem Einschub des AVICENNA-Zitat aus Wikipedia.<ref>{{w|Avicenna#Metaphysik}}</ref>)</span>
Mit anderen Worten ''':''' <span style="color:#FF6000">„Die Eigenschaft, dass ich denken kann, ist nicht die Ursache meiner ‚Existenz‘“</span>, sondern, <span style="color:#FF6000">„Die Liebe meiner Eltern und ihre Entscheidung füreinander ist die Ursache meiner ‚Existenz‘. Daher ‚bin’ ich. Und weil ich ein Mensch ‚bin‘, kann ich denken.“</span> Auch mit diesen Anmerkungen ist leicht einsehbar, dass ‚Existenz‘ keine ‚Eigenschaft‘ ist — außer bei GOTT. In GOTT ist ‚Dasein‘ die ‚Wesenseigenschaft‘ GOTTES, d.h. ‚Dasein‘ und ‚Wesen‘ sind in GOTT untrennbar verbunden; sind <span style="color:#FF6000">„koinzident“</span> ‚eins‘. Das ist die Einzigartigkeit im Wesen GOTTES, dass GOTT immer schon ‚da‘ ist. Die Frage nach dem ‚Wesen‘ GOTTES lautet ''':''' <span style="color:#FF6000">„Was bist du ? “</span>/<span style="color:#CC66FF">„Wer bist Du ? “</span> Antwort, Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'' <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Weil GOTT für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, hat GOTT es nicht nötig, ‚bewiesen‘ zu werden. <span style="color:#00B000">(In der Mathematik ist ein ‚Satz‘ erst dann ‚wahr‘ und ‚existent‘, wenn er bewiesen ist. Bei GOTT ist es jedoch nicht so ''':''' GOTTES ‚Existenz‘ ist nicht erst dann ‚wahr‘, wenn seine ‚Existenz‘ von uns ‚bewiesen‘ ist. Sein ‚Dasein‘ ist jedem unserer ‚Beweisversuche‘ immer schon voraus. Der Zugang zu GOTT ist nicht der ,Beweis‘, sondern der ,Glaube‘. Wer an GOTT glauben ,will‘, dem antwortet GOTT. Wer nicht an GOTT glauben ,will‘, dessen Entscheidung respektiert GOTT, und drängt sich nicht auf. Die Glaubens-Entscheidung hat jedoch für jeden Menschen eine existenzielle Konsequenz ''':''' <span style="color:#CC66FF">»''Wer glaubt und sich taufen lässt, wird gerettet; wer aber nicht glaubt'', <span style="color:#00B000">[ und diese Entscheidung auch im Augenblick der ,Wahrheit‘, im Tod, in der sog. ,Endentscheidung‘, nicht widerruft ]</span>, ''wird verurteilt werden''«,</span> <small>({{Bibel | Markus Evangelium |16|16|EU}})</small>. Das Urteil lautet ''':''' <span style="color:#CC66FF">»''zweiter Tod ''':''' der Feuersee''«</span>, <small>({{Bibel | Offenbarung |20|14f|EU}})</small>, ohne Berufungsmöglichkeit. <span style="color:#CC66FF">»''Ohne Glauben aber ist es unmöglich, Gott zu gefallen; denn wer zu Gott kommen will, muss glauben, dass er ist und dass er denen, die ihn suchen, ihren Lohn geben wird''«.</span> <small>({{Bibel | Hebräer Brief |11|6|LUT}})</small>)</span>
Das GÖDEL-Axiom-5 ist m.E. der entscheidende Ansatzpunkt einer stimmigen <span style="color:#4C58FF">„theologischen“</span> Interpretation der GÖDEL-Axiomatik.
===<div class="center"><span style="color:#660066">Das Kalkül ist kein Existenz-Beweis für GOTT</span></div>===
Die allgemeine <span style="color:#FF6000">»''mathematische Evidenz''«</span> des GÖDEL-Formalismus, d.h. seine ‚Schlusskraft‘, ist von kompetenten Leuten<ref>„GÖDELS Argumentationskette ist nachweisbar korrekt – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO nun gezeigt;“ vgl. https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html</ref> schon festgestellt worden, <span style="color:#00B000">(im Anhang ‚nachrechenbar‘ mit den Regeln und Gesetzen einer modalen Prädikatenlogik 2. Stufe)</span>. Das GÖDEL-Kalkül ist jedoch kein ‚moderner‘<span style="color:#FF6000">„Existenz-Beweis“</span> für GOTT, wofür es gehalten oder meistens bezweifelt wird, sondern setzt, <span style="color:#00B000">(theoretisch methodisch)</span>, den <span style="color:#FF6000">„Glauben an die Existenz GOTTES“</span> schon voraus, ohne ihn zu hinterfragen. Das <span style="color:#FF6000">„Dasein“</span> bzw. die <span style="color:#FF6000">„Existenz“</span> GOTTES wird mit der Definition-1 für <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, bzw. mit dem Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, im Kalkül ‚definitorisch‘ bzw. ‚axiomatisch‘ als Kalkül-,Annahme‘, als <span style="color:#FF6000">„Prämisse“</span>, eingeführt, unter der Voraussetzung, dass die ‚Eigenschaft‘ <span style="color:#4C58FF">‚'''G'''‘ := </span><span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(Essenz)</span> und das <span style="color:#FF6000">„Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span> <span style="color:#00B000">(Existenz)</span>, ontologisch ‚identisch‘, genauer ''':''' <span style="color:#FF6000">„koinzident“</span> sind, was GÖDEL im Axiom-5 definitiv für sein System vorschreibt ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''notwendige Existenz ist eine positive Eigenschaft''«</span>. Das <span style="color:#FF6000">„Dasein GOTTES“</span> ist faktisch äquivalent zur <span style="color:#FF6000">„notwendigen Existenz als GOTT“</span>; und <span style="color:#FF6000">„Göttlichkeit“</span> ist die <span style="color:#FF6000">„positive Eigenschaft in GOTT“</span>. Beides ist nach Axiom-5 ‚identisch‘, d.h. dem ‚Sein nach‘ dasselbe, und daher konvertierbar. Beide, <span style="color:#00B000">(sowohl die Essenz, als auch die Existenz GOTTES)</span>, werden daher auch mit demselben Term ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span> im Kalkül dargestellt. Der traditionelle, christliche ,GOTT-Glaube‘ wird zugleich mit diesem Term <span style="color:#4C58FF">‚'''G'''‘ := </span> <span style="color:#FF6000">„GOTT“ <span style="color:#00B000">|</span> „göttlich“</span>, im 2. Beweisgang, dem Basisbeweis, und im 3. Beweisgang für das Theorem ANSELMS, jeweils als ,methodologische‘ Prämisse :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> regulär <span style="color:#00B000">( ├ )</span> und explizit eingeführt ''':''' <span style="color:#FF6000">»''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht für den GOTT'' <span style="color:#4C58FF">‚'''G'''‘</span> ''der Christen''«</span>. Das ist die ,modal‘-frei gewählte, <span style="color:#4C58FF">„theologische“</span> Kalkül-,Annahme‘, <span style="color:#00B000">(als ,Argument-Einführung‘ := <span style="color:#4C58FF">‚'''AE:'''‘</span> )</span>, und wird dann mit Definition-1 näher ,bestimmt‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ — </span> ''':''' <span style="color:#FF6000"> »''Das'' <span style="color:#4C58FF">,'''x'''‘</span> ''steht genau dann für ‚GOTT‘'' <span style="color:#00B000">|</span> ''‚göttlich‘'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''wenn'' <span style="color:#4C58FF">,'''x'''‘</span> ''alle positiven Eigenschaften, bzw. Vollkommenheiten'', <span style="color:#4C58FF">‚'''PX'''‘</span>, ''hat''«</span>, entsprechend dem ‚Quelltext‘ bei LEIBNIZ. <span style="color:#00B000">(Das ,postulierte‘ Axiom-3 ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, wird standardmäßig gelesen als <span style="color:#FF6000">»''Göttlichkeit ist eine positive Eigenschaft''«</span>, hat aber auch die alternative Leseart ''':''' <span style="color:#FF6000">»''GOTT ist perfekt d.h. vollkommen''«</span>, was <span style="color:#4C58FF">„theologisch“</span> auch richtig ist; mit <span style="color:#4C58FF">‚'''P'''‘ </span> := <span style="color:#FF6000">„Perfektion“/„Vollkommenheit“</span> ist dann die Summe aller <span style="color:#FF6000">„positiven Eigenschaften“</span>.)</span> Mit Axiom-3, — in dieser <span style="color:#4C58FF">„theologischen“</span> Leseart —, ist der ‚Wenn-Satz‘ in Definition-1 ‚aufgelöst‘ ''':''' <span style="color:#FF6000">»''GOTT hat alle positiven Eigenschaften, weil er ‚perfekt‘ ist''«</span>.
In Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, wird die ,für uns‘ <span style="color:#FF6000">„notwendige Existenz“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —, </span> durch die ,aus sich‘ <span style="color:#FF6000">„notwendig“</span> <span style="color:#4C58FF">— '''□''' —</span> instanziierten <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(als zu den Transzendentalia gehörig)</span>, bestimmt. Das GÖDEL-Kalkül setzt sowohl in Definition-3 als auch im Axiom-5 das Theorem des ARISTOTELES von der ontologischen ‚Identität‘, d.i. die Koinzidenz von <span style="color:#FF6000">„Dasein“</span>, <span style="color:#00B000">(Existenz)</span> und <span style="color:#FF6000">„Wesenseigenschaften“</span>, <span style="color:#00B000">(Essenz)</span> im prinzipiell <span style="color:#FF6000">„unbewegten Erstbewegenden“</span> voraus. Ohne diese Annahme bzw. ohne Axiom-5, würde das GÖDEL-Kalkül nicht ‚funktionieren‘. Das GÖDEL-Theorem-2.1 ''':''' <span style="color:#4C58FF">— ‚'''Gx→G'''<sub>ess</sub>'''x'''‘ —</span>, kann unter dieser Voraussetzung dann, <span style="color:#4C58FF">„theologisch“</span> richtig und eindeutig, so gelesen werden ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für GOTT'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''als Individuum steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span>, ''das Wesen'', <span style="color:#4C58FF">—<sub>ess</sub>—, </span> <span style="color:#00B000">(,Essenz‘)</span>, ''GOTTES'' <span style="color:#4C58FF">‚'''x'''‘</span>«</span><ref>vgl. z.B. THOMAS von Aquin ''':''' ,''<span style="font-family: Times;"><big>De Ente et Essentia</big></span>''’, Kapitel 5 ''':''' „Deus, cuius essentia est ipsummet suum esse“ ''':''' „GOTT, dessen Wesen sein eigenes Sein ist“.</ref>, statt der <span style="color:#4C58FF">„theologisch“</span> unrichtigen Lesearten in der Wikipedia ''':''' <span style="color:#FF6000">»''Göttlich ist eine essentielle Eigenschaft jedes göttlichen Wesens''«</span><ref>{{w|Gottesbeweis#Kurt_Gödel|Gottesbeweis 2.1.2, Theorem 2}}; Version vom 10.09.2025</ref>, oder bei Christoph BENZMÜLLER et alia, im sog. ,Theorembeweiser‘ ''':''' <span style="color:#FF6000">»''Gottähnlich zu sein ist eine Essenz von jeder gottähnlichen Entität''«</span><ref>[https://www.fu-berlin.de/presse/informationen/fup/2013/fup_13_308/index.html ‚Gödels „Gottesbeweis“ bestätigt’, Theorem 2]</ref>, mit der suggestiven Annahme, es gäbe polytheïstisch, mehrere ,göttliche Wesen‘, bzw. ,gottähnliche Entitäten‘, was der monotheïstischen, abendländischen Tradition, bzw. dem <span style="color:#4C58FF">„theologischen“</span> Theorem von der ,Unvergleichlichkeit‘ und ,Einzigartigkeit‘ GOTTES widerspricht, das im GÖDEL-Kalkül mit Korollar-3 bestätigt wird. <span style="color:#00B000">(Die Interpretation <span style="color:#4C58FF">‚'''G'''‘ :=</span> <span style="color:#FF6000">„GOTT“</span>, als ,Individuumname‘, ist synonym zum <span style="color:#FF6000">„Dasein <span style="color:#00B000">(Existenz)</span> GOTTES“</span>, und äquivalent zur ‚positiven Eigenschaft‘ <span style="color:#FF6000">„Göttlichkeit“</span>, alias <span style="color:#FF6000">„göttlich zu sein“</span> = <span style="color:#FF6000">„GOTT zu sein“</span> = <span style="color:#FF6000">„GOTT-Sein“</span>; und mit dem GÖDEL-Term ''':''' <span style="color:#4C58FF">‚'''G'''<sub>ess</sub>‘ :=</span> <span style="color:#FF6000">„das Wesen <span style="color:#00B000">(Essenz)</span> GOTTES“</span>.)</span>
<div class="center"><span style="color:#FF6000"><span style="color:#4C58FF">‚'''G'''‘ :=</span> „'''G'''öttlichkeit“ <span style="color:#4C58FF">↔</span> „'''G'''OTT“ <span style="color:#4C58FF">↔</span> „'''G'''OTT-Sein“</span> </div>
Die Rechtfertigung für diese <span style="color:#4C58FF">„theologische“</span> Dreifach-Äquivalenz für <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, im GÖDEL-Kalkül, gibt Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span> ''':''' <span style="color:#FF6000">»''die positive <u>Eigenschaft</u>'', <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ''Göttlichkeit'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''äquivalent zu GOTT als Individuum-Name'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''ist auch äquivalent zum Dasein GOTTES'', <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ''gleichbedeutend mit notwendiger <u>Existenz</u>'', <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>'', dem <u>Sein</u> GOTTES für uns''«</span>. Hier hat GÖDEL explizit <span style="color:#FF6000">„Eigenschaft“</span> mit <span style="color:#FF6000">„Existenz“</span> bzw. <span style="color:#FF6000">„Sein“</span> gleichgesetzt; <span style="color:#00B000">(was jedoch nach KANT für alles, was in unserer Welt ‚existiert‘, bzw. für alles, was zur <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> gehört, wie GÖDEL selbst sagt, in jedem Fall ‚unstatthaft‘ ist ''':''' <span style="color:#FF6000">„Existenz ist keine Eigenschaft“</span>, bzw. <span style="color:#FF6000">»''Sein ist kein reales Prädikat''«</span>)</span>. Jedoch wegen dieser ‚Gleichsetzung‘, die einzig und allein, der aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition entsprechend, singulär nur in GOTT ‚statthaft‘ ist, kann jetzt die ‚positive Eigenschaft‘ <span style="color:#00B000">(Essenz)</span> <span style="color:#FF6000">„Göttlichkeit“</span> <span style="color:#00B000">(ontologisch korrekt)</span> gelesen werden als <span style="color:#FF6000">„das, was GOTT zu dem macht, ‚was‘ GOTT an sich selbst ist“</span>, nämlich zu seinem <span style="color:#FF6000">„GOTT-Sein“</span> <span style="color:#00B000">(Existenz)</span>, zu seinem <span style="color:#FF6000">„Dasein als GOTT“</span>; zur Tatsache, dass <span style="color:#FF6000">„GOTT GOTT ist“</span>, d.h. dass <span style="color:#FF6000">„GOTT als GOTT ‚da‘ ist“</span>. Das ist, <span style="color:#00B000">(und da folgt ARISTOTELES seinem Lehrer PLATO)</span>, nach traditioneller Auslegung, die übliche, ontologische Funktion des ‚Wesens‘<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span> | ‚ousía‘ |</span> eines Seienden ''':''' es ‚macht‘ das Seiende zu dem, ‚was‘ es ist; es ist die ‚Ursache‘ dafür, dass das Seiende, das ‚ist‘, ‚was‘ es ist | ‚Was-Sein‘ — ‚Wesen‘. <span style="color:#00B000">(ARISTOTELES lokalisiert jedoch das ,Wesen‘ im Seienden, im Gegensatz zu PLATO, der das ,Wesen‘, — ,getrennt‘ vom Seienden —, in den allgemeinen ,Ideen‘ lokalisiert.)</span>
Da aber in ‚Gott‘, <span style="color:#00B000">(dem <span style="color:#FF6000">„unbewegten, ‚unverursachten‘ Erstbeweger“</span>)</span>, Prozesshaftes, ‚Ursächliches‘ auszuschließen ist, ist die übliche prozesshafte, ‚ursächliche‘ Funktion von <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὐσία</big></span>“</span><span style="color:#00B000"> | ‚ousía‘ |</span> ,Wesen‘ im <span style="color:#FF6000">„Erstbewegenden“</span> nach ARISTOTELES, sozusagen, schon ‚zum Abschluss‘ gekommen, schon ‚verwirklicht‘, — <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐν-έργεια οὖσα</big></span>“</span><span style="color:#00B000"> | ‚en-érgeia oúsa‘</span> —, schon ‚ins-Werk‘ gesetzt; <span style="color:#00B000">(<span style="color:#FF6000">„<span style="font-family: Times;"><big>τὸ ἔργον</big></span>“</span> | ‚to érgon‘ | ‚das Werk‘; <span style="color:#FF6000">„<span style="font-family: Times;"><big>ἐνέργεια</big></span>“</span> | ‚enérgeia‘ | ,Wirksamkeit‘, ,Wirklichkeit‘, ,Aktualität‘, ,Energie‘; und <span style="color:#FF6000">„<span style="font-family: Times;"><big>οὖσα</big></span>“</span> | ,oúsa‘ | feminin Nominativ Singular von <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὤν</big></span>“</span> | ‚ón‘ | ‚seiend‘)</span>. Sein ,Wesen‘ ist im ,Dasein‘ vollendet, ist ,wirkliches, verwirklichendes Sein‘, ‚seiende Aktualität‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>actus purus</big></span>“</span> ''':''' sein Wesen ist ‚reine Tätigkeit‘, ,reine verwirklichende Gegenwärtigkeit‘, d.h. ,existent‘, ohne jede prozesshafte ‚Potenzialität‘. Aus der wichtigen und richtigen Erkenntnis, dass GOTT <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer Welt''«</span> ist, folgt mit der ontologischen Identität von ,Dasein‘ und ,Wesen‘ in GOTT ''':''' Der zeitlos ewige GOTT ist <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''immer schon da''«</span>, m.a.W. ist <span style="color:#FF6000">„zeitlos-ursprungslos“</span>. Insofern ist <span style="color:#FF6000">„Göttlichkeit“</span> die <span style="color:#FF6000">„Wesenseigenschaft“</span>, die im <span style="color:#FF6000">„Dasein GOTTES“</span> d.h. in <span style="color:#FF6000">„GOTT“</span>, schon ihr ‚Ziel‘, ihre Vollendung, — <span style="color:#FF6000">„Perfektion“</span>, Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, erreicht hat. GOTT ist <span style="color:#FF6000">»''vollkommen''«</span> und darum auch <span style="color:#FF6000">»''notwendig für uns immer schon ‚da‘''«</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ — </span>. GOTT ist in seinem ‚zeitlosen Wesen‘ <span style="color:#FF6000">„unverursacht“</span>, da er <span style="color:#FF6000">»''notwendig aus sich'' <span style="color:#00B000">(von Natur aus)</span> ''vollkommen''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''□PG'''‘ —</span>, <span style="color:#00B000">(eine Instanz von Axiom-4)</span>. <span style="color:#FF6000">„Vollkommenheit“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ist die <span style="color:#FF6000">„Wesenseigenschaft“</span>, bzw. das <span style="color:#FF6000">„Wesen GOTTES“</span> ''':''' <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>. <span style="color:#FF6000">»''GOTT ist ,der‘ Vollkommenste''«</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, d.h. <span style="color:#4C58FF">— ‚'''G'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist die unbegrenzte Summe der unendlichen Vollkommenheiten''«</span>. Und zur absoluten <span style="color:#FF6000">„Vollkommenheit“</span> gehört <span style="color:#FF6000">„notwendig“</span> auch das <span style="color:#FF6000">„Existieren“</span> ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ — </span>. <span style="color:#FF6000">„Notwendige Existenz“</span> gehört zu den ,ultimativen‘ Transzendentalia in GOTT, was GÖDEL mit Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, syntaktisch formalisiert hat, wenn sowohl das <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, als auch alle <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span> im Kalkül, für den Dreifaltigen GOTT der Christen stehen, was dann im Korollar-3, mit der Identität, <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, bzw. der Koinzidenz beider Individuum-Variablen, explizit gezeigt wird.
Entscheidend für diese Interpretation des GÖDEL-Systems ist ''':''' nur unter der ,modal‘ notwendigen Voraussetzung der ontologischen ‚Identität‘ von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, Theorem-2 ''':''' <span style="color:#4C58FF"> — '''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>, bzw. der ‚Gleichsetzung‘, <span style="color:#00B000">(Koinzidenz)</span>, von <span style="color:#FF6000">„notwendiger Existenz“</span> mit den ‚positiven‘ Wesenseigenschaften, der <span style="color:#FF6000">„Essenz“</span> in GOTT, Axiom-5 ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, ‚funktioniert‘ die GÖDEL-Axiomatik '''!''' Diese ‚Identität‘, bzw. ,Koinzidenz‘ wird in ARISTOTELES, ‚''<span style="font-family: Times;"><big>Metaphysik</big></span>''‘, Buch XII 7, in einem Indizienbeweis erbracht, der mit der Methode der philosophischen Induktion zum Ergebnis kommt ''':'''
::<span style="color:#FF6000">» … ''es muss'' <span style="color:#00B000">[ notwendig ]</span> ''etwas geben, das, ohne selbst ‚bewegt‘'' <span style="color:#00B000">[ </span>''worden''<span style="color:#00B000"> ]</span> ''zu sein'', <span style="color:#00B000">[ ‚unentstanden‘ ]</span>, ''alles Übrige wie ein Geliebtes ‚bewegt‘'' <span style="color:#00B000">[ ‚entstehen lässt‘ ]</span>«</span>, das darum selbst ‚zugleich‘ <span style="color:#FF6000">„<span style="font-family: Times;"><big>αἴδιον καί οὐσία καί ἐνέργεια οὖσα</big></span>“ <span style="color:#00B000">| ,aídion kai ousía kai enérgeia oúsa‘ |</span> »<span style="color:#00B000">[ zeitlich-]</span>''ewig, sowohl <u>Wesen</u>'', <span style="color:#00B000">[ etwas Konkretes, Essentielles ]</span>, ''als auch seiende Wirksamkeit — ''<span style="color:#00B000">[ </span>„<span style="font-family: Times;"><big>actus purus</big></span>“, „reine Tätigkeit“<span style="color:#00B000"> ]</span> ''— verwirklichendes, wirkliches <u>Sein</u> ist'', <span style="color:#00B000">[ ein Existierendes, das alles Übrige ,zur Existenz‘ bringen kann ]</span> «</span>, bzw. <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὀρεκτόν καί νοητόν</big></span>“ <span style="color:#00B000"> | ,orektón kai noêtón‘ | </span>»''das ersehnt und erkennbar ist''.«</span> <span style="color:#00B000">(''<span style="font-family: Times;"><big>vgl. ,Metaphysik</big></span>''‘ XII 7, 1072a,23 – 1072b,4)</span>
Was <span style="color:#FF6000">»''alles Übrige''«</span> ,zur Existenz‘ bringen kann, bzw. ,verwirklichen‘ kann, ohne selbst ,entstanden‘ zu sein, muß auch selbst, als etwas Konkretes, Essentielles, immer schon ,existieren‘, bzw. ,wirklich sein‘. Die, daraus abgeleitete, und damit ,erkannte‘, ontologische ‚Identität‘, — ,Koinzidenz‘ —, von ‚Wesen‘ und ‚Sein‘, <span style="color:#00B000">(Ziel aller Sehnsucht und jedes Erkenntnisstrebens)</span>, <span style="color:#FF6000">»''ist das Privilegium der Gottheit allein''«</span> ''':''' mit Gottfried Wilhelm LEIBNIZ interpretiert, entsprechend einer adäquaten, aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition. Dieses induktive, ‚ontologisch‘ a-posteriori Ergebnis aus der ‚Prinzipienforschung‘ des ARISTOTELES ist die metaphysische und logische Voraussetzung, dass GÖDEL seine Axiomatik im Kalkül des sog. ‚ontologischen Gottesbeweises‘ a-priori des ANSELM von Canterbury, und nach LEIBNIZ, deduktiv korrekt formulieren konnte; <span style="color:#00B000">(vgl. 3. Beweisgang)</span>.
Angenommen, die Variable <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für den <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, der Christen, <span style="color:#00B000">(siehe Anhang, Term :01: im 2. Beweisgang)</span>, dann ist, — auf Grund von diesem Beweisgang —, in unserer Welt ,wahr‘ und evident ''':''' sowohl die ‚positive Eigenschaft‘ <span style="color:#FF6000">»''Göttlichkeit''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als auch das faktische <span style="color:#FF6000">»''‚Da‘-Sein'' <span style="color:#00B000">[ Existenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, ‚benennen‘, ontologisch ident, denselben Sachverhalt ''':''' nämlich das, was wir das <span style="color:#FF6000">»''Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''GOTTES''«</span>, <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ —</span>, nennen. <span style="color:#FF6000">»''Göttlichkeit'', bzw. ''GOTT-‚Sein‘ ist das Wesen GOTTES''«</span>, <span style="color:#00B000">(Theorem-2.1)</span>, und dann umgedreht und äquivalent ''':''' <span style="color:#FF6000">»''Das Wesen GOTTES ist sein ‚Da‘-Sein als GOTT'', bzw. ''seine Göttlichkeit''«</span>, <span style="color:#00B000">(Theorem-2.2)</span>, m.a.W. ''':''' <span style="color:#FF6000">»''GOTT ist wesentlich ‚grundlos‘'' <span style="color:#00B000">[ d.h. </span> ''notwendig aus sich''<span style="color:#00B000"> ]</span> ''‚da‘''«</span>. Das ist das Einzigartige im <span style="color:#FF6000">»''Wesen GOTTES''«</span> ''':''' GOTT ist ohne zeitlichen Anfang, zeitlos-ewig, für uns immer schon ‚da‘, und das ‚ist‘ sein <span style="color:#FF6000">»''Wesen''«</span>; vorausgesetzt, ,angenommen‘, man glaubt an GOTT ''':''' Term :01:. <span style="color:#00B000">(Der schon von GÖDEL indizierte Term <span style="color:#4C58FF"> — ‚'''G'''<sub>ess</sub>‘ — </span> ,expliziert‘ nur eine der drei Lesearten, die der Term <span style="color:#4C58FF"> — ‚'''G'''‘ — „theologisch“</span> ,impliziert‘.)</span> Theorem-2 hat somit die syntaktische Form einer Definition ''':'''
<div class="center"><span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span></div>
Somit kann GOTT ‚explizit‘ <span style="color:#00B000">(aus einer bewiesenen Kalkül-Definition)</span> <span style="color:#4C58FF">„theologisch“</span> genauer ‚bestimmt‘ werden ''':''' <span style="color:#FF6000">»''GOTT ist gerade deswegen GOTT, weil sein überzeitlich-ewiges und an sich ‚grundloses‘'' <span style="color:#00B000">[ aber für uns notwendiges ]</span> ''Dasein'' <span style="color:#00B000">[ Existenz ]</span> ''als GOTT, ontologisch, — dem Sein nach —, identisch ist mit seinem persönlichen und für uns liebevollen Wesen'' <span style="color:#00B000">[ Essenz ]</span> ''als GOTT; diese Identität von Dasein und Wesen gilt einzig und allein nur bei GOTT.''«</span> Die philosophische Frage nach dem <span style="color:#FF6000">„Wesen GOTTES“</span> lautet, <span style="color:#00B000">(auf die Person bezogen)</span> ''':''' <span style="color:#FF6000">„Was bist du ? “</span> Sie ist äquivalent zur <span style="color:#4C58FF">,theologisch’</span>-biblischen Frage des MOSE ''':''' <span style="color:#CC66FF">„Wer bist Du ? “</span> Die bekannte Antwort des GOTTES-JHWH aus ‚Exodus 3,14‘, im Dornbusch, thematisiert das persönliche, für uns liebevolle und für immer notwendige <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin-Da‘'', <span style="color:#00B000">[ für euch und für immer ]</span>«.</span> Mit diesem Zitat aus der Bibel ist die GÖDEL-Axiomatik, sozusagen, <span style="color:#4C58FF">„theologisch“</span> ‚verifiziert‘. Sie hat einerseits im Theorem-2 ihren philosophischen ‚Abschluss’ erreicht, und andererseits damit formal-syntaktisch den ‚Anschluss‘ an eine allgemeine Basis-Glaubensaussage gefunden, die ‚an sich‘ für jeden CHRIST-gläubigen Menschen ‚selbstverständlich‘ ist. Was in der Metaphysik des ARISTOTELES das Ergebnis einer philosophischen ,Induktion‘ a-posteriori ist ''':''' <span style="color:#FF6000">„,Dasein‘ ist das ,Wesen‘ GOTTES“</span>, — <span style="color:#00B000">(das mit Theorem-2, auch ein Ergebnis der deduktiven GÖDEL-Axiomatik a-priori ist ''':''' die Beweisgrundlage für den Konsequenz-Teil im Theorem AMSELMS)</span>, — das ist in der Bibel die Grundüberzeugung jedes Menschen, der an GOTT glaubt ''':''' GOTT ist für uns immer schon <span style="color:#FF6000">„da“</span>, weil er uns liebt. Das ist das, <span style="color:#FF6000">„was“</span> GOTT für uns als GOTT ausmacht, — sein Wesen ''':''' <span style="color:#CC66FF">»''Wir haben die Liebe, die GOTT zu uns hat, erkannt und gläubig angenommen. GOTT ist Liebe, und wer in der Liebe bleibt, bleibt in GOTT und GOTT bleibt in ihm''«</span>, <small>({{Bibel | 1. Johannesbrief |4|16|EU}})</small>.
Das eigentliche Ergebnis der GÖDEL-Axiomatik ist somit die ‚triviale‘ Erkenntnis, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, — <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span> —, vorausgesetzt <span style="color:#00B000">(‚angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#CC66FF">»''Ehe die Berge geboren wurden, ehe die Erde entstand und das Weltall erschaffen wurden, bist du, o GOTT, von Ewigkeit zu Ewigkeit''«</span>, <small>({{Bibel | Psalm |90|2|LUT}})</small>. <span style="color:#00B000">(Der Glaube an die Zeitlosigkeit GOTTES ist mit der ‚Annahme‘ von Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist perfekt''«</span>, und der ‚Annahme‘ der Definition-1 für <span style="color:#4C58FF"> ‚'''Gx'''‘ := </span> den <span style="color:#FF6000">„GOTT der Christen“</span>, im Kalkül ‚implizit‘ schon eingeführt, da die Axiome und Definitionen, — nach GÖDEL —, nur dann <span style="color:#FF6000">»''wahr''«</span> sind, wenn sie <span style="color:#FF6000">»''unabhängig von der zufälligen''</span> [ Raum-Zeit-]<span style="color:#FF6000">''Struktur''«</span> unserer Welt sind. Das ,impliziert‘ auch, dass der GOTT von Axiom-3 und Definition-1 ebenfalls <span style="color:#FF6000">»''unabhängig''«</span> von Raum und Zeit, d.h. zeitlos-ewig ist '''!''' )</span>
Wer an den GOTT der Bibel glaubt, kann sich von der ‚Vernünftigkeit‘ seines Glaubens mit Hilfe des sog. ,ontologischen‘ Gottesbeweises nach ANSELM von Canterbury, mit Kurt GÖDEL <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, überzeugen. <span style="color:#00B000">(Das war auch die Absicht ANSEMS '''!''' )</span> Die Annahme, es sei ‚unmöglich‘, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span>, <span style="color:#00B000">(dezidierter Atheismus)</span>, führt im GÖDEL-Kalkül formal zu einem logischen Widerspruch; vgl. z. B. ‚''<span style="font-family: Times;"><big>Gödels Möglichkeitsbeweis</big></span>''‘, in ‚''<span style="font-family: Times;"><big>Der Gödelsche Gottesbeweis</big></span>''‘, Seite 17, von Günther J. WIRSCHING; (https://edoc.ku.de/id/eprint/10243/1/OntBw.pdf), d.h. es ist also nicht ‚unmöglich‘, dass es GOTT gibt. Der GOTT-Glaube ist mit den Maßstäben einer modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span> und darum ,vernünftig‘. Damit steht fest ''':''' das GÖDEL-Kalkül ist kein moderner ‚Existenz-Beweis‘ für den GOTT der Bibel, sondern es setzt, <span style="color:#FF6000">»''rein verstandesmäßig''«</span>, ,methodologisch‘, den Glauben an die Existenz eines zeitlos-ewigen GOTTES voraus, der, — <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur unserer '' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> —, für uns immer schon ‚da‘ ist. Wenn aber einmal als fix ‚angenommen‘ worden ist, <span style="color:#00B000">(als Prämisse)</span>, dass es wahr ist, dass GOTT ‚existiert‘, dann ist natürlich die ‚Annahme‘, dass GOTT ‚nicht existiert‘, falsch. Aber sie ist auch ,unlogisch‘ und ,unsinnig‘, weil die Annahme ''':''' <span style="color:#FF6000">»''Es ist unmöglich, dass es einen GOTT gibt''«</span>, offensichtlich und eindeutig zu einem Widerspruch führt; was z. B. Günther J. WIRSCHING mit seiner Version des <span style="color:#00B000">(nicht umkehrbaren)</span> ‚Möglichkeitsbeweises‘ für ,GOTT‘, explizit vorexerziert hat; <span style="color:#00B000">( nachgestellt im Anhang ''':''' GÖDELS ‚Möglichkeitsbeweis‘ als ,Widerlegung‘ eines Nicht-GOTT-Glaubens; in Entsprechung zu Psalm 14,1 und Psalm 53,2 ''':''' <span style="color:#CC66FF">»''Der'' <span style="color:#00B000">[ ,unvernünftige‘ ]</span> ''Tor sagt in seinem Herzen ''':''' Es gibt keinen Gott. Sie handeln verderbt, handeln abscheulich; da ist keiner, der Gutes tut''«</span>. Historischer Hintergrund zu diesem Psalm-Text ''':''' Die Zerstörung des Tempels in Jerusalem 586 v.Ch. durch die Truppen des NEBUKADNEZAR II.)</span> Der Logiker GÖDEL hat in seinem System zum ,ontologischen Beweis‘ keine ‚formale Unentscheidbarkeit‘ <span style="color:#00B000">(Agnostizismus)</span> feststellen können, wie auf einem anderen Feld seiner Forschungsarbeiten.
Das GÖDEL-Konsequenz-Teil von der ‚Notwendigkeit‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, <span style="color:#00B000">(die ‚Konsequenz’ aus dem ‚widerspruchsfreien‘ Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —,</span>)</span> im ‚Theorem ANSELMS‘, ist <span style="color:#00B000">(im 3. Beweisgang, Term :10:)</span> dann auch eine weitere Explikation des Basis-Theorems-2 des Kalküls ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span>, über die ‚ontologische Identität‘ vom <span style="color:#FF6000">„Dasein GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, mit seinem <span style="color:#FF6000">„Wesen“</span> ''':''' <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, nach einem <span style="color:#4C58FF">[ Modus ponens ]</span>, dargestellt mit Term :09:.
<span style="color:#00B000">(Die ontologische Identität von Dasein und Wesen in GOTT, ist die, für uns, <span style="color:#FF6000">„notwendige Präsenz <span style="color:#00B000">[ das Sein, <span style="color:#4C58FF">— ‚'''E'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, die äquivalent, bzw. koinzident ist zur <span style="color:#FF6000">„Vollkommenheit <span style="color:#00B000">[ das Wesen, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>]</span> GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>. Diese Identität von Sein und Wesen in GOTT ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub> —</span>, bedeutet <span style="color:#4C58FF">,theologisch‘</span> konkret ''':''' die, für uns, notwendige Gegenwärtigkeit GOTTES, [ sein Dasein ], ist verwirklicht worden in der liebevollen [ Wesens-]Zuwendung GOTTES zu uns Menschen, in seiner Kindwerdung in Bethlehem, durch die Jungfrau MARIA ''':''' GOTTES Wesen ist ,Sein-mit-uns‘ ''':''' <span style="color:#CC66FF">»''sein Name'', <span style="color:#00B000">[ sein Wesen ]</span>, ''ist IMMANUEL, das heiß übersetzt ''':''' GOTT-ist-mit-uns''«, <small>({{Bibel | Matthäus Evangelium |1|23|EU}})</small></span>, der unsere Not-,wenden‘-wird, d.h. der uns und die Welt von der Korruption der Sünde und des Todes <span style="color:#4C58FF">,erlösen‘</span> will und wird; jedoch nicht ohne uns. Die <span style="color:#4C58FF">„Menschwerdung“</span> GOTTES in JESUS CHRISTUS, die <span style="color:#4C58FF">„Hypostatische Union“</span>, bzw. diese außergewöhnliche und einzigartige <span style="color:#FF6000">„Koinzidenz“</span> von GOTT und Mensch, ist der wirkliche und historische Beginn der <span style="color:#4C58FF">„Erlösung“</span> des Menschen und der Welt; vergegenwärtigt für jede Generation der Menschen in und durch die <span style="color:#4C58FF">„Kirche“</span> JESU CHRISTI.)</span>
Die, von GÖDEL im 1. Beweisgang, als Prämissen schon vorausgesetzten und ,angenommenen‘ Perfektionen, bzw. Vollkommenheiten, <span style="color:#00B000">(das sind die allgemeinen ,Transzendentalia‘ für alles Nicht-Göttliche in der Welt)</span>, werden im ersten Teil des 2. Beweisganges, mit Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dann auch als <span style="color:#FF6000">„positive Wesenseigenschaften“</span>, <span style="color:#00B000">(als die ultimativen ,Transzendentalia‘)</span>, in GOTT ‚definitiv‘ <span style="color:#00B000">( ╞ )</span> bestätigt; <span style="color:#00B000">(siehe Anhang, 2. Beweisgang, Anmerkung-2)</span>.
Im 3. Beweisgang ist das Basis-Theorem-2 die ,modal‘ notwendige, bzw. transzendentale, Voraussetzung, sowohl für das <span style="color:#FF6000">„an sich notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, im Term :10:, als auch für die <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, in den Ressourcen dieses Beweisganges ''':''' in der Definition-3, und im Axiom-5; <span style="color:#00B000">(das <span style="color:#4C58FF">— ‚'''E'''‘ —</span> wird nur GOTT zugeordnet; vgl. auch Anhang, 3. Beweisgang, Anmerkung-4)</span>. Dieses Basis-Theorem-2 ist auch zugleich die Antwort auf die Frage nach dem ‚Ursprung‘ GOTTES ''':''' GOTT ist <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> ‚da‘, von <span style="color:#CC66FF">„Ewigkeit zu Ewigkeit“</span>, denn es ‚ist‘ sein <span style="color:#FF6000">„Wesen“</span>, <span style="color:#00B000">(überzeitlich-ewig)</span> für uns immer schon ‚da‘ zu sein. Weitere ‚Einzelheiten‘ über Wesen und Eigenschaften GOTTES gehören in die Mystik, bzw. in die <span style="color:#4C58FF">„Theologie“</span>.
===<div class="center"><span style="color:#660066">Die Bedeutung des Kalküls</span></div>===
<div class="center">Immanuel KANT und Kurt GÖDEL im ‚Dialog‘</div>
KANT sagt ''':'''
::<span style="color:#FF6000">»</span>'''''Sein''' ist offenbar kein reales Prädikat''. ... ''Es ist bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Position'' <span style="color:#00B000">[ latinisiert, deutsch für ''':''' ,Setzung‘ ]</span> ''eines Dinges ... Nehme ich nun das Subjekt (Gott) mit allen seinen Prädikaten'' <span style="color:#00B000">[ d.h. Eigenschaften ]</span> ''(worunter auch die Allmacht gehört) zusammen, und sage ''':''' ‚'''Gott ist'''‘'', <span style="color:#00B000">[ ,GOTT existiert wirklich‘ ]</span>, ''oder ‚es ist ein Gott‘, so <u>setze</u> ich kein neues Prädikat'' <span style="color:#00B000">[ keine neue Eigenschaft ]</span> ''zum ‚Begriffe‘ von Gott ''':''''' <span style="color:#00B000">[ <span style="color:#0000FF; background-color:#FFFF00">‚Sein’ ist kein ‚reales Prädikat’ in GOTT</span>; ‚Existenz‘ ist in GOTT keine ‚Eigenschaft‘ ],</span> ... ''es kann daher zu dem Begriffe'', <span style="color:#00B000">[ ,GOTT‘ ]</span>, ''der bloß die'' <span style="color:#00B000">[ gedachte ]</span>'' Möglichkeit ausdrückt, darum, dass ich dessen Gegenstand'', <span style="color:#00B000">[ GOTT ]</span>, ''als schlechthin gegeben (durch den Ausdruck ''':''' er ist'', <span style="color:#00B000">[ GOTT ist wirklich ]</span>'' ) <u>denke</u>, nichts weiter hinzukommen.'' <span style="color:#00B000">[ Beides ist ,bloß gedacht‘ '''!''' ]</span> ''Und so enthält das Wirkliche nichts mehr als das bloß Mögliche. Hundert ‚wirkliche‘ Taler enthalten nicht das mindeste <u>mehr</u>, als hundert ‚mögliche‘. Denn, da diese den'' <span style="color:#00B000">[ gedachten ]</span>'' ‚Begriff‘, jene aber den Gegenstand und dessen'' <span style="color:#00B000">[ gedachte ]</span>'' Position an sich selbst bedeuten, so würde, im Fall dieser'', <span style="color:#00B000">[ die 100, als ,wirklich‘ bloß gedachten Taler ]</span>, ''<u>mehr</u> enthielte als jener,'' <span style="color:#00B000">[ als ihr ‚gedachter‘ Begriff im Verstand, wie ΑNSELM von Canterbury für GOTT, als ‚wirklich‘ Existierenden, argumentierte, …''so würde'' ]</span> ''mein ‚Begriff‘'' <span style="color:#00B000">[ die 100 im Verstand ‚gedachten‘ Taler ]</span> ''nicht den ganzen Gegenstand ausdrücken, und also auch <u>nicht der angemessene Begriff</u> von ihm sein. Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben'', <span style="color:#00B000">[ als bei 100 bloß ‚gedachten‘ Talern ]</span> ... <span style="color:#FF6000">«</span> <span style="color:#00B000"><ref>‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 401; https://www.korpora.org/kant/aa03/401.html</ref></span>.
GÖDEL würde darauf <span style="color:#00B000">(korrespondierend zur aristotelisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition von der Identität von Sein und Wesen in GOTT)</span> antworten ''':'''
::<span style="color:#FF6000">»</span>Die <span style="color:#FF6000">„100 Taler“</span> sind der <span style="color:#FF6000">»''zufälligen Struktur der'' <span style="color:#00B000">[ vergänglichen ]</span> ''Welt''«</span> entnommen, und sind daher nicht mit GOTT vergleichbar, der, <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer Welt, <span style="color:#FF6000">„über“</span> dieser Welt steht. Einzig und allein nur von GOTT gilt ''':''' Der mit Dingen aus unserer Welt ,nicht vergleichbare‘ GOTT, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#FF6000">„existiert notwendig für uns“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘ —</span>, und <span style="color:#FF6000">„notwendiges Existieren, <u>Sein</u>“</span> ,ist‘ eine <span style="color:#FF6000">„positive <u>Wesen</u>seigenschaft“</span> in GOTT, <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>, weil GOTT aus sich <span style="color:#FF6000">„vollkommen“ <span style="color:#00B000">|</span> „perfekt“</span> ist, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span> ''':''' <span style="color:#0000FF; background-color:#FFFF00">‚Sein‘ ist in GOTT ein ‚reales Prädikat‘</span>; <span style="color:#00B000">(notwendige ‚Existenz’ ist eine positive ‚Wesenseigenschaft’ in GOTT)</span>, und nur bei GOTT '''!''' Zum zeitlos-ewigen GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(als methodologische Kalkül-Prämisse)</span>, kann man sagen ''':''' Weil es, wegen Axiom-1 und Axiom-2, <span style="color:#FF6000">„widerspruchsfrei möglich"</span> ist, dass es GOTT gibt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, darum ist GOTT auch das ‚einzige‘ <span style="color:#FF6000">„Wesen“</span>, <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, von dem ein Christ sagen kann, dass es <span style="color:#FF6000">„notwendig aus sich“</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, d.h. <span style="color:#FF6000">„grundlos“ <span style="color:#00B000">|</span> „unverursacht“</span>, für uns immer schon ‚da’ ist, und immer ,da’ sein wird; und zusätzlich gilt ''':''' Es gibt für jede mögliche Welt ‚nur‘ diesen einen GOTT ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx ∧ □∀y(Gy→x=y)'''‘ — </span><span style="color:#00B000">(Monotheïsmus, Korollar-3)</span>; vorausgesetzt, man geht von der ,Existenz’ dieses GOTTES aus, wobei diese Annahme für GÖDEL <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar''«</span> ist.<span style="color:#FF6000">«</span>
Eine Beobachtung ''':''' KANT sagt, gleichsam als ,krönenden‘ Abschluss seiner Widerlegung des, — von ihm so genannten —, ,ontologischen Gottesbeweises‘ ''':''' <span style="color:#FF6000">»</span>''Aber in meinem Vermögenszustande ist <u>mehr</u> bei hundert ‚wirklichen‘ Talern, als bei dem bloßen Begriffe derselben, (d.i. ihrer Möglichkeit).''<span style="color:#FF6000">«</span> Diese Feststellung KANTS entspricht jedoch genau der Argumentation ANSELMS ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span>, d.h. GOTT ,existiert auch in Wirklichkeit‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was <u>mehr</u> ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ein bloßer Begriff ,im Verstand zu sein‘. Der ,Mehr-Wert‘ ergibt sich in beiden Fällen, sowohl bei den Talern als auch bei GOTT, aus der ,Wirklichkeit‘ ihrer Existenz, im Gegensatz zur bloßen, <span style="color:#00B000">(im Begriff gedachten)</span>, ,Möglichkeit‘ ihrer Existenz, so dass, in jedem Fall, der ,Begriff‘ im Verstand ohne Abstriche <span style="color:#FF6000">»</span>''den ganzen Gegenstand ausdrückt''<span style="color:#FF6000">«</span>, und von diesem auch <span style="color:#FF6000">»</span>''der angemessene Begriff''<span style="color:#FF6000">«</span> ist. Alles andere wäre eine ,Lüge‘. Mit dieser ,Beobachtung‘ ist das implizit ,Widersprüchliche‘ in KANTS Argumentation aufgedeckt ''':''' Das Wirkliche in KANTS Vermögenszustande enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, konträr zu seiner vorigen Behauptung ''':''' <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#FF6000">«</span> enthalte <span style="color:#FF6000">»'',nichts mehr‘</span> als das bloß Mögliche''<span style="color:#FF6000">«</span>. Diese Behauptung ist offensichtlich falsch. Das ist somit ein indirekter Beweis und damit eine Bestätigung für die analoge Argumentation ANSELMS aus dem Wiederspruch des Gegenteils, am Beispiel KANTS <span style="color:#FF6000">»</span>''Vermögenzustandes bei hundert wirklichen Talern''<span style="color:#FF6000">«</span>, in dem in Wirklichkeit <span style="color:#FF6000">,doch mehr‘</span> ist, <span style="color:#FF6000">»</span>''als bei dem bloßen Begriffe derselben''<span style="color:#FF6000">«</span>.
<span style="color:#00B000">(Diese ,Beobachtung‘ ist zugleich auch das entscheidende Indiz dafür, dass das systembedingte Konzept KANTS von der ,Existenz‘, bzw. vom ,Sein‘ eines jeden Gegenstandes, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.i. als seine ,Setzung‘ bloß im- und durch den Verstand, ,falsch‘ ist, — d.h. im Klartext ''':''' für KANT ist das ,Sein‘ eines Gegenstandes bloß ein ,Gedanke‘ in uns, wenn er meint, dass uns ein Gegenstand erst dann wirklich ,gegeben‘ sei, wenn wir uns den</span> <span style="color:#FF6000">»</span>''Gegenstand als schlechthin gegeben (durch den Ausdruck : <u>er ist</u>) <u>denken</u>''<span style="color:#FF6000">«</span>, <span style="color:#00B000">was nur dem Irrtum einer falschen System-Konzeption geschuldet sein kann. Auf Grund dieser Konzeption ist das</span> <span style="color:#FF6000">»</span>''Ding, wie es an sich selbst ist''<span style="color:#FF6000">«</span>, <span style="color:#00B000">für KANT systembedingt weder ,anschaubar‘, noch ,erkennbar‘. Diese falsche Konzeption über die ,Existenz‘, bzw. das ,Sein‘ eines Dinges, als</span> <span style="color:#FF6000">»</span>''dessen bloße Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">ist für KANT letztendlich auch die Beweisgrundlage und Voraussetzung für seine Ablehnung des ontologischen Argumentes für GOTT im Theorem ANSELMS. Wenn das ,wirkliche‘ Sein eines Dinges nichts anderes ist, als</span> <span style="color:#FF6000">»</span>''dessen'' <span style="color:#00B000">[ bloß gedachte ]</span> ''Position''<span style="color:#FF6000">«</span>, <span style="color:#00B000">d.h. als seine ,mögliche‘ Setzung bloß im- und durch den Verstand, — das ist das, als ,wirklich‘ bloß nur ,gedachte‘ Ding —, dann</span> <span style="color:#FF6000">»</span>''enthält''<span style="color:#FF6000">«</span> <span style="color:#00B000">natürlich</span> <span style="color:#FF6000">»</span>''das Wirkliche''<span style="color:#00B000">, [ als die bloß gedachte Existenz ],</span> ''nichts mehr als das bloß Mögliche''<span style="color:#00B000">, [ als der gedachte Begriff ]<span style="color:#FF6000">«</span>, was offensichtlich unhaltbar ist. <span style="color:#4C58FF">[ Modus tollendo tollens ] </span> ''':''' Wenn die Konsequenz einer Wenn-Dann-Folgerung ,falsch‘ ist, dann ist auch ihre Voraussetzung, das System-Konzept KANTS, ,falsch‘ ''':''' d.i. seine ,Kopernikanische Wende‘ für die Metaphysik, soweit sie KANTS ,Sein’-Konzept betrifft. Korrekt und ,wahr‘ ist in jedem Fall ''':''' Das Wirkliche enthält <span style="color:#FF6000">,doch mehr‘</span> als das bloß Mögliche, und die Dinge ,existieren‘ schon immer unabhängig von unserem Denken. ,Existenz‘, das ,Sein‘, ist <span style="color:#FF6000">,doch mehr‘</span>, als bloß ein ,Gedanke‘ von uns.)</span>
Somit ist die Argumentation KANTS gegen den ontologischen Beweis ANSELMS für GOTT ,falsch‘ und unhaltbar, weil sie auf der ,falschen‘ Voraussetzung beruht ''':''' die ,Existenz‘, bzw. das ,Sein‘ eines jeden ,Gegenstandes‘, — wie z. B. auch die Existenz bei GOTT —, sei bloß dessen gedachte ,Position‘ an sich selbst, d.h. bloß seine ,Setzung‘ im- und durch den Verstand. Damit ,macht‘ er GOTT außerdem zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, und verkennt so, — wie vor ihm THOMAS von Aquin —, auch die Einzigartigkeit und Exklusivität GOTTES im Theorem ANSELMS.
<div class="center">Die <span style="color:#FF6000">„Rede von GOTT“</span> in der philosophischen Tradition</div>
Wenn man die philosophische Tradition der <span style="color:#FF6000">„Rede von GOTT“</span> im Lichte der Ergebnisse der <span style="color:#4C58FF">„axiomatischen Theologie“</span> GÖDELS liest, dann stellt sie sich am Beispiel bei ARISTOTELES, — AVICENNA, — ANSELM, und bei GÖDEL wie folgt dar ''':'''
<span style="color:#FF6000">»''Das Erstbewegende,'' (<span style="font-family: Times;"><big>,πρῶτον κινοῦν‘</big></span>), ''das, ohne selbst ‚bewegt‘ zu sein'', (<span style="font-family: Times;"><big>,ἀκίνητον‘</big></span> <span style="color:#00B000">| ''unverursacht, ,entstehungslos‘'' |</span> ), ''alles Übrige wie ein Geliebtes ‚bewegt‘'', (<span style="font-family: Times;"><big>,κινεῖ δὴ ὡς ἐρώμενον‘</big></span> <span style="color:#00B000"> | ''-verursacht, ,entstehen‘ lässt'' |</span> ), ''ist sowohl'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚Wesen‘'', (<span style="font-family: Times;"><big>,ἀΐδιον καί οὐσία‘</big></span> <span style="color:#00B000">| ''‚Substanz‘'' |</span> ), ''als auch'' <span style="color:#00B000">[ zeitlich-]</span>''ewiges ‚wirksames, verwirklichendes Sein‘'', (<span style="font-family: Times;"><big>‚ἀΐδιον καί ἐνέργεια οὖσα‘ = ‚actus purus‘</big></span><span style="color:#00B000"> | '',reine Tätigkeit‘'' |</span> ), … ''ersehnt'', (<span style="font-family: Times;"><big>,ὀρεκτόν‘</big></span>), ''und erkennbar'', (<span style="font-family: Times;"><big>,νοητόν‘</big></span>), ... ''denn dies ist der ‚Gott‘'', (<span style="font-family: Times;"><big>,τοῦτο γὰρ ὁ θεός‘</big></span>), <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, ''der'' <span style="color:#00B000">[ zeitlich-]</span>''Ewige'', (<span style="font-family: Times;"><big>,ἀΐδιον‘</big></span>), — ''der Unvergleichliche'', (<span style="font-family: Times;"><big>,ἄριστον‘</big></span> <span style="color:#00B000">| ''‚der Beste‘'' |</span> ), — ''der Lebendige'', (<span style="font-family: Times;"><big>,ζῷον‘</big></span> <span style="color:#00B000">| ,''das Leben selbst‘'' |</span> ), — ... ''so sagen wir ja'', (<span style="font-family: Times;"><big>,φαμὲν δὴ‘</big></span>), — ...«</span> ''':''' <span style="color:#00B000">(ARISTOTELES — Grieche)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„GOTT“</span>, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, als ,Individuumname‘, ist synonym mit <span style="color:#FF6000">„göttliches ‚Da-Sein’“</span>, das sowohl <span style="color:#FF6000">„aus sich vollkommen“</span>, als auch <span style="color:#FF6000">„notwendig für uns“</span> ‚da‘ ist; <span style="color:#00B000">(das ist das, an sich, vollkommene ‚Was-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ — </span>, das zugleich, für uns, das notwendige ‚Da-Sein‘ GOTTES ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> — ist)</span>; <span style="color:#CC66FF">„von Ewigkeit zu Ewigkeit“</span>. Das ist der <u>angemessene Begriff</u> von GOTT, und gilt ‚nur‘ von GOTT. Weil GOTT <span style="color:#FF6000">„vollkommen“</span> ist, ist <span style="color:#FF6000">„Da-Sein“ <span style="color:#00B000">|</span> „GOTT-Sein“ <span style="color:#00B000">|</span> „Göttlichkeit“</span> das <span style="color:#FF6000">„Wesen“</span> GOTTES ''':''' <span style="color:#4C58FF">— ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span>. Im Unendlichen, GOTT, sind <span style="color:#FF6000">„Essenz“</span> und <span style="color:#FF6000">„Existenz“</span> koinzident ,eins‘, und daher untrennbar, und <span style="color:#FF6000">»''darum ist GOTT das einzige ‚Sein’, das notwendig an sich ‚da‘ ist''«</span> ''':''' <span style="color:#00B000">(ABU ALI SINA alias AVICENNA — Muslim)</span>.
Der <span style="color:#00B000">(gedachte)</span> ‚Eigenschafts-Begriff‘ <span style="color:#FF6000">„Vollkommenheit (die Größe) GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, <span style="color:#00B000">(‚Perfektion‘, die unbegrenzte Summe aller ‚positiven Eigenschaften‘ in GOTT)</span> schließt koinzident die ‚Eigenschaft’ <span style="color:#FF6000">„notwendige Existenz für uns“</span> mit ein ''':''' <span style="color:#4C58FF">— ‚'''PE'''<sub>not</sub>‘ —</span>. GOTT wäre nicht <span style="color:#FF6000">„vollkommen“</span>, wenn er nicht auch real für uns ‚da‘ wäre, wenn er nicht ,immer schon’ <span style="color:#FF6000">„existierte“</span>. ‚Sein’ ist <u>mehr</u> als ‚Nicht-Sein’. ,Sein’, bzw. ,Existenz’ gehört in GOTT zu den ,Transzendentalia’. Das sind die <span style="color:#00B000">(ultimativen)</span> ,Wesenseigenschaften’ in GOTT. Der unbegrenzt Unendliche, GOTT, ist daher das <span style="color:#FF6000">»''vollkommenste Wesen, über das nichts ,Größeres‘ d.h. Vollkommeneres <u>mehr</u> ‚gedacht‘ werden kann''«</span> ''':''' <span style="color:#00B000">(ANSELM von Canterbury — Christ)</span>.
Der ‚Begriff’ <span style="color:#FF6000">„Perfektion GOTTES“</span>, <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schließt koinzident das <span style="color:#FF6000">„notwendige Dasein GOTTES“</span>, <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x'''‘</span> —, für uns mit ein, ohne einen zeitlichen Anfang und ohne ein zeitliches Ende. Das ist die ‚zeitlos-ewige‘, an sich absolute, und <span style="color:#FF6000">„für uns notwendige Existenz GOTTES“</span> ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#00B000">(Das ist ein ,regulär‘-mögliches Korollar im 2. Beweisgang aus Term :16: ''':''' <span style="color:#4C58FF">— ‚'''Gy→Yy'''‘ —</span>, mit der <span style="color:#4C58FF">[ Instanz(Y:=E<sub>not</sub>) ]</span>, und der <span style="color:#4C58FF">[ FUB(y:=x) ]</span>; und auch ein ,regulär‘-mögliches Korollar im 3. Beweisgang ''':''' entsprechend der <span style="color:#FF6000">„logischen Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A → B ]</span> von Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> und Term :05: <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span> aus diesem Beweisgang. In Worten ''':''' <span style="color:#FF6000">»</span>''Angenommen, '' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> ''steht für den GOTT der Christen'' ''':''' <span style="color:#4C58FF">— ‚'''G'''‘ — </span>, ''dann existiert dieser GOTT'', <span style="color:#4C58FF">— ‚'''x'''‘ —</span>, ''für uns notwendig'', <span style="color:#4C58FF">— <sub>not</sub> —</span> <span style="color:#FF6000">«</span>.)</span> Der Unendliche, GOTT, ist <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer ‚vergänglichen‘, ,endlichen‘ Welt, welche prinzipiell vom dreidimensionalen Raum und von der unwiederbringlich ‚vergehenden‘ Zeit geprägt ist. Der ,GOTT der Christen‘ ist <span style="color:#FF6000">»''unabhängig''«</span> von dieser <span style="color:#FF6600">„vergehenden Raum-Zeit“, — »''jenes rätselhafte und anscheinend in sich widersprüchliche Etwas''« <span style="color:#00B000">(GÖDEL)<ref>Kurt GÖDEL, ‚''<span style="font-family: Times;"><big>Eine Bemerkung über die Beziehungen zwischen der Relativitätstheorie und der idealistischen Philosophie‘</big></span>'', in P.A.SCHILPP (Hg.): ‚''<span style="font-family: Times;"><big>Albert Einstein, Philosoph und Naturforscher‘</big></span>'', Seite 406</ref></span> —</span>. Ohne ‚Zeit‘ gibt es keinen zeitlichen Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘, <span style="color:#00B000">(beides ist zeitlos ,eins‘)</span>, und so ist der zeitlos-ewige GOTT, der <span style="color:#FF6000">»''notwendig aus sich ,existiert‘'' «</span> ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ — </span>, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „ursprungslos“</span> für uns immer schon ‚da‘ ''':''' <span style="color:#00B000">(GÖDEL — ohne religiöses Bekenntnis)</span>.
Mit dem GÖDEL-Kalkül ist die <span style="color:#FF6000">„Rede von GOTT“</span> auf eine ‚vernünftige Basis‘ gestellt worden, und ist somit für jeden Menschen nachvollziehbar, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>, wie obige Beispiele zeigen.
'''Resümee :'''
Das GÖDEL-Kalkül zeigt mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, was notwendig folgt, wenn die Axiome ‚wahr‘ sind, <span style="color:#00B000">(die Axiome bilden formal-syntaktisch <span style="color:#FF6000">»''die theologische Weltanschauung''«</span> ab)</span>, unter der Voraussetzung, dass die Axiome <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>'' Struktur''«</span> unserer Welt sind. Die ,Verifikation‘ der Axiome und Definitionen von GOTT und seiner Vollkommenheiten gelingt GÖDEL, — entsprechend seiner Unabhängigkeits-Bedingung —, durch den Aufweis ihrer Widerspruchsfreiheit ''':''' sie sind somit ,wahr‘ und, — im Kontext einer <span style="color:#FF6000">»''theologischen Weltanschauung''«</span> —, auch ,annehmbar‘ in unserer ,realen‘ Welt ''':''' <span style="color:#00B000">(siehe Anhang, 2. Beweisgang und Anmerkung-2)</span>. Er vermeidet damit den Fehler, der immer wieder im Diskurs über Gottesbeweise gemacht wird ''':''' GOTT mit seinen Geschöpfen zu vergleichen. Diese logisch-philosophische Rede von GOTT <span style="color:#00B000">(<span style="color:#FF6000">»''ohne sich auf den Glauben an irgendeine Religion zu stützen''«</span>)</span> hat eine <u>mehr</u> als zweitausendjährige Tradition hinter sich. Der <span style="color:#FF6000">„100-Taler-Gott“</span> des Philosophen KANT, hat heute, nachdem der Logiker und Systemtheoretiker GÖDEL sein System vorgelegt hat, an ‚Strahlkraft‘ verloren.
Kurt GÖDEL ''':'''
::<span style="color:#FF6000">» ''Die theologische Weltanschauung'', <span style="color:#00B000">[ dass GOTT für uns immer schon ‚da‘ ist ]</span>, ''ist rein verstandesmäßig mit allen bekannten Tatsachen durchaus vereinbar'';«</span> <span style="color:#00B000">[ d.h. sie ist das ,Resultat‘ der, — vom Glauben geleiteten —, ‚theoretischen Vernunft‘, alias ‚reinen Vernunft‘, und nicht bloß das ‚Postulat‘ einer ‚praktischen Vernunft‘, wie KANT meint ]. <span style="color:#FF6000">»''Der'' <span style="color:#00B000">[ christliche ]</span> ''Glaube ist die ‚Pupille‘ im ‚Auge‘ unseres Verstandes.''«</span> (Heilige KATHARINA von Siena, Lehrerin der Kirche, Patronin Europas<ref>vgl. <span style="font-family: Times;"><big>''Gebet 7 ‚Für die neuen Kardinäle‘, Rom, 21. Dezember 1378,''</big></span> aus <span style="font-family: Times;"><big>''Caterina von Siena ,Die Gebete‘.''</big></span> Kleinhain 2019, online: https://caterina.at/werke/gebete/gebete-detailansicht/gebet-7.html</ref> )</span>
Der sonst so rationale KANT, hier doch etwas emotionell, <span style="color:#00B000">(als wolle er die Ergebnisse im GÖDEL-Kalkül nicht wahr haben, die belegen, dass er sich bei GOTT geirrt, und die Funktion des christlichen Glaubens für die Philosophie falsch eingeschätzt hat)</span> ''':'''
::<span style="color:#FF6000">»</span> ''Es war etwas ganz Unnatürliches und eine bloße Neuerung des Schulwitzes, aus einer ganz willkürlich entworfenen Idee das Dasein des ihr entsprechenden Gegenstandes selbst ausklauben zu wollen''<ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 403. https://www.korpora.org/kant/aa03/403.html</ref>.<span style="color:#FF6000">«</span>
Für KANT, für die Scholastiker, <span style="color:#00B000">(und auch für uns)</span>, ist es natürlich ‚logisch‘, dass aus einem als ‚möglich’ gedachten Begriff, <span style="color:#FF6000">»</span>''aus einer ganz willkürlich entworfenen Idee''<span style="color:#FF6000">«</span>, keine Existenzaussage abgeleitet werden kann. <span style="color:#00B000">(Aus dem bloß gedachten Begriff ,goldene Berge‘ folgt natürlich nicht, dass es solche in Wirklichkeit auch gibt.)</span> In der philosophisch-<span style="color:#4C58FF">,theologischen’</span> Tradition, die von ARISTOTELES herkommt, ist der Begriff <span style="color:#FF6000">»''GOTT''«</span> jedoch von allen anderen Begriffen so verschieden, so dass für GOTT diese Logik KANTS nicht mehr gilt. GOTT ist ,unvergleichlich‘ und ,einzigartig‘.
Dazu der Kommentar von HEGEL ''':'''
::<span style="color:#FF6000">»''Wenn KANT sagt, man könne aus dem Begriff'' <span style="color:#00B000">[ ‚GOTT‘ ]</span> ''die Realität nicht ,herausklauben‘, so ist da der Begriff als endlich gefasst''.« <span style="color:#00B000">[ In der Endlichkeit unserer Welt trifft die Logik KANTS zu, dass dem ‚Begriff‘ nicht ,notwendig‘ das ‚Sein‘ folgt, denn es gibt in ihr die ,Lüge‘, die das ,Wirklich-Sein‘ im Begriff bloß behauptet, ohne dass es ,in Wirklichkeit‘ zutrifft, was sie behauptet. Es gilt hier nach KANT ''':''' »''Sein ist kein reales Prädikat''«. Somit ist ]</span> »''...der Begriff ohne'' <span style="color:#00B000">[ reales ]</span> ''Sein ein Einseitiges und Unwahres, und ebenso das Sein, in dem kein Begriff ist'', <span style="color:#00B000">[ ist ]</span> ''das begrifflose Sein,'' <span style="color:#00B000">[ d.i. das relative ,Noch-Nicht-Begriffene‘ ]</span>.'' Dieser Gegensatz, der in die Endlichkeit fällt'' <span style="color:#00B000">[ im Endlichen zutrifft ]</span>, ''kann bei dem Unendlichen, GOTT, gar nicht statthaben''<ref>Georg Wilhelm Friedrich HEGEL, ‚<span style="font-family: Times;"><big>''Ausführungen des ontologischen Beweises''</big></span>‘ in den ‚<span style="font-family: Times;"><big>''Vorlesungen über die Philosophie der Religion vom Jahr 1831''</big></span>‘ . Hamburg 1966, Seiten 175 bzw. 174</ref>; <span style="color:#00B000">[ denn ,Begriff‘, bzw. ,Denken‘ und ,Sein‘ sind in dem Unendlichen, GOTT, untrennbar und real immer dasselbe. Auf Grund dieser ontologischen Identität ,personifiziert‘ und ,repräsentiert‘ GOTT die ,Wahrheit‘ ''':''' GOTT ist die ,Wahrheit‘. In GOTT, dem <span style="color:#FF6000">„Schöpfer der Welt“</span>, folgt dem ,Begriff‘ immer ,notwendig‘ das ,Sein‘ ''':''' <span style="color:#CC66FF">»''GOTT sprach ''':''' Es werde ,Licht‘. Und es wurde Licht''«, <small>{{Bibel | Genesis |1|3|EU}}</small>;</span> oder auch ''':''' <span style="color:#CC66FF">»''Der Herr sprach, und sogleich geschah es; er gebot, und alles war da''«,</span> <small>{{Bibel | Psalm |33|9|EU}}</small>.]</span>«</span>
Das Entscheidende bei der <span style="color:#4C58FF">„theologischen“</span> Interpretation des GÖDEL-Kalküls ist, dass der <span style="color:#00B000">(Begriff)</span> GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, nicht auf die Ebene seiner ,endlichen‘ Geschöpfe und unserer Welt gestellt wird, <span style="color:#00B000">(d.i. das ‚Universum‘ im ,Urknall‘, die ‚100-Taler‘, ein ‚Tsunami‘, auch ,einfache Modelle‘ von unserer Welt, etc.)</span>, und damit verglichen wird, sondern, dass der GOTT der Christen in seiner Einzigartigkeit und Besonderheit als <span style="color:#FF6000">»''der Unendliche''«</span> belassen und als <span style="color:#FF6000">»''unabhängig von der zufälligen'' <span style="color:#00B000">[ Raum-Zeit-]</span>''Struktur''«</span> unserer vergänglichen Welt, — als <span style="color:#FF6000">»''der Unvergleichliche''«</span> —, verstanden wird. <span style="color:#00B000">(Alle Kritiken des sog. ,ontologischen‘ Gottesbeweises übersehen die Einzigartigkeit und Besonderheit des <span style="color:#FF6000">»''Unendlichen''«</span>, und/oder wollen diese nicht ,wahr‘ haben.)</span> Auch THOMAS von Aquin ,verortet‘ den GOTT ANSELMS, — in seiner Kritik an dessen Theorem —, irrtümlich unter die ,Dinge‘ der uns umgebenden ,Natur‘, wenn er sagt ''':''' GOTT <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse in rerum natura</big></span>“</span>, d.h. wörtlich, dass der GOTT ANSELMS <span style="color:#FF6000">»</span>''in der Natur der Dinge'' <span style="color:#00B000">(unserer Welt)</span> ''existiert''<span style="color:#FF6000">«</span>, und verkennt somit, — wie nach ihm auch KANT —, die ,Unvergleichlichkeit‘ GOTTES, <span style="color:#00B000">(vgl. STh I q.2 a.1 ad 2<ref>„Deus … illud quo maius cogitari non potest; non tamen propter hoc sequitur quod intelligat id quod significatur per nomen, esse in rerum natura; sed in apprehensione intellectus tantum.“ ——— »''GOTT ist'' (nach ANSELM) ''der, über den Größeres nicht mehr gedacht werden kann. Aber nicht deswegen, weil er'', (der Narr von Psalm 14.1, den ANSELM zitiert), ''das versteht, was durch diesen Namen,'' (d.h. mit dem Begriff ,GOTT‘, als der ,Größte‘, im Theorem ANSELMS), ''bezeichnet wird, folgt daraus'', (wie ANSELM meint), ''dass er auch versteht, dass er'', (der GOTT ANSELMS), ''auch in der ,Natur‘ der Dinge'' (unserer Welt) ''existiert''; <span style="color:#00B000">[ was ANSELM so nie gesagt hat ]</span>. ''Daraus folgt nur, dass er'', (als ,GOTT‘), ''bloß in der Auffassung seines Verstandes'', (d.h. nur im Denken des Narren als ,Begriff‘), ''existiert.''« ——— Hier ,verortet‘ THOMAS einerseits den unendlichen GOTT, von dem das Theorem ANSELMS spricht, irrtümlich unter die endlichen Dinge der uns umgebenden ,Natur‘, was sachlich dem theologischen Theorem der Unvergleichlichkeit GOTTES widerspricht, der nicht unter die Dinge unserer Welt eingereiht werden darf. Anderseits verliert er dadurch auch den ,Blick‘ für die Außerordentlichkeit und Besonderheit GOTTES, dessen Natur völlig verschieden und unabhängig von der ,Natur‘ unserer raum-zeitlichen Welt ist. GÖDEL beweist jedoch, mit ANSELM, weil es notwendig, ohne Widerspruch, (»''bloß in der Auffassung unseres Verstandes''«), möglich ist, dass GOTT existiert, ist es korrekt, daraus auch mit Notwendigkeit zu folgern, dass der Glaube des Erzbischofs ANSELM, und der Glaube seiner Anvertrauten, von der Wirklichkeit GOTTES, widerspruchsfrei, logisch richtig, und damit sinnvoll ist; denn Möglichkeit und Wirklichkeit sind in GOTT koinzident ,eins‘. Das ist das Privilegium GOTTES allein, der einzigartig und unvergleichlich ist. Damit zeigt er auf, dass THOMAS die Unvergleichlichkeit und Einzigartigkeit GOTTES in seinem Vorhalt nicht bedacht hat; und außerdem ANSELM missverstanden hat.</ref>)</span>; jedenfalls hier in der Auseinandersetzung mit ANSELM. Dagegen spricht ANSELM im ,''<span style="font-family: Times;"><big>Proslogion</big></span>''‘, Seite 85f, nur von einem <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse et in re</big></span>“</span> GOTTES, d.h. dass GOTT ,auch in Wirklichkeit existiert‘, <span style="color:#FF6000">„<span style="font-family: Times;"><big>quod maius est</big></span>“</span>, was ,größer‘, bzw. ,mehr‘ ist, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>esse solo in intellectu</big></span>“</span>, als nur ,im Verstand zu sein‘; wobei die ,zeitlose-überzeitliche‘ Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES jedoch völlig verschieden und <span style="color:#FF6000">»''unabhängig von der zufälligen''«</span> Wirklichkeit <span style="color:#00B000">(die ,Natur‘)</span> der ,raum-zeitlichen‘ Welt der Dinge ist. Daher ist sie mit dieser auch nicht vergleichbar. GOTT ist <span style="color:#FF6000">„vollkommen“</span> und alle <span style="color:#FF6000">„Vollkommenheiten“</span> in GOTT, <span style="color:#00B000">(die ultimativen ,Transzendentalia‘)</span>, sind koinzident ,eins‘, — ,fallen <span style="color:#FF6000">„notwendig“</span> perspektivisch in eins zusammen‘, und sind daher konvertierbar. Darum ist auch die Wirklichkeit, <span style="color:#00B000">(Natur)</span>, GOTTES ,einzigartig‘ und ,unvergleichlich‘.
Mit Korollar-3 ist die Exklusivität und Außerordentlichkeit GOTTES definitiv im Kalkül ,bewiesen‘ <span style="color:#00B000">( ╞ )</span>. Der abendländische Monotheïsmus ist somit eine ,logische‘ Konsequenz aus den GÖDEL-Axiomen. <span style="color:#00B000">(Das <span style="color:#4C58FF">„theologische“</span> Theorem von der ,Einzigartigkeit‘ und Exklusivität GOTTES, d.h. hier im Kontext ''':''' die exklusive Einheit von GOTT und Mensch in JESUS CHRISTUS; von Vater, Sohn und Geist im <span style="color:#4C58FF">„Dreifaltigen“</span>; von Essenz und Existenz, von Begriff und Sein, von Ursache und Wirkung, von Subjekt und Objekt, von Möglichkeit und Wirklichkeit, und die unbegrenzte Summeneinheit und Koinzidenz der unendlichen Transzendentalien in GOTT, ist, — mit HEGEL —, die Voraussetzung und Bedingung jeder Philosophie ''':''' <span style="color:#FF6000">»''Die Einheit muss am Anfang der Philosophie stehen''«</span>; und ist zugleich auch ihr gesuchtes und bewiesenes Endergebnis und Ziel ''':''' <span style="color:#FF6000">»''Diese Einheit muss auch das Resultat der Philosophie sein''«</span><ref>https://hegel-system.de/de/gottesbeweis.htm#hegels-kritik-an-kant</ref>, was hier im GÖDEL-Kalkül ,logisch‘ mit Korollar-3 verifiziert wird ''':''' <span style="color:#4C58FF">— ‚'''□(∃xGx ∧ ∀y(Gy→x=y))'''‘ —</span> ''':''' <span style="color:#FF6000">»''GOTT ist exklusiv einzigartig''«</span>.)</span>
Die Einzigartigkeit GOTTES bedingt die Koinzidenz, den inneren Zusammenhang aller seiner Vollkommenheiten und Zuschreibungen, <span style="color:#00B000">(Axiom-2)</span>, d.h. ihr paarweise, perspektivisches ,Zusammenfallen in eins‘ im Unendlichen, GOTT. ——— Aus der Notwendigkeit aller positiven Eigenschaften und Zuschreibungen, <span style="color:#00B000">(d.h. aus den, an sich, notwendigen, ultimativen Transzendentalien, Axiom-4)</span>, die in GOTT paarweise, als ,Wesenseigenschaften‘ koinzident ,eins‘ sind, <span style="color:#00B000">(Definition-2)</span>, ist die Einzigkeit GOTTES für uns erschließbar, <span style="color:#00B000">(Korollar-3)</span>. Axiom-4 ist die erste, ,modal‘ <span style="color:#FF6000">„notwendige“</span>, d.h. die transzendentale Voraussetzung für Korollar-3.
Wenn im Korollar-3 das <span style="color:#4C58FF">— ‚'''x'''‘ —</span> z. B. für GOTT, dem ,Vater‘ der Christen, und das <span style="color:#4C58FF">— ‚'''y'''‘ —</span> für GOTT, dem ,Sohn‘, d.h. für ,JESUS CHRISTUS‘ steht, oder für den ,HEILIGEN GEIST‘, <span style="color:#00B000">(den ,Dreifaltigen GOTT‘ der Christenheit)</span>; oder auch für die Gottesbezeichnung ,GOTT-ADONAI‘ der Juden, oder für die Gottesbezeichnung ,ALLAH‘ der Muslime steht, dann weist dieses Korollar, für <span style="color:#4C58FF">— ‚'''∀y'''‘ —</span>, mit der ,ontologischen Identität‘ ''':''' <span style="color:#4C58FF">— ‚'''x=y'''‘ —</span>, auf die ,Koinzidenz‘ des <span style="color:#4C58FF">„Dreifaltigen“</span>, und auf die <span style="color:#4C58FF">„Hypostatische Union“</span> der Naturen von GOTT und Mensch in JESUS CHRISTUS,
bzw. auch auf den inneren Zusammenhang der drei Buch-Religionen hin.
===<div class="center"><span style="color:#660066">Anhang : das GÖDEL-Kalkül</span></div>===
In der ,Legende zum GÖDEL-Kalkül‘ wird an einige Basics erinnert, und diese für die operative Praxis im anstehenden Kalkül, mit Hilfe von logischen Meta-Terme, adaptiert. Zusätzliche, notwendige Regeln und Gesetze werden dann ,benannt‘, wenn sie in der Kalkül-Durchführung auftreten.
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">Legende zum GÖDEL-Kalkül</span></div>
|-
|
<small>
<math>\begin{align}
{\color{blue}\text{ ◇}} \text{ :: konsistent ↔ widerspruchsfrei ↔ möglich ↔ denkbar, } & {\color{blue}\text{ □}} \text{ :: notwendig ↔ wirklich, für jede mögliche Welt ↔ exklusiv} \\
\text{logischer Meta-Term ::} {\color{blue}\text{ [ A ├ B ]}} \text{ ::} & \text{ „aus A folgt im Kalkül ,regulär‘ (├ ) B.“} \\
\text{ A, B sind Aussagen über Eigenschaften, (A ist keine Eigenschaft);} & \text{ die Aussage, z.B. in der Kalkül-Zeile 10, wird als ,Term :10:‘ bezeichnet} \\
{\color{blue}\text{ AE}} \text{ ::} & \text{ Argument Einführung, Prämisse, Postulat } \\
{\color{blue}\text{ Xx}} \text{ ::} & \text{ „X ist eine Eigenschaft der Individuum-Variable x.“ } \\
{\color{blue}\text{ ¬PX}} \text{ ::} & \text{ „X ist keine positive Eigenschaft, ist keine Perfektion, ist nicht vollkommen.“ } \\
{\color{blue}\text{ Instanz(X := Y)}} \text{ ::} & \text{ Substitution der Eigenschaft X durch die ,bestimmte‘ Eigenschaft Y } \\
\text{ (Eine ,Instanz‘ ist ein Exemplar aus einer Menge gleichartiger Dinge;} & \text{ hier die ,bestimmte‘ Eigenschaft Y, als Ersatz für das unbestimmte X.) } \\
{\color{blue}\text{ FUB(x := y)}} \text{ ::} & \text{ Freie-Um-Benennung der Individuum-Variable x in y } \\
\text{ ,modal‘-frei gewählte Kalkül-Prämisse ::} {\color{blue}\text{ Gx}} \text{ ::} & \text{ „Die Variable x steht für den GOTT der Christen.“ } \\
{\color{blue}\text{ [ G(y) ├ ⱯyG(y) ]}} \text{ ::} & \text{ All-Operator-Einführung der Variable y für GOTT } \\
\text{ „Angenommen, die Variable y steht für GOTT, dann } & \text{folgt ,regulär‘ (├ ), dass auch jedes y im Kalkül für GOTT steht.“}\\
{\color{blue}\text{[ ⱯXA(X) ├ A(X) ]}} \text{ ::} & \text{ All-Operator-Beseitigung für die substituierte Eigenschaft X } \\
\text{ „Wenn X durch eine ,bestimmte‘ Eigenschaft ,instanziiert‘ ist oder } & \text{wird, dann kann der All-Operator von X ,regulär‘ (├ ) beseitigt werden.}\\
{\color{blue}\text{ KOMM(↔)}} \text{ ::} & \;{\color{blue}\text{[ (A↔ B) ↔ (B ↔ A) ]}} \text{ :: Kommutativgesetz für ( ↔ )}\\
{\color{blue}\text{ DIST(□∧)}} \text{ ::} & \;{\color{blue}\text{[ (□A ∧ □B) ↔ □(A ∧ B) ]}} \text{ :: Distributivgesetz für (□∧ )} \\
\text{ (hypothetischer Syllogismus, häufige logische Schlussregel) ::} & \;{\color{blue}\text{[ A → B, A ├ B ]}} \text{ :: (Modus ponendo ponens) :: Abtrennregel.} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn A wahr ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch B wahr ist.“} \\
\text{ (negativer hypothetischer Syllogismus) ::} & \;{\color{blue}\text{[ A → B, ¬B ├ ¬A ]}} \text{ :: (Modus tollendo tollens)} \\
\text{ „Wenn es wahr ist, dass aus A ein B folgt, und wenn B falsch ist, } & \text{dann ist im Kalkül ,regulär‘ (├ ) ableitbar, dass auch A falsch ist.“} \\
\text{''KONDITIONALER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ A ├ B ╞ A → B ]}} \text{ :: (logische Implikation)} \\
\text{ „Angenommen, A ist ,regulär‘ Axiom oder Prämisse, und B ist im } & \text{Kalkül ,regulär‘ abgeleitet, dann ist ,bewiesen‘ ( ╞ ) : A impliziert B, ist wahr.“} \\
\text{''INDIREKTER BEWEIS“ ::} & \;{\color{blue}\text{[ ├ ¬A → F ╞ A ]}} \text{ :: (Reductio ad absurdum)} \\
\text{ „Wenn im Kalkül aus ¬A ,regulär‘ eine Kontradiktion } & \text{F folgt, dann ist A ,bewiesen‘ ( ╞ ) : A ist ,wahr‘.“} \\
\end{align}</math>
</small>
|}
A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Eine Prädikatenlogik zweiter Stufe ist eine Logik, in der die Quantoren auch Eigenschaftsausdrücke <span style="color:#00B000">(<span style="color:#FF6000">„Prädikate”</span>)</span> binden können''. <span style="color:#00B000">[ Die ,Prädikate‘ werden in einem Kalkül dieser Logik durch Definitionen ,bestimmt‘ ]</span>. ''Wir werden uns im folgenden recht frei einer dafür geeigneten formalen Sprache bedienen. Äußere Quantoren werden meist weggelassen und wir schreiben kurz'' <span style="color:#4C58FF">— ‚'''Xx'''‘ — </span> ''bzw.'' <span style="color:#4C58FF">— ‚'''PX'''‘ — </span> ''um auszudrücken, dass das Individuum'' <span style="color:#4C58FF">— ‚'''x'''‘ — </span> ''die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''hat, bzw. dass die Eigenschaft'' <span style="color:#4C58FF">— ‚'''X'''‘ — </span> ''die höherstufige Eigenschaft'' <span style="color:#4C58FF">— ‚'''P'''‘ — </span> ''<span style="color:#00B000">(für <span style="color:#FF6000">„positiv”</span>)</span> hat;'' <span style="color:#00B000"> [ wobei die Eigenschaft <span style="color:#4C58FF">— ‚'''P'''‘ — </span> als einzige im Kalkül ,unbestimmt‘ bleibt ]</span>. <span style="color:#FF6000">«</span><ref>A. FUHRMANN ‚''<span style="font-family: Times;"><big>‚G‘ wie Gödel. Kurt Gödels axiomatische Theologie</big></span>''‘, Seite 6, Anmerkung 3. Konform mit seinem Artikel in ‚''<span style="font-family: Times;"><big>Logik in der Philosophie</big></span>''‘ hg. v. P. SCHROEDER-HEISTER, W. SPOHN und E. OLSSON. 2005, Synchron, Heidelberg.</ref>
Der All-Quantor für Eigenschaften, hier im GÖDEL-Kalkül der ,modalen‘ Prädikatenlogik zweiter Stufe, bindet die ,unbestimmte‘ Eigenschafts-Variable <span style="color:#4C58FF">— ‚'''X'''‘ —</span> ausschließlich nur in den Definitionen im 2. und 3. Beweisgang; <span style="color:#00B000">(im ersten Beweisgang gibt es keine Definition)</span>. Wobei diese Definitionen auch nur dann <span style="color:#FF6000">„wahr und widerspruchsfrei”</span> sind, wenn ihre Eigenschafts-Variablen ausschließlich mit ,Transzendentalien‘ belegt werden. Andernfalls sind sie sofort <span style="color:#FF6000">„modal falsch”</span>. Dieser All-Quantor wird dann jedes Mal in der Beweis-Durchführung durch die Substitution ''':''' <span style="color:#4C58FF"> [ Instanz(X:= ..) ]</span> mit ,bestimmte‘ Eigenschafts-Konstanten wie <span style="color:#4C58FF">— (X:= G) —</span>, bzw. <span style="color:#4C58FF">— (X:= ¬Y) —</span>, oder <span style="color:#4C58FF">— (X:= E<sub>not</sub>) —</span> ,regulär‘ <span style="color:#00B000">(├ )</span> beseitigt ''':''' <span style="color:#4C58FF"> [ ⱯXA(X) ├ A(X) ]</span>; wobei die Eigenschafts-Konstante im Kalkül entweder als Zwischenergebnis ,regulär‘ abgeleitet, <span style="color:#00B000">(,errechnet‘)</span>, oder mit einer Definition schon ,bestimmt‘ worden ist.
Die spezifische ‚Eigenschaft‘ einer Eigenschaft wird hier, in der formalen Syntax der ,modalen‘ Prädikatenlogik zweiter Stufe, als eine tiefer gestellte Abkürzung <span style="color:#00B000">(als Index)</span> an ihre Trägereigenschaft angehängt, wie z. B. ‚wesentlich‘, bzw. ‚essentiell‘ durch <span style="color:#4C58FF"> — <sub>ess</sub> —</span>, oder ‚notwendig‘ durch <span style="color:#4C58FF"> — <sub>not</sub> —</span>. In der Definition-3 steht der Term ''':''' <span style="color:#4C58FF"> —‚'''E'''<sub>not</sub>'''x'''‘ —</span>, um auszudrücken, dass das Individuum <span style="color:#4C58FF">— ‚'''x'''‘ —</span> notwendig <span style="color:#4C58FF">— <sub>not</sub> —</span> die Eigenschaft ''':''' <span style="color:#4C58FF">— ‚'''E'''‘ —</span>, für ,Existenz‘, hat, d.h. <span style="color:#FF6000">»''das <span style="color:#4C58FF">‚'''x'''‘</span> existiert notwendig''«</span>. Der schon von GÖDEL indizierte Term ''':''' <span style="color:#4C58FF">—‚'''G'''<sub>ess</sub>'''x'''‘ —</span> kann gelesen werden als ''':''' <span style="color:#FF6000">»''Das Individuum <span style="color:#4C58FF">‚'''x'''‘</span> hat die Wesenseigenschaft, <span style="color:#4C58FF"> — <sub>ess</sub> — </span> ''':''' GOTT zu sein, <span style="color:#4C58FF">‚'''G'''‘ </span>''«</span>, statt der ,an sich‘ konformen, aber <span style="color:#4C58FF">„theologisch“</span> etwas ungenauen Formulierung ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''ist wesentlich göttlich''«</span>; oder mit der Voraussetzung ''':''' <span style="color:#4C58FF">— ‚'''Gx'''→'''G'''<sub>ess</sub>'''x'''‘ — </span> deutlicher und <span style="color:#4C58FF">„theologisch“</span> korrekt ''':''' <span style="color:#FF6000">»''Wenn'' <span style="color:#4C58FF">‚'''x'''‘</span> ''für den GOTT der Christen'', <span style="color:#4C58FF">‚'''G'''‘</span>, ''steht, dann ist GOTT-Sein'', <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(,Existenz‘)</span> ''das Wesen dieses GOTTES'', <span style="color:#4C58FF">— <sub>ess</sub>‚'''x'''‘ —</span>, <span style="color:#00B000">(,Essenz‘)</span>«</span>; wobei, — entsprechend der ,methodologischen‘ Prämisse des Kalküls <span style="color:#00B000">(<span style="color:#4C58FF">— ‚'''Gx'''‘ — </span> ''':''' das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den ,GOTT der Christen‘)</span> —, bei der Interpretation der Terme dieses besonderen Kalküls, die <span style="color:#4C58FF">„christliche Theologie”</span> für den Begriff <span style="color:#FF6000">„GOTT”</span>, Korrektur und die leitende Instanz ist. Dabei muss die Dreifach-Äquivalenz von <span style="color:#4C58FF"><span style="color:#4C58FF">— ‚'''G'''‘ — </span></span>berücksichtigt werden. Welche der drei Äquivalenzen, bzw. Lesearten von <span style="color:#4C58FF">— ‚'''G'''‘ — </span> bei einem bestimmten Term im Kalkül zulässig ist, muss <span style="color:#4C58FF">„theologisch”</span> überprüft und evaluiert werden. Bei manchen können sogar alle drei Lesearten <span style="color:#4C58FF">„theologisch”</span> zulässig sein.
Warum es in der modalen Prädikatenlogik zweiter Stufe, im GÖDEL-System, ,Definitionen‘ gibt, erklärt GÖDEL formal-syntaktisch ''':''' <span style="color:#FF6000">»''Definitionen dienen ja nur der kürzeren Schreibwelse und sind daher prinzipiell überflüssig.''«</span> <span style="color:#00B000">(Aus der Anmerkung 6 in seinem Hauptwerk ''':''' ,''<span style="font-family: Times;"><big>Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I</big></span>''‘.)</span> Für die <span style="color:#4C58FF">„theologische”</span> Interpretation und Hermeneutik seines Kalküls, sind die ,Definitionen‘ im GÖDEL-System jedoch wesentlich, und letztlich entscheidend. Erst dadurch wird sein Axiomensystem zur <span style="color:#4C58FF">„axiomatischen Theologie”</span>. GÖDEL gibt selbst den hermeneutischen Hinweis dazu, wenn er über den höherstufigen Eigenschaftsbegriff <span style="color:#FF6000">»''positiv''«</span> sagt, der nur ,indirekt‘ definiert wird, jedoch mit seinem gesamten Axiomensystem ''':''' <span style="color:#FF6000">»''Positiv bedeutet positiv im moralisch ästhetischen Sinne, (unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''.«</span> Die Deutung dieses ,höherstufigen‘ Begriffs als ein anderes Wort für <span style="color:#FF6000">„Transzendentalia“</span> ergibt sich aus der <span style="color:#4C58FF">„theologischen”</span> Evaluierung, d.h. der Einordnung des GÖDEL-Systems in die ,laufende‘ <span style="color:#FF6000">„Rede von GOTT“</span>, seit Menschen, sich über den Sinn der Welt und unseres Lebens in ihr, Gedanken machen. GOTT, der ,transzendent‘, — unabhängig —, zur Welt ist, ist Thema im Theorem ANSELMS, um das es ja im GÖDEL-Kalkül geht. Eine <span style="color:#4C58FF">„theologische”</span> Hermeneutik des GÖDEL-Systems ist daher legitim, die, als ein Bemühen um ein überzeugendes Verstehen, aus dem <span style="color:#4C58FF">„theologischen”</span> Vorwissen vieler Generationen schöpft.
Um philosophische, und sogar <span style="color:#4C58FF">„theologische”</span> Theoreme exakt zu formulieren, und untersuchen zu können, hat der Ausnahmelogiker GÖDEL, im 20. Jahrhundert, ein Tor aufgestoßen, das uns ermöglichen kann, <span style="color:#FF6000">»''mathematisch evident''«</span>, und logisch objektiv nachprüfbar, in diesen Disziplinen zu argumentieren. Mit seiner modalen Prädikatenlogik zweiter Stufe, <span style="color:#00B000">(speziell ,zugeschnitten‘ auf seinen ,ontologischen‘ Beweis)</span>, hat GÖDEL dem alten Wunsch eines Raimundus LULLUS, eines Gottfried Wilhelm LEIBNIZ, eines Immanuel KANT, und anderer, nach einer nachprüfbaren ,Universalsprache‘ in den Geisteswissenschaften, entsprochen; analog zur Mathematik, als Universalsprache in den Naturwissenschaften. Der sog. ,Theorembeweiser‘ der Wissenschaftler Christoph BENZMÜLLER und Bruno WOLTZENLOGEL-PALEO, mit Hilfe eines Computers, im 21. Jahrhundert, ist die kongeniale und logische Folge aus diesem Quanten-Schritt GÖDELS.
In der folgenden Neu-Kalkülisierung, wird jeder einzelne operative Logik-Schritt des Kalküls in der '''linken Spalte''' nummeriert und als Term-Ergebnis angezeigt, und in der '''rechten Spalte''' werden die dafür benötigten Term-Komponenten und die dabei angewendeten Logik-Regeln und -Gesetze, mit Meta-Terme, dokumentiert. Am Anfang stehen die Ressourcen und das angestrebte Ziel des Beweisganges, <span style="color:#00B000">(das Theorem)</span>. Die GÖDEL Axiome und Definitionen, die Theoreme und Korollare, die Zwischenergebnisse, das Endergebnis, und die logischen Meta-Terme, <span style="color:#00B000">[ in eckigen Klammern ]</span>, werden kontextabhängig, <span style="color:#00B000">(durch ''„Benennungen“'')</span>, interpretiert, <span style="color:#00B000">(angezeigt durch ,Interpretationspunkte‘ — '''::''' —, falls nötig)</span>. Der jeweilige Beweisgang wird in den Anmerkungen ausführlich und umfassend kommentiert. Die Kalkül-Prämissen, <span style="color:#00B000">(<span style="color:#4C58FF">'''AE:'''</span> Argument Einführung)</span>, sind der modal-frei gewählte Einstieg in das Kalkül. Sie dokumentieren, zusammen mit dem angestrebten Beweis-Ziel, eine bestimmte Problemlage in einem externen Diskurs, der mit dem modalen Logik-System hier, formal-syntaktisch überprüft, und gegebenenfalls, verifiziert oder falsifiziert werden soll. Korollare sind einfache, logische Folgerungen aus dem jeweiligen Beweisgang. Theoreme und Korollare sind ,modal‘ gleichwertig.
====<div class="center"><span style="color:#660066">1. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 1, (Möglichkeitsbeweis)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe__________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist die Eigenschaft X nicht positiv“} \\
\text{(Axiom 2)} & \quad (P\ X \wedge \;\Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x)) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaften Y, die aus einer positiven Eigenschaft X modal} \\
\text{ } & \quad & \ & \; \; \text{notwendig folgen, sind auch positive Eigenschaften“} \\
\text{(Axiom 3)} & \quad P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Theorem 1)} &\quad P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{ (◇ :: „möglich“ ↔ „konsistent“ ↔ „denkbar“; □ :: „notwendig“) } \\
\text{ } & \text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad P\ X \ & \ & \text{ AE: „Angenommen, es gibt positive Eigenschaften, Perfektionen“} \\
\text{02} & \quad P\ X \;\Rightarrow\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{ AE: „Angenommen, positive Eigenschaften sind nicht konsistent“} \\
\text{03} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{04} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{05} & \quad \text{ ├ }\; \neg \Diamond \; \exists x \ X \ x \ & \ & \text{:01:02:[Modus ponendo ponens] :: [A, A → B├ B] :AE:} \\
\text{06} & \quad \neg\neg \Box \neg \exists x \ X \ x \ & \ & \text{:05:[ ◇A ↔ ¬□¬A] :: (Modalregel)} \\
\text{07} & \quad \neg\neg \Box \neg\neg \forall x \neg X \ x \ & \ & \text{:06:[∃xA ↔ ¬Ɐx¬A] :: (Quantoren Regel)} \\
\text{08} & \quad \text{ ├ }\; \Box \; \forall x \neg X \ x \ & \ & \text{:07:NEG :: [¬¬A↔A] :: (Gesetz der Aussagenlogik)} \\
\text{09} & \quad \Box \; \forall x \neg X \ x \Leftrightarrow\ W & \ & \text{:02:08:[(:02:↔W) → (├:08:↔W)] :: (Kalkülregel)} \\
\text{10} & \quad \Box \; \forall x \ X \ x \Leftrightarrow\ F & \ & \text{:09:[(¬A↔W)↔(A↔F)] :: (Regel für Wahrheitswerte)} \\
\text{11} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:03:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{12} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \text{ } & \text{:10:11:[(:10:↔F) → (:11:↔F)] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{13} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (\neg x = x)) & \ & \text{:01:12:[Konjunktion] :: [A, B ├ A∧B]} \\
\text{14} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow \; (\neg x = x))) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(Y:=( ¬x= ..)) :: (Substitution für Eigenschaften)} \\
\text{15} & \quad \ P (\neg x = .. ) & \ & \text{:13:14:[Modus ponens] :: (logische Schlussregel)} \\
\text{16} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{17} & \quad \neg P (\ x = .. )\ & \ & \text{:15:16:[Modus ponens]}\\
\text{18} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:04:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{19} & \quad \Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \text{ } & \text{:10:18:[(:10:↔F) → (:18:↔W)] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{20} & \quad \ P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x)) & \ & \text{:01:19:[Konjunktion] } \\
\text{21} & \quad \ (P\ X \wedge \;\Box \; \forall x (\ X \ x \Rightarrow\; (x = x))) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(Y:=(x=..))} \\
\text{22} & \quad \ P (\ x = .. )\ & \ & \text{:20:21:[Modus ponens]}\\
\text{23} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ & \text{:17:22:[Konjunktion] ⇒ Kontradiktion !}\\
\text{24} & \quad \neg \Diamond \; \exists x \ X \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:05:23:[├A├B╞ A→B] :: ''KONDITIONALER BEWEIS''}\\
\text{25} & \quad \neg\neg \Diamond \; \exists x \ X \ x & \ & \text{:24:23:[Modus tollendo tollens] :: [A→B,¬B ├ ¬A]}\\
\text{26} & \quad \text{ ├ }\; \Diamond \; \exists x \ X \ x & \ & \text{:25:NEG; bzw. :05:23:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS''}\\
\text{27} & \quad \ P\ X \;\Longrightarrow\; \Diamond \; \exists x \ X \ x \ & \ & \text{:01:26:[├A├B ╞ A→B]} \\
\text{(Theorem 1)} & \;\text{„Positive Eigenschaften sind konsistent“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\text{28} & \quad \ P\ G \;\Longrightarrow\; \Diamond \; \exists x \ G \ x \ & \ & \text{:27:Instanz(X:=G) } \\
\text{29} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{(A3):28:[Modus ponens]} \\
\text{(Korollar 1)} & \;\text{„Das Dasein GOTTES ist definitiv denkbar“} & \ & \text{„Es ist widerspruchsfrei möglich, dass es GOTT gibt“} \\
\end{align}</math>
</small>
|}
Anmerkung-1 ''':''' <span style="color:#00B000">(Der GÖDEL-Term <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, im Axiom-2 ist an sich überflüssig, da dieser hier als Prämisse :01: ohnehin ,angenommen‘ wird. Der Beweisgang kommt mit Axiom-2 auch ohne diesen GÖDEL-Term zum selben Ergebnis, und verkürzt sich damit sogar um zwei Schritte ''':''' Zeile 13 und Zeile 20 sind dann unnötig.)</span>
Der Beweisgang geht mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als Kalkül-Ressource, prinzipiell von der Existenz eines GOTTES aus. Mit der Prämisse :01: <span style="color:#00B000">(hier im 1. Beweisgang)</span> postuliert GÖDEL vorerst allgemein, dass es <span style="color:#FF6000">»''Vollkommenheit, d.h. positive Eigenschaften''«</span> in unserer Welt gibt ''':''' <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, ohne im Kalkül zu definieren, was darunter zu verstehen ist. Definiert wird dann <span style="color:#00B000">(im 2. Beweisgang)</span>, was eine <span style="color:#FF6000">»''wesentliche Eigenschaft''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>‘ —</span>, <span style="color:#00B000">(im Sinne von ,Transzendentalia‘)</span>; und mit Hilfe dieser Eigenschaft definiert GÖDEL <span style="color:#00B000">(im 3. Beweisgang)</span>, was eine <span style="color:#FF6000">»''notwendige Existenz''«</span> ist ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>‘ —</span>, die er <span style="color:#00B000">(im selben Beweisgang)</span> axiomatisch mit den <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> gleich setzt ''':''' Axiom-5 ''':''' <span style="color:#4C58FF"> —‚'''PE'''<sub>not</sub>‘ —</span>. Erst im 2. Beweisgang wird mit Term :13:, nach einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, definitiv bewiesen <span style="color:#00B000">( ╞ )</span>, dass die, von GÖDEL, hier postulierten, <span style="color:#00B000">(allgemeinen)</span>, positiven Eigenschaften, <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, tatsächlich auch in GOTT <span style="color:#FF6000">»''positive Eigenschaften''«</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, sind; <span style="color:#00B000">(das sind die ultimativen ,Transzendentalia‘ in GOTT)</span>. Jetzt aber muss vorerst der ,Wunsch‘, bzw. die LEIBNIZ-Frage beantwortet werden ''':''' Ob, mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, <span style="color:#FF6000">»''GOTT''«</span> ,möglich‘ ist, der, nach traditioneller Auffassung, <span style="color:#FF6000">»''ein Wesen von äußerster Größe und Vollkommenheit'' <span style="color:#00B000">[ ist ]</span>, ''das alle Grade derselben in sich schließt''«</span>, <span style="color:#00B000">(nach LEIBNIZ; was GÖDEL mit Definition-1 ,abbildet‘)</span>. Wenn man also beweisen will, dass die Existenz eines solchen ''<span style="color:#FF6000">»GOTTES«</span>'' ,möglich‘ sein soll, dann muss man beweisen, dass dieses postulierte System der <span style="color:#FF6000">»''positiven Eigenschaften in GOTT''«</span> möglich und formal ,widerspruchsfrei‘ ist. Das Ergebnis des 1. Beweisganges, das ,Theorem-1‘, <span style="color:#00B000">(,Erster Satz‘)</span>, fasst A. FUHRMANN zusammen als ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>. Wenn sie nicht konsistent wären, käme es zu unlösbaren Widersprüchen, <span style="color:#00B000">(Term :24:)</span>. Term :27: ,besagt‘ ''':''' <span style="color:#FF6000">»''Es ist definitiv, d.h. ohne Widerspruch möglich, dass es positive Eigenschaften gibt''«</span>; denn die Behauptung, es sei nicht möglich, dass es positive Eigenschaften, <span style="color:#00B000">(das sind die ,Transzendentalia‘)</span>, in unserer Welt gibt, führt zu einem Widerspruch, und ist daher falsch und ,unlogisch’. Einmal Axiom-1 und zweimal Axiom-2, <span style="color:#00B000">(das die Gleichwertigkeit aller positiven Eigenschaften nachdrücklich klarstellt)</span>, sichern hier die Konsistenz <span style="color:#FF6000">»''aller positiven Eigenschaften in der Welt'', <span style="color:#00B000">[ die ,Transzendentalien‘ ]</span>, ''und damit auch die, die in GOTT sind''«</span>. <span style="color:#00B000">(Der 2. Beweisgang bestätigt, dass es in GOTT tatsächlich positive Eigenschaften gibt.)</span> Die ,Gleichwertigkeit‘ aller Transzendentalia, <span style="color:#00B000">(ihre ,Äquivalenz‘)</span>, ist formal-syntaktisch daran erkennbar, dass die beiden Eigenschafts-Variablen <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> im Axiom-2 für beliebige, unterschiedliche ,positive‘ Eigenschaften gegenseitig austauschbar, <span style="color:#00B000">(,konvertierbar‘)</span>, sind. Das heißt, dass beliebige, unterschiedliche ,positive‘ Eigenschaften, für die diese Variablen stehen, sich paarweise, wechselseitig ,implizieren‘, einschließen, und damit notwendig voneinander abhängen, d.h. koinzident ,eins‘ sind, konvertierbar, und somit gleichwertig sind; entsprechend dem Theorem von den Transzendentalia. Zu Term :29:, dem Korollar zu Theorem-1, notiert GÖDEL am 10. Feb. 1970, <span style="color:#00B000">(übersetzt von Joachim BROMAND)</span> ''':''' <span style="color:#FF6000">»''◇∃xG(x) besagt, dass das System aller positiver Eigenschaften kompatibel ist'',</span> <span style="color:#00B000">[ d.h. miteinander verträglich, weil ohne Widersprüche ].</span> <span style="color:#FF6000">''Dies ist ,wahr‘ auf Grund von Axiom-2,'' <span style="color:#00B000">[ weil alle positiven Eigenschaften, d.h. die Transzendentalien, koinzident gleichwertig und konvertierbar sind ]</span>.«</span> Darum ist es definitiv ,möglich‘, dass es diesen GOTT gibt, der <span style="color:#FF6000">»''alle Grade der Vollkommenheit in sich schließt''«</span> und <span style="color:#FF6000">»''über dem ,Größeres‘ nicht mehr gedacht werden kann''«</span>, und, in weiterer Konsequenz, ist der GOTT-Glaube deshalb ,notwendig‘ widerspruchsfrei und sinnvoll, nach Theorem-3 ''':''' <u>Wenn</u> es ,ohne Widerspruch‘ ''<span style="color:#FF6000">»möglich, bzw. denkbar«</span>'' ist, dass es ''<span style="color:#FF6000">»GOTT«</span>'' gibt, <u>dann</u> folgt daraus ''<span style="color:#FF6000">»notwendig«</span>'' ''':''' es ist auch ,widerspruchsfrei‘, wenn man als Voraussetzung ,annimmt‘, dass es ''<span style="color:#FF6000">»GOTT wirklich, für jede mögliche Welt«</span>'' gibt ''':''' Term :11: im 3. Beweisgang. Der Wenn-Satz ist hier mit Korollar-1 bewiesen; der Dann-Satz wird im 3. Beweisgang bewiesen <span style="color:#00B000">( ╞ )</span>, d.i. die Widerspruchsfreiheit und Sinnhaftigkeit des GOTT-Glaubens.
Die ontologische ,Identität‘, d.h. die ,Gleichsetzung‘, bzw. die ,Koinzidenz‘ von Strukturen, die in der Endlichkeit für uns verschieden sind, jedoch in dem unbegrenzt Unendlichen, GOTT, paarweise, perspektivisch in eins zusammenfallen, wie ,Sein‘ und ,Wesen‘, wie ,Ursache‘ und ,Wirkung‘ usw., und auch die Äquivalenz und Austauschbarkeit der Transzendentalien, haben im GÖDEL-Kalkül die logisch-syntaktische Form einer, aus sich, ,modal‘ notwendigen Implikation zwischen zwei verschiedenen, gegenseitig austauschbaren Eigenschafts-Variablen ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>. Dieses Term-Element stellt formal-syntaktisch die Gleichwertigkeit, <span style="color:#00B000">(Äquivalenz)</span>, bzw. die paarweise Koinzidenz aller positiven Eigenschaften und Zuordnungen in GOTT dar; sowohl hier im Axiom-2, als auch in der Definition-2 über die ,Wesenseigenschaften‘, im 2. Beweisgang, mit jeweils verschiedenen, frei umbenennbaren, Individuum-Variablen. Dieses Term-Element ,gilt‘ allgemein jedoch nur für positive Eigenschaften, alias ,Transzendentalia‘, und wird sofort <span style="color:#FF6000">„modal falsch“</span>, wenn für <span style="color:#4C58FF">— ‚'''X'''‘ —</span>, oder <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, Eigenschaften eingesetzt werden, die, — von Natur aus —, weder positiv noch negativ sind, wie z. B. ,rot‘ oder ,schwer‘. Die wechselseitige Austauschbarkeit der noch ,unbestimmten‘ Eigenschafts-Variablen, für beliebige positive Eigenschaften, ist formal äquivalent zur freien Umbenennung der noch ,unbestimmten‘ Individuum-Variablen ''':''' <span style="color:#4C58FF">[ FUB(x:=y) ]</span>. Der formale, gegenseitige, allgemeine Austausch der positiven Eigenschafts-Variablen, bzw. die formale Gleichsetzung beliebiger positiver Eigenschaften, kann, auf Grund der Äquivalenz aller Vollkommenheiten, bzw. ,Transzendentalia‘, auch dann noch durchgeführt werden, wenn eine, von zwei Eigenschafts-Variablen, durch eine Definition oder eine Schlussfolgerung ,bestimmt‘ worden ist, und dadurch zu einer positiven Eigenschafts-Konstante, d.h. zu einer ,bestimmten‘, positiven Eigenschaft geworden ist. Das ist z. B. bei einer instanziierenden Substitution der Fall ''':''' <span style="color:#4C58FF">[ Instanz(X:=..) ]</span>. Das ist eine spezifische Eigenheit der GÖDEL-Axiomatik, weil alle relevanten, positiven Eigenschaften und Zuordnungen in GOTT, als <span style="color:#FF6000">„ultimative Transzendentalia“</span>, immer auch miteinander kompatibel sind. Mit dem Term-Element ''':''' <span style="color:#4C58FF">— ‚'''□∀x(Xx→Yx)'''‘ —</span>, wird formal die <span style="color:#FF6000">„Koinzidenz“</span> aller ,Transzententalia‘ in der Welt, und auch der ,Zusammenfall‘ aller Gegensätze in GOTT, abgebildet.
Da die Variable <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht, <span style="color:#4C58FF">‚'''G'''‘</span>, <span style="color:#00B000">(im Korollar-1)</span>, ist die Eigenschaft ''':''' ''<span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'' ''':''' <span style="color:#4C58FF">(¬x=..)</span>, d.h. das <span style="color:#FF6000">„Ungleichsein“</span>, das <span style="color:#FF6000">„Anderssein“</span> GOTTES, <span style="color:#00B000">(Prämisse :03:)</span>, die entscheidende Voraussetzung und Norm für jeden Diskurs über GOTT ''':''' um der <span style="color:#FF6000">„Unvergleichlichkeit“</span>
GOTTES gerecht zu werden, darf GOTT niemals mit etwas aus der ''<span style="color:#FF6000">»zufälligen Struktur der Welt«</span>'' verglichen, d.h. gleich gesetzt werden. Der Term :18: <span style="color:#4C58FF">(x=x) ↔ W</span> erinnert an die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚Ich-Bin‘''«</span>. <span style="color:#00B000">(In der mystischen Tradition, im ''<span style="font-family: Times;"><big>‚Dialog über die Vorsehung‘</big></span>'', dem Hauptwerk der Heiligen KATHARINA von Siena, Mystikerin und Lehrerin der Kirche, sagt GOTT-VATER zur KATHARINA ''':''' <span style="color:#FF6000">»''ICH BIN der IST'', <span style="color:#00B000">[ aus mir selbst ]</span>, ''du bist, die nicht ist'', <span style="color:#00B000">[ aus dir selbst ]</span>.«</span> Das ist eine wichtige, deutende Ergänzung, und die authentische <span style="color:#4C58FF">,theologische‘</span> Interpretation dieser Exodus Text-Stelle. Das ist der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES.)</span>
Zum Term :03: notiert A. FUHRMANN ''':''' <span style="color:#FF6000">»</span> ''Die Notation'' <span style="color:#4C58FF">(¬x=..)</span> ''für die Eigenschaft ''':''' <span style="color:#FF6000">„nicht mit x identisch zu sein“</span>'', <span style="color:#00B000">[ d.h. <span style="color:#FF6000">„Ungleichheit“, „Anderssein“</span>, bzw. die Notation <span style="color:#4C58FF">(x=..)</span> für den Existenzmodus-Perfektion ''':''' <span style="color:#FF6000">„Gleichheit“, „Idendität“</span> ]</span>, ''ist suggestiv und informell und ersetzt hier einen formal korrekten Abstraktionsausdruck wie'' <span style="color:#4C58FF">λy.(¬x=y)</span>, <span style="color:#00B000">[ bzw. <span style="color:#4C58FF">λy.(x=y)</span> ]</span>. ''Für die formal korrektere Notation bedarf es der zusätzlichen Vereinbarung, dass der Ausdruck'' <span style="color:#4C58FF">λy.(¬x=y)</span> ''gleichbedeutend sei mit dem Ausdruck'' <span style="color:#4C58FF">¬λy.(x=y)</span>. ''Diese Vereinbarung ist harmlos, da wir aufgrund der Regel der λ–Konversion'' ''':''' <span style="color:#4C58FF">λy.Xy.x ↔ Xx</span>, <span style="color:#00B000">[ mit der <span style="color:#4C58FF">Instanz(X:=(¬x=..))</span> ]</span>, ''so schließen dürfen'' ''':''' <span style="color:#4C58FF">λy.(¬x=y).x ↔ ¬x=x ↔ <span style="color:#00B000">¬(x=x)</span> ↔ ¬λy.(x=y).x</span> .<span style="color:#FF6000">«</span> <ref>A. FUHRMANN a.a.O. Seite 7, Anmerkung 4 (von mir korrigiert und ergänzt)</ref>
In der Kalkül-Zeile 29 wird das Möglichkeits-Korollar-1 durch einen <span style="color:#4C58FF">[ Modus ponens ]</span> mit Axiom-3 von der Kalkül-Prämisse-Term :01: ,abgekoppelt‘, d.h. es ist nicht mehr vom Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span> logisch abhängig. Das Möglichkeits-Korollar-1 behält jedoch die bewiesene Widerspruchsfreiheit von Theorem-1, und ist damit nur mehr von Axiom-1 und Axiom-2 abhängig, was für das Theorem-ANSELMS am Schluss entscheidend ist. Erklärung zu Term :05: Das Ergebnis einer Logik-Operation zwischen Prämissen ist ,regulär‘ <span style="color:#00B000">(├ )</span> den Prämissen zuzurechnen.
Das Modale-Prinzip KRIPKE-Γ-Ɐx, <span style="color:#4C58FF">['''RK''']</span>, in Worten ''':''' <span style="color:#FF6000">»''Wenn mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''gilt, und daraus logisch folgt, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''auch die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''gilt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar'' ''':''' ''es ist wahr, dass mit ,modaler‘ Notwendigkeit'' <span style="color:#00B000">( □ )</span>, ''für alle'' <span style="color:#4C58FF">‚'''x'''‘</span> ''aus der Aussage'' <span style="color:#4C58FF">‚'''A'''‘</span> ''die Aussage'' <span style="color:#4C58FF">‚'''B'''‘</span> ''logisch folgt''«</span>. Der Term <span style="color:#4C58FF">— ‚'''□∀xXx'''‘ —</span> steht formal-syndaktisch, allgemein für ,Transzendentalia‘, und ist für alle ,Nicht-Transzendentalia‘ <span style="color:#FF6000">„modal falsch“</span>.
====<div class="center"><span style="color:#660066">2. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 2, (,Basisbeweis‘)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe____________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.2)} & \quad \neg P\ X \;\Longrightarrow\;\ P\neg X\ & \ & \text{„Wenn X nicht positiv ist, dann ist die Negation ¬X positiv“} \\
\text{(Axiom 3)} & \quad \ P\ G \ & \ & \text{„Göttlichkeit, GOTT-Sein, ist eine pos. Eigenschaft“ ↔ „GOTT ist perfekt“} \\
\text{(Axiom 4)} & \quad \ P\ X \;\Longrightarrow\; \Box \; \ P\ X \ & \ & \text{„Positive Eigenschaften sind notwendig aus sich positiv“} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 2)} & \quad \ X_{ess}\ x \;\Leftrightarrow X\ x \wedge \forall Y \left(\ Y\ x \Rightarrow \Box \; \forall y (\ X\ y \Rightarrow \ Y\ y)\right) & \ & \text{„X ist genau dann eine wesentliche Eigenschaft von x, wenn x sie hat, und} \\
\text{ } & \quad & \text { } & \;\;\text{alle anderen Eigenschaften Y von x notwendig aus dieser Eigenschaft X folgen“} \\
\text{[RM]} &\quad \ A \;\Longrightarrow\;\ B\; \text{ ├ }\;\Box \; A \Longrightarrow\;\Box\; \ B\ & \ & \text{( :: Modales Prinzip)} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{(,G‘ :: „Göttlichkeit“ ↔ „GOTT“ ↔ „Dasein GOTTES“)} \\
\text{ } &\;\text{„Das Wesen GOTTES ist sein Dasein“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} &\quad \ G\ x \ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} &\quad \ Y\ x \ & \ & \text{ AE: „Angenommen, GOTT hat die Eigenschaften Y“} \\
\text{03} &\quad \neg P\ Y & \ & \text{ AE: „Angenommen, die Y in GOTT sind nicht positiv“} \\
\text{04} &\quad \neg P \ Y \Rightarrow \ P \neg Y\ & \ &\text{(A1.2):Instanz(X:=Y) :: (Substitution für Eigenschaften) } \\
\text{05} &\quad \ P \neg Y \ & \ & \text {:03:04:[Modus ponens] :: [A, A → B├ B] } \\
\text{06} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{07} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:06:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{08} &\quad \ P \neg Y \Rightarrow \neg Y \ x\ & \ &\text{:07:Instanz(X:=¬Y)} \\
\text{09} &\quad \neg Y \ x\ & \ &\text{:05:08:[Modus ponens]} \\
\text{10} &\quad \text{ ├ }\; (Y\ x \wedge \neg Y \ x) \;\Leftrightarrow\;\ F\ & \ & \text{:02:09:[Konjunktion] ⇒ Kontradiktion !} \\
\text{11} &\quad \neg P\ Y \; \Rightarrow \; (Y\ x \wedge \neg Y \ x )\ & \ &\text{:03:10:[├A├B ╞ A → B] :: ''KONDITIONALER BEWEIS''} \\
\text{12} &\quad \neg\neg P\ Y \ & \ &\text{:11:10:[Modus tollendo tollens] :: [A → B,¬B├ ¬A]} \\
\text{13} &\quad \text{ ├ }\; P\ Y \ & \ &\text{:12:NEG; bzw. :03:10:[├¬A→F ╞ A] :: ''INDIREKTER BEWEIS'' :AE:} \\
\text{14} &\quad \ P\ Y \;\Rightarrow\;\Box \; \ P\ Y \ & \ & \text{(A4):Instanz(X:=Y)} \\
\text{15} &\quad \Box \; \ P\ Y \ & \ & \text{:13:14:[Modus ponens]} \\
\text{16} &\quad \ G \ y \Rightarrow \ Y \ y\ & \ &\text{:01:02:[├A├B ╞ A→B]:FUB(x:=y)} \\
\text{17} &\quad \text{ ├ }\; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:16:[G(y) ├ ⱯyG(y)]} \\
\text{18} &\quad \Box \; \ P\ Y \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:13:17:[├A├B ╞ A→B]:[RM]} \\
\text{19} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:15:18:[Modus ponens]} \\
\text{20} &\quad \ Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)\ & \ &\text{:02:19:[├A├B ╞ A→B]} \\
\text{21} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x & \ &\text{:20:01:[Konjunktion] :: [A, B├ A ∧ B]} \\
\text{22} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ X \ y \Rightarrow \ Y \ y)) \wedge \ X \ x\;\Leftrightarrow\; X_{ess}\ x \ & \ &\text{(D2):KOMM(↔):KOMM(∧):[ⱯYA(Y) ├ A(Y)] wegen :13:} \\
\text{23} &\quad \ (Y\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ Y \ y)) \wedge \ G \ x\;\Leftrightarrow\; G_{ess}\ x \ & \ &\text{:22:Instanz(X:=G)} \\
\text{24} & \quad \text{ ├ }\; G_{ess}\ x \ & \ &\text{:21:23:[Modus ponens]:AE: wegen :30:} \\
\text{25} &\quad \ G\ x \;\Rightarrow\; \ G_{ess}\ x \ & \ & \text{:01:24:[├A├B ╞ A→B] :: Theorem 2.1} \\
\text{26} &\quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ &\text{(D1):01:[Modus ponens] } \\
\text{27} &\quad \ P \ X \Rightarrow \ X \ x\ & \ &\text{:26:[ⱯXA(X) ├ A(X)]} \\
\text{28} &\quad \ P \ G \Rightarrow \ G \ x\ & \ &\text{:27:Instanz(X:=G)} \\
\text{29} &\quad \text{ ├ }\; G \ x\ & \ &\text{(A3):28:[Modus ponens]} \\
\text{30} &\quad \ G_{ess}\ x \;\Rightarrow \ G \ x\ & \ &\text{:24:29:[├A├B ╞ A→B] :: Theorem 2.2 } \\
\text{31} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ & \text{:25:30:[Konjunktion]:BIKONDITIONAL :: [(A→B) ∧ (B→A) ↔ (A↔B)] } \\
\text{(Theorem 2)} &\; \text{„Dasein, GOTT-Sein, ist das Wesen GOTTES“} & \ & \Longleftarrow\; \text{was zu beweisen war ! } \\
\text{32} &\quad \text{ ├ }\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:19:Instanz(Y:=(x=..))} \\
\text{33} &\quad \ G\ x \;\Rightarrow\; \Box \; \forall y(\ G \ y \Rightarrow \ (x = y))\ & \ & \text{:01:32:[├A├B ╞ A→B]} \\
\text{(Korollar 2)} & \;\text{„Es gibt notwendig höchstens einen GOTT“} & \ & \text{„Wenn es GOTT gibt, dann gibt es für jede mögliche Welt nur einen GOTT“} \\
\end{align}</math>
</small>
|}
<span style="color:#00B000"><small>(In den Kalkül-Zeilen 16, 18, 31 mussten zwei-, und in Zeile 22 drei Kalkül-Schritte, d.h. Logik-Operationen in eine Zeile zusammengezogen werden, weil der Parser dieser speziellen Mathematik-Funktion in Wikibooks jedes Mal wegen Puffer-Überlauf abstürzt, wenn zu den bestehenden Zeilen noch eine neue Zeile, oder ein Text-Element, zusätzlich eingefügt wird. Das vermindert etwas die Transparenz des Kalküls.)</small></span>
Anmerkung-2 ''':''' <span style="color:#00B000">(Dieser Beweisgang kommt auch ohne das ,unbestimmte‘ Konjunkt <span style="color:#4C58FF"> — ‚'''Xx'''‘ —</span> in der Definition-2 zum gleichen Ergebnis, und wird dadurch um eine Zeile verkürzt ''':''' Zeile 21 entfällt, und <span style="color:#4C58FF">[ KOMM(∧) ]</span> ist dann unnötig. Dieses Konjunkt wird hier ebenfalls schon in der Kalkül-Prämisse :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, als ,Annahme‘ gesetzt, vorentschieden und ,bestimmt‘ mit der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>. Es war also logisch korrekt, dass GÖDEL, in seiner Notiz vom 10. Feb. 1970 zum ontologischen Beweis, dieses Konjunkt weggelassen hat, was ihm von Kommentatoren als ein Flüchtigkeitsfehler angerechnet worden war. Der gesamte 2. Beweisgang bewegt sich im Geltungsbereich der Prämisse Term :01:, d.h. ist in jeder Zeile von der Annahme abhängig ''':''' die Variable <span style="color:#4C58FF"> — ‚'''x'''‘ —</span> steht für den GOTT der Christen. In der Kalkül-Zeile 33 wird mit Korollar-2 diese Abhängigkeit, für den Term :32:, explizit dargestellt.)</span>
Der Beweisgang geht mit der Prämisse :01: prinzipiell, als ,modal‘ freigewählte Voraussetzung, von der Existenz eines GOTTES aus. Im 1. Beweisgang wurde bewiesen, dass die von GÖDEL ,postulierten‘ <span style="color:#FF6000">»''allgemeinen positiven Eigenschaften, Vollkommenheiten, Perfektionen'', <span style="color:#00B000">[ die sog. ,Transzendentalien‘ ]</span> ''konsistent''«</span>, d.i. widerspruchsfrei sind. Hier, in diesem Beweisgang wird nun die Prämisse vom 1. Beweisgang, <span style="color:#4C58FF"> — ‚'''PX'''‘ —</span>, im Bezug auf GOTT hinterfragt ''':''' Gibt es auch in GOTT so Etwas, wie <span style="color:#FF6000">»''Vollkommenheit, Positives, Perfektes''«</span> '''?''' Die ,Annahme‘ jedoch, dass es <span style="color:#FF6000">»''in GOTT keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span> <span style="color:#00B000">(keine Transzendentalien)</span> gibt, <span style="color:#00B000">(Prämisse Term :03:)</span>,<span style="color:#4C58FF"> — ‚'''¬PY'''‘ —</span>, d.h. dass die <span style="color:#00B000">(wesentlichen)</span> Eigenschaften in GOTT keine <span style="color:#FF6000">„Vollkommenheiten“</span> seien, führt aber zu einem unlösbaren Widerspruch, <span style="color:#00B000">(Term :10:)</span>. Mit Term :13:, als 1. Hauptergebnis, ist damit, — als ,neue‘ Prämisse, <span style="color:#00B000">(ersetzt Term :03:)</span> —, definitiv ,bewiesen‘ <span style="color:#00B000">( ╞ , d.h. es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, dass alle Eigenschaften, die hier mit <span style="color:#4C58FF">— ‚'''Y'''‘ —</span> symbolisiert werden, <span style="color:#FF6000">„positive Eigenschaften“</span>, d.h. <span style="color:#FF6000">„Perfektionen“</span> sind, von denen das Kalkül ,annimmt‘, <span style="color:#00B000">(Prämissen Term :01:, Term :02: und speziell Term :16:)</span>, dass der GOTT der Christen sie besitzt. Alle ,Wesenseigenschaften‘ in GOTT ''':''' <span style="color:#4C58FF">— ‚'''Y'''<sub>ess</sub>‘ —</span>, die durch den Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —, </span> dargestellt werden, sind somit <span style="color:#FF6000">„Vollkommenheiten“</span> ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span><span style="color:#00B000">, (,ultimative Transzendentalien‘, aller ,Grade‘)</span>. Damit ist definitiv ‚bestätigt‘, <span style="color:#00B000">( ╞ , es ist ,wahr‘ und ,widerspruchsfrei‘)</span>, was mit Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, schon ‚angenommen‘ worden ist ''':''' <span style="color:#FF6000">»''GOTT ist perfekt; er hat alle positiven Eigenschaften''«</span>; und auch Definition-1 ist damit ,verifiziert‘ ''':''' <span style="color:#FF6000">»''GOTT ist genau deswegen GOTT, weil er, als GOTT, positive Eigenschaften aller Grade in sich schließt''«</span>; entsprechend dem Quelltext bei LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. <span style="color:#00B000">(Der ,Schlüsselbegriff‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> ist der ,Schlüssel‘ zur Erkenntnis, dass GOTT ,notwendig‘, sowohl ,wesentlich‘ für uns, als auch an sich ,grundlos‘, immer schon ,da‘ ist.)</span> Hier, <span style="color:#00B000">(im 2. Beweisgang)</span>, hat Axiom-1, <span style="color:#00B000">(im Term :04:)</span>, sicher gestellt, dass die Eigenschaften in GOTT, <span style="color:#00B000">(Definition-1; Term :06:)</span>, tatsächlich <span style="color:#FF6000">„ultimativ positiv, perfekt und vollkommen“</span> sind ''':''' <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>. Das GÖDEL-Axiom-1 bezieht seine ,Potenz‘ aus dem Prinzip vom ,auszuschließenden‘ Widerspruch ''':''' eine Eigenschaft kann nicht zugleich ,positiv‘ und ,nicht positiv‘ sein '''!'''
Formal lässt sich das 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' schon aus Term :23: in diesem Beweisgang mit der <span style="color:#4C58FF">[ Vereinfachung ] :: [ A∧B ├ B ]</span> ohne Weiteres ,regulär‘ ableiten, — analog zu den Vorgehensweisen bei A. FUHRMANN und G.J. WIRSCHING. <span style="color:#00B000">(Beide Aussagen dieser ,Konjunktion‘ sind ,gleichwertig‘ und wahr, daher partizipiert das Theorem-2 auch am Ergebnis der Widerspruchsfreiheit von Term :13:, <span style="color:#4C58FF">— ‚'''PY'''‘ —</span>, dem 1. Hauptergebnis. Beide Aussagen im Term :23: interpretieren sich gegenseitig.)</span> Der hier gewählte, etwas längere Weg zum Ergebnis, soll die innere Struktur und Abhängigkeit der Ergebnisse von bestimmten Voraussetzungen offen legen, und ihren ,Zweck‘ verdeutlichen. Die beiden Hauptergebnisse im Basisbeweis gehen vom vorgefundenen und traditionell vorgegebenen Begriff von ,GOTT‘ aus, <span style="color:#00B000">(Term :06:, Term :16: und Term :26:)</span>. Das ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 1. Hauptergebnis, hier im 2. Beweisgang, Term :13: <span style="color:#4C58FF">— ‚'''PY'''‘ —</span> ''':''' <span style="color:#FF6000">»''die Eigenschaften in GOTT sind vollkommen, d.h. sind die ultimativen Transzendentalia''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-3 ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>, als auch die Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span>, für die Annahme ''':''' den ,GOTT der Christen‘, der deswegen GOTT ist, weil er alle Grade der Vollkommenheit in sich schließt. Und das ebenfalls ,bewiesene‘ <span style="color:#00B000">( ╞ )</span> 2. Hauptergebnis, hier im selben Beweisgang, Theorem-2 ''':''' <span style="color:#4C58FF">— ‚'''Gx'''↔'''G'''<sub>ess</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''das Wesen GOTTES ist sein eigenes Sein''«</span>, rechtfertigt, bzw. verifiziert sowohl Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, als auch die Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, für die Wesenseigenschaft ''':''' ,notwendige Existenz‘, und widerlegt den Einwand KANTS, für den Spezialfall ''':''' <span style="color:#4C58FF">— ‚'''x'''‘ —</span> steht für ,GOTT‘. Zwei Axiome und zwei Definitionen von GOTT und seinen Vollkommenheiten werden durch die Ergebnisse im Basisbeweis des GÖDEL-Kalküls in unserer realen Welt als ,wahr‘, <span style="color:#00B000">(genauer als ,widerspruchsfrei‘)</span>, und, — im Rahmen des christlichen Glaubens —, als ,annehmbar‘ bestätigt. <span style="color:#00B000">(Anmerkung zu Term :24: ''':''' eine Prämisse ist regulär-,modal‘ immer ,frei‘ wählbar.)</span>
Zusammengefasst heißt das ''':''' die ,strittige‘ Begründung der ,methodologischen‘ Prämisse des GÖDEL-Kalküls ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#00B000">(Prämisse, Term :01:)</span>, weil <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#00B000">(Korollar-1)</span> ''':''' <span style="color:#FF6000">»''Das <span style="color:#4C58FF">‚'''x'''‘</span> steht für den GOTT der Christen, für den es ohne Widerspruch denkbar ist, dass es ihn gibt''«</span>, <span style="color:#00B000">(ANSELMS Prinzip, trotz der ,Warnung‘ KANTS)</span>, ist ,wahr‘ und für uns ,annehmbar, denn es ist auch, auf Grund der Ergebnisse des 2. Beweisganges, in unserer realen Welt ,wahr‘ und ,annehmbar‘, weil schon als ,widerspruchsfrei‘ verifiziert ''':''' <span style="color:#FF6000">»''Der GOTT der Christen'' <span style="color:#00B000">(Term :01:)</span> '',existiert‘ für uns ,notwendig‘''«</span> ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, <span style="color:#00B000">(d.i. das ,regulär‘-mögliche Korollar sowohl im 2. als auch im 3. Beweisgang)</span>, denn dieser GOTT ist aus sich ,vollkommen‘ ''':''' <span style="color:#4C58FF"> — ‚'''PG'''‘ —</span>, und zu seiner ,Vollkommenheit‘ <span style="color:#4C58FF">— ‚'''P'''‘ —</span> gehört auch notwendig sein ,Existieren‘ ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. <span style="color:#00B000">(Jeder dieser Terme ist im-, und durch den 2. Beweisgang, im Geltungsbereich der Prämisse Term :01:, als ,wahr‘ und ,annehmbar‘ bewiesen, bzw. verifiziert.)</span> Das ist der ,Kern‘ des ontologischen Arguments, und somit ist auch diese ,strittige‘ Begründung der Prämisse des GÖDEL-Kalküls mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. sie ist logisch ,richtig‘ und, im Kontext des christlichen Glaubens, vernünftig. Die Annahme des Gegenteils zu dieser Prämisse ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Es ist undenkbar, dass es diesen GOTT gibt''«</span>, führt jedoch, unabhängig von jeder Glaubensüberzeugung, zu einem Widerspruch — ist unlogisch und daher ,falsch‘, <span style="color:#00B000">(siehe Anhang ''':''' Widerlegung)</span>. Die Behauptung einer ,formalen Unentscheidbarkeit‘ zu den Annahmen über die Existenz GOTTES, ob oder nicht, <span style="color:#00B000">(d.h. ein ,methodologischer‘ Agnostizismus)</span>, ist gegen jede ,Logik‘; und ist auch ,falsch‘, d.h. der Agnostizismus ist einfach nur ein ,logischer Irrtum‘. Denn aus dem, im Kalkül abgeleiteten, Widerspruch aus der einen Annahme, und damit ihrer Unrichtigkeit, folgt notwendig die Richtigkeit der gegenteiligen Annahme. Damit ist eine klare Entscheidung getroffen.
Das Modale-Prinzip <span style="color:#4C58FF">['''RM''']</span> in Worten ''':''' <span style="color:#FF6000">»''Wenn es wahr ist, dass aus'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> ''ein'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> ''logisch folgt, dann ist in einem Kalkül regulär'' <span style="color:#00B000">( ├ )</span> ''ableitbar, dass, wenn'' <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist, auch'' <span style="color:#4C58FF"> — ‚'''B'''‘ —</span> '',modal‘ notwendig'' <span style="color:#00B000">( □ )</span> ''ist''«</span>. <span style="color:#00B000">(Das <span style="color:#4C58FF"> — ‚'''A'''‘ —</span> in Term :18: ist als ,modal notwendig‘ durch den Term :15: verifiziert '''!''' )</span>
Mit dem 2. Hauptergebnis, Theorem-2 ''':''' <span style="color:#FF6000">»'',Dasein‘ ist das ,Wesen‘ GOTTES''«</span>, folgt die GÖDEL-Axiomatik der philosophisch-<span style="color:#4C58FF">,theologischen‘</span> Tradition der ,Rede von GOTT‘ seit ARISTOTELES, und schließt sich damit formal-syntaktisch zugleich auch der religiösen Überzeugung der Christen an, die glauben, dass GOTT, als unser Vater, aus Liebe, in seinem Sohn, JESUS CHRISTUS, für uns immer schon <span style="color:#FF6000">»''da''«</span> ist, <span style="color:#00B000">(der Sohn ist koinzident ,eins‘ mit GOTT, dem Vater und dem GEIST)</span>, wirksam in und durch seine <span style="color:#4C58F0">„Kirche“</span>, im HEILIGEN GEIST, bis ans Ende der Zeit. Das ist das, <span style="color:#FF6000">»''was''«</span> GOTT eigentlich für uns ausmacht, — die Selbstmitteilung seines unergründlichen Wesens in den Sakramenten der <span style="color:#4C58F0">„Kirche“</span> ''':''' <span style="font-family: Times;"><big>‘אֶֽהְיֶ֖ה אֲשֶׁ֣ר אֶֽהְיֶ֑ה‚</big></span> <span style="color:#00B000">| ‚eh'jeh asher eh'jeh‘ |</span> <span style="color:#CC66FF">»''Ich bin da für euch und für immer, als der ich ''<span style="color:#00B000">[ immer schon gewesen ]</span> ''bin''«</span>; <span style="color:#00B000">(d.i. das <span style="color:#4C58FF">,theologisch‘</span>-exegetische ,Axiom‘ der Christen, und eine <span style="color:#4C58FF">,theologisch‘</span> korrekte Explikation der ,regulären‘ Kalkül-Prämisse Term :01: <span style="color:#4C58FF"> — ‚'''Gx'''‘ —</span>, jeweils im 2. und 3. Beweisgang)</span>. Das heißt aber nicht, dass der Autor des Kalküls sich mit diesem Glauben identifiziert hat, <span style="color:#00B000">(,hat‘ er auch nicht)</span>, oder dass der Leser des ontologischen Beweises von Kurt GÖDEL sich damit identifizieren muss, wenn er dessen <span style="color:#FF6000">»''mathematische Evidenz''«</span> anerkennt.
Zur erweiterten <span style="color:#4C58FF">„theologischen“</span> Explikation der Kalkül-Prämisse ''':''' Die <span style="color:#4C58F0">„Kirche“</span> ist das ,Meisterwerk‘ GOTTES ''':''' In ihr ist es GOTT gelungen, etwas Göttliches und Unzerstörbares in unsere korrupte Welt einzupflanzen ''':''' <span style="color:#4C58FF"> — ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span> ''':''' <span style="color:#FF6000">»''Etwas Göttliches existiert notwendig, d.h. ,unzerstörbar‘ in unserer Welt''«</span>. Sie ist, durch die Menschwerdung des GOTTES Sohnes, JESUS CHRISTUS, dessen <span style="color:#4C58F0">„Leib“</span> die <span style="color:#4C58F0">„Kirche“</span> ist, untrennbar mit Menschen verbunden, die schon, von allem Anfang an, und jetzt immer noch, durch die Sünde korrumpiert sind. Mit ihr will und wird GOTT unsere Welt und die Menschheit, bis ans Ende der Zeit, von der Sünde und von deren Konsequenz, dem <span style="color:#00B000">(ewigen)</span> Tod <span style="color:#4C58FF">„erlösen“</span>, <span style="color:#00B000">(jedoch nicht ohne die Zustimmung des Menschen)</span>. Mit dieser Explikation wird die Tragweite des ontologischen Arguments ANSELMS, und damit auch die <span style="color:#4C58FF">„theologische“</span> Relevanz der GÖDEL-Axiomatik erkennbar. Immer vorausgesetzt, <span style="color:#00B000">(,angenommen‘)</span>, man glaubt an GOTT, <span style="color:#00B000">(Term :01:)</span>.
====<div class="center"><span style="color:#660066">3. Beweisgang</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDELS ontologischer Beweis für Theorem 3, (ANSELMS Theorem)</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe___________________„Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 5)} & \quad P\ E_{not}\; \ & \text { } & \text{„Notwendige Existenz ist eine positive Eigenschaft“} \\
\text{ } & \text{( :: Das ist nur dann wahr, wenn ,Dasein‘ und ,Wesen‘ } & \ & \text{( :: dagegen KANT : ,Existenz‘ ist keine ,Eigenschaft‘,} \\
\text{ } & \;\;\text{in eins zusammenfallen ! ARISTOTELES : Theorem-2)}\ & \ & \;\;\text{,Sein‘ ist für alles, was existiert, kein ,reales Prädikat‘ ! )} \\
\text{(Definition 1)} &\quad \ G\ x \;\Longleftrightarrow\; \forall X(\ P \ X \Longrightarrow \ X \ x)\ & \ & \text{„x ist genau dann GOTT, wenn x alle positiven Eigenschaften hat“} \\
\text{(Definition 3)} & \quad \ E_{not}\ x \;\Longleftrightarrow\;\ \forall X \left(\ X_{ess}\ x \Longrightarrow \Box \; \exists y \ X\ y \right) & \ & \text{„Notwendige Existenz ist genau dann eine Eigenschaft von x, wenn} \\
\text{ } & \quad & \ & \;\;\text{alle wesentl. Eigenschaften von x notwendig instanziiert sind“} \\
\text{(Korollar 1)} & \quad \Diamond \; \exists x \ G \ x \ & \ & \text{„Es ist widespruchsfrei möglich, dass es GOTT gibt“} \\
\text{(Theorem 2)} &\quad \ G\ x \;\Longleftrightarrow\; \ G_{ess}\ x \ & \ &\text{„Dasein, GOTT-Sein, Existenz ist das Wesen, die Essenz GOTTES“} \\
\text{(Korollar 2)} &\quad \ G\ x \;\Longrightarrow\; \Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{„Wenn es GOTT gibt, dann gibt es notwendig nur einen GOTT“} \\
\text{(Theorem 3)} & \quad \Diamond \; \exists x \ G \ x \;\Longrightarrow\; \Box \; \exists x \ G \ x \ & \ & \text{( :: ANSELMS Prinzip)} \\
\text{ } & \text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{01} & \quad \ G \ x\ & \ & \text{ AE: „Angenommen, x steht für den GOTT der Christen“} \\
\text{02} & \quad \forall X(\ P \ X \Rightarrow \ X \ x)\ & \ & \text{(D1):01:[Modus ponens] :: (logische Schlussregel)} \\
\text{03} & \quad \ P \ X \Rightarrow \ X \ x\ & \ & \text{:02:[ⱯXA(X) ├ A(X)] :: (Quantorenregel)} \\
\text{04} & \quad \ P \ E_{not}\;\Rightarrow \ E_{not}\ x\ & \ & \text{:03:Instanz(X:= Enot) :: (Substitution für Eigenschaften)} \\
\text{05} & \quad \ E_{not}\ x\ & \ & \text{(A5):04:[Modus ponens] :: [A, A → B├ B]} \\
\text{06} & \quad \forall X \left(\ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y \right) & \ & \text{(D3):05:[Modus ponens]} \\
\text{07} & \quad \ X_{ess}\ x \Rightarrow \Box \; \exists y \ X\ y & \ & \text{:06:[ⱯXA(X) ├ A(X)]} \\
\text{08} & \quad \ G_{ess}\ x \Rightarrow \Box \; \exists y \ G\ y & \ & \text{:07:Instanz(X:= G)} \\
\text{09} & \quad \ G_{ess}\ x \ & \ & \text{(Th2):01:[Modus ponens]} \\
\text{10} & \quad \text{ ├ }\;\Box \; \exists x \ G\ x & \ & \text{:08:09:[Modus ponens]:FUB(y:=x) :: (Freie-Um-Benennung der Var.)} \\
\text{ } & \text{„Es gibt GOTT wirklich, für jede mögliche Welt“} & \ & \Longleftarrow\; \text{1. Hauptergebnis !} \\
\text{11} & \quad \;\Diamond \exists x \ G \ x \;\Longrightarrow \; \Box \; \exists x \ G\ x & \ & \text{(K1):10:[├A├B ╞ A→B] :: ''KONDITIONALER BEWEIS''} \\
\text{(Theorem 3)} & \;\text{„Weil es widerspruchsfrei möglich ist, dass es GOTT gibt,} & \ & \Longleftarrow\; \text{was zu beweisen war ! 2. Hauptergebnis ! } \\
\text{ } & \;\;\text{ist der Glaube, dass es GOTT wirklich gibt, widerspruchsfrei“} \\
\text{12} & \quad \;\Box \; \forall y(\ G \ y \Longrightarrow \ (x = y))\ & \ &\text{(K2):01:[Modus ponens]} \\
\text{13} & \quad \;\Box \; (\exists x \ G\ x \wedge \; \forall y(\ G \ y \Longrightarrow \ (x = y)))\ & \ & \text{:10:12:[Konjunktion]:DIST(□∧)} \\
\text{(Korollar 3)} & \;\text{„Es gibt notwendig genau nur einen GOTT“} & \ & \text{„Es gibt für jede mögliche Welt nur den GOTT der Christen“} \\
\end{align}</math>
</small>
|}
Anmerkung-3 ''':''' <span style="color:#00B000">(Ein Theorem und zwei Korollare, aus den beiden vorhergehenden Beweisgängen, werden hier, im 3. Beweisgang, zu ,Axiomen‘, die das Theorem-ANSELMS und sein Korollar mit-verifizieren und bestätigen.)</span>
Dieser Beweisgang ist das Ziel aller Bemühungen. Hier wird der sog. ,ontologische Gottesbeweis‘ nach ANSELM von Canterbury formal-syntaktisch dargestellt und als logisch nachvollziehbar von GÖDEL bestätigt. Damit hat er aber auch klar gestellt, dass der ontologische Beweis ANSELMS kein Beweis für die ,Existenz‘ des GOTTES der Bibel sein kann, bzw. sein ,will‘ ''':''' Denn mit der Prämisse, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, <span style="color:#00B000">(Term :01:, wie auch schon im ,Basisbeweis‘, und ausformuliert hier in Term :02:, mit der Definition für GOTT)</span>, wird mit dem traditionellen, abendländischen ,GOTT-Glauben‘, der ,glaubt‘, dass der Gott der Christen tatsächlich existiert, — methodologisch als ,Annahme‘ —, der Beweisgang schon regulär und explizit eröffnet, aus dem sich dann, logisch korrekt, mit Hilfe der GÖDEL-Axiome und Definitionen, das ,Theorem ANSELMS‘ ergibt; <span style="color:#00B000">(hier jedoch, mit Günther J. WIRSCHING, ohne den Umweg bei GÖDEL über den <span style="color:#4C58FF">[ Modus Barbara ] :: [ A → B, B → C ├ A → C ] </span>, mit dem modalen Axiom-BECKER ''':''' <span style="color:#4C58FF">— ‚'''◇□A→□A'''‘ —</span>, als <span style="color:#4C58FF">‚B → C‘</span> im kategorischen Syllogismus, das André FUHRMANN recherchiert hat)</span>. GÖDEL verwendet zur Darstellung des sog. ,ontologischen Gottesbeweises‘ nach ANSELM die Struktur eines modal-logischen Kalküls. Ein modal-logisches Kalkül ist ein genau geregeltes Schema, in dem bei bestimmten ,Annahmen‘ <span style="color:#00B000">(Axiome, Definitionen, Prämissen)</span> etwas anderes als das Vorausgesetzte, auf Grund des Vorausgesetzten mit Notwendigkeit folgt. Entsprechend der ,Modalität‘ der sechs ,modal‘ notwendigen, d.h. transzendentalen Voraussetzungen, hier, für den 3. Beweisgang, die in den <span style="color:#00B000">(und durch die)</span> beiden vorhergehenden Beweisgängen schon als <span style="color:#FF6000">„modal wahr“</span>, bzw. als logisch annehmbar, verifiziert und/oder ,bewiesen‘ wurden, sind auch die beiden ,Schlusssätze‘ <span style="color:#00B000">(Theorem-3 und Korollar-3)</span> <span style="color:#FF6000">„modal wahr“</span>, bzw. logisch annehmbar '''!''' Die Wahl der Prämisse :01: dagegen ist nicht ,modal‘ notwendig, sondern beruht auf einer freien Entscheidung, und damit ist auch ihre Interpretation eine freie Entscheidung, mit der Voraussetzung, dass man das Kalkül mit Theoremen aus der <span style="color:#4C58FF">„christlichen Theologie“</span> evaluieren, und damit interpretieren will. Dazu berechtigt die Genese des Kalküls. Der Glaube an den GOTT der Christen ''':''' <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, beruht immer auf einer freien Entscheidung. Das Kalkül, als solches, unabhängig von jeder Interpretation seiner Syntax, ist genau dann ,allgemein‘ <span style="color:#FF6000">»''mathematisch evident''«</span>, d.h. ,ist allgemein gültig‘, wenn es gültigen Logik-Regeln folgt. Die Bestimmung seiner Syntax jedoch, d.h. seine Interpretation, unterliegt hermeneutischen Kriterien, die nicht von Logik-Regeln abhängen, wie hier ''':''' <span style="color:#FF6000">»''(unabhängig von der zufälligen Struktur der Welt). Nur dann sind die Axiome wahr''«</span>, wie GÖDEL selbst hinzufügt. Mit der, — von GÖDEL eingeforderten —, ‚Unabhängigkeit‘ der Kalkül-Axiome von der zufälligen Struktur der Welt, wird implizit für das Kalkül auch festgelegt, dass <span style="color:#FF6000">„GOTT“</span> ‚unabhängig‘ von der zufälligen <span style="color:#00B000">(Raum-Zeit-)</span>Struktur unserer vergänglichen Welt, und daher ,zeitlos-ewig‘ ist, <span style="color:#00B000">(was <span style="color:#4C58FF">„theologisch“</span> korrekt ist)</span>, begründet durch Definition-1 und Axiom-3. Aus der zeitlosen Ewigkeit GOTTES folgt, dass GOTT, <span style="color:#FF6000">„unverursacht“ <span style="color:#00B000">|</span> „grundlos“</span>, für uns immer schon ‚da‘ ist, denn bei Zeitlosigkeit gibt es keinen ,zeitlichen‘ und damit auch keinen ,ontologischen‘ Unterschied zwischen ‚Ursache‘ und ‚Wirkung‘. Beides ist dann koinzident ,eins‘ ''':''' wie ,Wesen‘ und ,Dasein‘ in GOTT, bzw. wie ,Begriff‘ und ,Sein‘, oder ,Möglichkeit‘ und ,Wirklichkeit‘. <span style="color:#00B000">(Man vergleiche damit auch die ,postulierte‘ Einheit von ,Erkenntnisobjekt‘ und ,Erkenntnissubjekt‘ im ,Gott‘ des ARISTOTELES ''':''' im <span style="color:#FF6000">»<span style="color:#00B000">[ selbstbewussten ]</span> ''Erkennen seiner Erkenntnis''<span style="color:#00B000">[-Tätigkeit ]</span>«<span style="color:#00B000"> | </span>„<span style="font-family: Times;"><big>νοήσεως νόησις</big></span>“<span style="color:#00B000"> | </span>„noêseôs noêsis“</span> <small>(‚<span style="font-family: Times;"><big>''Metaphysik''</big></span>‘ XII 9, 1074b34)</small>, im Vollzug seiner Funktion als ,unbewegtes Bewegungsprinzip‘, als <span style="color:#FF6000">„<span style="font-family: Times;"><big>πρῶτον κινοῦν ἀκίνητον</big></span>“<span style="color:#00B000"> | </span>„prôton kinoûn akinêton“</span> der Welt, das alles Übrige <span style="color:#FF6000">»''wie ein Geliebtes''«<span style="color:#00B000"> | <span style="color:#FF6000">„<span style="font-family: Times;"><big>ὡς ἐρώμενον</big></span>“</span> | <span style="color:#FF6000">„hôs erômenon“</span> bewegt; d.h. christlich ''':''' <span style="color:#FF6000">»''aus Liebe''«</span> ,entstehen‘ lässt.)</span>
Anmerkung-4 ''':''' Das <span style="color:#00B000">(im 2. Beweisgang)</span> schon bewiesene Theorem-2, d.i. die Koinzidenz von <span style="color:#FF6000">„Sein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, <span style="color:#00B000">(‚Existenz‘</span> und <span style="color:#00B000">‚Essenz‘)</span>, rechtfertigt sowohl Axiom-5 als auch die Definition-3, und widerlegt den Einwand KANTS. Somit ist deren Setzung <span style="color:#00B000">(hier, im 3. Beweisgang)</span> korrekt, und durch das Theorem-2 schon vorbestimmt und bestätigt, d.h. beide sind <span style="color:#FF6000">„modal wahr“</span> und ,logisch‘ annehmbar, da sie durch die Gültigkeit von Theorem-2 ,verifiziert‘ worden sind. Damit wird klar erkennbar, dass das Theorem-2 tatsächlich die Basis des GÖDEL-Kalküls ist. Und wenn damit Axiom-5 im GÖDEL-Kalkül ‚gerechtfertigt‘ ist, dann ist auch, <span style="color:#00B000">(als Voraussetzung dafür)</span>, das Axiom-4 ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ — ''':''' </span> <span style="color:#FF6000">»''Positive Eigenschaften'', <span style="color:#00B000">[ ,Transzendentalia‘ ]</span>, ''sind notwendig aus sich'', <span style="color:#00B000">[ von Natur aus ]</span>, ''positiv''«</span>, im 2. Beweisgang erklärbar, in dem die ‚Positivität‘, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, einer Eigenschaft schon als ‚notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, charakterisiert worden ist, äquivalent zu Axiom-5 ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>, in dem die ‚Notwendigkeit‘, <span style="color:#4C58FF">— <sub>not</sub> —</span>, <span style="color:#00B000">(der Existenz <span style="color:#4C58FF">— ‚'''E'''‘ —</span>)</span>, dann als ‚positive‘ Eigenschaft, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, ‚bestimmt‘ wird; <span style="color:#00B000">(unter der speziellen Voraussetzung, dass <span style="color:#FF6000">„Existieren“</span> definitiv als eine <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT ,instanziiert‘ ist; vgl. Definition-3. Eine ,bestimmte‘ Eigenschaft ist genau dann ,instanziiert‘, wenn sie an einem Träger real ,existiert‘. Definition-3 ''':''' <span style="color:#4C58FF">— ‚'''E'''<sub>not</sub>'''x ↔ ∀X(X'''<sub>ess</sub>'''x →□∃yXy)'''‘ —</span>, besagt, dass die, von GÖDEL ,postulierte‘, und im Basis-Theorem-2 verifizierte, <span style="color:#FF6000">„notwendige Existenz“</span> zu den ,ultimativen‘ Transzendentalia in GOTT gehört. Genauer ''':''' Sie ist die ,Summe‘ aller Transzendentalia.)</span> Zum Axiom-4, <span style="color:#00B000">(bzw. zum Term :14:, im 2. Beweisgang)</span>, erklärt GÖDEL in seinen Notizen zum Kalkül ''':''' <span style="color:#FF6000">»''da es'' <span style="color:#00B000">[ das Notwendigsein, <span style="color:#4C58FF">— '''□''' —</span> ]</span> ''aus der Natur der'' <span style="color:#00B000">[ positiven ]</span> ''Eigenschaft folgt'', <span style="color:#00B000">[ deren Positivität, im selben Beweisgang, mit Term :13: vorher schon ,bewiesen‘ (╞ ) worden ist ]</span>«</span>. Die GÖDEL-Erklärung zum Axiom-4 entspricht der Modal-Regel zur sog. ,Nezessisierung‘ in der KRIPKE-Logik nach GÖDEL. <span style="color:#4C58FF">[ Nezessisierungsregel ] '''::''' [ ├ A →├ □ A ]</span> ''':''' <span style="color:#FF6000">»''Angenommen'', <span style="color:#4C58FF">‚'''A'''‘</span> ''ist in einem Kalkül eine Prämisse, oder darin regulär'' <span style="color:#4C58FF">(├ )</span> ''abgeleitet, dann folgt in diesem Kalkül regulär'' <span style="color:#4C58FF">(├ )</span>, ''dass dieses'' <span style="color:#4C58FF">‚'''A'''‘</span> ''auch ,modal‘ notwendig'' <span style="color:#4C58FF">— ,□‘ —</span> ''ist''«</span>. GÖDEL hat jedoch diese modale Notwendigkeit nur in der ,Natur‘ der positiven Eigenschaften, alias ,Transzendentalia‘, gesehen, und mit den Aussagen im Axiom-4 expliziert ''':''' <span style="color:#4C58FF">— ‚'''PX → □PX'''‘ —</span> ''':''' <span style="color:#FF6000">»''unabhängig von der zufälligen Struktur der Welt, nur dann sind die Axiome wahr''«</span>. Ob dieselbe modale Notwendigkeit auch auf Aussagen über Eigenschaften, wie ,rot‘ oder ,schwer‘, die weder positiv noch negativ sind, zutrifft, ist nicht erwiesen. Hier kann nur von modaler ,Kontingenz‘ gesprochen werden, die universal, alles Seiende innerhalb der <span style="color:#FF6000">»''zufälligen Struktur der Welt''«</span> betrifft. Somit sind die Aussagen <span style="color:#4C58FF">— ‚'''A'''‘ —</span> in der GÖDEL-Regel, nur auf Aussagen über ,positive‘ Eigenschaften eingeschränkt, und nicht allgemein gültig. Die <span style="color:#4C58FF">[ Nezessisierungsregel ]</span> ist nur für <span style="color:#FF6000">„Transzendentalia“ „modal wahr“</span>, und für ,Nicht-Transzendentalia‘ immer <span style="color:#FF6000">„modal falsch“</span>.
Der unbegrenzt Unendliche, GOTT, — im Glauben der Christen —, ist deswegen ,notwendig für uns da‘ ''':''' <span style="color:#4C58FF">— ‚'''Gx→E'''<sub>not</sub>'''x'''‘ —</span>, weil er als GOTT ,vollkommen‘, ,perfekt‘ und absolut ,positiv‘, d.h. absolut ,gut allein‘ ist, ohne jede Negativität ''':''' <span style="color:#4C58FF">— ‚'''PG'''‘ —</span>; <span style="color:#00B000">(was auch schon im 2. Beweisgang mit Term :13: verifiziert wurde)</span>. Und wenn GOTT ,vollkommen‘, ,perfekt‘, ,positiv‘, und absolut ,gut‘ ist, dann ist er das auch ,notwendig aus sich‘ ''':''' <span style="color:#4C58FF">— ‚'''PG → □PG'''‘ — ::</span> <span style="color:#00B000">(als Zusatz-Korollar im 2. Beweisgang mit Axiom-4 und der <span style="color:#4C58FF">[ Instanz(X:=G) ]</span>)</span>, d.h. ,aus seinem Wesen‘. Das ist gerade das, ,was‘ GOTT als GOTT ausmacht ''':''' sein ,Wesen‘, bzw. seine <span style="color:#FF6000">„Natur“</span>. Zusammen mit der Definition-1 für GOTT, <span style="color:#00B000">(und der Definition-2 ''':''' Alle Wesenseigenschaften hängen notwendig gleichwertig aus sich zusammen)</span>, ist dieses, aus der <span style="color:#FF6000">„Natur“</span> GOTTES sich ergebende, ‚Notwendigsein‘, <span style="color:#4C58FF">— '''□''' —</span>, aller ‚positiven‘ Eigenschaften im Axiom-4, und ihr logischer Zusammenhang, d.i. die Koinzidenz aller ,Vollkommenheiten‘ und ,Zuschreibungen‘ im Unendlichen, GOTT, ihr ,Zusammenfallen in eins‘, die entscheidende Voraussetzung, aus der sich dann für GÖDEL <span style="color:#00B000">(im 2. Beweisgang)</span> auch der logische Zusammenhang, bzw. die ontologische Identität, <span style="color:#00B000">(die Koinzidenz)</span>, von <span style="color:#FF6000">„Dasein“</span> und <span style="color:#FF6000">„Wesen“</span> in GOTT, im Basis-Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ —</span> mit Notwendigkeit ergibt. Damit hat GÖDEL ein altes <span style="color:#4C58FF">„theologisches“</span> Theorem der Vergessenheit entrissen. Das Theorem-2 ist dann, in weiterer Folge, die ,modal‘ notwendige, d.h. die transzendentale Voraussetzung auch für den Konsequenz-Teil im Theorem ANSELMS, <span style="color:#00B000">(Term :09: hier im 3. Beweisgang)</span>. <span style="color:#FF6000">„Positive Eigenschaften“<span style="color:#00B000"> | </span>„Vollkommenheiten“</span> sind ,immer‘ auch <span style="color:#FF6000">„notwendige Eigenschaften“</span>, daher ''':''' <span style="color:#4C58FF"> — ‚'''PE'''<sub>not</sub>‘ —</span>. Das ,Dasein‘, die <span style="color:#FF6000">„Existenz“</span> ist ,immer‘ etwas <span style="color:#FF6000">„Positives“</span>, speziell in GOTT, dem Schöpfer jeder ,Existenz‘, bzw. allen ,Seins‘. Axiom-4 begründet im GÖDEL-Kalkül das Basis-Theorem-2, <span style="color:#00B000">(wie auch das Korollar-3 von der exklusiven Einzigartigkeit GOTTES)</span>, und ,verankert‘ diese Theoreme damit zugleich in der <span style="color:#4C58FF">,theologisch‘</span>-philosophischen Tradition der ,Rede von GOTT‘ bei ARISTOTELES, — AVICENNA, — ANSELM, — DESCARTES, — LEIBNIZ, — HEGEL, — und bei GÖDEL mit äußerster ,logischer‘ Klarheit.
Anmerkung-5 ''':''' Der ‚Schlüsselbegriff‘ in diesem Kalkül ''':''' <span style="color:#FF6000">„positive Eigenschaft“</span>, bzw. <span style="color:#FF6000">„Vollkommenheit“<span style="color:#00B000"> | </span>„Perfektion“</span>, <span style="color:#4C58FF">— ‚'''P'''‘ —</span>, dominiert alle Axiome des GÖDEL-Kalküls, jedoch ohne inhaltlich genauer ‚bestimmt‘ worden zu sein. Für <span style="color:#4C58FF">— ‚'''P'''‘ — </span> gibt es keine explizite Definition '''!''' <span style="color:#00B000">(Das Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span>, besagt nur, dass die ,postulierten‘, positiven Eigenschaften, die <span style="color:#FF6000">„Transzendentalia“</span>, formal miteinander verträglich, d.h. ‚widerspruchsfrei‘ sind, wegen Axiom-2. Axiom-2 ''':''' <span style="color:#4C58FF">— ‚'''PX ∧ □∀x(Xx→Yx)→PY'''‘ —</span>, besagt, dass positive Eigenschaften ,gleichwertig‘ sind, d.h. gleich ,wahr‘ sind, weil sie ,notwendig‘, <span style="color:#4C58FF">— '''□''' —</span>, aus sich, alle paarweise mit- und voneinander ,impliziert‘ sind, sich gegenseitig ,einschließen‘, und damit eine Einheit bilden, d.h. in GOTT ,eins‘ sind. Axiom-2 ist somit zugleich eine ,indirekte‘ Definition für ,positive‘ Eigenschaften ''':''' <span style="color:#4C58FF">— ‚'''P'''‘ —</span>. Definition-2 ''':''' <span style="color:#4C58FF">— ‚'''X'''<sub>ess</sub>'''x ↔ Xx ∧ ∀Y(Yx→ □∀y(Xy→Yy))'''‘ —</span>, besagt ''':''' Weil die ,gleichwertigen‘, positiven Eigenschaften sich gegenseitig implizieren, und damit notwendig von einander abhängen, d.h. koinzident in GOTT ,eins‘ sind, — wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT steht —, dann sind sie somit auch die ,wesentlichen‘ Eigenschaften, die <span style="color:#FF6000">„ultimativen Transzendentalia“</span>, in GOTT, der, wesentlich und exklusiv, notwendig ,Einer‘ ist. Die Definition-2 ist nur dann <span style="color:#FF6000">„modal wahr“</span>, wenn ihre Eigenschafts-Variablen, <span style="color:#4C58FF">— ‚'''X'''‘ —</span> und <span style="color:#4C58FF">— ‚'''Y'''‘ —</span>, mit positive Eigenschaften, d.h. mit <span style="color:#FF6000">„Transzendentalien“</span>, besetzt werden. Diese Definition ist jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn ihre Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind. Fußnote zu Definition-2 in der GÖDEL-Notiz ''':''' <span style="color:#FF6000">»''any two essences of x are nec. equivalent''«</span>. Die paarweise, notwendige Äquivalenz von zwei beliebigen Wesenseigenschaften der Individuum-Variable <span style="color:#4C58FF">‚'''x'''‘</span>, wird hier, spezifisch für GOTT, d.h. wenn <span style="color:#4C58FF">‚'''x'''‘</span> für GOTT, dem ,Einen‘, steht, zur <span style="color:#FF6000">„Koinzidenz“</span>, — zum paarweise ,Zusammenfallen aller Gegensätze in Einem‘ —, dem inneren Zusammenhang aller seiner <span style="color:#FF6000">„ultimativen“</span> Vollkommenheiten, d.h. aller <span style="color:#FF6000">„Transzendentalia“</span> und Zuschreibungen, in dem unbegrenzt Unendlichen, GOTT, den schon der Philosoph und Kardinal NIKOLAUS von Cues als <span style="font-family: Times;"><big>,coincidentia oppositorum‘</big></span> verstanden hat.)</span>
In den entscheidenden ‚Schlusssätzen‘ des Kalküls ist der ‚Schlüsselbegriff‘ verschwunden. Hier ist nur mehr von GOTT, <span style="color:#4C58FF">— ‚'''G'''‘ —</span>, die Rede ''':''' Korollar-1, <span style="color:#FF6000">»''Es ist definitiv denkbar, dass es GOTT gibt''«</span>, Theorem-2, <span style="color:#FF6000">»''Dasein, GOTT-Sein, Göttlichkeit ist das Wesen GOTTES''«</span>, Theorem-3, <span style="color:#FF6000">»''Weil GOTT definitiv denkbar, d.h. widerspruchsfrei möglich ist, darum ist auch der Glaube an GOTT widerspruchsfrei, logisch richtig und mathematisch evident, der annimmt, dass es GOTT, mit Notwendigkeit, wirklich gibt''«</span>, <span style="color:#00B000">(nach ANSELM von Canterbury, und was spezifisch das <span style="color:#FF6000">»</span>''Privilegium der Gottheit allein''<span style="color:#FF6000">«</span> ist, nach LEIBNIZ)</span>, und Korollar-3, <span style="color:#FF6000">»''Es gibt notwendig aus sich, d.i. unverursacht, nur einen GOTT''«</span>. Das GÖDEL-Kalkül ist zu diesen Erkenntnissen gekommen, ohne die Eigenschaften, bzw. die ‚Vollkommenheiten‘ GOTTES, d.h. wer oder was GOTT ‚an sich‘ selbst ist, genauer bestimmen zu müssen, <span style="color:#00B000">(was ,für uns‘ ohnehin ,unmöglich‘ ist)</span>; außer im Theorem-2, in dem das <span style="color:#FF6000">„Dasein“</span> GOTTES als die ‚für uns‘ bestimmende und wichtigste <span style="color:#FF6000">„Wesenseigenschaft“</span> in GOTT erkannt worden ist, — immer vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span>, man ‚glaubt‘ an den zeitlos-ewigen GOTT ''':''' <span style="color:#00B000">(Term :01:)</span>. Der GOTT des GÖDEL-Kalküls ist nicht mehr der an Raum und Zeit gebundene ‚Gott‘ des ARISTOTELES, sondern der von Raum und Zeit <span style="color:#FF6000">»''unabhängige''«</span> GOTT der Bibel bei ANSELM und bei LEIBNIZ. Das GÖDEL-Kalkül, <span style="color:#00B000">(wie ja auch der sog. ‚ontologische Gottesbeweis‘ ANSELMS)</span>, kann jedoch, — bei aller ‚Coolness‘ —, keinen GOTT-Glauben ‚erzeugen‘, sondern setzt vielmehr die Existenz GOTTES notwendig als gegeben schon voraus. Das Kalkül des Logiker GÖDEL beweist aber, dass der traditionelle ‚GOTT-Glaube‘, <span style="color:#FF6000">»''die theologische Weltanschauung''«</span>, mit den Maßstäben der modernen Logik <span style="color:#FF6000">»''durchaus vereinbar''«</span>, d.h. logisch ,richtig‘ und <span style="color:#FF6000">»''mathematisch evident''«</span> ist, weil der ‚Nicht-GOTT-Glaube‘, <span style="color:#FF6000">»''die atheistische Weltanschauung''«</span>, im Möglichkeitsbeweis notwendig zu unlösbaren Widersprüchen führt, und somit logisch ,falsch‘ ist. <span style="color:#00B000">(Die ,Logik‘ hat aber, — bekanntlich —, bei allen wichtigen, persönlichen Entscheidungen immer nur eine untergeordnete Rolle '''!''' )</span>
Anmerkung-6 ''':''' Das erste, ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleitete, Hauptergebnis im 3. Beweisgang, Term :10: <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> ''':''' der Glaube, dass GOTT ,notwendig‘ existiert, ist die logische Konsequenz aus der Prämisse, Term :1: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>. Dieses erste Hauptergebnis hat also den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist daher davon ,abhängig‘, d.h. Term :10: ist der Ausdruck einer ,Glaubensüberzeugung‘. Das zweite Hauptergebnis im 3. Beweisgang, das Theorem ANSELMS ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, dagegen, ist die Darstellung der Abhängigkeit des ersten Hauptergebnisses von dem, vorher schon bewiesenen, ,Axiom‘ von der ,möglichen‘ Existenz GOTTES ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang. Dem geht folgende Beobachtung voraus ''':''' Der Term ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, hat in seiner syntaktischen Stellung hier, im Theorem-3, nicht mehr den überlieferten, traditionellen GOTT-Glauben zur Voraussetzung, und ist damit, in seiner Position als Konsequenz-Teil im Theorem ANSELMS, auch nicht mehr davon syntaktisch abhängig, sondern stützt sich formal-syntaktisch nur auf die behauptete Möglichkeit GOTTES; daher muss diese ,angenommene‘ Möglichkeit noch bewiesen <span style="color:#00B000">( ╞ )</span> werden. Dazu die Feststellung LEIBNIZ‘, der diesen Zusammenhang, und seinen Mangel, erkannt hat ''':'''
::Das Theorem ANSELMS ist <span style="color:#FF6000">» ''ein unvollständiger Beweis, der etwas voraussetzt, was man noch hätte beweisen'' <span style="color:#00B000">( ╞ )</span> ''sollen, um ihm mathematische Evidenz zu verleihen — nämlich, dass man dabei stillschweigend voraussetzt, diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens sei möglich und enthalte keinen Widerspruch'' «</span>.
Diesen <span style="color:#FF6000">»''unvollständigen Beweis''«</span> hat GÖDEL im 1. Beweisgang mit dem ,regulär‘ <span style="color:#00B000">(├ )</span> abgeleiteten, und widerspruchfreien Möglichkeits-Korollar-1, vervollständigt, und damit hat er mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span> bewiesen ''':''' <span style="color:#FF6000">»''Diese Vorstellung des durchaus großen oder durchaus vollkommenen Wesens''«</span> enthält <span style="color:#FF6000">»''keinen Widerspruch''«</span> '''!''' Das Korollar-1 ist nur vom logischen Axiom-1 und von der mathematischen Äquivalenz der Perfektionen, <span style="color:#00B000">(der Transzendentalien)</span>, im Axiom-2 ,abhängig‘, und nicht mehr von der ,methodologischen‘ Kalkül-Prämisse, dem traditionellen GOTT-Glauben. Damit hat das Glaubens-Theorem ANSELMS die gesuchte <span style="color:#FF6000">»''mathematische Evidenz''«</span> erreicht, unabhängig von jeder Glaubensüberzeugung. Entscheidend dafür ist der mathematisch-logische Beweis GÖDELS, dass der Nicht-GOTT-Glaube zu einem Widerspruch führt.
Zusammenfassung ''':'''
Theorem-1 ''':''' <span style="color:#4C58FF">— ‚'''PX→◇∃xXx'''‘ —</span> ''':''' <span style="color:#FF6000">»''Positive Eigenschaften sind konsistent''«</span>, ist die logische Konsequenz aus der Prämisse im 1. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''PX'''‘ —</span>, den, — <u>modal-frei</u> — gewählten, ,angenommenen‘ positiven Eigenschaften, bzw. ,Transzendentalia‘.
Theorem-2 ''':''' <span style="color:#4C58FF"> — ‚'''Gx↔G'''<sub>ess</sub>'''x'''‘ — </span> ''':''' <span style="color:#FF6000">»''GOTT-Sein ist das Wesen GOTTES''«</span>, ist die logische Konsequenz aus der Prämisse im 2. Beweisgang, Term :01: <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span>, dem, — <u>modal-frei</u> — gewählten, ,angenommenen‘ GOTT-Glauben der Christen.
Im Unterschied dazu ist im 3. Beweisgang, das Theorem-3 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span> ''':''' der Glaube, dass es einen GOTT notwendig gibt ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, die logische Konsequenz aus dem, — <u>modal-notwendig</u> — als widerspruchsfrei ,bewiesenen‘, Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, im 1. Beweisgang, <span style="color:#00B000">(auch im Beweisgang ,Widerlegung‘ im Anhang)</span>, und damit ist das Glaubens-Theorem-3, als ganzes, ,widerspruchsfrei‘. Das Theorem ANSELMS ist, mit Korollar-1, nur vom logischen Axiom-1 der Widerspruchsfreiheit, und der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften, <span style="color:#00B000">(aller Transzendentalia)</span>, im Axiom-2, abhängig. Damit ist die Bedingung für die geforderte, spezielle <span style="color:#FF6000">»''mathematische Evidenz''«</span>, und auch für die Widerspruchsfreiheit im Glaubens-Theorem ANSELMS erfüllt; unabhängig von jeder Glaubensüberzeugung. Weil es <span style="color:#FF6000">„modal wahr“</span> ist, dass die Transzendentalien, bzw. die Vollkommenheiten ontologisch, — dem Sein nach —‚ alle <span style="color:#00B000">(zueinander)</span> widerspruchsfrei, und alle <span style="color:#00B000">(miteinander)</span> gleichwertig sind, ist es auch <span style="color:#FF6000">„modal wahr“</span>, dass es möglich ist, dass GOTT, — dem Sein nach —‚ da ist, <span style="color:#00B000">(d.h. existiert)</span>, der die unbegrenzte Summe aller ultimativen Transzendentalia, bzw. der unendlichen Vollkommenheiten allen Grades ist, wie es der ,christliche Glaube‘ des Erzbischofs ANSELM und seiner Anvertrauten ,annimmt‘.
====<div class="center"><span style="color:#660066">Widerlegung</span></div>====
{|class="wikitable"
|-
! <div class="center"><span style="color:#660066">GÖDEL-Kalkül : der Möglichkeitsbeweis als Widerlegung des Nicht-GOTT-Glaubens</span></div>
|-
! <span style="color:#00B000">''Terme der erweiterten Prädikatenlogik zweiter Stufe_____________ „Benennungen“ und durchgeführte Logik-Operationen''</span>
|-
|
<small>
<math>\begin{align}
\text{(Axiom 1.1)} & \quad P \neg X \;\Longrightarrow\;\ \neg P\ X\ & \ & \text{„Wenn die Negation von X positiv ist, dann ist X nicht positiv“} \\
\text{(Axiom 2)} & \quad \Box \;\forall x (\ X\ x \Longrightarrow \ Y\ x) \Longrightarrow \ P\ Y & \ & \text{„Die Eigenschaft Y in allen x, die aus der Eigenschaft X in allen x} \\
\text{ } & \quad & \ & \; \; \text{mit modaler Notwendigkeit folgt, ist eine positive Eigenschaft“} \\
\text{[RK]} &\quad \Box\; \forall x A \;\Longrightarrow\;\Box\; \forall x B\; \text{ ├ }\;\Box \; \forall x (A \Longrightarrow\; B)\ & \ & \; \; \text{( :: Modales Prinzip KRIPKE-Γ-Ɐx)} \\
\text{(Korollar-1)} &\quad \Diamond \; \exists x \ G \ x \ & \ & \; \; \text{( „das —,x‘— steht für den GOTT, —,G‘—, der Christen“ )} \\
\text{ } & \text{„Es ist möglich, dass es den GOTT der Christen gibt“} & \ & \Longleftarrow\; \text{was zu beweisen ist !} \\
\text{01} & \quad \; \neg \Diamond \; \exists x \ G \ x \ & \ & \text{ AE: „Es ist unmöglich, dass es diesen GOTT gibt“ (dezidierter Atheismus)} \\
\text{02} & \quad (\neg x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, nicht mit x identisch zu sein“ :: (ungleich)} \\
\text{03} & \quad (\ x = .. )\ & \ & \text{ AE: „Es gibt die Eigenschaft, mit x identisch zu sein“ :: (gleich)} \\
\text{04} & \quad \neg\neg \Box \neg \exists x \ G \ x \ & \ & \text{:01:[ ◇A ↔ ¬□¬A ] :: (Modalregel) } \\
\text{05} & \quad \neg\neg \Box \neg\neg \forall x \neg \ G \ x \ & \ & \text{:04:[ ∃xA ↔ ¬Ɐx¬A ] :: (Quantorenregel) } \\
\text{06} & \quad \text{ ├ }\; \Box \; \forall x \neg G \ x \ & \ & \text{:05:NEG :: [ ¬¬A↔A ] :: (Gesetz der Aussagenlogik) } \\
\text{07} & \quad \Box \; \forall x \neg G \ x \Leftrightarrow\ W & \ & \text{:01:06:[ (:01:↔W) → (├:06:↔W) ] :: (Kalkülregel) } \\
\text{08} & \quad \Box \; \forall x \ G \ x \Leftrightarrow\ F & \ & \text{:07:[ (¬A↔W)↔(A↔F) ] :: (Regel für Wahrheitswerte)} \\
\text{ } & \text{„Jeder GOTT-Glaube ist notwendig falsch ! “} & \ & \Longleftarrow\; \text{die logische Konsequenz aus der Prämisse :01: !} \\
\text{09} & \quad \Box \; \forall x (\neg x = x ) \Leftrightarrow \ F \; \ & \text{ } & \text{□ⱯxXx:02:Instanz(X:=(¬x=..)) ⇒ Kontradiktion !} \\
\text{10} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (\neg x = x)) & \text { } & \text{:08:09:[ (:08:↔F) → (:09:↔F) ] :: „ex falso sequitur quotlibet“ :[RK]} \\
\text{11} & \quad \Box \; \forall x (\ G \ x \Rightarrow \; (\neg x = x)) \Rightarrow \; P (\neg x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=(¬x= ..)) } \\
\text{12} & \quad \ P (\neg x = .. ) & \ & \text{:10:11:[ Modus ponens ] :: [ A→B, A ├ B ]} \\
\text{13} & \quad \ P (\neg x = .. )\;\Rightarrow\ \neg P (\ x = .. )\ & \ & \text{(A1.1):Instanz(X:=(x=..))}\\
\text{14} & \quad \neg P (\ x = .. )\ & \ & \text{:12:13:[ Modus ponens ] :: (log. Schlussregel)}\\
\text{15} & \quad \Box \; \forall x \ (x = x ) \Leftrightarrow \ W \; \ & \ & \text{□ⱯxXx:03:Instanz(X:=(x=..)) ⇒ Tautologie !} \\
\text{16} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) & \ & \text{:08:15:[ (:08:↔F) → (:15:↔W) ] :: „ex falso sequitur etiam verum“ :[RK]} \\
\text{17} & \quad \Box \; \forall x (\ G \ x \Rightarrow\; (x = x)) \Rightarrow \ P (x = .. ) & \ & \text{(A2):Instanz(X:=G):Instanz(Y:=( x= ..))} \\
\text{18} & \quad \ P (\ x = .. )\ & \ & \text{:16:17:[ Modus ponens ]}\\
\text{19} & \quad \text{ ├ }\; (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) \Leftrightarrow\ F & \ &
\text{:14:18:[ Konjunktion ] ⇒ Kontradiktion !}\\
\text{20} & \quad \neg \Diamond \; \exists x \ G \ x \Rightarrow (\neg P (\ x = .. )\ \wedge \ P (\ x = .. )) & \ & \text{:01:19:[ ├A├B╞ A→B ] :: ''KONDITIONALER BEWEIS''}\\
\text{ } & {\color{RedOrange}\text{Der Atheismus führt zu einem logischen Widerspruch ! }} & \ & \Longleftarrow\; \text{was mit Term :20: bewiesen ist !} \\
\text{21} & \quad \neg\neg \Diamond \; \exists x \ G \ x & \ & \text{:20:19:[ Modus tollendo tollens ] :: [ A→B,¬B ├ ¬A ]}\\
\text{22} & \quad \; \Diamond \; \exists x \ G \ x & \ & \text{:21:NEG }\\
\text{(Korollar-1)} & \;\text{„Es ist definitiv möglich, dass es diesen GOTT gibt“} & \ & \Longleftarrow\; \text{was zu beweisen war !} \\
\end{align}</math>
</small>
|}
Anmerkung-7 ''':''' <span style="color:#00B000">( Dieser Beweisgang ist praktisch identisch mit dem 1. Beweisgang, jedoch gestrafft und präzisiert nach G.J.WIRSCHING. Diese Widerlegung des Nicht-GOTT-Glaubens beginnt sofort mit dem Korollar-1 <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> aus dem 1. Beweisgang, als in Frage gestelltes ,Theorem‘, und beweist, ohne das Axiom-3 <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, und ohne die GÖDEL-Prämisse <span style="color:#4C58FF">— ,'''PX'''‘ —</span>, in einem Zwischenergebnis, die innere Widersprüchlichkeit und damit auch die Unhaltbarkeit der atheistischen Glaubens-Annahme, aus rein logischen ,Gründen‘, bzw. Axiomen. )</span>
Dieser Beweisgang geht von der Existenz GOTTES, <span style="color:#4C58FF">— ,'''G'''‘ —</span>, als Glaubens-Annahme, aus, wobei aber die Möglichkeit seiner Existenz, und damit die Sinnhaftigkeit des Glaubens an GOTT, durch die Prämisse :01: in Frage gestellt wird, und daher im Kalkül überprüft werden muss. Denn mit der Behauptung der Existenz GOTTES allein ist es nicht getan. Es muss auch seine ,Möglichkeit‘, d.h. die Sinnhaftigkeit des Glaubens an GOTT aufgewiesen werden. LEIBNIZ hat als erster, <span style="color:#00B000">(nach ANSELM)</span>, dieses Problem gesehen, und GÖDEL hat dafür die Lösung gefunden. Dieser Beweisgang, <span style="color:#00B000">(analog zum Möglichkeitsbeweis von Günther J. WIRSCHING konzipiert)</span>, setzt in den Axiomen, genau wie im 1. Beweisgang, die Existenz von etwas <span style="color:#FF6000">„Positiven“, „Perfekten“, „Vollkommenen“</span>, <span style="color:#4C58FF">— ,'''P'''‘ —</span>, <span style="color:#00B000">(d.h. die Transzendentalien)</span>, allgemein für die Welt voraus, <span style="color:#00B000">(was im Axiom-3 ''':''' <span style="color:#4C58FF">— ,'''PG'''‘ —</span>, auch GOTT ultimativ zugeordnet wird ''':''' <span style="color:#FF6000">»''GOTT ist absolut positiv, perfekt und vollkommen''«</span>)</span>; das dann im 2. Beweisgang mit Term :13: als widerspruchsfrei, <span style="color:#00B000">(als ,wahr‘ und ,annehmbar‘ im Kontext des christlichen Glaubens)</span>, schon ,bewiesen‘ <span style="color:#00B000">( ╞ )</span> worden ist. Die Existenz von ,Transzendentalien‘ in der Welt, ist ein, mit Beispielen belegbares, allgemeines Faktum; ihre Existenz auch in GOTT ist mit dem Term :13: des 2. Beweisganges bewiesen, die jedoch im Unendlichen, GOTT, als Transzendentalia, auch in ,ultimativer‘ Form vorliegen. Axiom-1 ,besagt‘, dass Eigenschaften nicht zugleich, vollkommen und nicht vollkommen, sein können. Axiom-2 ,besagt‘, dass, allgemein, alle Vollkommenheiten, <span style="color:#00B000">(alle Transzendentalien)</span>, gleichwertig, <span style="color:#00B000">(mathematisch äquivalent)</span>, sind. <span style="color:#00B000">(Axiom-2 wird hier um das GÖDEL-Konjunkt <span style="color:#4C58FF">— ,'''PX'''‘ —</span> verkürzt dargestellt. Damit ist auch Axiom-3 für diesen Beweisgang unnötig geworden, ohne dass sich wegen dieser Kürzung am Ergebnis etwas ändert. Axiom-2 wird jedoch sofort <span style="color:#FF6000">„modal falsch“</span>, wenn seine Variablen mit nicht-positive Eigenschaften, wie ,rot‘ oder ,schwer‘ belegt werden, die nicht ,transzendental‘-allgemein gültig sind, die keine ,Transzendentalia‘ sind.)</span> Die Eigenschaft <span style="color:#4C58FF">— (¬x=..) —</span> ,besagt‘, dass GOTT <span style="color:#FF6000">„unvergleichlich“</span> ist, wenn <span style="color:#4C58FF">,'''x'''‘</span> für GOTT steht. <span style="color:#00B000">(Der informelle Term, <span style="color:#4C58FF">— (¬x=..) —</span>, ersetzt hier, wie bei A. FUHRMANN, den formal korrekten Abstraktionsausdruck ''':''' <span style="color:#4C58FF">— λy.(¬x=y) —</span>, aus dem Lambda-Kalkül.)</span> Der Term :16: <span style="color:#4C58FF">— (x=x) ↔ W —</span> steht für die Selbstbezeichnung des GOTTES-JHWH in Exodus 3,14 ''':''' <span style="color:#CC66FF">»''Ich bin der ‚IST‘'' <span style="color:#00B000">(aus mir selbst)</span>«</span>, der Grund für die <span style="color:#FF6000">„Unvergleichlichkeit“</span> GOTTES. Der GOTT der abendländischen, christlichen Tradition wird mit <span style="color:#4C58FF">— ,'''G'''‘ —</span> bezeichnet ''':''' d.i. der <span style="color:#FF6000">„GOTT der Christen“</span>, entsprechend der ,methodologischen‘ Prämisse und der ,Genese‘ des Kalküls, syntaktisch formalisiert in der Definition-1 ''':''' <span style="color:#4C58FF">— ‚'''Gx↔∀X(PX→Xx)'''‘ —</span> ''':''' <span style="color:#FF6000">»''Das Individuum'' <span style="color:#4C58FF">,'''x'''‘</span> ''ist genau dann GOTT'', <span style="color:#4C58FF">,'''G'''‘</span>, ''wenn es alle Vollkommenheiten'', <span style="color:#4C58FF">,'''P'''‘</span>, ''in sich schließt''«</span>, nach der Vorgabe von LEIBNIZ ''':''' <span style="color:#FF6000">»''GOTT ist ein Wesen von äußerster Größe und Vollkommenheit, das alle Grade derselben in sich schließt''«</span>. Mit Korollar-1 hat dieser Beweisgang dasselbe Endergebnis, wie der 1. Beweisgang. Der Beweis, dass der dezidierte Atheismus zu einem logischen Widerspruch führt, und damit falsch ist, ist ein Zwischenergebnis in diesem Beweisgang, und begründet mit <span style="color:#FF6000">»''mathematischer Evidenz''«</span>, und unabhängig von jeder Glaubensüberzeugung, den, von LEIBNIZ gesuchten, Möglichkeitsbeweis für die Existenz GOTTES im Argument des Erzbischofs, und bestätigt damit die Sinnhaftigkeit des GOTT-Glaubens. Einmal Axiom-1 und zweimal Axiom-2 sichern hier das Ergebnis des Kalküls ''':''' das Möglichkeits-Korollar-1 ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>''':''' <span style="color:#FF6000">»''Es ist definitiv möglich, dass es den GOTT der Christen gibt''«</span>. Diese zwei Axiome sind die einzigen, und modal-notwendigen, d.h. die transzendentalen Voraussetzungen und Bedingungen für das Endergebnis ''':''' der Widerspruchsfreiheit und Sinnhaftigkeit des Glaubens der Christen an GOTT; <span style="color:#00B000">(dasselbe gilt natürlich auch für die <span style="color:#4C58FF">„theologische“</span> Weltanschauung jeder monotheïstischen Religion '''!''' Dem Erzbischof ANSELM ging es damals nur um seinen Glauben an GOTT.)</span>.
Die Logik-Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso sequitur quotlibet, etiam verum“</big></span></span>, <span style="color:#00B000">(‚Aus Falschem folgt irgendetwas, auch Wahres‘)</span>, ist der scholastische Ausdruck für die ‚Implikation‘ <span style="color:#00B000">(Folgerung)</span> von Aussagen, die nur dann falsch, <span style="color:#4C58FF">— F —</span> ist, wenn das Antezedens wahr, <span style="color:#4C58FF">— W —</span>, und die Konsequenz falsch, <span style="color:#4C58FF">— F —</span> ist. Andernfalls ist sie immer wahr, <span style="color:#4C58FF">— W —</span>, auch wenn die Voraussetzung falsch, <span style="color:#4C58FF">— F —</span> ist ''':''' ‚Modern‘ darstellbar durch die ‚Wahrheitswertetafel‘ für die ‚materiale Implikation‘, <span style="color:#4C58FF">— ,(A → B)‘ —</span> <span style="color:#FF6000">„wenn A, dann B“</span>. Damit ist auch der <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ] </span> verstehbar; <span style="color:#00B000">(vgl. die vierte Zeile der ‚materialen Implikation‘)</span>. Der positive hypothetische Syllogismus ''':''' <span style="color:#4C58FF">[ Modus ponendo ponens ] :: [ A → B, A ├ B ] </span> ist aus der ersten Zeile ablesbar.
Die folgende Tabelle gibt für jeden ,Wahrheitswert‘ der Aussagen <math>A</math> und <math>B</math> das Resultat einiger zweiwertiger Verknüpfungen an ''':'''
{|class="wikitable hintergrundfarbe2" style="text-align:center;"
|-
!colspan="2"|''Belegung''!!Konjunktion!!Disjunktion!!materiale<br /> Implikation!!Äquivalenz<br /> Bikonditional!!kopulative<br /> Konjunktion
|-
!<math>A</math>
!<math>B</math>
!<math>A</math> und <math>B</math>
!<math>A</math> oder <math>B</math>
!wenn <math>A</math> dann <math>B</math>
!sowohl <math>A</math> als auch <math>B</math>
!entweder <math>A</math> oder <math>B</math>
|-
!W!!W
|W||W||W||W||F
|-
!W!!F
|F||W||F||F||W
|-
!F!!W
|F||W||W||F||W
|-
!F!!F
|F||F||W||W||F
|}
<span style="color:#00B000">(Eine ‚Konjunktion‘ ist nur dann ,wahr‘, wenn beide Aussagen einer ‚Konjunktion‘ wahr sind. Eine ‚kopulative Konjunktion‘ ist nur dann ,wahr‘, wenn entweder die eine, oder die andere Aussage der ‚kopulativen Konjunktion‘ wahr ist. Es besteht also eine Wenn-Dann-Verbindung zwischen beiden Aussagen — eine ,Kopplung‘. Das ist die logische Grundlage von Axiom-1 im GÖDEL-Formalismus)</span>
Um das Widersprüchliche der ,Annahme‘ nachzuweisen, dass positive Eigenschaften ,nicht konsistent‘ seien, <span style="color:#00B000">(im 1. Beweisgang)</span>, bzw. um das Unlogische und Sinnwidrige der ,Annahme‘ klarzustellen, es sei ,unmöglich‘, dass es einen GOTT gibt, <span style="color:#00B000">(hier, in der Widerlegung)</span>, verwendet das GÖDEL-Kalkül den Gegensatz ''':''' wahr, <span style="color:#4C58FF">— W —</span>, falsch, <span style="color:#4C58FF">— F —</span>, zwischen der dritten und vierten Zeile der Wahrheitswertetafel, für zwei ,wahre‘ <span style="color:#4C58FF">— W —</span> ,materiale Implikationen‘, in denen die Voraussetzung jeweils falsch, <span style="color:#4C58FF">— F —</span>, ist, entsprechend der Regel <span style="color:#FF6000"><span style="font-family: Times;"><big>„ex falso, <span style="color:#4C58FF">— F —</span>, sequitur quotlibet, <span style="color:#4C58FF">— F —</span>, etiam verum, <span style="color:#4C58FF">— W —</span>“</big></span></span>, jeweils mit der Hilfe von Axiom-1 und Axiom-2, in einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>; hier unabhängig von jeder Glaubensüberzeugung. Im Gegensatz dazu, wird, <span style="color:#00B000">(im 2. Beweisgang)</span>, aus dem Glauben an GOTT, auch mit einer <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, speziell mit Axiom-1, das Widersprüchliche in der ,Annahme‘ nachgewiesen, es gäbe in GOTT <span style="color:#FF6000">»''keine Vollkommenheit, nichts Positives, nichts Perfektes''«</span>, d.h. keine ,Transzendentalia‘. In dieser <span style="font-family: Times;"><big>,Reductio ad absurdum‘</big></span>, im 2. Beweisgang, wird vorausgesetzt <span style="color:#00B000">(,angenommen‘)</span> ''':''' es gibt den GOTT der Christen, <span style="color:#00B000">(als Prämisse :01:)</span>, der ,unvergleichlich‘ und ,einzigartig‘ ist, und in dem auch alle ,Transzendentalia‘ <span style="color:#FF6000">„koinzident“</span> ,eins‘ sind, entsprechend Axiom-2.
Für KANT entsteht ein Widerspruch in den Prädikaten eines Satzes.
::<span style="color:#FF6000">»</span> ''Wenn ich das Prädicat in einem identischen Urtheile aufhebe'', <span style="color:#00B000">[ durch eine Negation ]</span>, ''und behalte das Subject, so entspringt ein Widerspruch''. <span style="color:#00B000">[ Wenn ich sage ''':''' ,''GOTT ist nicht allmächtig''‘, entsteht ein Widerspruch zur richtigen Aussage ''':''' ,''GOTT ist allmächtig''‘. ]</span> … ''Wenn ihr aber sagt ''':''' ,GOTT ist nicht‘, so ist weder die Allmacht, noch irgendein anderes seiner Prädicate gegeben; denn sie sind alle zusammt dem Subjecte aufgehoben'', <span style="color:#00B000">[ negiert ]</span>, ''und es zeigt sich in diesem Gedanken nicht der mindeste Widerspruch.'' <span style="color:#FF6000">«</span><ref>vgl. ‚''<span style="font-family: Times;"><big>Kritik der reinen Vernunft</big></span>''‘, Seite 398f; https://www.korpora.org/kant/aa03/398.html</ref>
Es ist richtig, wie KANT sagt, der Widerspruch entsteht nicht in dem Gedanken ''':''' <span style="color:#FF6000">»</span>''GOTT ist nicht''<span style="color:#FF6000">«</span>. GÖDEL zeigt daher, dass der Widerspruch erst dann entsteht, wenn von der Annahme ausgegangen wird ''':''' ''<span style="color:#FF6000">»</span>Es ist unmöglich, dass GOTT ist''<span style="color:#FF6000">«</span>. Daraus folgt dann ,regulär‘, mit Hilfe von Axiom-1 und Axiom-2, <span style="color:#00B000">(d.h. mit den Theoremen von den Transzendentalien)</span>, die logische ,Möglichkeit‘ GOTTES, unabhängig von jeder Glaubensüberzeugung. Wie LEIBNIZ klar erkannt hat, muss zuerst, aus dem Widerspruch des Gegenteils, die logische ,Möglichkeit‘, <span style="color:#00B000">(die Konsistenz)</span>, der Existenz GOTTES bewiesen werden ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, bevor daraus die reale ,Notwendigkeit‘ GOTTES abgeleitet werden kann ''':''' <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, dessen ,Existenz‘ jedoch, aus dem ,Glauben‘, im Voraus, schon angenommen worden ist. Dieser Sachverhalt ist das ausschließliche Spezifikum GOTTES, <span style="color:#00B000">(das <span style="color:#FF6000">»''Privilegium der Gottheit allein''«</span>)</span>, und gilt nur bei GOTT, als dem Unvergleichlichen und Einzigartigen. Dieses ,Spezifikum‘ wird im Theorem ANSELMS abgebildet ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx→□∃xGx'''‘ —</span>, auf Grund von Axiom-2, das den inneren Zusammenhang, die Koinzidenz auch von ,Möglichkeit‘ und ,Notwendigkeit‘ im Unendlichen, GOTT, erkennen lässt. Bis Zeile 10, im 3. Beweisgang, reicht der Geltungsbereich der ,modal‘-frei gewählten Kalkül-Prämisse :01:, der ,methodologische‘ GOTT-Glaube. In Zeile 11 liegt der ,Schwerpunkt‘ des ontologischen Beweises dann aber am, — modal als notwendig — ,bewiesenen‘ Widerspruch des Gegenteils zum GOTT-Glauben, <span style="color:#00B000"> (formal-syntaktisch dargestellt als widerspruchfreies Antezedens, <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span>, dem Möglichkeits-Korollar-1 aus dem 1. Beweisgang)</span>, und nicht mehr am ,angenommenen‘ GOTT-Glauben der Kalkül-Voraussetzung, <span style="color:#00B000">(nun dargestellt als Konsequenz <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span> im Theorem ANSELMS)</span>. Das Möglichkeits-Korollar-1 muss jetzt immer, wie folgt, gelesen werden ''':''' <span style="color:#FF6000">»''Es ist <u>widerspruchfrei</u> möglich, dass GOTT ist''«</span>. Damit hat er, — angeregt durch LEIBNIZ, und mit ihm —, die fast einhellig akzeptierte Fehldeutung des ontologisch-<span style="color:#4C58FF">„theologischen“</span> Arguments ANSELMS für GOTT durch gewichtige philosophische, <span style="color:#00B000">(KANT<ref>GOTT ist absolut einzigartig und unvergleichlich. KANT macht GOTT jedoch zu einem ,Ding‘ unter den vielen ,Dingen‘ dieser Welt, indem er die Existenz, bzw. das ,Sein‘ GOTTES mit dem ,Sein der Dinge‘ gleich setzt. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! KANT verkennt damit die Einzigartigkeit und Besonderheit GOTTES. Das ,Sein‘ der Dinge ist, — wie KANT sagt —, kein ,reales Prädikat’, d.h. Existenz ist keine Eigenschaft. Jedoch in GOTT ist ,Sein‘ ein ,reales Prädikat‘, d.h. Existieren ist ,real‘ die Wesenseigenschaft GOTTES, denn GOTT ist der, der für uns, — aus Liebe —, immer schon ,da‘ ist ''':''' in der ,Hypostatischen Union‘, sowohl als GOTT von Ewigkeit zu Ewigkeit, als auch als Mensch in unserer Zeitlichkeit. Das ist das, was GOTT für uns ausmacht —, sein Wesen.</ref>)</span>, und <span style="color:#4C58FF">„theologische“</span>, <span style="color:#00B000">(THOMAS<ref>GOTT ist absolut einzigartig und unvergleichlich. THOMAS unterscheidet die ,Natur GOTTES‘ nicht von der ,Natur der Dinge‘, indem er die ,Natur‘ des GOTTES ANSELMS irrtümlich mit der ,Natur‘ der Dinge gleich setzt. Damit reiht er GOTT unter die vielen Dinge unserer Welt ein, indem er für den GOTT ANSELMS annimmt ''':''' GOTT ,esse in rerum natura‘, d.h. wörtlich, dass der GOTT ANSELMS in der ,Natur‘ der Dinge existiert, <span style="color:#00B000">(was ANSELM nie gesagt hat)</span>. Eine solche Gleichsetzung ist bei GOTT unangebracht und daher unzulässig! Die ,zeitlose-überzeitliche‘ Wirklichkeit, (Natur), GOTTES ist völlig verschieden und unabhängig von der zufälligen Wirklichkeit, (die ,Natur‘), unserer ,raum-zeitlichen‘ Welt. Daher ist sie mit dieser auch nicht vergleichbar. Thomas verkennt damit die Einzigartigkeit und Besonderheit GOTTES.</ref>)</span>, Autoritäten zurechtgerückt, welche die Einzigartigkeit und Unvergleichlichkeit des Unendlichen, GOTT, bei ihrer Beurteilung des Theorem ANSELMS nicht berücksichtigt, sondern den Unendlichen, <span style="color:#00B000">(irrtümlich)</span>, unter die endlichen Dinge unserer Welt eingereiht haben. GÖDEL hat mit dem bewiesenen Widerspruch des Gegenteils zum GOTT-Glauben, den Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Theorem ANSELMS geliefert, was, nach LEIBNIZ, für die Akzeptanz dieses Theorems noch gefehlt hat. Das Theorem ANSELMS besagt universell ''':''' Die <span style="color:#FF6000">»''theologische Weltanschauung''«</span> der Juden, Christen und Muslime, <span style="color:#00B000">(und des ägyptischen Pharaos ECHNATON und seiner Frau NOFRETETE)</span>, die ,annehmen‘, dass es mit ,Notwendigkeit‘ <span style="color:#4C58FF">— ‚'''□'''‘ —</span> <span style="color:#00B000">(nur)</span> einen GOTT gibt, ist logisch richtig und <span style="color:#FF6000">»''mathematisch evident''«</span>, weil es <u>ohne Widerspruch</u> ,denkbar‘ <span style="color:#4C58FF">— ‚'''◇'''‘ —</span> ist, dass es GOTT gibt ''':''' Nicht mehr und nicht weniger, <span style="color:#FF6000">»''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''«</span>.
Es geht hier bei GÖDEL nicht um Theoriefindung oder ähnliches. GÖDEL ist kein ,spekulierender‘ Theoretiker. GÖDEL ist Logiker und Mathematiker. Was er sagt, ist mathematisch wahr und logisch richtig. Wenn er sagt, dass die Aussage ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ — »''wahr''«</span> ist ''':''' <span style="color:#FF6000">»''es ist möglich, dass es Gott gibt'' ''':''' ''das ist ,wahr‘ wegen Axiom-2 (und Axiom-1)''«</span>, dann spricht er hier von der mathematischen Wahrheit. Logischerweise ist dann die konträre Aussage ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ — »''falsch''«</span> ''':''' <span style="color:#FF6000">»''es ist nicht möglich, dass es einen Gott gibt''«</span>, und zwar mathematisch falsch, weil sich aus dieser Aussage ein Widerspruch ergibt. Jeder, der die mathematische Logik GÖDELS lesen kann, kann das sehen und verstehen ''':''' Das Zwischenergebnis, <span style="color:#00B000">(Term :20:)</span>, in dieser Kalkül-Ableitung, die logische Konsequenz aus der Annahme des dezidierten Atheismus, es sei unmöglich, dass es GOTT gibt, ist der faktische, nachprüfbare, und für jeden Menschen sichtbare Beweis dafür, dass diese Annahme in einen Widerspruch mündet, und damit falsch und unlogisch ist. Das bedeutet, es ist eine Tatsache, bzw. es ist ein allgemein gültiges Faktum unser Welt, dass der Atheismus, — mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span> —, wirklich falsch und unsinnig ist, und daher, mit Recht, als ,Unsinn‘ bezeichnet werden darf '''!''' Das ist nicht bloß als eine Theoriefindung, oder als eine Interpretation eines Autors zu verstehen. Das ist vielmehr genau so wahr und <span style="color:#FF6000">»''mathematisch evident''«</span>, wie, dass zwei mal zwei vier ergibt, und wirklich genau so logisch richtig, wie, dass die Erde sich um die Sonne dreht. Das ist gerade das Überraschende und Unerwartete am Gödel-Kalkül. Es geht hier nicht mehr um Theoriefindung oder Interpretationen, denen man zustimmen kann oder nicht. Es geht hier <span style="color:#FF6000">»''rein verstandesmäßig''«</span> um mathematisch-logische Fakten. Damit steht GÖDEL, in seiner Bedeutung, in gewisser Weise, neben KOPERNIKUS, weil seine Kalkül-Ergebnisse, wie die Berechnungs-Ergebnisse dieses Pioniers der damaligen Zeitenwende, heute, in unserem Äon, ebenfalls mit eingefleischte Vorurteile aufräumen, ohne aber, dass GÖDEL für sich selbst, im Glauben, logisch konsequent gewesen wäre. <span style="color:#00B000">(Er ist sich der Tragweite und der Konsequenzen seiner <span style="color:#4C58FF">„axiomatischen Theologie“</span> anscheinend nicht bewusst gewesen, wenn er sagt ''':''' Man sei heute noch <span style="color:#FF6000">»''weit davon entfernt, das theologische Weltbild wissenschaftlich begründen zu können''«</span>, nachdem sein Kalkül das <span style="color:#FF6000">„atheistische Weltbild“</span> fundamental ins Wanken gebracht und als irrationalen ,Unsinn‘ entlarvt hat. Sein Kalkül ,beweist‘ ( ╞ ) indirekt, dass das <span style="color:#FF6000">„theologische Weltbild“</span>, im Beweisgang ,Widerlegung‘, aus dem Widerspruch des Gegenteils, mit <span style="color:#FF6000">»''mathematisch-logischer Evidenz''«</span>, offensichtlich doch, wissenschaftlich begründet werden kann)</span>.
----
Kurt GÖDEL ist auch deswegen ein Ausnahmelogiker.
----
===<div class="center"><span style="color:#660066">Epilog für Skeptiker</span></div>===
Wenn man das GÖDEL-Argument genau liest, dann ist nur die Annahme ''':''' <span style="color:#FF6000"> „es ist möglich, dass es GOTT gibt“</span> bewiesen, weil aus der Annahme ''':''' <span style="color:#FF6000">„es ist unmöglich, dass es GOTT gibt“</span> ein logischer Widerspruch ableitbar ist. Die Aussage ''':''' <span style="color:#FF6000">„es gibt GOTT“</span> ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Menschen, der dann aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann ''':''' <span style="color:#FF6000">»''es gibt GOTT wirklich''«</span>, wenn er will ''':''' <span style="color:#FF6000">»''Es stimmt also, was ich glaube '''!''''' «</span> Das ist das Argument ANSELMS, der ein christlicher Amtsträger war, und der daher von dieser Grundannahme auch ausgeht. Solange in den Voraussetzungen des Möglichkeitsbeweises im GÖDEL-Kalkül kein Widerspruch nachweisbar ist, und solange in der logischen Durchführung dieses Beweises keine schweren Mängel festgestellt werden können, ist das Ergebnis des Möglichkeitsbeweises, wie GÖDEL ihn durchgeführt hat, korrekt, und die Folgerungen daraus, logisch richtig, dass es sich hier um <span style="color:#FF6000">»''mathematische Evidenz''«</span> handelt, <span style="color:#00B000">(z. B. wie 2 x 2 = 4)</span>. Aber niemand ist gezwungen, aus der Möglichkeit, dass es GOTT gibt, daraus zu schließen, dass es GOTT auch mit Notwendigkeit gibt, wie das im Argument ANSELMS geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit LEIBNIZ, der selbst an GOTT geglaubt hat, mit Bestimmtheit sagen ''':''' <span style="color:#FF6000">»''gesetzt, dass GOTT möglich ist, so ist er, was das Privilegium der Gottheit allein ist''«</span>, weil GÖDEL mit seinem Kalkül den noch ausstehenden Beweis der Widerspruchsfreiheit dafür geliefert hat.
Wenn Du den 3. Beweisgang des GÖDEL-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument ANSELMS, der identisch ist mit dem Term in der Zeile 10, <span style="color:#4C58FF">— ‚'''□∃xGx'''‘ —</span>, immer noch formallogisch abhängig ist von der methodologischen Glaubens-Prämisse, Term :01:, <span style="color:#4C58FF">— ‚'''Gx'''‘ —</span> ''':''' <span style="color:#FF6000">»''das'' <span style="color:#4C58FF">‚'''x'''‘</span> ''steht für den Gott der Christen''«</span>. Diese Abhängigkeit ist bis zur Zeile 10 offensichtlich und logisch korrekt. <span style="color:#00B000">(Man könnte nach dieser Zeile, ohne Weiteres, ,regulär‘ die <span style="color:#FF6000">„logische Implikation”</span> :: <span style="color:#4C58FF">[├ A ├ B ╞ A→B ]</span> mit Term :01: und Term :10: als ein mögliches Korollar bilden ''':''' <span style="color:#4C58FF">— ‚'''Gx→□∃xGx'''‘ — </span>)</span>. Das bedeutet, der Konsequenz-Teil im Theorem ANSELMS, der in diesem ,regulär‘-möglichen Korollar an zweiter Stelle steht, ist damit in seiner Formal-Struktur offensichtlich ,regulär‘ von der Glaubens-Prämisse, Term :01:, abhängig, d.h. er ist der Ausdruck einer Glaubensüberzeugung. Im Theorem ANSELMS steht er jetzt, in der Zeile 11, als Konsequenz-Teil auch an zweiter Stelle, hat aber nicht mehr seine Glaubens-Prämisse als notwendige Bedingung an erster Stelle vor sich, wie im ,regulär‘-möglichen Korollar. Jetzt steht eine neue und andere Voraussetzung als Begründung vor ihm. Der Schwerpunkt des Argument ANSELMS liegt damit am Begründungs-Teil des ANSELM-Theorems, der jetzt die erste Stelle im Theorem einnimmt ''':''' <span style="color:#4C58FF">— ‚'''◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist möglich, dass es GOTT gibt''«</span>, der erst dadurch entstanden ist, und davon abhängig ist, weil sein Gegenteil ''':''' <span style="color:#4C58FF">— ‚'''¬◇∃xGx'''‘ —</span> ''':''' <span style="color:#FF6000">»''es ist unmöglich, dass es GOTT gibt''«</span>, zu einem Widerspruch geführt hat. Dieser Begründungs-Teil, das Antezedens, im Argument ANSELMS, ist daher nicht mehr von der methodologischen Glaubens-Prämisse, Term :01:, abhängig, sondern nur vom Axiom-1, der Widerspruchsfreiheit, und von der paarweisen, mathematischen Äquivalenz beliebiger positiver Eigenschaften im Axiom-2, die im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘, mit dem <span style="color:#4C58FF">[ Modus tollendo tollens ] :: [ A → B, ¬B ├ ¬A ]</span>, die Widerspruchsfreiheit der Möglichkeit des GOTT-Glaubens mit Notwendigkeit herbeigeführt haben. Daraus ergibt sich eine logische Verschiebung in der Argumentationskette, denn dieser Begründungs-Teil, der jetzt die Widerspruchsfreiheit für den Konsequenz-Teil liefert, ist selbst unabhängig und frei von jeder Glaubensüberzeugung. Weil widerspruchsfrei und <span style="color:#FF6000">»''mathematisch evident''«</span>, muss er als logische Begründung für die Widerspruchsfreiheit und als Beweis für die <span style="color:#FF6000">»''mathematische Evidenz''«</span> des Konsequenz-Teils gelesen werden, und damit bestätigt er die Widerspruchsfreiheit und Sinnhaftigkeit der Glaubensüberzeugung eines gläubigen Menschen, <span style="color:#00B000">(was auch das Ziel ANSELMS war)</span>. Das heißt also ''':''' der Glaube dieses Menschen ist widerspruchsfrei und sinnvoll, und enthält keinen Zirkelschluss, weil sein Gegenteil, der Nicht-GOTT-Glaube, zu einem Widerspruch führt; <span style="color:#00B000">(das hat GÖDEL mit seinem Kalkül-System bewiesen, dessen Argumentationskette mit einem Computer-Programm, dem sog. ,Theorembeweiser‘, überprüft worden ist, und als <span style="color:#FF6000">»''nachweisbar korrekt''«</span> befunden wurde)</span>. Das Theorem ANSELMS beweist, nach GÖDEL, dass der Glaube an GOTT, mit <span style="color:#FF6000">»''mathematische Evidenz''«</span> notwendig widerspruchsfrei und sinnvoll ist, weil der Nicht-GOTT-Glaube notwendig zu einem Widerspruch führt. <u>Das Theorem beweist jedoch nicht, dass die Existenz GOTTES notwendig ist</u>, <span style="color:#00B000">(wie es fast immer fälschlich gelesen wurde und wird)</span>, sondern, das Theorem ANSELMS geht davon aus, als nicht hinterfragtes Faktum, dass GOTT notwendig, schon immer existiert, und beweist, mit dem GÖDEL-Kalkül, dass diese Glaubens-Annahme widerspruchsfrei und sinnvoll, und <span style="color:#FF6000">»''mit allen bekannten Tatsachen durchaus vereinbar ist''«</span>, wie GÖDEL abschließend sagt. GOTT hat es ja auch nicht ,nötig‘, bewiesen zu werden. Für den Erzbischof ANSELM war die Existenz GOTTES, überall und jederzeit, die ungefragte und für ihn die selbstverständlichste Voraussetzung aller seiner Bemühungen, in seinem Leben, und in seinem Beruf als christlicher Amtsträger, und auch als Theologe in den philosophischen Überlegungen über seinen Glauben. Mit diesen Überlegungen hat er, mit GÖDEL, bewiesen ''':''' Glaube ist nicht irrational, kein Sprung ins Unbekannte, sondern eine freie, vernünftige Entscheidung. Glaube ist rational und vertrauenswürdig.
Zusammengefasst heißt das Ergebnis dieser Bemühungen ANSELMS ''':''' Wenn Du an GOTT glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist auch logisch in der <u>bewiesenen Möglichkeit</u>, dass es GOTT geben kann, begründet, und damit ist er widerspruchsfrei, sinnvoll und kein Zirkelschluss. Dein Glaube an GOTT beruht jedoch, nach wie vor und in erster Linie, auf Deiner freien Entscheidung für GOTT, und nicht auf dem Zwang einer ,logischen‘ Argumentation. Wenn Du nicht an GOTT glauben willst, dann <u>musst Du, und sollst Du, auch nicht deswegen</u> an GOTT glauben, weil der Nicht-GOTT-Glaube zu einem Widerspruch führt, und damit falsch und unlogisch ist. Denn der Glaube an GOTT muss immer eine freie und Deine ganz persönliche Entscheidung für GOTT sein und bleiben. Niemand darf zum Glauben an GOTT gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Warum '''?''' Weil GOTT die Liebe ist '''!''' Und die Liebe duldet keinen Zwang '''!'''
Zum Abschluss, und für eine bessere Verständlichkeit dieser Studie, hat die KI, der ich diese Studie für die Erstellung eines Podcast übergeben habe, eine, — sogar für Kinder —, verständliche Metapher kreiert. Sie sagt, man stelle sich vor ''':''' Es sei irgendwo ein ,Schatz’ vergraben, und es gäbe auch eine ,Schatzkarte’ für diesen ,Schatz’. Kurt GÖDEL ist nun gekommen, und hat mit seinem Kalkül bewiesen, dass diese ,Schatzkarte’ korrekt ist und fehlerfrei. Ob aber jemand, mit Hilfe dieser ,Schatzkarte’ auf ,Schatzsuche’ gehen will oder nicht ''':''' das ist und bleibt jedem selbst überlassen, und ist immer eine freie, und ganz persönliche Entscheidung. Damit hat die KI erstaunlich treffend, sowohl die Bedeutung, als auch die reale Funktion des GOTT-Glaubens in der Lebens-Wirklichkeit unserer Welt und Zeit charakterisiert, in Übereinstimmung mit der Gleichniserzählung JESU vom ,Schatz im Acker’; <small><span style="color:#00B000">( vgl. {{Bibel | Matthäus-Evangelium |13|44|EU}} )</span></small>. Der ,Schatz’ ist die <span style="color:#FF6000">„<span style="font-family: Times;"><big>Βασιλεία του Θεού</big></span>“</span><span style="color:#00B000"> | ,Basileía tou Theoú’</span>, d.h. das <span style="color:#CC66FF">»''Königtum GOTTES''«</span>, oder auch das <span style="color:#CC66FF">»''Himmelreich''«</span>. Die ,Schatzkarte’ ist der Glaube an GOTT. Die ,Schatzsuche’ ist der Weg des Glaubens in der Nachfolge JESU, der uns den Weg zeigt zum Ziel, zur Erfüllung aller unserer Sehnsüchte und Wünsche.
----
----
;Fußnoten
<references />
n5f5csu2jyq9at3es13g5l6qrq7bbes
Programmieren in C/C++: Grundlagen
0
118048
1090661
1090659
2026-09-10T12:09:41Z
D. Justen
102048
Formulierung geändert
1090661
wikitext
text/x-wiki
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
<!-- Falls du ein automatisch erstelltes Inhaltsverzeichnis nicht willst, ersetze das nachfolgende TOC durch NOTOC -->
<!-- Einklammerung mit noinclude, damit dieses nicht in der Druckversion erscheint -->
<noinclude>__TOC__</noinclude>
Die Programmiersprache C/C++ beinhaltet mehrere Sprachen/ Syntaxen:
* C-Syntax
* Präprozessor-Syntax
* Printf/Scanf Formatstring Syntax
* Terminal Emulation
* Compiler/Linker Anweisungen
Letztere beiden werden nur rudimentär in dieser Vorlesung/diesem Skript behandelt. Alle anderen sind Bestandteil dieser Vorlesung.
In diesem Kapitel sollen zunächst allgemeine Eigenschaften der Sprache, der grundlegende Syntax und die Kontrollstrukturen erklärt werden. Bei vielen Erklärungen sind Code-Beispiele vorhanden. Da man aus Fehlern am meisten lernt, sind zum Teil auch negative Beispiele enthalten. Für ein besseres Verständnis empfiehlt es sich, Code-Beispiele selbst nachzuvollziehen.<br />
Sofern sich die Eigenschaften auf eine bestimmte C-/C++- oder Compiler-Version beziehen, wird dies gesondert vermerkt.
== Zeichensatz ==
Der Syntax von C nutzt die unteren 128 Zeichen des ASCII Zeichensatzes. Da UTF-8 in den ersten 128 Zeichen deckungsgleich zu ASCII ist, kann auch dieser zur Erstellung des Source Codes genutzt werden.
Zeichen außerhalb dieses gültigen Zeichensatzes können folglich nur in Strings oder Kommentaren vorkommen. Werden Zeichen außerhalb der unteren 128 Zeichen in Strings genutzt, so gilt Folgendes zu berücksichtigen:
* Die String-Funktionalitäten der Standard-C Library gehen von dem regulären ASCII Zeichensatz aus, so dass z.B. die Suche, der Vergleich oder die Konvertierung fehlschlagen kann
* Strings werden oftmals in Verbindung mit printf() genutzt, d.h. auf der Standardausgabe ausgegeben. Der verwendete Zeichensatz sollte hier identisch zum verwendeten Zeichensatz der Terminal-Emulation sein!
== Kommentarzeichen ==
Kommentare dienen dazu, den Source Code mit zusätzlichen Hinweisen zu versehen, so dass die Intension der Anweisungen sichtbar wird. Kommentarzeichen werden durch den Compiler vor dem eigentlichen Übersetzungsdurchlauf entfernt und durch ein Leerzeichen ersetzt [C11 6.4.9]. Innerhalb von Strings wird nicht nach Kommentarzeichen gesucht.
<code>
Syntax: /* */
</code>
Blockkommentar zum Kommentieren eines Bereiches, auch über mehrere Zeilen hinweg. Dieses Kommentarzeichen kann nicht verschachtelt werden, d.h. '*/' beendet die Kommentierung, unabhängig von der Anzahl der zuvor geöffneten Kommentierungen!
<code>
Syntax: //
</code>
Zeilenkommentar zum Kommentieren bis zum Zeilenende (wurde in der Programmiersprache BCPL definiert, aber nicht von C, sondern erst von C++ übernommen).
Sollen größere Bereiche auskommentiert werden, so empfiehlt sich die Nutzung der Präprozessoranweisung #if 0 ... #endif.
Beispiele:
<syntaxhighlight lang="C">
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt
Compiler-Warning nur aufgrund des Compiler-Schalters -Wall! */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Namenskonventionen ==
Folgende Regeln gelten bzgl. der Benennung von Variablen und Funktionen:
* Variablen und Funktionsnamen können aus Buchstaben, Zahlen und dem Unterstrich bestehen. Sie müssen mit einem Buchstaben oder einem Unterstrich beginnen
* Seit C95 können weitere Zeichen aus dem Universal Coded Character Set (UCS) genutzt werden [C11 D.1]
* C ist Case sensitiv, d.h. es wird zwischen Groß- und Kleinbuchstaben unterschieden
* Schlüsselwörter können nicht für Variablen/Funktionsnamen/Datentypen genutzt werden
Namenskonventionen von Libraryfunktionen:
* In C (und C++) sind Schlüsselwörter und Standardlibraryfunktionen zumeist in Kleinbuchstaben geschrieben. In der C-Standardlibrary werden oftmals verkürzte Ausdrücke (z.B. isalnum() (zum Testen ob ein Zeichen ein Buchstaben oder ein Digit ist) und in C++ der Unterstrich als Worttrenner (z.b. out_of_range) genutzt
* Makros (siehe Kap.[[Programmieren in C/C++: Präprozessor | Präprozessor]]) werden per Konvention in GROSSBUCHSTABEN und ggf. mit Unterstrich als Worttrenner geschrieben.
* Namen beginnend mit doppelten Unterstrich oder beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (z.B. __LINE__ _Reserved) sind für den Compiler und der Standard-C-Library vorbehalten und sollten im eigenen Programm nicht benutzt werden.
== Zeilenfortsetzung ==
Mit dem Backslash Operator (gefolgt von einem Zeilenende) kann eine Zeile in der nächsten Zeile fortgesetzt werden. Der Compiler löscht das \-Zeichen mit anschließendem Zeilenende und ersetzt dies durch nichts. Dies ist insbesondere bei Anweisungen notwendig, die am Ende der Zeile abgeschlossen sein müssen (z.B. Strings, Makros).
Beispiele:
<syntaxhighlight lang="c">
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Innerhalb von Char-Literatoren und Strings wird '\' als Escape-Operator genutzt, welche das '\' und ein oder mehrere folgende Zeichen ersetzt (siehe Kap.[[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Grundlagen:Literale/Konstanten]]). Daher darf hinter Backslash als Zeilenfortsetzungszeichen kein weiteres Zeichen folgen.
== Gültigkeit/Sichtbarkeit von Variablen ==
Vorrangig in der objektorientierten Programmierung werden mit Namensräumen Objekte und deren Methoden/Attribute in einer Art Baumstruktur strukturiert. Dies ermöglicht eine eindeutige Ansprache von Variablen/Objekte, aber auch eine doppelte Verwendung von Methoden-/Attributnamen in unterschiedlichen Namensräumen. Ergänzend zu den Namensräumen kann mit public/private/proteced eine Zugriffsbeschränkung von Methoden/Attributen definiert werden.
Die Programmiersprache C unterstützt keinen Namensraum. Zugriffsmodifikatoren werden indirekt über Header-Dateien getätigt. Hinsichtlich der Gültigkeit/Sichtbarkeit unterscheidet C folgende Bereiche [C11 6.2.1]:
* Funktionen (Function Scope)
* Datei (File Scope)
* Block (Block Scope)
* Funktionsparameter in Prototypen (Function Prototype Scope)
Innerhalb eines Gültigkeitsbereiches dürfen Variablen-/Funktions-/Datentypnamen nicht doppelt genutzt werden.<br />
In der Programmiersprache C++ sind weitere Scope wie z.B. Class Scope, Enumationation Scope und ergänzend das Konzept von Namensräumen vorhanden (Beschreibung folgt).
=== Funktionsweite Sichtbarkeit ===
Eine Label-Definition (als Sprungmarke für die goto-Anweisungen) erfolgt immer mit funktionsweiter Sichtbarkeit/Gültigkeit. Die genaue Beschreibung dieses Sichtbarkeitstyps erfolgt im Rahmen des Kapitels [[Programmieren in C/C++: Grundlagen #Label + Goto|Grundlagen:Label+Goto]].
=== Dateiweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp-Definition außerhalb eines Block-Scopes oder von Funktionsparameter, so sind diese innerhalb der gesamten Datei und bei Funktionen/Variablen ergänzend Projektweit (für alle Objektdateien) sichtbar/gültig (= global) (In der C-Spec unter dem Stichwort 'Linkage' beschrieben, siehe Kapitel [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage| DatentypeSpecifier:Internal/External Linkage]]). Alle globalen Funktionen/Variablen können von allen Dateien aus genutzt/zugegriffen werden (sofern sie zuvor deklariert wurden).<br />
Beispiel:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Deklaration von global,
//welche in Datei1.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
printf("global=%d\n",global);
return 0;
} | datei2_c=#include <stdio.h>
//Deklaration von global,
//welche in example.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
printf("func() called\n");
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird das Schlüsselwort 'static' der Variablen/Funktionsdefinition vorangestellt, so wird die Sichtbarkeit/Gültigkeit auf Dateiweit eingeschränkt. Variablen/Funktionen können nur innerhalb der (Objekt-) Datei genutzt werden und sind für anderen (Objekt-)Dateien unsichtbar. (Siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage|DatentypeSpecifier:Internal/External Linkage]] Internal/External Linkage)
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
printf("example.c:var1=%d\n",var1);
void func(void); //Prototyp für func()
func();
return 0;
} | datei2_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
printf("datei2.c:var1=%d\n",var1);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Projektweite Gültigkeit bedeutet insbesondere, dass keine doppelten Benennung von Variablen/Funktionen/Datentypen innerhalb des gesamten Projektes erlaubt sind, d.h. alle Variablen/Funktionennamen über alle Dateien/Librarys eindeutig sein müssen.<br>
Beispiel 1:
{| class="wikitable"
|-
! Datei1.c !! Datei.2
|-
| <syntaxhighlight lang="C">
#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
}</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
} | datei2_c=#include <stdio.h>
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der Linker meldet beim Zusammenfügen der Objekt-Dateien, dass die Variable a bereits woanders definiert sei (multiple definition of `a';)!
Beispiel 2:
<syntaxhighlight lang="C">
#include <stdio.h> //fuer printf() size_t stderr
int printf=7;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int printf=7;
int main(int argc,char *argv[])
{
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hier meldet der Compiler eine Fehlermeldung, da das Symbol printf zu einen als Variable und zum anderen als Funktion (innerhalb der inkludierten Datei stdio.h beschrieben) genutzt wird ('printf' redeclared as different kind of symbol).
=== Blockweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp Definition innerhalb einer Funktion, als Funktionsparameter oder eines Blockes, so sind diese nur innerhalb des Blockes sichtbar/gültig (=Lokale Variable). Blöcke können verschachtelt sein, so dass das bei identischer Namensgebung innere Definitionen Vorrang haben. Ebenso haben Blockdefinitionen Vorrang vor Datei-/Projektdefinitionen (überdecken diese):
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
} | datei2_c=#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sichtbarkeit von Funktionsparameter in Protypen ===
Soll eine Funktion aufgerufen werden, die zuvor nicht definiert wurde, so ist ein Prototyp/(Forward)deklaration der Funktion notwendig (siehe nachfolgendes Kapitel). Die Parameterliste dieses Prototyps hat seinen eigenen Gültigkeitsbereich.<br/>
Beispiel:
<syntaxhighlight lang="C">
int a; //a im File Scope
int func(int a, int b); //a und b im Function Prototyp scope
</syntaxhighlight>
Hinweis:
* Bei Prototypen ist die Angabe von Variablenname nicht notwendig. Die alleinige Angabe des Datentyps ist ausreichend
=== Zuordnung der Gültigkeitsbereiche zu globalen/lokalen Variablen ===
Zum einfacheren Verständnis wird im Skript von folgenden Begrifflichkeiten gesprochen:
* '''Globale''' Variablen-/Funktionen-/Datentypdefinitionen → Projektweite Sichtbarkeit/Gültigkeit
* '''Statisch globale''' Variable/Funktionen → Dateiweite Sichtbarkeit/Gültigkeit
* '''Lokale''' Variablen/Funktionen/Funktionsparameter/Datentypen → Nur innerhalb des zugehörigen Blockes sichtbare/gültig
* '''Statisch lokale''' Variablen → Nur innerhalb der Funktion sichtbar/gültig, mit der Besonderheit, dass die Gültigkeit über der Laufzeit der Funktion gilt (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Static Storage Class Specifier|DatentypeSpecifier:Static Storage Class Specifier]])
=== Speicherzuweisung ===
Für die einzelnen Gültigkeitsbereiche werden im Speicher (und auch in der Objekt-Datei) unterschiedliche Speicherbereiche (Segmente) vorgehalten, d.h. der Compiler teilt den Speicher in unterschiedliche Bereiche auf und weist den Variablen/Funktionen in Abhängigkeit der Gültigkeit/Sichtbarkeit unterschiedliche Speicherbereiche zu!
[[File:Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten).png|thumb|Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten)]]
Zur Ermöglichung von Rekursion werden lokale Variable auf dem Stack gehandelt. Mit Aufruf einer Funktion oder öffnen eines neuen Block-Scopes wird Speicher auf dem Stack reserviert, der bei Beenden des Scopes wieder freigegeben wird. Die Speicheradresse von lokalen Variablen ist somit nicht Fix, sondern hängt von der Aufrufhierarchie ab!
Globale und statisch globale Variablen werden nicht auf dem Stack gehalten, sondern bekommen einen 'festen' Speicherbereich (hier DATA/BSS/RODATA) während der gesamten Laufzeit des Programms zugewiesen. Die Adresse dieser Variablen sind somit konstant. Das genutzte Speichersegment von globalen Variablen hängen von der Art der Variablen ab. Initialisierte Variablen werden im DATA-Segment gesammelt, welcher mit dem Initialisierungswert der Variablen initialisiert wird. Nicht initialisierte globale Variablen landen im BSS-Segment, so dass diese mit Programmstart durch Füllen dieses Blockes mit 0 auf 0 gesetzt werden.
Konstante globale Variablen werden im RODATA-Segment gehalten. Über das Betriebssystem kann dieser Speicherbereich auf nur Lesbar gesetzt werden.
Dynamische Speicheranforderungen, resp. Speicher, dessen Gültigkeit über die Laufzeit einer Funktion hinausgeht, wird im Heap gesammelt. Für die Verwaltung dieses Speichers ist der Programmierer zuständig.
Entsprechend globalen Variablen wird für Funktionen ebenfalls ein eigener Speicherbereich (TEXT Segment) vorgesehen. Im Gegensatz zu Variablen, wo im Speicher der dazugehörige Inhalt gespeichert ist, ist der Speicherinhalt von Funktionen die Maschinenanweisungen. Die Speicheradresse der Funktionen sind konstant.
Hinweis:
* Die Speicheradresse von sowohl globalen und statisch globalen Variablen als auch von Funktionen ist konstant und ändert sich während der Laufzeit des Programms nicht. Die Adressvergabe dieser Variablen und Funktionen erfolgt somit nicht zur Laufzeit sondern durch die Toolchain (hier der Linker).
* Dieses Konzept ist allgemeingültig, gilt nicht nur für die Programmiersprache C/C++
== Definition/Deklaration(Prototyp) ==
Der C-Compiler ist ein Single-Pass Compiler (siehe Kap [[Programmieren in C/C++: Einführung/Literatur#Arbeitsweise eines Compilers | Einführung/Literatur:Arbeitsweise eines Compilers ]]), d.h. für den Übersetzungsvorgang wird der Quellcode einmalig eingelesen und von vorne nach hinten abgearbeitet. Dies bedingt, dass keine Vorwärtsbezüge im Quelltext enthalten sein dürfen:
* keine Variable genutzt werden kann, die erst später definiert wird (da der Compiler in Abhängigkeit des Datentyps (den er dann noch nicht kennt) keine entsprechende Maschinensprachebefehle erzeugen kann)
* keine Funktion aufgerufen werden kann, die erst später definiert wird (da der Compiler nicht weiß, welcher Datentyp die Übergabewerte haben und folglich keine Maschinensprachebefehle zur Konvertierung und Übergabe der Variablen erzeugen kann)
* kein Datentyp genutzt werden kann (struct, union, enum, typedef), welcher erst später definiert wird (da der Compiler nicht weiß, wieviel Speicher er für die Variable reservieren muss)
Eine Lösungsvariante dieser Problematik ist, im Quellcode alle Variablen/Funktionen/Datentypen/Makros zu definieren, bevor diese erstmalig genutzt werden (Funktion main() steht dann folglich am Ende des Quellcodes):
<syntaxhighlight lang="C">
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
//Hier kein Zugriff auf var möglich!
//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(void) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
var++; //Hier kein Zugriff auf var möglich!
uchar xyz;//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(int argc, char *argv[]) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Sollen globale Funktionen/Variablen in Datei1.c genutzt werden, die in Datei2.c definiert sind, so schlägt diese Vorgehensweise fehl. Um auch dieses zu ermöglichen, bietet C die Möglichkeiten von Prototypen/Deklarationen an. Diese teilt dem Compiler mit, wie im späteren Ablauf die Variable, die Funktion definiert wird, bzw. dass es diesen Datentyp geben wird:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
} | datei2_c=#include <stdio.h>
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Innerhalb der C-Spezifikation werden für den Umgang mit dieser Problematik die Begriffe 'Declaration' und 'Definition' genutzt. Da diese Begriffe jedoch nicht klar abgegrenzt werden und auch für viele weitere Aspekte genutzt werden, sollen in diesem Skript in Anlehnung an den Wikipedia Artikel {{w|Deklaration (Programmierung)|Deklaration (Programmierung)}} (im Absatz zur Programmiersprache C/C++) die Begriffe Definition/Deklaration wie folgt genutzt werden:
;Definition: entspricht der Belegung/Reservierung von Speicherplatz
:* Bei der Definition einer Variablen wird hiermit Speicherplatz entsprechend dem Datentyp der Variable belegt:
:<syntaxhighlight lang="C">
int var1; //entsprechend der Größe des Datentyps int wird
//Speicherplatz für die Variable var1 reserviert
int var2=4711; //Dito, ergänzend wird dieser Speicherplatz mit dem
//Wert 4711 initialisiert
</syntaxhighlight>
:* Bei einer Funktion wird Speicherplatz zur Aufnahme der Maschinenbefehle belegt:
:<syntaxhighlight lang="C">
void foo(void) { //Die Anweisungen in den geschweiften Klammern
//werden in Maschinenbefehle übersetzt. D.h. die
//Funktion foo() belegt Speicher, dessen Inhalt
//die Maschinensprachebefehle sind
}
</syntaxhighlight>
:* Ergänzend wird der Begriff Definition auch in Verbindung mit der Definition von neuen Datentypen genutzt!
;Deklaration/Prototyp: ist die Mitteilung an den Compiler, wie diese Variable/Funktion an einer späteren Stelle im Source-Code oder in einer anderen Source-Datei definiert wird. Auf Grundlage dieser 'vorab' Information kann der Compiler die passenden Maschinensprachebefehle für den Zugriff/Aufruf auf die Variablen/Funktion einsetzen:
:<syntaxhighlight lang="C">
extern int var1; //Deklaration von var1
extern void foo(void); //Deklaration von foo()
void foo(void); //Deklaration von foo()
</syntaxhighlight><br />
Insbesondere bei dem Umgang mit der Deklaration gilt es Folgendes zu berücksichtigen:
* Deklarationen werden entweder:
:* am Anfang einer C-Datei geschrieben, so dass Funktionen/Variablen im Zugriff stehen, die erst später in der C-Datei definiert werden (entspricht dann der Private Anweisung in anderen Sprachen)
:* in Header-Dateien geschrieben, so dass diese Variable/Funktionen für alle sichtbar sind, welche diese Header-Datei einbinden (entspricht der Public Anweisung in anderen Sprachen)
* Deklarationen von Funktionen werden in der C-Spec als (function) Prototyp bezeichnet und sind dadurch gekennzeichnet, dass diese mit einem Semikolon abgeschlossen sind. Der Specifier 'extern' ist hier optional und sagt eigentlich aus, dass diese Funktion external Linkage besitzt (siehe [[Programmieren in C/C++:_DatentypeSpecifier#Internal/External Linkage | DatentypeSpecifier:Internal/External Linkage]]). Die Benennung der Parametervariablen sind gleichermaßen optional:
:<syntaxhighlight lang="C">
extern int foo(int var1, float var2); //Deklaration
extern int foo(int , float ); //Deklaration
int foo(int var1, float var2); //Deklaration + external Linkage
int foo(int , float ); //Deklaration + external Linkage
</syntaxhighlight>
* Für globale Variablen gibt es keine (Variablen) Prototype. Stattdessen muss zur Bekanntgabe des Datentyps der Specifier 'extern' vorangestellt werden, mit welchen ergänzend zum Ausdruck gebracht wird, das diese Variable external Linkage und damit globale Gültigkeit hat (siehe Kap [[Programmieren in C/C++: DatentypeSpecifier# Extern - Storage Class Specifier| DatentypeSpecifier:Extern - Storage Class Specifier]]). Da die Deklaration einzig zur Bestimmung der Zugriffsmethoden auf Maschinenspracheebene genutzt wird, können diese keine Initialisierungswerte enthalten:
:<syntaxhighlight lang="C">
extern int var1;
extern int var2=7; //KO Deklarationen können keine
//Initialisierungswerte haben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern int foo;
extern int foo=7;
int main(int argc, char *argv[]) {
return foo;
}
int foo=7;| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen von statisch globalen, lokalen und statisch lokalen Variablen nicht möglich sind:
:<syntaxhighlight lang="C">
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sich auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sicht auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen für identische Variablen/Funktionen können beliebig oft erfolgen, sofern der Datentyp identisch ist:
:<syntaxhighlight lang="C">
extern int var;
extern int var; //OK, doppelt Deklaration mit identischen Datentyp
extern unsigned int var; //KO, Doppelte Deklaration mit unterschiedlichen
// Datentyp
</syntaxhighlight>
* Sofern eine Deklaration und eine Definition in der identischen Datei erfolgen überprüft der Compiler, ob Deklaration und Definition identisch sind. Es empfiehlt sich, die eigene Header-Datei (in welcher die Deklaration normalerweise enthalten ist) zu inkludieren:
:{| class="wikitable"
|-
! Datei1.c !! Datei1.h
|-
| <syntaxhighlight lang="C">
//Include der eigenen Header-Datei
#include "datei1.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
</syntaxhighlight> ||
<syntaxhighlight lang="C">
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Include der eigenen Header-Datei
#include "example.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
int main(int argc, char *argv[]) {
return 0;
} | example_h=
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Datei kann eine Variable identischen Datentyps mehrmals definiert werden (bei identischen Initialisierungswert). Diese Definitionen werden vom Compiler als eine Definition angesehen. Wenn jedoch eine identische Variable in unterschiedlichen Dateien definiert wird, so legt jede Datei eine eigene unabhängige Variable an, welche dann beim Zusammenführen der Objektdateien durch den Linker zu Fehler führt. Da Header-Datei zumeist in mehrere C-Dateien inkludiert werden, sind Definitionen in Header-Dateien 'verboten'.
* Deklarationen innerhalb eines Block-Scopes oder eines Function Prototyp Scopes sind nur in diesen Bereich gültig.
== Grundlegende Datentypen und Typsicherheit ==
Die Programmiersprache C kennt folgende grundlegende Datentypen (siehe Kap. [[Programmieren in C/C++: Datentypen | Datentypen]]). Von jedem Datentyp kann ein Zeiger angelegt werden:
{| class="wikitable"
|-
! Datentyp !! Bsp. für Datentyp !! Bsp. für Zeiger auf Datentyp
|-
| Ganzzahl ||
<syntaxhighlight lang="C">
char var;
int var;
short int var;
long int var;
long long int var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
char *ptr;
int *ptr;
short int *ptr;
long int *ptr;
long long int *ptr;
</syntaxhighlight>
|-
| Gleitkommazahl ||
<syntaxhighlight lang="C">
double var;
float var;
long double var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
double *ptr;
float *ptr;
long double *ptr;
</syntaxhighlight>
|-
| Funktionen ||
<syntaxhighlight lang="C">
void func(void) {}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
void (*pfunc)(void);
</syntaxhighlight>
|-
| Arrays ||
<syntaxhighlight lang="C">
int arr[10];
float arr[3][3];
</syntaxhighlight>
||
<syntaxhighlight lang="C">
int (*parr);
float (*parr)[3];
void (*pfunc[5])(void);
</syntaxhighlight>
|-
| Strukturen/Unions ||
<syntaxhighlight lang="C">
struct xyz {int x,y,z};
union abc {int a,b,c};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
struct xyz *ptr;
union abc *ptr;
</syntaxhighlight>
|-
| Aufzählungstyp ||
<syntaxhighlight lang="C">
enum abc {A,B,C};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
enum abc *ptr;
</syntaxhighlight>
|-
| Boolescher Datentyp ||
<syntaxhighlight lang="C">
_Bool var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Bool *ptr;
</syntaxhighlight>
|-
| Komplexe Zahlen ||
<syntaxhighlight lang="C">
_Complex var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Complex *ptr;
</syntaxhighlight>
|}
C/C++ unterscheidet zwischen vorzeichenbehafteten <code>signed</code> und vorzeichenlosen <code>unsigned</code> ganzzahligen Datentypen. Vorzeichenlose Datentypen können nur positive Zahlen incl. der 0 aufnehmen (Anwendungsbereich bspw. Speicheradressen/Arrayindexe, welche nicht negativ sein können). Deren max. Zahlenwert ergibt sich aus der Datenbreite N des Datentyps 2<sup>N</sup>-1. Ein Vergleich eines vorzeichenlosen Datentyps mit ≥ 0 ist somit immer TRUE:
<syntaxhighlight lang="C">
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt"); //dieser ggf. vom Compiler wegoptimiert wird!
for(var=10; var>=0; var--); //Endlosschleife! 0 dekrementiert ergibt 255
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt\n"); //dieser ggf. vom Compiler wegoptimiert wird!
//Beim Öfffnen des Compiler-Fensters ist die IF-Anweisung nicht farblich
//hervorgehoben. Dies bedeutet, dass diese Zeile wegoptimiert wurde und folglich
//kein Maschinencode für diese Anweisung erzeugt wurde
for(var=10; var>=0; var--) //Endlosschleife! 0 dekrementiert ergibt 255
printf("%u ",var),fflush(stdout);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Vorzeichenlose Datentypen halbieren den verfügbaren Zahlenbereich und 'weisen' dem oberen Wertebereich den negativen Zahlen zu.<br>
Wird ein ganzzahliger Datentyp ohne Angabe des Vorzeichentyps (signedness) definiert, so ist diese vorzeichenbehaftet. Bei vorzeichenlosen Variablen muss explizit <code>unsigned</code> vorangestellt werden. Die Voranstellung von <code>signed</code> ist optional. Einzige Ausnahme stellt der Datentyp char dar. Hier gibt die Spezifikation keine default signedness vor, so dass bei Nutzung dieses Datentyps zur Aufnahme von Zahlen immer signed oder unsigned vorangestellt werden sollte!<br>
Innerhalb des Formatstrings bei den printf()/scanf() Anweisungen '''muss''' die signedness vom Programmierer händisch berücksichtigt werden. Die Formatanweisung %d und %i interpretieren die übergebenen Zahl als vorzeichenbehaftete Zahl. Soll eine vorzeichenlose Zahl ausgegeben werden, so muss %u verwendet werden:
<syntaxhighlight lang="C">
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%d varu=%u",vari,varu); //Korrekt
printf("vari=%u varu=%i",vari,varu); //Falsche Werteausgaben!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%12d varu=%12u\n",vari,varu); //Korrekt
printf("vari=%12u varu=%12i\n",vari,varu); //Falsche Werteausgaben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit der Definition (dem Anlegen) einer Variablen eines Datentyps wird Speicher entsprechend der Größe des Datentyps reserviert. Optional kann dieser Speicher initialisiert werden. Über den Datentyp wird ausgesagt, wie der Inhalt des Speichers zu interpretieren ist:
<syntaxhighlight lang="C">
char var1; //Speicherplatzreservierung von 1 Byte
//Inhalt der Speicherstelle wird als Zahl interpretiert
//(Hinweis: ASCII-Zeichen sind Zahlen)
double var2=47.11; //Speicherplatzreservierung von 8 Byte
//Inhalt der Speicherstellen wird als Gleitkommazahl
//interpretiert (bestehend aus je einer Ganzzahl für
//Mantisse und Exponent)
short arr[10]; //Speicherplatzreservierung von 10*2 Byte
//Inhalt der 10 Speicherstellen werden als Ganzzahl
//interpretiert
</syntaxhighlight>
Die Funktionalität der Operatoren hängt vom Datentyp der Operanden ab. Der Plus-Operator angewendet auf ganzzahlige Operanden führt eine Ganzzahl Addition aus, angewendet auf gleitkomma Operanden eine Gleitkomma Addition. Ist einer der Operanden ein Zeiger, so wird eine Zeigeraddition angewendet. Für andere Datentypen ist der Plus-Operator nicht definiert, so dass der Compiler einen Fehler wirft. '''Bei der Betrachtung eines Ausdruckes sollte dem genutzten Datentypen folglich eine besondere Aufmerksamkeit zuteil werden''':
<syntaxhighlight lang="C">
int vari=47;
vari+12; //(int) + (int) → Ganzzahladdition
float varf=12.3;
3.1415F+varf; //(float) + (float) → Gleitkommaaddition
int *ptr=&vari;
ptr+3; //(int *) + (int) → Zeigeraddition
int arr[3];
arr+3; //(int (*)) + (int) → Zeigeraddition
</syntaxhighlight>
Das Ergebnis einer Operation hat ebenfalls einen Datentyp. Eine Ganzzahl Addition gibt bspw. als Ergebnis einen Ganzahl Datentyp zurück, eine Gleitkomma Addtition einen Gleitkomma Datentyp und ein Vergleichsoperator den Datentyp _Bool:
<syntaxhighlight lang="C">
int vari1=47;
int vari2=11;
vari1 + 12 + vari2; //((int)+(int)+(int))→((int)+(int))→(int)
40 < vari1 < 50; //((int)<(int)<(int))→((_Bool=int)<(int))→(_Bool=int)
</syntaxhighlight>
Wie Operatoren haben auch Funktionen Operanden (in Form von Übergabeparameter). Das Ergebnis eines Funktionsaufrufes wird ebenfalls in Form eines Datentyps zurückgegeben:
<syntaxhighlight lang="C">
float add(int par1,par2) {return par1+par2;}
int vari1=47;
int vari2=11;
vari1 + add(var2,12); //(int)+((int),(int)→(float))→(int)+(float)→(float)
</syntaxhighlight>
Wird auf einen Operator gleichermaßen ein vorzeichenbehafteter und ein vorzeichenloser Operand angewendet, so kann es zu unerwarteten Konvertierungsproblemen führen:
<syntaxhighlight lang="C">
unsigned char varu=12;
signed char vars=-12;
float varf;
varf = varu + vars;
if(vars < varu)
</syntaxhighlight>
Sind die Datentypen der Operanden nicht 'kompatibel', so 'passt' der Compiler die Datentypen im Falle von Ganzahl und Gleitkomadatentypen per impliziter Regel an (siehe Kap. [[Programmieren in C/C++: Datentypen#Implizite Typumwandlung | Datentypen:Implizite Typumwandlung]]). Über explizite Typumwandlung (siehe Kap.[[Programmieren in C/C++: Datentypen# Explizite Typumwandlung|Datentypen:Explizite Typumwandlung]]) kann ein Datentyp z.T. in einen anderen Datentyp gewandelt werden.
In allen anderen Fällen ist C Typsicher, d.h. der Compiler gibt zumindest eine Warning aus, wenn die Datentypen nicht identisch sind und der Compiler keine implizite Regel anwenden kann.
Tipp:
* Compiler gibt bei Fehlermeldung oftmals die erwarteten und die vorhandenen Datentyp an. Wenn solch eine Fehlermeldung kommt, sollten sie sich a) überlegen, was wollten sie syntaktisch geschrieben haben und b) was haben sie in der Tat geschrieben. Ein Google nach einer Lösung des Compilerproblems löst zumeist nicht das Problem, sondern umgeht es!
Hinweis:
* Ein guter Programmierer sollte die Datentypen so wählen, dass:
:* die Datentypen zum Inhalt und zum Wertebereiches passen
:* keine Datentypkonvertierungen notwendig sind
: andernfalls besteht die Gefahr, dass hiermit Laufzeitfehler einprogrammiert werden.
* Wenn Datentypkonvertierungen notwendig sind, sollte die explizite Konvertierung genutzt werden
== Abhängigkeiten bzgl. Rechnerarchitektur ==
Kenngrößen von Prozessoren sind unter anderem die Anzahl der Bits für den Datentransport und für Arithmetisch-/Logische-Operationen (→ Datenbreite) und die Anzahl der Bits für die Adressierung des Speichers (→ Adressierungsbreite). Die Datenbreite sagt dabei aus, welche max. Datenbreite ein Maschinenbefehl (zumeist in einem Taktzyklus) transportieren/berechnen kann. Werden programmtechnisch größere Datenbreiten benötigt, bedingt dies, dass hierzu mehrere Maschinenbefehle notwendig sind. Wenn kleinere Datenbreiten notwendig sind, so wird oftmals das Ergebnis abgeschnitten (sofern der Prozessor keine Befehle für den Umgang mit kleineren Datentyp beherrscht):
{| class="wikitable"
|-
! 32-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 64-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 16-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
|-
| <syntaxhighlight lang="C">
int32_t a32,b32;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int64_t a64,b64;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int16_t a16,b16;
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=b32;
mov eax,b32
mov a32,eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=b64;
mov eax ,b64
mov edx ,b64+4
mov a64 ,eax
mov a64+4,edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
//a16=b16;
movz eax,b16
mov a16,ax
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=a32+b32;
mov edx, a32
mov eax, b32
add eax, edx
mov a32, eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=a64+b64;
mov ecx , a64
mov ebx , a64+4
mov eax , b64
mov edx , b64+4
add eax , ecx
adc edx , ebx
mov a64 , eax
mov a64+4, edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a16=16+b16;
movzx eax, a16
mov edx, eax
movzx eax, b16
add eax, edx
mov a16, ax
</syntaxhighlight>
|}
Die Adressierungsbreite gibt an, mit welcher Bitbreite der Speicher adressiert werden kann:
* Bei einem 32-Bit System können 2<sup>32</sup>=4.294.967.295=4Gi Bytes/Speicherstellen adressiert werden
* Bei einem 16-Bit System können 2<sup>16</sup>=65.536=64Ki Bytes/Speicherstellen adressiert werden
* Bei einem 64-Bit System können 2<sup>64</sup>=18.446.744.073.709.551.616 =16Ei ~18Exa Bytes/Speicherstellen adressiert werden
Waren die Datenbreite und die Adressierungsbreite bei den ersten Prozessoren noch unterschiedlich, so sind diese heutzutage zumeist identisch. Bei einem 32-Bit Prozessor bedeutet dies, dass dieser max. 4Gi Bytes Speicherstellenstellen adressieren kann und Maschinenbefehle für den Datentransport und die Berechnung von 32-Bit Datenworten beinhaltet.
Die Datenbreite und auch die Adressierungsbereite haben direkten Einfluss auf die Programmiersprache:
* Wird defaultmäßig mit größerer Datenbreite gerechnet, als der Prozessor 'von Hause' aus unterstützt, so werden die erzeugten Maschinenprogramme größer und langsamer (Umgedreht bedeutet dies jedoch nicht, dass die Maschinenprogramme kleiner und schneller werden)
* Die max. Größe von Verbunddatentypen und Arrays ergibt sich aus der Adressierungsbreite des Prozessors
Die Intention der Programmiersprache C/C++ ist, die Prozessorarchitektur optimal zu nutzen. Dementsprechend sind diverse Eigenschaften der Sprache nicht fest spezifiziert, sondern von der Rechnerarchitektur abhängig.
=== Integer Datentyp ===
Intention von C/C++ ist, dass der Umgang mit dem Grunddatentyp 'int' möglichst direkt in einen Maschinensprachebefehl umgesetzt werden kann.<br />
Bei einem 16-Bit Prozessor hat der Datentyp int daher eine Breite von 16-Bit und bei einem 32-Bit Prozessor eine Breite von 32-Bit (siehe Kap [[Programmieren in C/C++: Datentypen # Ganzzahlige Datentypen|Datentypen:Ganzahl Datentypen]]). Über vorangestellte Qualifier kann dieser Grunddatentyp verkleinert/vergrößert werden.
=== Integer Arithmetik ===
Ganzzahlen haben nur einen begrenzten Wertebereich. Wird dieser bspw. durch eine Addition überschritten (d.h. das Rechenergebnis benötigt zur Darstellung mehr Stellen, als der Datentyp 'hergibt'), so gibt es zwei Vorgehensweisen:
* Arithmetischer Überlauf (siehe {{w|arithmetischer Überlauf}}): Die nicht speicherfähigen Stellen werden verworfen, so dass i.d.R. ein falsches Ergebnis erzeugt wird!
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist (254+3)%256=1
c=a*b; //c ist (254*3)%256=250
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char a=254,b=3,c1,c2;
c1=a+b; //c ist (254+3)%256=1
c2=a*b; //c ist (254*3)%256=250
printf("c1=%hhu c2=%hhu\n",c1,c2);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Sättigungsarithmetik (siehe {{w|Sättigungsarithmetik}}): Alle Operationen laufen innerhalb eines festen Intervalls ab, so dass Überläufe und Unterläufe auf dieses Intervall begrenzt werden:
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist MAX((254+3),255)=255
c=a*b; //c ist MAX((254*3),255)=255
</syntaxhighlight>
Die Spezifikation von C macht bezüglich der zu nutzenden Methodik keine Vorgaben, so dass das Handling von der ALU des Prozessors abhängt. Aus Komplexitäts- und Geschwindigkeitsgründen ist dies zumeist der arithmetische Überlauf. Nur bei Spezialprozessoren (z.B. DSP Digital Signal Processor) kommt z.T. die Sättigungsarithmetik zum Einsatz.
=== Gleitkomma Datentyp und Arithmetik ===
Für den Umgang mit Gleitkommazahlen bieten einige Prozessoren spezielle Recheneinheiten ({{w|Gleitkommaeinheit}} Floating Point Units FPU) an. Sowohl die Darstellung von Gleitkommazahlen als auch das Verhalten bei Überlauf/Unterlauf ist damit Herstellerabhängig. Um auch diese Einheiten effektiv nutzen zu können, ist die C/C++ Spezifikation in diesem Bereich ebenfalls sehr offen.
=== Max. Speicherbedarf von Variablen ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C/C++ von der zugrundeliegenden Rechnerarchitektur abhängig:
<syntaxhighlight lang="C">
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Zur Darstellung bitte Compiler-Fenster öffnen
//und dort den CC65-Compiler für den 6502 Prozessor auswählen
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Im Falle von globalen Variablen erzeugt der Compiler/Linker eine Fehlermeldung. Werden von diesen Datentypen Variablen als lokale Variablen angelegt, so erzeugt dies zur Laufzeit einen Stackoverflow.
=== Zeigervariable ===
Eine Zeigervariable ist eine Variable, die eine Speicheradresse speichert. Die Größe dieses Datentyps hängt von der Adressierungsbreite des Prozessors ab. Unabhängig von dem Datentyp, auf den die Zeigervariable zeigt, ergibt sich folgende Breite:
* 4-Byte bei einer 32-Bit Rechnerarchitektur
* 8-Byte bei einer 64-Bit Rechnerarchitektur
* 2-Byte bei einer 16-Bit Rechnerarchitektur
=== Datentyp size_t ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C von der zugrundeliegenden Rechnerarchitektur abhängig. Sie ergibt sich aus der Adressierungsbreite. Da die Datenbreite des Datentyps int zumeist kleiner als die Adressierungsbreite ist, existiert in C/C++ der vorzeichenlose Datentyp size_t.<br />
Alle Funktionen, welche den Speicherbedarf übergeben bekommen, bzw. zurückgeben (bspw. strlen(), memcpy(), sizeof()) , nutzen den Datentyp size_t:
<syntaxhighlight lang="C">
//Prototypen
size_t strlen(char *str); //Die max. Stringlänge ist durch den
//adressierbaren Speicher vorgegeben
void *malloc(size_t size);
void *memcpy(void *dest, const void *src, size_t n);
</syntaxhighlight>
Der Datentyp size_t ist in der Header-Datei stddef.h der Standard-C-Library per typedef gesetzt. Im Normalfall muss diese Header-Datei nicht explizit inkludiert werden, da bei Nutzung von z.B. strlen() diese bereits durch die Header-Datei string.h inkludiert wird:
<syntaxhighlight lang="C">
typedef unsigned long long size_t; //Bei einer 64-Bit Rechnerarchitektur
</syntaxhighlight>
Hinweis:
* Der Datentyp size_t ist immer ein vorzeichenloser Datentyp (es gibt keine negativen Speicheradressen).
* Mit dem Datentype ssize_t wird eine vorzeichenbehaftete Variante zur Verfügung gestellt, welche hilfreich ist, wenn Speicheradresse subtrahiert werden sollen.
* Soll der Wert vom Datentyp size_t mittels printf() ausgegeben werden, so ist der 'Length Modifier' z und der 'Conversion Specifier' u zu nutzen:
:<syntaxhighlight lang="C">
size_t var=strlen("String");
printf("%zu",var);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]) {
size_t var=strlen("String");
printf("%zu",var);
printf("%d",var); //Hier sollte es eine Compiler-Warning geben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Boolescher-Datentype/Operatoren ==
Ursprünglich gab es den booleschen Datentyp in der Programmiersprache C nicht. Mit C99 wurde zwar der Datentyp <code>_Bool</code> eingeführt, dies änderte jedoch nicht den Umgang mit Anweisungen und Operatoren, die einen booleschen Datentyp erwarten/zurückgeben!
An allen Stellen, an denen ein boolescher Datentyp erwartet wird (z.B. IF-Abfrage, bei booleschen Operationen) wird der Datentyp Ganzzahl, Gleitkommazahl oder Zeiger erwartet (= Scalar-Type) und ausgewertet. Der hierin gespeicherte Zahlenwert sagt aus, ob diese Zahl als True oder False zu interpretieren ist:
* False, wenn Ganzzahl gleich 0 oder Gleitkommazahl gleich 0.0 oder Zeiger gleich NULL
* True, wenn Ganzzahl ungleich 0 oder Gleitkommazahl ungleich 0.0 oder Zeiger ungleich NULL
Beispiel:
<syntaxhighlight lang="C">
int a=3;
double b=0.0;
int *ptr=&a;
while(1);
if(a) {}
for( ; b && ptr ; );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
double b=0.0;
int *ptr=&a;
while(0);
if(a) {}
for( ; b && ptr ; ) {}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Operatoren, welchen einen booleschen Wert zurückliefern (Vergleichs-Operatoren und Boolesche-Operatoren), liefern ein Integer-Datentyp zurück:
* (int)0 für False
* (int)1 für True
Beispiel:
<syntaxhighlight lang="C">
int a=3;
int b= (a==3); //b=1
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
int b= (a==3); //b=1
printf("%d",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
In den if()/for()/while() Anweisungen ist folglich kein explizites Konvertieren eines Ganzzahl-/Gleitkomma-/Zeigerwertes mittels des Vergleichs-Operators in einen Booleschen Wert notwendig:
<syntaxhighlight lang="C">
int a;
double b;
if(a) //entspricht if(a!=0)
if(!b) //entspricht if(b==0.0)
while(1) //entspricht while(True)
for(int lauf=1; lauf ; lauf--);
</syntaxhighlight>
Umgedreht kann ein boolescher Wert oder auch das Ergebnis einer booleschen Operation direkt mit einer Ganzzahl- oder Gleitkommazahl verknüpft werden:
<syntaxhighlight lang="C">
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
if( a==1 & b==2)
if(3 < a < 9) //Vorsicht, die Schreibweise lässt ein
//anderes Verhalten erwarten!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
printf("%d\n",a);
if(a==1 & b==2)
printf("true\n");
else
printf("false\n");
if(3 < a < 9)
if( (a==1) & (b==2))
printf("true\n");
else
printf("false\n");
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit C99 wurde der Datentyp <code>_Bool</code> eingeführt. Dieser entspricht weiterhin einem Integerdatentyp mit der Besonderheit, dass beim Zuweisen eines Wertes dieses auf true oder false geprüft wird und Variablen dieses Datentyps nur die Werte 0 oder 1 annehmen können:
<syntaxhighlight lang="C">
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool! möglich
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool!
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für den einfacheren Umgang mit dem 'neuen' Datentyp wurde in der Header-Datei <code>stdbool.h</code> die Makros <code>true</code> (als Austauschwert für die Ganzzahl 1) und <code>false</code> (als Austauschwert für die Ganzahl 0) definiert. Ergänzend wird hier der Datentyp <code>bool</code> als Alias auf <code>_Bool</code> gesetzt.
<syntaxhighlight lang="C">
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
int main(int argc,char *argv[]) {
foo(4,3,6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In C++ gibt es anstatt des Datentypes <code>_Bool</code> den Datentyp <code>bool</code>. Auch sind die beiden Konstanten <code>true</code> und <code>false</code> ohne zusätzliches Einbinden der Header-Datei vorhanden. Der weitere Umgang ist jedoch identisch zu C.
== Literale/Konstanten ==
In Computerprogramm werden an diversen Stellen Konstanten in Source Code genutzt. Sei es als Initialisierungswert für Variablen, als Vergleichswert für Abfragen, zur Definition von Schleifendurchläufe oder als Strings für die Kommunikation. Der Syntax der Programmiersprache bietet dazu verschiedene Möglichkeiten, wie Zahlen zu beschreiben sind und wie der Datentyp vorgeben wird.</br>
Ungeachtet der Schreibweise werden im Computer alle Zahlen identisch als binäre Zalen gespeichert. Beispiele, wie die Zahlen intern gespeichert werden:
<syntaxhighlight lang="C">
int var=17; //0000 0000 0000 0000 0000 0000 0001 0001
short var=0x307;// 0000 0011 0000 0111
char var=017; // 0000 1111
int var=-1; //1111 1111 1111 1111 1111 1111 1111 1111
float var=0.0; //0000 0000 0000 0000 0000 0000 0000 0000
float var=1.0; //0011 1111 1000 0000 0000 0000 0000 0000
</syntaxhighlight>
=== Ganzzahl-Konstanten ===
Im Allgemeinen ordnet der Compiler einer numerischen, ganzzahligen Konstanten den kleinstmöglichen Datentyp beginnend vom Datentyp integer zu. Sobald der Wert der Konstanten den Wertebereich von integer übersteigt, wird der nächst größere passende Datentyp gewählt. Ergänzend gilt, dass alle Ganzzahl-Konstanten als vorzeichenbehaftete Ganzzahl-Konstanten angesehen werden!<br />
Beispiele für integer Konstanten:
<pre>
123
+123
-123 → Formal wird das Minus als Operator angesehen
und die positive Zahl 123 negiert
0x123 → Konstante ist in hexadezimaler Schreibweise notiert
0123 → Konstante ist in oktaler Schreibweise notiert
0b011 → Konstante ist in binärer Schreibweise notiert
nicht offizieller C-Syntax, wird aber von vielen Compiler unterstützt
ab C23-Spezifikation offiziell im C-Syntax enthalten!
6'432'108 → Tausendertrenner (ab C23 und in C++)
6'4'3'2'10 → Tausendertrenner
0x12'23'5 → Tausendertrenner
0b1001'001 → Tausendertrenner
5123123123 → Wertebereich größer als 2^31 so dass automatisch
zum nächst größeren Datentyp konvertiert wird
</pre>
Mit den Suffixen L/l und LL/ll kann der Datentyp long und long long erzwungen werden:
<pre>
12L → Konstante wird in eine long Integer Konstante konvertiert
4711LL → Konstante wird in eine Long Long Konstante konvertiert
</pre>
Mit dem Suffix U/u kann die Konstante explizit auf unsigned gesetzt werden:
<pre>
12U → Konstante wird als vorzeichenlose Zahl gesepeichert
4711ULL → Konstante wird in eine vorzeichenlose
Long Long Konstante konvertiert
</pre>
=== Char-Konstanten ===
In einfachen Anführungsstrichen geschriebene ASCII Zeichen werden entsprechend der {{w|American Standard Code for Information Interchange | ASCII-Tabelle}} als Zahlenwert (Datentyp int) dargestellt:
<pre>
'A' → Integerkonstante 65
'a' → Integerkonstante 97
…
</pre>
Über den {{w|Escape-Sequenz|Escape-Operator}} (Zeichen Backslash '\') wird das/die dem ESCAPE Operator folgende Zeichen gesondert interpretiert. Die im Source-Code erhaltene Zeichenfolge wird im Computerprogramm als ein Zahlenwert (Datentyp int) gespeichert. Dies ist u.A. zur Darstellung von ' und " aber auch zur Darstellung der unteren 32 Zeichen der ASCII Tabelle notwendig (Siehe auch {{w|Steuerzeichen}})
<pre>
ESCAPE Integer- → Bedeutung / (Terminal)funktionalität
Sequence konstante
'\0' = 0 → 0 Character = Stringendezeichen
'\a' = 7 → Bell (erzeugt auf dem Terminal einen Ton)
'\b' = 8 → Backspace (Bewegt den Cursor um eine Position nach links)
'\t' = 9 → Horizontal Tab (Bewegt den Curso auf die nächste horizontale
Tabulatorposition, Abstand ist Terminalspezifisch)
'\n' = 10 → NewLine (Zeilenvorschub)
'\v' = 11 → Vertial Tab
'\r' = 13 → Carriage Return (Wagenrücklauf, Bewegt den Cursor an den
Zeilenanfang)
'\"' = 34 → Double Quote
'\'' = 39 → Single Quote
'\?' = 63 → Question mark
'\\' = 92 → Backslash
'\f' = 12 → FormFeed (Erzeugt auf dem Terminal/Drucker
einen Seitenvorschub)
'\ooo' = 0ooo → Oktal, wobei o Digits von 0..7 sein müssen
'\xdd' = 0xdd → Hexadezimal, wobei d Digits von 0..9 A..F sein müssen
'\udddd' Unicode mit 4 Digits
'\Udddddddd' Unicode mit 8 Digits
</pre>
Beispiel
<syntaxhighlight lang="C">
'A' == 65 == '\101' == '\x41' == '\u0041' == '\U00000041'
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
//Programmiersprache wurde auf C++ gesetzt
if('A' == 65) printf("'A' == 65\n");
if('A' == '\101') printf("'A' == '\\101'\n");
if('A' == '\x41') printf("'A' == '\\x41'\n");
if('A' == '\u0041') printf("'A' == '\\u0041'\n");
if('A' == '\U00000041') printf("'A' == '\\U00000041'\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true|
lang=c++
}} Öffnen im Compiler Explorer] }}
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
u'b' → unicode 16 (nur C++)
U'b' → unicode 32 (nur C++)
L'b' → wchar_t
</pre>
Hinweis
* Die ASCII-Tabelle basiert auf einer 7-Bit Zeichenkodierung, so dass bspw. die Umlaute 'ä', 'ö' und 'ü' dort nicht kodiert sind. Sollen auch diese Zeichen genutzt werden, so empfiehlt sich der Datentyp wchar_t
=== Gleitkommakonstanten ===
Alle Gleitkommakonstanten sind ohne weitere Angaben vom Datentyp double!
<pre>
555.12
555. → 555.0
.1 → 0.1
4e2 → 400.0
1'234.678'9 → Tausendertrenner (ab C23 und in C++)
0x22.11p13 → Konstante in Hexadezimalen Schreibweise (ab C99)
</pre>
Über Suffixe kann ein alternativer Datentyp erzwungen werden:
<pre>
3.0F → Datentyp float
3.0l → Datentyp long double
</pre>
Hinweis:
* Aufgrund der unterschiedlichen Basis zwischen dem menschlichen Zehner-System und dem computerinternen Binär-System entstehen insbesondere bei den Nachkommastellen Rundungsfehler. Die Konstante 0.1f wird durch die Wandlung intern als 1.00000001490116119384765625e-1 dargestellt (siehe [[Programmieren in C/C++: Datentypen#Gleitkomma Datentypen | Datentypen:Gleitkomma Datentypen]])
* Die C-Spec verlangt, dass die binäre Repräsentation von Gleitkommazahlen zur Laufzeit (z.B. durch die Funktion atof() strtod() scanf("%f")) identisch zur der zur Compilezeit ist. Beispiel:
:<syntaxhighlight lang="C">
if(3.14==atof("3.14")) printf("muss erfüllt sein");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
if(3.14==atof("3.14")) printf("muss erfüllt sein\n");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
printf("Intern wird 3.14 wie folgt dargestellt %14.20f",3.14);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Konstanten Ausdrücke ===
Ergänzend zu den Zahlenwerten werden auch Ausdrücke durch den Compiler ausgewertet. Als Voraussetzung für die Ausdrücke gilt, dass alle Operatoren Literale/Konstante sein müssen, so dass der Compiler die Berechnung durchführen kann. Als Operatoren können alle im normalem Syntax erlaubten Operatoren (z.B.: +,-,*,/,&,&&,|,||,>>,<<,==,!=) genutzt werden.<br />
Beispiel:
<syntaxhighlight lang="C">
int var1=7*3+5; → wird vom Compiler durch 26 ersetzt
int var2=(4710+(8-1))&-8; → wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); → wird vom Compiler durch 16 * var1 + 154 ersetzt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int var1=7*3+5; //→ wird vom Compiler durch 26 ersetzt
int var2;
var2=(4710+(8-1))&-8; //→ wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); //→ wird vom Compiler durch var1 * 16 + 154 ersetzt
return 0;
} | execCompilerOptions=-Wall|
h=g|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Konstante Ausdrücke bieten sich an, um den Sourcecode lesbarer zu gestalten. Da der Compiler die Berechnung durchführt, wird zur Laufzeit keine Rechenleistung benötigt. Einzig die Compiledauer wird etwas erhöht:
<syntaxhighlight lang="C">
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180); //siehe nachfolgende Hinweise
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int ad_get(void) {
return 615; //614;
}
int main(int argc,char *argv[]) {
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180);
printf("%f\n%f\n",alpha1,alpha2);
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Ergänzend zu den oben aufgeführten Operatoren erlauben einige Compiler weitere Funktionen der Math.h Library in Konstantenausdrücken (z.B. sin(), cos(), ...)
* Konstanten Ausdrücke werden innerhalb des Compilers durch den Präprozessor ausgewertet, so dass dieser die Ergebnisse ebenfalls nutzen kann:
:<syntaxhighlight lang="C">
#define BUF_SIZE 512
#if (BUF_SIZE & (BUF_SIZE -1)) != 0
#endif
</syntaxhighlight>
=== String Konstanten ===
Stringkonstanten erzeugen ein Array von Characters. Mit dem abschließenden Hochkommata wird das Array um ein Stringendezeichen ergänzt:
<pre>
"abc" → (char []) {'a','b','c','\0'}
</pre>
Adjacent Strings Konstanten werden vom Compiler zu einer String-Kontante zusammengefasst, so dass nur ein Stringendezeichen vorhanden ist:
<pre>
"xxx" "yyy" → (char []) {'x','x','x','y','y','y','\0'}
</pre>
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
L"string" → (wchar_t[7]){L's',L't',L'r' …)
</pre>
Über Postfixes können in C++ Objekte erzeugt werden:
<pre>
"string"s → erzeugt einen String vom Datentyp std::string
"string"sw → Erzeugt einen String vom Datentyp std::string_view
</pre>
String Konstanten werden Compilerintern über unnamed Variablen realisiert, welche als globale Variable angelegt werden und per default const sind:
<syntaxhighlight lang="C">
printf("Wert=%d",4);
//entspricht
const char unnamed1[]="Wert=%d";
printf(unnamed1,4);
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
printf("Wert=%d\n",4);
//entspricht
const char unnamed1[]="Wert=%d\n";
printf(unnamed1,4);
fflush(stdout); //Zur Darstellung der Ausgabe, da nachfolgend
//das Programm abstürzt und die gepufferte Ausgabe
//nicht zur Anzeige gebracht wird
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für doppelte String Konstanten wird nur einmal Speicher reserviert:
<syntaxhighlight lang="C">
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2) printf("Identische Startadressen");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2)
printf("Identische Startadressen");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Initialisierungsliste / Compound Literal ==
Arrays, Strukturen und Unions bestehen zumeist aus mehreren Elementen. Zur Initialisierung solcher Variablen werden die Initialisierungswerte in geschweiften Klammern als Initialisierungsliste zusammengefasst.
<code>
Syntax: {Initialisierungsliste}
</code>
Für eine Initialisierungsliste wird kein Speicher vorgehalten. Vielmehr wird bei der Variablendefinition die Variable direkt mit dem Inhalt der Liste initialisiert. Der Datentyp der Initialisierungsliste ergibt sich aus dem Datentyp der zu initialisierenden Variable:
<syntaxhighlight lang="C">
int arr[5] = { 1,2,3,4,5 };
struct xyz { int x,y,z;}; //Definition einer Struktur
struct xyz var = { 1,2,3 };
</syntaxhighlight>
Wird der Initialisierungsliste ein Datentyp in runden Klammern vorangestellt, so wird hiermit eine 'unnamend' Variable/Objekt, ein Compound Literal erstellt:
<code>
Syntax: (type) {Initialisierungsliste}
</code>
Ein Compound Literal entspricht einer anonymen Variablen des angegebenen Datentyps. Wie bei einer normalen Variablendefinition wird hier ebenfalls eine Variable angelegt und diese mit den Initialisierungswerten initialisiert. Im Unterschied zu einer normalen Variable kann auf solch eine Variable im Nachgang nicht mehr zugegriffen werden. Der Rückgabewert eines Compound Literals entspricht somit dem einer Variablen.</br>
Compound Literale bieten sich überall dort an, wo Variablen nur für einen einmaligen Zweck angelegt werden (bspw. bei der Parameterübergabe von Funktionen):
<syntaxhighlight lang="C">
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawline(struct point start,struct point end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start.x,start.y,end.x,end.y);
}
void printarray(int arr[4]) {
printf("[ ");
for(size_t idx=0;idx<4;idx++)
printf("%d ",arr[idx]);
printf("]\n");
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Über den Adressoperator kann auch die Adresse der anonymen Variablen ermittelt werden. In diesem Falle ist dann der Gültigkeitsbereich/-dauer des Compound Literals zu berücksichtigen. Wird eine Compound Literals außerhalb eines Block-Scopes angelegt, so entspricht sie einer globalen Variable, andernfalls einer lokalen Variablen. Außerhalb des Gültigkeitsbereiches verliert die Adresse auf solch eine Variable ihre Gültigkeit:
<syntaxhighlight lang="C">
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawlinep(struct point *start,struct point *end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start->x,start->y,end->x,end->y);
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Compound-Literal sind per Default keine Konstanten, können also zur Laufzeit geändert werden (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Const Type Qualifier|DatentypeSpecifier:Const Type Qualifier]]):
:<syntaxhighlight lang="C">
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweiften Klammern <code>{ }</code> sind nicht mit dem Block-Operator (siehe [[Programmieren in C/C++: Grundlagen#Block / Compound-Statement | Block / Compound-Statement]]) zu verwechseln. Werden die geschweiften Klammern bei der Initialisierung von Variablen genutzt, dann beschreibt der Inhalt der geschweiften Klammern eine Initialisierungsliste. Wird diesen ein Datentyp vorangestellt, dann wird hiermit eine Compound Literal definiert.
== Variableninitialisierung ==
Mit der Definition einer Variable kann diese optional initialisiert werden. Der tatsächliche Zeitpunkt der Variableninitialisierung (zur Laufzeit oder zur Compilezeit) und damit die Ausführung der Initialisierung (Maschinensprachebefehle oder Speichervorbelegung) hängt von der Gültigkeit/Sichtbarkeit der Variablen ab(siehe [[Programmieren in C/C++: Grundlagen#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]).
=== Globale + Static lokale Variablen ===
Globale und statisch globale Variablen werden in einem während der Laufzeit des Programms festen Speicherbereich gehalten. Zum Startzeitpunkt des Programms ist der Speicherplatz solch einer Variable mit dem Initialisierungswert gefüllt, so das bei erstmaliger Nutzung dieser Variablen diese ihre Initialisierungswerte enthalten. Die Belegung des Speicherplatzes erfolgt durch den Compiler, so dass als Initialisierungswerte / Inhalt der Initialisierungsliste nur Konstanten oder Konstanten-Ausdrücke (siehe [[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Literale/Konstanten]]) erlaubt sind:
<syntaxhighlight lang="C">
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
double sin(double); //DJ: Include-Anweisung in wikibooks schlägt fehlt
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
int main(int argc,char *argv[]) {
printf("%hd %hd %hd\n",array[0],array[1],array[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Nicht initialisierte globale und static lokale Variablen werden mit 0 initialisiert! D.h. die Speicherstellen dieser Variablen werden mit dem Wert 0 vorbelegt::
<syntaxhighlight lang="C">
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
int main(int argc,char *argv[]) {
printf("f=%d\n",f);
printf("%f %f %f\n",arr[0],arr[1],arr[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Lokale Variable ===
Der Speicherplatz für lokale Variable wird auf dem Stack zur Verfügung gestellt. Mit jedem öffnenden Block-Scope wird Speicher für die innerhalb dies Block-Scopes vorhandenen Variablen vom Stack nach dem LIFO Prinzip reserviert und mit der Variablendefinition Maschinencode zur Initialisierung der Speicherstellen ausgeführt (sofern Variable einen Initialisierungswert hat):
<syntaxhighlight lang="C">
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für int) und 8 Bytes (für double)
int var1=12; //erzeugt Maschinencode zur Initialisierung
//der ersten 4 Byte mit dem Wert 12
double var2=sin(f); //erzeugte Maschinencode, welche zunächst
//die Funktion sin() mit dem Übergabewert f
//aufruft und dessen Rückgabewert in die
//nächsten 8 Byte des reservierten Speichers
//kopiert
...
{ //siehe zuvor
int var3=var1; //siehe zuvor
double var4=var2+var1;
} //siehe nachfolgenden
} //Freigabe des zuvor reservierten Speichers
</syntaxhighlight>
Dies gilt auch für Funktionsaufrufe. Mit der öffnenden geschweiften Funktionsklammer wird ebenfalls Speicher reserviert:
<syntaxhighlight lang="C">
void foo(int par)
{ //Öffnende Funktionsklammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für (Übergabe)Variable par und 4 Bytes für Variable var
int var; //Da keine Initialisierung vorhanden ist wird auch
//kein Maschinencode zur Initialisierung ausgeführt
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Byte für Variable x
int x;
...
</syntaxhighlight>
Aufgrund der mit der Initialisierung bedingten Erzeugung von Maschinencode können die Initialisierungswerte/Inhalte der Initialisierungsliste bei lokalen Variablen aus beliebigen Ausdrücken bestehen und müssen keine Konstanten oder Konstanten Ausdrücke sein:
<syntaxhighlight lang="C">
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sin(f)}; //werden zur Laufzeit berechnet
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h> //fuer sinf()
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sinf(f)}; //werden zur Laufzeit berechnet
printf("%f\n",(double)summe);
printf("%f %f %f\n",(double)arr[0],(double)arr[1],(double)arr[2]);
}
int main(int argc,char *argv[]) {
foo(3,4);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dieser Maschinencode wird jedes Mal ausgeführt, wenn die dazugehörige Anweisung abgearbeitet wird und bedingt dementsprechend Rechenzeit. Zehnmaliges Ausführen einer Funktion oder zehnmaliges Öffnen eines Block-Scopes innerhalb einer For-Schleife führt zur zehnmaligen Ausführung der oben genannten Sachverhalte:
<syntaxhighlight lang="C">
void foo(int);
void var(void) {
for(int lauf=10; lauf>0; lauf--)
{ //zehnmaliges Reservieren von Speicher
int var=lauf*2; //zehnmalige Initialisierung
foo(var);
} //Freigabe des Speichers
}
void foo(int par) { //zehnmaliges Reservieren von Speicher
int var=12; //zehnmalige Initialisierung
} //Freigabe des Speichers
</syntaxhighlight>
Nicht initialisierte lokale Variablen werden nicht initialisiert, d.h. keine zusätzlichen Maschinenbefehle zum Initialisieren erzeugt. Der Variablenwert entspricht dann einem 'Zufallswert' oder korrekter gesagt dem Inhalt der Variablen, welcher zuvor der Speicherstelle zugewiesen war:
<syntaxhighlight lang="C">
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//und damit auch dessen zuletzt gültigen Wert
}
int main(int argc, char *argv[]) {
int var1=first(); //var1 beinhaltet Wert 7
int var2=second(); //var2 beinhaltet Wert 7
printf("var_foo=%d\n",var1);
printf("var_far=%d\n",var2);
return 0;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//(und damit auch dessen zuletzt gültigen Wert)
}
int main(int argc, char *argv[]) {
printf("%d\n",second()); //Zufallswert (0, da Stack mit 0 initialisiert ist)
printf("%d\n",first()); //Stack belegen
printf("%d\n",second()); //Zufallswert (7, da Speicherstelle zuvor mit 7
return 0; //belegt wurde)
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird eine Variableninitialisierung mit einer switch oder goto Anweisung übersprungen, so wird zwar die Variable angelegt (Speicherplatz reserviert), jedoch die Maschinenbefehle zur Initialisierung dieser Variablen nicht ausgeführt (siehe auch [[Programmieren in C/C++: Grundlagen# Switch-Anweisung|Switch-Anweisung]] und [[Programmieren in C/C++: Grundlagen# Label + Goto|Label + Goto]]). Die Variable enthält dann einen Zufallswert:
<syntaxhighlight lang="C">
switch(value) {
case 0:
int lok=7;
printf("%d",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(int value) {
switch(value) {
case 0:
int lok=7;
printf("%d\n",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d\n",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
}
void far(void) {
int var1=4711;
int var2=1799;
printf("Marke: %d, Erscheinungsjahr: %d\n",var1,var2);
}
int main(int argc,char *argv[]) {
foo(2); //Zufallswert (0, da Stack mit 0 initialisiert ist)
foo(0); //Initialisierungswert
far(); //Stack belegen
foo(2); //Zufallswert
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei erstmaligem Funktionsaufruf kann eine nicht initialisierten lokale Variablen den Wert 0 beinhalten (Stackframe wird mit Programmstart auf 0 gesetzt). Beim nächsten Aufruf der Funktion ist zumeist die Speicherstelle der lokalen Variablen mit anderen Werten gefüllt worden, so dass nun ein anderer 'Zufallswert' als 'Initialisierungswert' enthalten ist
=== C++ ===
In C++ ist ergänzend die Initialisierung einer Variablen über () möglich. Bei Objekten wird hierüber der zugehörige Konstruktor aufgerufen. Bei primitiven Datentypen entspricht der Wert in den Klammern dem Initialisierungswert:
<syntaxhighlight lang="C++">
int variable(10); //Bei primitiven Datentype entspricht dies
//int variable=10;
struct test {
int a;
test(int par) {a=par;} //Konstruktor der Struktur test
};
struct test test(4); //Konstruktor test(int par) wird aufgerufen
struct test test(4,5); //KO, kein passender Konstruktor vorhanden
</syntaxhighlight>
=== Sonstiges ===
Folgende weitere Sachverhalten gilt es bzgl. Variableninitialisierung zu berücksichtigen:
* Nach C-Spezifikation ist eine Initialisierung von Variablen nicht notwendig. Es liegt folglich kein Fehler vor, wenn auf eine nicht initialisierte Variable lesend zugegriffen wird. Ungeachtet der C-Spezifikation überprüft der Compiler mit dem Schalter '-Wall' diesen Sachverhalt und gibt eine Warning aus
* Deklarationen/Prototypen können keinen Initialisierungswert enthalten
<syntaxhighlight lang="C++">
extern int var=7; //Fehlerhaft
</syntaxhighlight>
* Const und lokale Static Variablen sollten initialisiert werden, auch wenn C in diesem Fall keinen Fehler meldet!
<syntaxhighlight lang="C++">
const int konstante; //Syntaktisch OK, Initialisierungswert fraglich!
static int statisch;
</syntaxhighlight>
== Anweisung (Statement) & Expression ==
Eine Anweisung (Statement) stellt entsprechend dem Wikipedia Artikel {{w|Anweisung_(Programmierung) | Anweisung}} ''"ein in der Syntax einer Programmiersprache formulierte einzelne Vorschrift dar, die im Rahmen der Abarbeitung des Programms auszuführen ist"''.</br>
Aus der Statement Spezifikation ergibt sich folglich, welche Bestandteile ein Programm beinhaltet kann. In der C-Spezifikation [C11 6.8] sind folgende Anweisungen definiert:
: labeled-statement: Eine Sprungmarke für die Switch- und die Goto-Anweisung
: compound-statement: siehe nachfolgendes Kapitel
: expression-statement: siehe nachfolgendes Kapitel
: selection-statement: Eine if() oder switch() Anweisung
: iteration-statement: Eine while(), do while() oder eine for() Anweisung
: jump-statement: Eine goto, break, continue oder return Anweisung
so dass ein Programmablauf wie folgt aussehen könnte:
<syntaxhighlight lang="C">
int main(int argc, char argv[]) {
int var; //declaration innerhalb eines compound-statements
label: //labeled-statement
var=var*2+1; //expression-statement
for(var=0;var<100;var++); //iteration-statement
if(var<0) //selection-statement
printf("var<0"); //espression-statement
{ int lok=var; lok++; } //compound-statement
goto label; //jump-statement
return 0;
}
</syntaxhighlight>
=== Ausdruck (Expression) ===
Entsprechend der C-Spezifikation [C11 6.5] ist ein Ausdruck eine Folge von Operatoren und Operanden, die die Berechnung eines Werts angibt, ein Objekt oder eine Funktion bezeichnet, Nebenwirkungen erzeugt oder eine Kombination davon ausführt. Die Wertberechnungen der Operanden eines Operators werden vor der Wertberechnung des Ergebnisses des Operators ausgeführt (siehe auch {{w|lang=en|Expression_(computer_science)|Expression}}).
Beispiele:
<syntaxhighlight lang="C">
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöung der globalen Variable a)
int func(int par) { a++; return par*2;}
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int a=0;
int func(int par) {
a++;
return par*2;
}
int main(int argc,char *argv[]) {
int a=4,b=7;
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöhung der globalen Variable a)
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ausdrücke entsprechen somit Rechenvorschriften, die ausgewertet werden. Ausdrücke sind in C/C++ überall dort erlaubt, wo ein Operand erwartet wird:
<syntaxhighlight lang="C">
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func3(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf()]) {}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
//Ausdruck innerhalb eines Funktionskopfes
int func1(int par) {
return 1;
}
int func2(void) {
return 1;
}
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf("func() called\n")])
{
printf("func() body\n");
}
int main(int argc,char *argv[]) {
int a=1;
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func1(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
func3(1,arr);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dies ist unter anderen ein Grund dafür, dass C/C++ als unleserlich gilt. Zur besseren Lesbarkeit eines Codes sollte dieses 'Feature' nur dann genutzt werden, wenn es zwingend notwendig ist.
=== Discarded Value / null statement ===
Alle Ausdrücke und nicht void-Funktionen haben einen Rückgabewert, der weiter verwendet werden kann:
<syntaxhighlight lang="C">
a+7 //Rückgabewert ist das Ergebnis der Addtion
printf("hallo") //printf() Funktion ist vom Typ int und gibt die Anzahl
//der ausgegebenen Zeichen zurück
a //gibt den Inhalt der Variablen zurück
7 //gibt den 'Inhalt' der Konstanten zurück
b=(a=7) //der Zuweisungsoperator gibt den Zuweisungswert zurück
</syntaxhighlight>
Der letzte Rückgabewert eines fasst jeden Ausdruckes wird somit nicht genutzt. Dies wird Discarded Value bezeichnet:
<syntaxhighlight lang="C">
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der einfachste Fall eines Discarded Values ist ein Leeranweisung / null statement, d.h. die Anweisung besteht nur aus einem Semikolon. Dies stellt eine syntaktisch korrekte Anweisung dar, die keine Auswirkung hat:
<syntaxhighlight lang="C">
; //Leeranweisung
</syntaxhighlight >
Überall wo statements/Anweisungen erwartet werden (bspw. bei einer for-Schleife, bei einer if-Anweisungen) kann anstatt einer statements eine Leeranweisung stehen, welche dementsprechend nichts ausführt:
<syntaxhighlight lang="C">
for(size_t idx=0; str[idx]!=0; idx++)
; //Leeranweisung
while(a++ < 100)
; //Leeranweisungen
</syntaxhighlight>
An einige Stellen bietet sich die Nutzung dieser Sachverhalte als vorteilhaft an. Oft führen diese Sachverhalten jedoch zu Ausführungsfehlern, da sie aufgrund des korrekten Syntax vom Compiler nicht als Fehler gemeldet werden und beim Suchen dementsprechend nur schwer zu finden sind! Ggf. gibt der Compiler für einige Sachverhalte eine Warnung aus, so dass es vorteilhaft ist, Compiler-Warnings zu beachten!
Hinweise:
* Soll bewusst der Rückgabewert verworfen werden, so kann/sollte mit dem explizten Cast auf (void) der Rückgabewert explizit 'verworfen' werden. Dies ist u.A. hilfreiche bei Variablen, die (noch) nicht benutzt werden und der Compiler die Warning "unsued Variable" ausgibt:
:<syntaxhighlight lang="C">
(void)a; //Zur Vermeidung von Compiler-Warnings "Unused Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(void) {
return 4711;
}
int main(int argc,char *argv[]) {
int a;
(void)a; //Zur Vermeidung von Compiler-Warnings "Unsued Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Mit der Anweisung <nowiki>[[nodiscard]]</nowiki> (ab C++17, ab C23) wird der Compiler angewiesen, dass der Aufrufer einer Funktion mit Rückgabewert der Rückgabewert entgegenzunehmen ist. Wird der Rückgabewert verworfen, so gibt der Compiler eine Fehlermeldung aus:
:<syntaxhighlight lang="C">
[[nodiscard]] int Client(int socket);
Client(5); ////Fehlermeldung, da Rückgabewert nicht verwendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
[[nodiscard]] int Client(int socket) {
return socket+1;
}
int Server(int socket) {
return socket+1;
}
int main(int argc,char *argv[]) {
Server(5); //keine Fehlermeldung
Client(5); //Fehlermeldung, da Rückgabewert nicht verwendet wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sequence Point ===
Ein Sequenzpunkt (u.A. das abschließende Semikolon am Ende der Anweisung) ist nach dem Wikipedia Artikel {{w|lang=en|Sequence_point|Sequence Point}} definiert als der Punkt in der Ausführung eines Computerprogramms, an dem garantiert ist, dass alle Nebenwirkungen früherer Bewertungen durchgeführt wurden und noch keine Nebenwirkungen von nachfolgenden Bewertungen durchgeführt wurden.</br>
Sequenzpunkte führen somit zur Trennung der Abarbeitungsreihenfolge innerhalb von Ausdrücken. Das abschließende Semikolon am Ende eines Ausdruckes sorgt somit dafür, dass zunächst der vorangegangene Ausdruck abgearbeitet wird, bevor der nächste Ausdruck beachtet wird.</br>
Beschreibt das Semikolon explizit einen Sequenzpunkt, so gibt es auch andere Operatoren, die einen Sequenzpunkt beinhalten. Bei solchen Operatoren wird somit zunächst vollständig der erste Teilausdruck ausgewertet, bevor der nächste folgt. Zwei Beispiele für Operatoren mit Sequenzpunkt sind das logische Und <code>&&</code> und der <code>?</code>-Operator:
<syntaxhighlight lang="C">
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(int par) {
return printf("func(%d) called\n",par);
}
int main(int argc,char *argv[]) {
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein weiteres Beispiel ist der Komma-Operator. Hier teilt das Komma den Gesamtausdruck in mehrere Teilausdrücke auf, die nacheinander abgearbeitet werden (siehe
[[Programmieren in C/C++: Grundlagen#Komma-Operator | Komma-Operator]]).
=== Abarbeitungsreihenfolge ===
Die Abarbeitungsreihenfolge der Operatoren innerhalb eines Ausdruckes wird durch die Prioritätenliste/Rangfolge (siehe [[C-Programmierung: _Liste_der_Operatoren_nach_Priorität| C-Programmierung:Liste der Operatoren nach Priorität]]) vorgegeben. Operatoren mit höherer Priorität werden vor Operatoren mit niedriger Priorität ausgeführt. Die ()-Klammer hat die höchste Priorität:
<syntaxhighlight lang="C">
//Der Ausdruck
c = sizeof(x) + ++a / 3;
//wird aufgrund der Prioritäten wie folgt ausgewertet:
c= (sizeof(x)) + ( (++a) / 3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=2;
int c;
int x=0;
c = sizeof(x) + ++a / 3;
printf("a=%d c=%d\n",a,c);
//Wird aufgrund der Prioritäten wie folgt ausgewertet:
a=2;
c= (sizeof(x)) + ( (++a) / 3);
printf("a=%d c=%d\n",a,c);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei identischer Priorität ergibt sich die Abarbeitungsreihenfolge aus der Assoziativität (L-R oder R-L):
<syntaxhighlight lang="C">
a=33 / 5 / 2;
//Wird aufgrund der L-R Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2;
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
a = b = c = d*2; //→ a=(b=(c=(d*2)));
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a;
a=33 / 5 / 2;
printf("a=%d\n",a);
//Wird aufgrund der Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2
printf("a=%d\n",a);
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
int b,c,d=8;
a = b = c = d*2; //→ a=(b=(c=(d*2)));
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
An einigen Stellen gibt die C/C++ Spezifikation die Abarbeitungsreihenfolge nicht vor (indeterminately-sequenced), überlässt diese somit dem Compiler:
* Bei Funktionsaufrufen ist die Abarbeitungsreihenfolge der Parameter nicht spezifiziert:
:<syntaxhighlight lang="C">
//Quelle: C-Spec Kap. 6.5.2.2
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int f1(void) {
printf("f1 called\n");
return 1;
}
int f2(void) {
printf("f2 called\n");
return 2;
}
int f3(void) {
printf("f3 called\n");
return 3;
}
int f4(void) {
printf("f4 called\n");
return 4;
}
void func1(int par1,int par2) {
printf("func1(%d,%d) called\n",par1,par2);
}
void func2(int par1,int par2) {
printf("func2(%d,%d) called\n",par1,par2);
}
int main(int argc,char *argv[]) {
//Quelle: C-Spec Kap. 6.5.2.2
void (*pf[2])(int,int)={func1,func2};
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Per Postinkrement/-dekrement Operator sagt aus, dass für die eigentliche Operation der Wert der Variablen genutzt wird und im Anschluss die Variable erhöht / erniedrigt werden soll. Nach C-Spezifikation [C11 6.5.2.4] muss dies spätestens vor dem nächsten Sequence Point erfolgt sein. Der genaue Zeitpunkt innerhalb des Sequence Points ist jedoch nicht vorgegeben:
:<syntaxhighlight lang="C">
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
printf("a=%d b=%d\n",a,b);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Initialisierungliste ist Abarbeitungsreihenfolge nicht spezifiziert:
<syntaxhighlight lang="C">
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
printf("var={a=%d b=%d c=%d}\n",var.a,var.b,var.c);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Compound-Statement ===
Ein Compound-Statement ist innerhalb der C-Spezifikation ein alternativer Ausdruck für ein block-scope. Dieser fasst mehrere Statements und Deklarationen zu einem Statement zusammen:
<code>
Syntax: {Declaration-or-statement-list/textsuperscript<sub>OPT</sub>}
</code>
Ein Block wird nicht wie bei einer Anweisung mit einem Semikolon abgeschlossen (Das angehängte Semikolon wäre dann eine separate leere Anweisung!).
Ein Block hat blockweite Sichtbarkeit (siehe [[Programmieren in C/C++: Grundlagen#Blockweite Sichtbarkeit | Blockweite Sichtbarkeit]]), , so dass hier definierte Variablen nur hier gültig sind. Deklarationen sind ebenfalls nur in dem Block gültig:
<syntaxhighlight lang="C">
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Verwendung findet das Compound-Statement a) als Strukturierungsmöglichkeit innerhalb von Funktionen (zur Darstellung, dass dieser Bereich 'zusammengehörig' ist) und b) an den Stellen, an denen C/C++ nur eine Anweisung erwartet. Dies sind bspw. die If- und die For-Anweisungen:
<syntaxhighlight lang="C">
for(..) Anweisung; //For-Schleife führt nur diese eine Anweisung aus
for(…) {Block} //For-Schleife führt Block (als eine Anweisung) aus
if(..) Anweisung; else Anweisung; //IF-Anweisung führt nur 'eine'
//Anweisung aus
if(..) {Block} else {Block} //IF-Anweisung führt Block aus
if( ) {Block}; else {Block}; //Semikolon ist eine separate
//Leer-Anweisung, so dass else
//nicht zur IF-Anweisung zugeordnet
//werden kann (2 Anweisungen vor Else)</syntaxhighlight>
=== Embedded Statement ===
Embedded Statements sind eine GNU-C Erweiterung (siehe [https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html GNU-C-Manual 3.18]). Da diese vom Autor als sehr nützlich angesehen und auch von diversen Compilern und auch in C++ unterstützt werden, werden diese nachfolgend beschrieben.
Ein Compound-Statement fasst mehrere Anweisungen zu einer Anweisung zusammen, hat jedoch kein Rückgabewert. Ein Embedded-Statement entspricht einem Compound-Statement mit der Ergänzung, dass dieser einen Rückgabewert hat, so dass ein Embedded-Statement überall dort eingesetzt werden kann, wo eine Operand erwartet wird.
<code>
Syntax: ({Declaration-or-statement-list<sub>OPT</sub>})
</code>
Der Rückgabewert (und Datentyp) wird nicht über eine return-Anweisung angegeben, sondern entstammt aus dem Rückgabewert der letzten Anweisung innerhalb der Liste:
<syntaxhighlight lang="C">
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
printf("var=%d\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein Embedded-Statement ähnelt folglich einem Funktionsaufruf mit dem Unterschied, dass a) in der Tat kein Funktionsaufruf stattfindet und b) der Rückgabewert nicht mit return, sondern über die letzte Anweisung zurückgegeben wird. Der Anwendungsfall ist dort zu finden, wo eine Operand erwartet wird und mehrere Anweisungen zum Ermitteln des Operanden notwendig sind:
<syntaxhighlight lang="C">
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
printf("Bedingung erfüllt");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Ein Embedded-Statement ist insbesondere bei Nutzung von Makros (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]) hilfreich
* Mittels eines Embedded-Statement kann eine anonyme Funktion/Lambdafunktion dargestellt werden:
<syntaxhighlight lang="C">
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {return a%2?a:0;} ; func;})
,arr);
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {printf("Called:%d\n",a);return a%2?a:0;} ; func;})
,arr);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Funktionen / Prozeduren ==
Funktionen/Prozeduren sind ein Strukturierungsmerkmal, so dass Teile der Funktionalität des Programmes wiederverwendbar sind. C/C++ unterscheidet nicht zwischen Funktionen (haben einen Rückgabewert, können damit als Operand in Ausdrücken verwendet werden) und Prozeduren (haben keine Rückgabewert, resp. Rückgabetyp void). <br/>
Mit jedem Aufruf einer Funktion wird für den zugehörigen Block ein eigener Stack-Kontext angelegt, so dass Funktionen sich selbst aufrufen können (Rekursion). Jeder Funktionsinstanz hat somit seinen eigenen lokalen Variablenbereich, teilen sich jedoch die globalen und die statisch lokalen Variablen.<br />
Mit dem Aufruf einer Funktion können Parameter übergeben werden, wobei die Übergabeparameter vom Aufrufer (Caller) durch den Aufruf in die lokalen Variablen des Aufgerufenen (Callee) kopiert/zugewiesen werden (Call by Value). Wird ein Zeiger übergeben, hat der Callee über die Dereferenzierung des Zeigers die Möglichkeit, die Variablen des Caller zu verändern (Call by Reference) (siehe Kap. [[Programmieren in C/C++: Zeiger #Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen).]]).
Hinweise:
* Die Klammerung hinter dem Funktionsnamen (<code>foo()</code>) zeigt an, dass es sich um einen Funktionsaufruf (Verzweigung der Programmausführung zu der Startadresse der Funktion) handelt:
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
foo(); //Klammern hinter dem Funktionsnamen bedeuten Aufruf der Funktion
</syntaxhighlight>
* Die Nutzung des Funktionsnamens ohne Klammerung (<code>foo</code>) gibt die Startadresse der Funktion zurück. Die Startadresse kann in einem Zeiger auf Funktionen gespeichert werden (siehe Kap. [[Programmieren in C/C++: Zeiger#Zeiger auf Funktionen | Zeiger:Zeiger auf Funktionen]]):
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
printf("foo called");
};
int main(int argc, char *argv[]) {
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
fptr(); //Aufruf der Funktion
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklaration/Definition vor dem ersten Aufruf der Funktion 'notwendig', damit Compiler die Übergabeparameter entsprechend bereitstellt und ggf. eine implizite Typkonvertierung durchführt (dito Rückgabewert). Die Angabe der Variablennamen können bei der Deklaration entfallen
* Die fehlende Angabe der Übergabeparameter bedeutet in C (bis einschl. C18), dass diese Funktion mit beliebigen Übergabeparametern aufgerufen werden kann und der Compiler keine Typprüfung durchführt:
:<syntaxhighlight lang="C">
int func(/*Keine Übergabeparameter angegeben*/) {...}
//kann wie folgt aufgerufen werden
func();
func(4);
func("hallo Welt",4.7);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func() {
printf("foo called\n");
};
int main(int argc, char *argv[]) {
func();
func(4);
func("hallo Welt",4.7);
//Ab C23 hat sich die Bedeutung geändert.
//Zum Testen C-Versionsvorgabe -sdc=xxx unter Compiler-options aendern
return 0;
} | execCompilerOptions=-Wall -std=c17|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:→ unbedingt vermeiden<br />
:Hat die Funktion keinen Übergabewert, so wird dies in C mit void gekennzeichnet
* In C++ bedeutet die Schreibweise ohne Datentypbeschreibung, dass keine Parameter erwartet werden
* In der Parameterliste von Funktionen dient in der GNU-C Spezifikation das Semikolon zum Trennen zwischen Deklaration von Übergabeparameter und den Übergabeparametern. Alle Übergabewerte links vom Semikolon sind (Forward)deklarationen:
:<syntaxhighlight lang="C">
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Aufruf
test1(3,7); //a=7 b=3
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim);
//Aufruf
test2("hallo",6);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim) {
printf("dim=%d\n",dim);
}
int main(int argc, char *argv[]) {
//Aufrufe
test1(3,7); //a=7 b=3
test2("hallo",6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Return-Anweisung ===
Mit der Return-Anweisung wird eine Funktion (vorzeitig) beendet. Der optionale Parameter dient der Angabe des Rückgabewertes der Funktion an den Aufrufer. Der Datentyp des Parameters ergibt sich aus dem Rückgabedatentyp der Funktion.
<code>
Syntax: return expression<sub>OPT</sub>
</code>
Der Rückgabewert expresion sagt aus, dass hier nicht nur Konstanten oder Variablen stehen können, sondern ein komplexer Ausdrücke erlaubt ist. Der resultierende Datentyp des Ausdruckes sollte dem Rückgabedatentyp der Funktion entsprechen, andernfalls wird eine implizite Typkonvertierung vollzogen (sofern möglich):<syntaxhighlight lang="C">
int foo(double a, double b) {
return (int)(a*a+b*b);
}
</syntaxhighlight>
Hinweise:
* Bei nicht void-Funktionen ist eine return-Anweisung mit einer Expression entsprechend dem Datentyp der Funktion zwingend notwendig:
:<syntaxhighlight lang="C">
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
double a=func(); //int wird in double konvertiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
int main(int argc, char *argv[]) {
double a=func(); //int wird in double konvertiert
printf("a=%f\n",a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei einer void-Funktion ist die return-Anweisung ohne Expression optional. Hier entspricht der schließende Block der Return-Anweisung
:<syntaxhighlight lang="C">
void func(char *str) {
if(str==NULL)
return;
printf("%s",str);
}
</syntaxhighlight>
Sollen mehr als ein Rückgabewert an den Aufrufer zurückgegeben werden so empfiehlt sich:
* die Rückgabewerte in einer Struktur zu packen (siehe [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++) |Datentypen:Verbundtyp Struktur/Klasse (nur C++)]])
* die Rückgabewerte über die Aufrufparameter als Call-by-Reference zu übergeben (siehe [[Programmieren in C/C++: Zeiger#Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen]])
==== Rückgabewert aus Datentypsicht ====
Aus Datentypsicht kann der Funktionsname inkl. den Parameter(n) in einem Ausdruck mit dem Datentyp des Rückgabewertes der Funktion ausgetauscht werden:
<syntaxhighlight lang="C">
int foo(void) {return 4711;}
int var;
var=1+foo(); //Aus Datentypsicht (int)=(int)+(int)
</syntaxhighlight>
Daraus ergibt sich, dass bei Arrays/Strukturen/Unions direkt auf einzelne Komponenten zugegriffen werden kann, ohne diese zuvor einer Variablen zuzuweisen:
<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
if(foo(12).x == 12) printf("Identisch\n");
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
if(far(3)[2] == 2) printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <stdlib.h>
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
int main(int argc, char *argv[]) {
if(foo(12).x == 12)
printf("Identisch\n");
if(far(3)[2] == 2)
printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
==== Fehlerrückgabe ====
Viele Funktionen können unter gewissen Umständen nicht korrekt ausgeführt werden. Z.B. aufgrund dessen, dass:
* der benötigter Speicher vom Heap nicht bereitgestellt werden kann
* Übergabeparameter außerhalb des zulässigen Wertebereiches liegen
* angeforderte Ressource (Datei, Geräte, …) nicht vorhanden/verfügbar sind
Solche Fälle gilt es dem Aufrufer mitzuteilen, da in diesen Fällen die vom Aufrufer geforderte Funktionalität nicht erfüllt ist und der Aufrufer ggf. nicht weiterarbeiten kann. Zur Mitteilung des Fehlers sollte vorrangig der Rückgabewerte genutzt werden. (auch wenn in C++ mit Exception eine Alternative hierzu bereitsteht)
<syntaxhighlight lang="C">
char *strdup(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup1(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
int main(int argc, char *argv[]) {
char *dup=strdup1("hallo");
if(dup == NULL)
printf("Fehler\n");
else
printf("dup='%s'\n",dup);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Standard-C Library-Funktionen geben in diesem Fall zumeist ein -1 (Rückgabewert Ganzzahl) oder einen NULL-Zeiger (Rückgabewert Zeiger) zurück. Der genaue Fehlergrund ist dann ergänzend in der globalen Variablen errno gespeichert. Mittels der Standard-C Funktion strerror() kann die Zahl in einen für den Anwender/Programmierer lesbaren String umgewandelt werden (die GNU-C Library Funktion printf() bietet ergänzend den Conversion Spezifier %m als alternative Ausgabemöglichkeit an):
<syntaxhighlight lang="C">
#include <errno.h>
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY|O_CREAT|O_EXCL,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY{{!}}O_CREAT{{!}}O_EXCL,
S_IRUSR{{!}}S_IWUSR{{!}}S_IRGRP{{!}}S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'''Für eine sauber Programmierung sollte diese Methodik generell angewendet werden.''' Jede Funktion, welche Fehlschlagen kann, teilt dies per Rückgabewert dem Aufrufer mit. Der Rückgabewert einer jeden Funktion wird vom Aufrufer kontrolliert.
=== Main-Funktion ===
Mit Start der Anwendung übergibt das Betriebssystem die Kontrolle an die Anwendung und führt dort die Funktion main aus. Als Übergabe- und Rückgabeparameter sind folgende Varianten erlaubt:
<syntaxhighlight lang="C">
int main(void) { }
int main(int argc, char *argv[]) { }
</syntaxhighlight>
Mit dem Start der Anwendung kann, wie bei jedem Funktionsaufruf, Parameter an den startenden Prozess übergeben werden. Die Parameter werden als Array von Strings übergeben. Im Parameter argc ist die Anzahl der Strings enthalten. Im Parameter argv[0..argc-1] sind die einzelnen Strings enthalten. Sofern vorhanden ist im ersten String der Programmname/Aufrufname der Anwendung enthalten:
<syntaxhighlight lang="C">
int main(int argc, char *argv[]) {
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++)
printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int max_width=0;
int ret;
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++) {
ret=printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
max_width=ret>max_width ? ret : max_width;
}
//Trennzeichen drucken
char term[max_width];
memset(term,'-',max_width);
printf("%.*s\n",max_width-1,term);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Im Compiler-Explorer können die Parameter im Executor unter 'Execution Arguments', getrennt mit Leerzeichen eingegeben werden.
Wird die Funktion main beendet, entweder über die return Anweisung oder den Aufruf der exit() Funktion, wird die Kontrolle zurück an den startenden Prozess (zumeist Shell) gegeben. Über den Rückgabewert wird im Allgemeinen dem Aufrufer der Fehlerstatus mitgeteilt (EXIT_SUCCESS oder 0 bedeutet fehlerfreie , EXIT_FAILURE oder Werte ungleich 0 fehlerhafte Ausführung).
Hinweise:
* Der Return-Wert der main-Funktion kann mit >>echo $? in der Bash abgefragt werden
* Mittels <code>exit(int status)</code> kann das Programm an jeder Stelle innerhalb des Programms beendet werden. <code>status</code> entspricht dann der expression der return Anweisung von main()
* Ungeachtet des Rückgabedatentyps int bei der Defintion der main() Funktion beträgt der zulässige Wertebereich für Linux Anwendungen 0..255. Der korrekte Rückgabedatentyp der main() Funktion müsste somit 'unsigned char' lauten
=== Inline Funktion ===
Wie der Name inline andeutet, ist die Intention von Inline, dass die aufgerufen Funktion Bestandteil der aufrufenden Funktion ist. Die aufgerufene Funktion soll somit im Kontext des Aufrufers ausgeführt werden, so dass kein eigener Stack bereitgestellt werden muss. Der Start der Funktion kann somit schneller erfolgen:
<code>
inline int foo(void) { }
</code>
Das Funktionseinbindung/zusammenführung erfolgt durch den Compiler (und nicht durch den Linker). Damit das inline vom Compiler ausgeführt werden kann, muss die zu inlinende Funktion vor dem Aufruf definiert sein, d.h. sie muss in derselben C-Datei oder in einer der einzubindenden Header-Dateien enthalten sein [C11 6.7.4].
Hinweis:
* Das 'inlinen' von Funktionen über die eigene Objektdatei hinweg erfolgt in C/C++ über Link Time Optimization (LTO). Hierzu fügt der Compiler den Zwischencode mit in die Objektdatei, so dass der Linker das 'inlinen' vollziehen kann (siehe {{w|lang=en|Interprocedural_optimization| Interprocedural Optimization}})
=== Variadic Function / Ellipsis Punctuator ===
Mit dem Ellipsis Puncturator '…' kann in Funktionsdefinitionen angegebenen werden, dass an dieser Stelle beliebig viele Parameter/Argumente übergeben werden können. Dies wird unter anderen in der printf() Anweisung genutzt:
<syntaxhighlight lang="C">
int printf(const char *fmt, ... );
</syntaxhighlight>
Die wie folgt aufgerufen werden kann:
<syntaxhighlight lang="C">
printf("Hello World"); //es folgt kein Parameter
printf("%d",100); //es folgt ein Parameter vom Datentyp int
printf("%f",1.1); //es folgt ein Parameter vom Datentyp double
printf(conststr,1,2,3,"xyz") //Ohne Worte
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n"); //es folgt kein Parameter
printf("%d\n",100); //es folgt ein Parameter vom Datentyp int
printf("%f\n",1.1); //es folgt ein Parameter vom Datentyp double
const char *conststr="%d %x %c '%s'\n";
printf(conststr,1,2,33,"xyz"); //Ohne Worte
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei der Parameterübergabe wird der Datentyp nicht mit übergeben, so dass die aufgerufene Funktion keine Möglichkeit hat, den Datentype der Parameter zur Laufzeit zu ermitteln. Einzig werden bei Aufruf der variadischen Funktion so viel Bytes auf den Stack gelegt, wie der Datentyp der einzelnen Übergabeparameter groß ist:
:<code>int --> 4 Byte</code>
:<code>double --> 8 Bytes</code>
:<code>Zeiger --> 4/8 Byte</code>
Damit die aufgerufene Funktion die fehlende Datentypinformation dennoch mitgeteilt bekommt, erfolgt dies am Beispiel der printf Funktion über den Format-String:
<syntaxhighlight lang="C">
int vari;
printf("%d",vari); //%d erwartet einen Integer Übergabeparameter (4-Byte)
size_t vars;
printf(" %zu %d ", vars, vari); // %zu zur Mitteilung, dass anstatt
//integer nun size_t als Datentyp übergeben wird
//und somit anstatt 4 Bytes 8 Bytes vom Stack genommen werden
</syntaxhighlight>
<code>printf()</code> entnimmt entsprechend der Datentypbeschreibung im Formatstring die passende Anzahl an Bytes vom Stack.
Da der Compiler für die optionalen Parameter nicht den Zieldatentyp kennt, erlaubt die C-Spezifikation als Übergabedatentypen hier nur die Grunddatentypen <code>signed int, unsigned int, long, long long, double</code> und <code>Zeiger</code>. Entspricht der übergebene Parameter nicht einen dieser Datentypen, so wird er mittels implizit Cast entsprechend nachfolgender Tabelle gewandelt [C11 6.5.2.2 Default Argument Promotions]:
{| class="wikitable"
|-
! Ausgangstyp !! Umwandlungstyp
|-
| char, signed char, short || int
|-
| unsigned char, unsigned short || unsigned int
|-
| float || double
|-
| Alle anderen Datentypen || bleiben erhalten
|}
Bspw.:
<syntaxhighlight lang="C">
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Über den Length-Modifier Parameter im Formatstring kann printf mitgeteilt
//werden, dass von dem übergebenem Integerwert weniger Bytes zu
//interpretieren sind
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
Zum Umgang mit dem variadischen Parameter stellt C die Funktionen <code>va_start(), va_arg(), va_copy()</code> und <code>va_end()</code> bereit. Auf Grundlage des dazugehörigen Datentyps <code>va_list</code> können variadische Parameter auch an Unterfunktionen weitergereicht werden (bspw vprintf()). Dieses Thema bedingt jedoch genaue Kenntnisse vom Umgang mit dem Stack und ist nicht Bestandteil dieser Vorlesung.
=== Funktion in Funktion ===
Die GNU-C Reference (nicht C++) erlaubt es, Funktionen innerhalb von Blöcken (und damit innerhalb von Funktionen) zu definieren. Diese innere Funktion steht dann nur in diesem Block zur Verfügung und kann von außerhalb des Blockes nicht aufgerufen werden. Als Gimmick können Funktionen in Funktionen auf die zuvor definierten lokalen Variablen der inkludierenden Funktion zugreifen:
<syntaxhighlight lang="C">
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Variable Length Array (VLA) ==
Im Normalfall ergibt sich die Anzahl der Elemente eines Arrays aus einer Konstanten, so dass der Compiler zur Compilezeit passend Speicher reserviert (siehe Kap. [[Programmieren in C/C++: Array | Array]]):
<syntaxhighlight lang="C">
int arr[4]; //Compiler reserviert für Variable arr
//4*sizeof(int) Speicherplatz
</syntaxhighlight>
Bei Variable Lenght Array wird die Arraydimension nicht über eine Konstante, sondern über eine Variable oder einen Ausdruck angegeben. D.h. die tatsächliche Dimension des Arrays ergibt sich erst zum Ausführungszeitpunkt der Definition:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //Arraydimension ergibt sich zum Ausführungszeitpunkt
n++; //Nachträgliches Ändern von n ändert nicht
//die Größe des Arrays!
}
</syntaxhighlight>
Ein Variable Length Array kann nur als lokale Variable oder als Übergabeparameter definiert werden (wobei im letzteren Fall kein Speicher hiermit reserviert wird). Eine Initialisierung eines VLA's mit der Definition ist nicht möglich, d.h. nach der Definition beinhaltet das Array 'zufällige' Werte. Es empfiehlt sich daher, diese bspw. mit memset händisch zu initialisieren (siehe auch Kap [[Programmieren in C/C++: Array#Initialisierung | Array:Initialisierung]]):
<syntaxhighlight lang="C">
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
for(size_t lauf=0;lauf<n;lauf++)
printf("str[%zu]=%d\n",lauf,str[lauf]);
}
int main(int argc, char *argv[]) {
foo(4);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mittels sizeof kann weiterhin der Speicherbedarf ermittelt werden, wobei sizeof mit einem VLA als Argument kein Konstantenausdruck ist. Stattdessen wird die Größe zur Laufzeit ermittelt:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
printf("size=%zu\n",size);
}
int main(int argc, char *argv[]) {
foo(5);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
VLA wurden erstmals in C mit C99 eingeführt. In C11 wurden VLA's als optional eingestuft und mit C23 zurück auf notwendig gesetzt. In C++ sind VLA's nicht definiert, werden jedoch vom GCC Compiler unterstützt. Als alternativen Datentyp wird hier std::array empfohlen.
Hinweis:
* VLA sind nicht direkt in einem Switch-Case Block definierbar. Wird hier ein VLA benötigt, so muss hierzu ein Block erzeugt werden:
:<syntaxhighlight lang="C">
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int value=argc;
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Operatoren ==
In der Programmiersprache C sind folgende Punctuators [C11 6.4.6] definiert:
<syntaxhighlight>
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |= , # ##
<: :> <% %> %: %:%:
</syntaxhighlight>
Die Funktionalitäten sind identisch zu Java. Aufgrund des Datentyps Zeiger gibt es in C ergänzend den Punctuator <code>-></code> (siehe Kap [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++)|Datentypen:Verbundtyp Struktur/Klasse (nur C++)]]). Der Präprozessor bedingt die beiden Punctuatoren <code>#</code> und <code>##</code> (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]).
Die letzten 6 Punctuators <code><: :> <% %> %: %:%:</code> werden zu <code>[ ] { } # ##</code> ersetzt. Sie sind für Computersysteme gedacht, welche keine ALTGR-Taste besitzen.<br />
Java kennt ergänzend den <code>>>></code> Operatoren, welcher in C über den normalen Schiebebefehl und den zugrundeliegenden Datentyp gesteuert wird.
Wie in Java sind einige Punctuators vom Kontext abhängig und haben damit unterschiedliche Funktionalitäten:
<syntaxhighlight>
++ → (Postfix) ++ vs. ++(Präfix)
-- → (Postfix) -- vs. --(Präfix)
+/- → Vorzeichen vs. Addition/Subtraktion
() → Funktionsaufruf() vs. Befehlsbestandteil if() vs. Priorisierung
</syntaxhighlight>
Für den Umgang mit dem Datentyp Zeiger besitzen einige Punctuatoren ergänzende Funktionalitäten (siehe Kap [[Programmieren in C/C++: Zeiger| Zeiger]]):
<syntaxhighlight>
& → Bitweises UND:
Anwendung: Ganzahlausdruck & Ganzahlausdruck
& → Adressoperator:
Anwendung: &Variable
* → Multiplikation
Anwendung: Ganzahl-/Gleitkommaausdruck * Ganzahl-/Gleitkommaausdruck
* → Datentyp Zeiger
Anwendung: Datentyp * Variablenname;
* → Dereferenzierung:
Anwendung: * Zeiger
</syntaxhighlight>
Punctuatoren, welche von Java abweichende / ergänzende Funktionalitäten haben, werden nachfolgend gesondert beschrieben.
Sind in einer Anweisung mehrere Operatoren enthalten, so hängt die Abarbeitungsreihenfolge von der Rangfolge/Priorität der Operatoren ab (siehe [[Programmieren in C/C++: Grundlagen#Abarbeitungsreihenfolge | Abarbeitungsreihenfolge]]).<br />
Die Rangfolge ist identisch zu Java, wobei C mehr Operatoren kennt. Generell empfiehlt sich, lieber eine Klammer zu viel als zu wenig zusetzen. Klammern haben die höchste Priorität.
=== Zuweisungs-Operator ===
Die Zuweisung ('='-Operator, assignment expression) weist dem L-Value den R-Value zu.
Der Zuweisungs-Operator gibt den L-Value als Rückgabewert der Zuweisung zurück, so dass mehrere Zuweisungen in einem Ausdruck möglich sind. Die Abarbeitungsreihenfolge ist von rechts nach links (R-L Assoziativität). Wird der 'letzte' Rückgabewert nicht verwendet, so wird dieser verworfen (siehe Kap. [[Programmieren in C/C++: Grundlagen#Discarded Value / null statement | Discarded Value / null statement]]).<br />
Beispiel:
<syntaxhighlight lang="C">
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
//der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
//Compilerfehler geworfen wird
x*=y=z //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a,b,c=3,d=4;
int x,y,z;
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
; //der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
; //Compilerfehler geworfen wird
x*=y=z; //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen return 0;
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Auf beiden Seiten der Zuweisung muss der identische Datentyp stehen. Wenn andernfalls eine implizite Typkonvertierung nicht möglich ist, gibt der Compiler einen Fehler aus:
:<syntaxhighlight lang="C">
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
(void)b;
(void)c;
(void)d;
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
* Bei der Parameterübergabe beim Funktionsaufruf wird ebenfalls indirekt der Zuweisungs-Operator angewendet. Die Parameter des Aufrufers werden per Zuweisung den lokalen Variablen der aufgerufenen Funktion zugewiesen
:<syntaxhighlight lang="C">
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int main(int argc, char *argv[]) {
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
=== Komma-Operator ===
Der Komma-Operator erlaubt es, zwei Ausdrücke auszuführen, wo nur einer erlaubt wäre. Die Ergebnisse/Rückgabewerte aller durch diesen Operator verknüpften Ausdrücke, außer dem letzten werden verworfen. Der letzte Ausdruck dient als Rückgabewert.
Folgendes gilt es bei der Nutzung des Komma-Operators zu beachten:
* Der Komma-Operator wird von links nach rechts ausgewertet (L-R Assoziativität)
* Das Komma selbst stellt eine Sequence Point dar (siehe Kap [[Programmieren in C/C++: Grundlagen#Sequence Point|Sequence Point]])
* An Stellen, wo das Komma zum Syntax gehört (z.B. Trennung der Übergabeparameter bei der Funktionsdefinition und beim Funktionsaufruf, Trennung von Variablen bei der Variablendefinition/-deklaration, Trennung der enum Konstanten) muss der Ausdruck ergänzend geklammert werden, wenn der Komma-Operator gefordert ist
* Der Komma-Operator hat von allen Operatoren die niedrigste Priorität/Rangfolge, so dass dieser Operator als letztes 'ausgewertet' wird
Beispiel:
<syntaxhighlight lang="C">
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
int c=1,d=2,e=3;
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
void func(int value){}
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int value){
printf("func called with %d\n",value);
}
int main(int argc, char *argv[]) {
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
printf("a=%d\n",a);
int c=1,d=2,e=3;
printf("c=%d,d=%d,e=%d\n",c,d,e);
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
printf("c=%d,f=%d\n",c,f);
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'Sinnvolle' Anwendungsbeispiele:
* Bei For-Schleifen, so dass mehrere Variablen initialisiert und mehrere Variablen mit jedem Schleifendurchlauf geändert werden können:
:<syntaxhighlight lang="C">
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf]);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf])
printf("sum=%d lauf=%d\n",sum,lauf);
printf("sum=%d\n",sum);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der Return-Anweisung, bei welcher zur Darstellung der Zusammengehörigkeit mehrere Aktionen ausgeführt werden sollen:
:<syntaxhighlight lang="C">
return errno=EINVAL,-1;
return printf("Fehler"),-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <errno.h>
int foo(void) {
return errno=EINVAL,-1;
}
int far(void) {
return printf("Fehler\n"),-1;
}
int main(int argc, char *argv[]) {
printf("foo()=%d\n",foo());
printf("far()=%d\n",far());
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* An Stellen, wo nur eine Anweisung erlaubt ist (und man zu faul ist, einen Block zu öffnen)
:<syntaxhighlight lang="C">
if(…) y=2,z=3;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int y=0,z=0;
if(1) y=2,z=3;
printf("y=%d z=%d\n",y,z);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In vielen Ländern wird das Komma zur Darstellung von Gleitkommazahlen genutzt. Wird versehentlicher Weise dies in C/C++ übernommen, so führt dies zu einem unerwarteten Verhalten:
:<syntaxhighlight lang="C">
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
printf("var=%f\n",var);
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
printf("var=%f\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== ?-Operator / Conditional-Operator ===
Operator mit 3 Operanden, welcher in Abhängigkeit des ersten Ausdruckes den zweiten oder dritten Ausdruck ausführt und dessen Rückgabewert zurückgibt.
<code>
Syntax: Logical-OR-expression ? expression : condition-expression
</code>
Entspricht der if()-Anweisung, wobei der ?-Operator als solches einen Wert zurückgibt! <code>Expression</code> wird nur ausgeführt, wenn <code>Logical-OR-Expression</code> zu true ausgewertet wird. Andernfalls wird <code>condition-expression</code> ausgeführt. Der zurückgegebene Datentyp ergibt sich aus der <code>expression</code> resp. <code>condition-expression</code>. '''Beide Ausdrücke sollten somit einen identischen resultierenden Datentyp besitzen!'''
Folgendes gilt es bei der Nutzung des ?-Operators zu beachten:
* Der Datentyp <code>expression</code> und <code>condition-expression</code> sollte identisch sein:
<syntaxhighlight lang="C">
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Nach der GNU-C Reference kann der mittlere Ausdruck fehlen. In diesem Fall wird stattdessen das Ergebnis des linken Operanden dort eingesetzt (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)
<syntaxhighlight lang="C">
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
printf("b=%d\n",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* In der Abarbeitungsreihenfolge liegt der ?-Operator oberhalb der Komma- und des Zuweisungsoperators. Soll im <code>condition-expresion</code> Ausdruck der Komma- oder Zuweisung-Operator genutzt werden, so ist <code>condition-expression</code> zu klammern. Andernfalls bedingt die niedrige Priorität des Komma-Operators ein anders Verhalten, als erwartet:
<syntaxhighlight lang="C">
int a=7,max=5,var;
max=a>max ? a : max; //Alles bestens
var= a>5 ? a++,5:6; //Alles bestens
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=7;
int max=5;
max=a>max ? a : max; //Alles bestens
printf("max=%d\n",max);
int var;
var= a>5 ? a++,5:6; //Alles bestens
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
printf("var=%d a=%d\n",var,a);
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
printf("var=%d a=%d\n",var,a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Nutzung des ?-Operators empfiehlt sich an diversen Stellen:
* Bei Makros:
:<syntaxhighlight lang="C">
#define MAX(a,b) (a>b?a:b)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
int main(int argc, char *argv[]) {
printf("MAX(4,5)=%d\n",MAX(4,5));
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Beim Fehlerhandling:
:<syntaxhighlight lang="C">
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion ausgeführt wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn ret==0 ist
//andernfalls wird ret zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 0;
}
int init2(void) {
printf("init2() called\n");
return 0;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn Ret==0 ist
//andernfalls wird Ret zurückgegeben
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Logische Verknüpfungen ===
Alle logischen Operationen nutzen als Operanden Ganzzahlen ,Gleitkommazahlen oder Zeiger. Der Operand wird als false angesehen, wenn der Operand 0, 0.0 oder NULL ist. Andernfalls als true. Das Ergebnis ist immer vom Datentyp int und hat den Wert von 0 oder 1.
<code>Syntax: Expression && Expression</code><br />
<code>Syntax: Expression || Expression</code><br />
<code>Syntax: ! Expression</code><br/>
Bei der logischen UND und ODER Verknüpfung wird zuerst der linke Ausdruck ausgewertet (Operator ist ein Sequence Point). Der rechte Ausdruck wird nur ausgeführt, wenn:
* bei der logischen UND Verknüpfung der linke Ausdruck TRUE ergab
* bei der logische OR Verknüpfung der linke Ausdruck FALSE ergab
Andernfalls steht das Ergebnis schon mit der Auswertung des linken Operanden fest.<br />
In der theoretischen Informatik wird dies 'Non-strict-evaluation' genannt, bei welcher der Rückgabewert feststeht, bevor alle Ausdrücke bearbeitet worden sind.
Beispiel für das Verhalten des Ausbleibens der Auswertung des zweiten Operators:
<syntaxhighlight lang="C">
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a || ++a)
b=1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a {{!}}{{!}} ++a)
b=1;
printf("a=%d b=%d\n",a,b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Diese Funktionalität ist insbesondere beim Umgang mit Fehlern vorteilhaft:
* Prüfen, ob eine Variable einen gültigen Wert hat, bevor sie weiterverwendet wird
<syntaxhighlight lang="C">
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
else
printf("Kein Substring im String gefunden\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion aufgerufen wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 1;
}
int init2(void) {
printf("init1() called\n");
return 1;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Bitweise Verknüpfungen ===
Alle bitweisen Operationen nutzen als Operanden Ganzzahlen. Bei vorzeichenbehafteten Zahlen ist das Ergebnis nach [C11 6.5] Implementierungsabhängig, wobei das Vorzeichenbit zumeist als eigenständiges Bit angesehen wird und bei UND/ODER/EXOR als normales BIT betrachtet wird.
<code>Syntax: Ganzzahl & Ganzzahl → Bitweise UND Operation</code><br />
<code>Syntax: Ganzzahl | Ganzzahl → Bitweise ODER Operation</code><br />
<code>Syntax: Ganzzahl ^ Ganzzahl → Bitweise EXOR Operation</code><br />
<code>Syntax: ~ Ganzzahl → Bitweise Negierung</code><br />
<code>Syntax: Ganzzahl >> additive-expression</code><br />
<code>Syntax: Ganzzahl << additive-expression</code><br />
Mittels des Schiebeoperators können Ganzzahlen um additive-expression bitweise nach Links <code><<</code> oder Rechts <code>>></code> verschoben werden. Der resultierende Datentyp ergibt sich aus dem linken Operanden. Der rechte Operand muss positiv und kleiner gleich der Bitbreite des linken Operanden sein. Andernfalls ist das Ergebnis implementierungsspezifisch.
Nach [C11 6.5.7] ist das Ergebnis der Schiebeoperation implementierungsspezifisch, wenn der linke Operand eine negative vorzeichenbehaftete Zahl ist. In der Regel wendet der Compiler jedoch folgende Schiebeoperation an:
* Logisches Schieben (zu füllende Bit-Stellen werden mit 0 aufgefüllt), wenn der linke Operand eine vorzeichenlose Zahl ist
* Arithmetisches Schieben (zu füllende Bit-Stelle beim Rechtsschieben wird mit dem Vorzeichenbit aufgefüllt), wenn der linke Operand eine vorzeichenbehaftete Zahl ist. Hiermit wird das Vorzeichen beibehalten, so dass eine negative Zahl nach dem Schieben weiterhin negativ ist (In Java erfolgt dies durch den >>> - Operator)
Hinweis:
* Ein Schieben um eine Stelle nach rechts entspricht einer Division durch 2
* Ein Schieben um eine Stelle nach links entspricht einer Multiplikation mit 2
=== sizeof-Operator ===
Der sizeof-Operator dient zur Ermittlung des Speicherbedarfs (in Bytes) einer Variablen/eines Datentyps.
<code>Syntax: sizeof (type-name)</code><br />
<code>Syntax: sizeof unary-expression</code><br />
Als Argument für den Sizeof-Operator kann wahlweise ein Datentyp, eine Variable oder ein Ausdruck genutzt werden. Sizeof gilt als Konstantenausdruck, d.h. seine Berechnung erfolgt durch den Compiler, sodass:
* sizeof zur Initialisierung von globalen Variablen genutzt werden
:<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz); //3*sizeof(int)=12
int main(int argc, char *argv[]) {
printf("size=%zu\n",size);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* bei einem Ausdruck dieser nicht ausgeführt wird, sondern nur der resultierende Datentyp bestimmt wird und dessen Größe zurückgegeben
:<syntaxhighlight lang="C">
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der resultierende Datentyp des Rückgabewertes ist size_t.
Es empfiehlt sich, den sizeof-Operator mit Klammern zu nutzen, andernfalls wird im Falle eines Ausdruckes der Speicherbedarf des linken Operanden angegeben:
<syntaxhighlight lang="C">
size_t size;
short var;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
size_t size;
short var=0;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
printf("size=%zu var=%d\n",size,var);
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* sizeof angewendet auf char gibt immer den Wert 1 zurück.
* sizeof ist nicht auf Operanden vom Typ Funktion, void, Felder ohne Größenangabe und Bitfelder anwendbar
* wird sizeof auf ein VLA angewendet, so entspricht sizeof nicht mehr einen Konstantenausdruck, sondern einem Funktionsaufruf
:<syntaxhighlight lang="C">
void foo(int n) {
int arr[n];
size_t size=sizeof(arr); //Speicherbedarf ist kein Konstantenausdruck
//sondern wird zur Laufzeit berechnet
</syntaxhighlight>
* Sizeof entspricht nicht strlen(), da sizeof den für die Variable reservierten Speicherbereich zurückgibt und nicht wie strlen() den Inhalt des Speicher hinsichtlich des Stringendezeichens auswertet.
:<syntaxhighlight lang="C">
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Anweisungen ==
=== If-Anweisung ===
<code>Syntax: if (expression) statement</code><br />
<code>Syntax: if (expression) statement else statement</code><br />
Das Ergebnis des Ausdruckes (Ganzzahl, Gleitkommazahl oder Zeiger) wird auf ungleich 0, 0.0 oder NULL getestet. Trifft dies zu, so wird statement ausgeführt. Andernfalls wird das else statement ausgeführt, sofern vorhanden. Sollen mehrere Anweisungen ausgeführt werden, so sind diese mittels Block zusammenzufassen (diesen dann bitte nicht mit ; abschließen).
Beispiel:
<syntaxhighlight lang="C">
if(a==1)
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
if(a) //entspricht a!=0
if(printf("hallo")<0) //prüfen, ob printf() fehlschlägt
if( ({int dummy=a;a=b;b=dummy;})==6)
if(a=7) //Zuweisung!
if(7=a) //KO, Eine Konstante kann kein L-Value sein
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1,b=2;
if(a==1)
printf("a==1\n");
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
printf("a=1\n");
if(a) //entspricht a!=0
printf("a\n");
if(printf("hallo\n")<0) //prüfen, ob printf() fehlschlägt
printf("printf()\n");
if( ({int dummy=a;a=b;b=dummy;})==6)
printf("({...})\n");
if(a=7) //Zuweisung!
printf("a=7\n");
if(7=a) //KO, Eine Konstante kann kein L-Value sein
;
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei der Anweisung <code>if(a==7)</code> finden aus syntaktischer Sicht zwei Aktionen statt. Zunächst wird geprüft, ob a gleich 7 ist. Dieser Vergleich liefert true(=1) oder false(=0) zurück. Die If-Anweisung prüft im Anschluss, ob das Argument true oder false ist.
=== For-Anweisung ===
<code>Syntax: for(Initialisierungsteil<sub>OPT</sub> ; Test<sub>OPT</sub> ; Fortsetzung<sub>OPT</sub>) Statement</code>
Die For-Anweisung wird vom Compiler wie folgt umgesetzt:
<poem> '''Initialisierungsteil'''<sub>OPT</sub>
Goto Next
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
'''Statement'''
Continue:
'''Fortsetzung'''<sub>OPT</sub>
Next:
if('''Test'''<sub>OPT</sub>) goto Goon
Break:
</poem>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
for(summe=lauf=0;lauf<20;lauf++)
summe+=lauf;
printf("summe=%d\n",summe);
//Initialisierungsteil
summe=lauf=0;
goto Next;
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
//Statement
summe+=lauf;
Continue: __attribute__((unused))
//Fortsetzung
lauf++;
Next:
//if(TestOPT) goto Goon
if(lauf<20) goto Goon;
Break: __attribute__((unused))
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die einzelne Elemente haben folgende Bedeutung/Besonderheiten:
;Initialisierungsteil: Zum Initialisieren von Schleifenvariablen, wird einmalig mit Beginn der FOR-Anweisung ausgeführt.
:* kann Leer sein, dann erfolgt keine Initialisierung
:* Ab C99: Hier kann eine lokale Variable definiert werden, welche nur innerhalb dieser For-Anweisung gültig ist
;Testteil: Hierin wird vor jedem Schleifendurchlauf geprüft, ob die Schleifenbedingung erfüllt ist. Wenn Bedingung nicht erfüllt ist (Ganzzahl, Gleitkommazahl oder Zeiger gleich 0,0.0 oder NULL), wird die For-Schleife beendet.
:* Kann leer sein, dann wird dieser Teil als true angesehen
;Fortsetzungsteil: Wird nach jeden Schleifendurchlauf ausgeführt. In der Regel sollte hier die Schleifenvariable aktualisiert werden
:* Kann leer sein
;Statement: In der Schleife auszuführender Ausdruck
:* Sollen mehrere Ausdrücke ausgeführt werden, so sind diese in einem Block zusammen zu fassen.
:Ergänzende Anweisungen innerhalb des Statements/Block
:* 'continue' zum Fortsetzen des Schleifendurchlaufes, d.h. Sprung zum Fortsetzungs-Teil
:* 'break', zum Beenden des Schleifendurchlaufes
Beispiele:
* For-Schleife mit lokaler Schleifenvariable
:<syntaxhighlight lang="C">
char string[]="hallo";
for(size_t lauf=0; lauf < strlen(string); lauf++)
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife mit Break-Anweisung
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
printf("lauf=%zu\n",lauf);
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife, bei welcher die gesamte Aktion innerhalb der For-Anweisung ausgeführt wird
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;
src[l]!=0 && l <sizeof(dest);
printf("l=%zu\n",l),dest[l]=src[l],l++);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;src[l]!=0 && l <sizeof(dest); printf("l=%zu\n",l),dest[l]=src[l],l++);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleifenvariable muss keine Zählvariable sein
:<syntaxhighlight lang="C">
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
printf("Anzahl Einsen in %b = %d\n",zahl,bits);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zeiger als Schleifenvariable
:<syntaxhighlight lang="C">
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
printf("src='%s' dst='%s'\n",src,dst);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Zur Geschwindigkeitsoptimierung sollten im Test- und Fortsetzungsteil keine Funktionsaufrufe mit Werten enthalten sein, die sich innerhalb der Schleife nicht ändern:
:<syntaxhighlight lang="C">
for(size_t lauf=0;lauf<strlen("hallo");lauf++)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zur Geschwindigkeitssteigerung sollte im Testteil auf 0 abgefragt werden, d.h. die Schleifenvariable dekrementiert werden
:<syntaxhighlight lang="C">
for(int lauf=700000;lauf;lauf--)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(ssize_t lauf=700000000;lauf;lauf--)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
for(ssize_t lauf=0;lauf<700000000;lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Alternativ zu einer Laufvariablen empfiehlt sich die Nutzung von Pointer als Schleifenvariable;
:<syntaxhighlight lang="C">
for(char *ptr=str; *ptr; ptr++);
</syntaxhighlight>
=== While-Anweisung ===
<code>Syntax: while(expression) Statement </code><br />
<code>Syntax: do Statement while(expression);</code><br />
Die While-Anweisungen werden vom Compiler wie folgt umgesetzt:
{| class="wikitable"
! while()-Anweisung !! do while()-Anweisung
|-
| <poem>
Continue:
if(!'''expression''')
goto Break
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
'''Statement'''
goto Continue
Break:
</poem> ||
<poem>
GoOn:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
'''Statement'''
Continue:
if('''expression''')
goto GoOn
Break:
</poem>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
lauf=summe=0;
while(lauf<10) {
if(lauf>=5)
break;
lauf++;
if(lauf<3)
continue;
summe+=lauf;
}
printf("summe=%d\n",summe);
lauf=summe=0;
Continue1:
if(!(lauf<10))
goto Break1;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
//Statement
if(lauf>=5) {
goto Break1;
}
lauf++;
if(lauf<3)
goto Continue1;
summe+=lauf;
goto Continue1;
Break1:
printf("summe=%d\n",summe);
lauf=summe=0;
do {
lauf++;
if(lauf>5)
break;
if(lauf<3)
continue;
summe+=lauf;
} while(lauf<10);
printf("summe=%d\n",summe);
lauf=summe=0;
GoOn2:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
//Statement
lauf++;
if(lauf>5)
goto Break2;
if(lauf<3)
goto Continue2;
summe+=lauf;
Continue2:
if(lauf<10)
goto GoOn2;
Break2: __attribute__((unused));
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Folgendes gilt es bei der Nutzung der While-Anweisung zu beachten:
* Soll mehr als ein Statement innerhalb der While-Schleife ausgeführt werden, so sind diese in einem Block zu schreiben
* Statement kann eine Leeranweisung (gekennzeichnet durch ein Semikolon) sein
:<syntaxhighlight lang="C">
while(1);
do ; while(1);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf1=1000;
while(lauf1--);
int lauf2=1000;
do ; while(lauf2--);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der do-While-Schleife ist das abschließende Semikolon Bestandteil des Befehls
* expression muss eine Ganzzahl, Gleitkommazahl oder Zeiger zurückgeben, der bei False (0, 0.0 oder NULL) die Schleife beendet.
Beispiele:
* Endlosschleife
:<syntaxhighlight lang="C">
while(1) {}
</syntaxhighlight>
* Schleife zum Durchlaufen eines String
:<syntaxhighlight lang="C">
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
printf("Stringlänge=%zu\n",len);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Switch-Anweisung ===
<code>Syntax: switch(expression) statement</code><br />
<code>Syntax: statement:= case constant-expression: statement<sub>opt</sub> default: statement<sub>opt</sub></code><br />
Die Switch-Anweisung entspricht einer verschachtelten If-Anweisung, mit der Besonderheit, dass der auszuführende Code nicht im If-Zweig stattfindet, sondern dort ein goto zum eigentlichen Code enthalten ist:
{| class="wikitable"
! Switch-Anweisung !! Compilerumsetzung
|-
|<syntaxhighlight lang="C">
switch(a) {
case 1:
int a=7;
//Code
break;
case 2:
printf("%d",a);
case 3: {
int a;
//Code
}
case 4 ... 8:
default:
//Code
}
</syntaxhighlight>
||<poem>
if(a==1)
goto label1;
else if(a==2)
goto label2;
else
goto label_default;
//-------------------
label1:
//Code
goto label_break;
label2:
//Code
label_default:
goto label_break;
label_break:
</poem>
|}
Folgendes gilt es bei der Nutzung der Switch-Anweisung zu beachten:
* <code>Expression</code> muss zu einer Ganzzahl (int, short, char, long, long long) oder enum (entspricht einer Ganzzahl) ausgewertet werden
* <code>constant-expression</code> muss eine Ganzzahl-Konstante oder ein Enumelement sein. Sie darf nicht doppelt im Block vorkommen. Der genaue Datentyp ergibt sich aus dem Datentyp der <code>expression</code>
* Lt. Spezifikation ist ein nur <code>statement</code> hinter der switch-Anweisung erlaubt, so dass nur ein <code>case</code> Fall oder der <code>default</code> Fall bedient werden kann::<syntaxhighlight lang="C">
int var=1;
switch(var) case 1: printf("hallo");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) case 1: printf("hallo");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweifte Klammer der <code>switch</code>-Anweisung erzeugt einen Block, so dass a) hier mehrere <code>case</code>-Fälle und b) hierin definierte Variablen innerhalb des gesamten Blocks zur Verfügung stehen (sind somit nicht <code>case</code> abhängig). Die <code>case</code> Anweisung ist nichts anderes als eine Sprungmarken (welche durch die switch-Anweisung angesprungen wird) so dass der Initialisierungsteil der lokalen Variablen übersprungen / nicht ausgeführt werden kann:
:<syntaxhighlight lang="C">
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("%d %d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
break;
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1;
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("a=%d b=%d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
(void)a;
break;
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* GNU-C (siehe [https://www.gnu.org/software/c-intro-and-ref/manual/html_node/switch-Statement.html Switch-Statement]) erlaubt ergänzend zur Angabe einer Konstante die Angabe eines Wertebereiches:
:<syntaxhighlight lang="C">
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=2;
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
printf("a im Bereich von 1 bis 8\n");
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* <code>break</code> ist optional. Mittels <code>break</code> wird an das Ende der Switch-Anweisung gesprungen. Wenn <code>break</code> weggelassen wird, wird die nachfolgende Anweisungen ausgeführt. Ggf. gibt der Compiler eine Warning aus. Mittels der GCC-Compiler-Anweisung __attribute__((fallthrough)); kann diese Warning unterdrückt werden:
:<syntaxhighlight lang="C">
switch(a) {
case 0: //ggf. Compiler-Warning
__attribute__((fallthrough)); case 1:
case 2:
break;
}
</syntaxhighlight>
* Ein Variable Length Array ist als Variable im Switch-Block direkt nicht erlaubt. Ist dies notwendig, so ist das VLA in einem inneren Block zu kapseln:
:<syntaxhighlight lang="C">
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Case - Anweisungen sind nichts anderes als Sprungmarken (Labels), so dass CASE-Anweisungen überall innerhalb des Switch-Blockes stehen können:
:<syntaxhighlight lang="C">
int prime(int value) {return value+1;}
void hallo(int var) {
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int prime(int value) {
return value+1;
}
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:oder anderen Anweisungen innerhalb des Switch-Blockes enthalten sein können:
:<syntaxhighlight lang="C">
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++;
case 7: *dst = *src++;
case 6: *dst = *src++;
case 5: *dst = *src++;
case 4: *dst = *src++;
case 3: *dst = *src++;
case 2: *dst = *src++;
case 1: *dst = *src++;
}while(--n>0);
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h> //fuer uintptr_t
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++; printf("%02hhx ",*dst);
case 7: *dst = *src++; printf("%02hhx ",*dst);
case 6: *dst = *src++; printf("%02hhx ",*dst);
case 5: *dst = *src++; printf("%02hhx ",*dst);
case 4: *dst = *src++; printf("%02hhx ",*dst);
case 3: *dst = *src++; printf("%02hhx ",*dst);
case 2: *dst = *src++; printf("%02hhx ",*dst);
case 1: *dst = *src++; printf("%02hhx ",*dst);
}while(--n>0);
}
}
int main(int argc, char *argv[])
{
char src[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char dst;
send(&dst,src,20);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Eine Switch-Case Anweisung über Strings sind in C/C++ nicht möglich:
:<syntaxhighlight lang="C">
switch(str) {
case "hallo":
return 1;
case "du da":
return 2;
case "xyz":
return 3;
default:
rReturn -1;
}
</syntaxhighlight>
:Ein direkte Lösungsansatz ist die Nutzung von strcmp() zum Vergleichen von String. Da strcmp zeichenweise den String vergleicht, ist dieser Ansatz langsam. Alternativ bietet sich an, von allen String einen Hash-Wert zu berechnen und zunächst diesen Hash-Wert zu kontrollieren. Da der Hash-Wert nicht eindeutig ist, muss ergänzend ein strcmp() erfolgen:
:<syntaxhighlight lang="C">
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h>
//Lösungsansatz von: https://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
#define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
#define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
#define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
#define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
#define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
#define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
#define HASH_LAUFZEIT(s) (H256(s,0,0))
//Eigener Lösungsatz zur Umsetzung des vorherigen HASH-Algorithmus
//so dass dieser zur Compilezeit berechnet werden kann
//Was fehlt ist die abschließende EXOR berechnung!
//Problem war, dass die Array-Dereferenzierung nicht zur Compilezeit
//aufelöst werden kann
#define HH0(a,x) (x*65599u+a)
#define HH1(a) HH0(a,HH0(0,HH0(0,HH0(0,0))))
#define HH2(a,b) HH0(b,HH0(a,HH0(0,HH0(0,0))))
#define HH3(a,b,c) HH0(c,HH0(b,HH0(a,HH0(0,0))))
#define HH4(a,b,c,d) HH0(d,HH0(c,HH0(b,HH0(a,0))))
#define HH4x(a,b,c,d,x) HH0(d,HH0(c,HH0(b,HH0(a,x))))
#define HH5(a,b,c,d,e) HH4x(b,c,d,e,HH4x(0,0,0,a,0))
#define HH6(a,b,c,d,e,f) HH4x(c,d,e,f,HH4x(0,0,a,b,0))
#define HH7(a,b,c,d,e,f,g) HH4x(d,e,f,g,HH4x(0,a,b,c,0))
#define HH8(a,b,c,d,e,f,g,h) HH4x(e,f,g,h,HH4x(a,b,c,d,0))
#define HH9(a,b,c,d,e,f,g,h,i) HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0)))
#define HH10(a,b,c,d,e,f,g,h,i,j) HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0)))
#define HH11(a,b,c,d,e,f,g,h,i,j,k) HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0)))
#define HH12(a,b,c,d,e,f,g,h,i,j,k,l) HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0)))
#define HH13(a,b,c,d,e,f,g,h,i,j,k,l,m) HH4x(j,k,l,m,HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0))))
#define HH14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) HH4x(k,l,m,n,HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0))))
#define HH15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) HH4x(l,m,n,o,HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0))))
#define HH16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) HH4x(m,n,o,p,HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0))))
#define EIGHTEENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \
a11,a12,a13,a14,a15,a16,a17,a18, ...) a18
#define CONCAT(c,d) c ## d
#define CONCATI(a,b) CONCAT(a,b)
#define HASH_COMPILEZEIT(...) CONCATI(HH , EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0))(__VA_ARGS__)
//Lösungsansatz basierend auf: https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/preprocessor/macros/__VA_ARGS__/count-arguments
#define COUNT_ARGUMENTS(...) EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main(int argc, char *argv[]) {
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:Siehe:[https://benhoyt.com/writings/hash-table-in-c/ Hash Table in C]
== Label + Goto ==
=== Label ===
<code>Syntax: name:</code><br />
Labels dienen zur Kennzeichnung einer Anweisung, so dass die Programmausführung an dieser Stelle fortgesetzt, resp. mit einer GOTO-Anweisung angesprungen werden kann. Ein Label ist durch den folgenden Doppelpunkt gekennzeichnet. Dem Label muss eine Anweisung folgen, welches auch eine Leeranweisung (Semikolon) sein kann.
Folgendes gilt es bei der Nutzung von Labels zu beachten:
* Ein Label entspricht der Speicheradresse des der Label-Anweisung folgenden Anweisung
* Bei nicht genutzten Labels (mit goto nicht angesprungene Labels) gibt der Compiler eine Warning aus. Diese kann beim GCC-Compiler mit __attribute__((unused)) unterdrückt werden
* die Case- und die Default-Anweisung aus der Switch-Anweisung entspricht einem Label
<br />
Labels hat eine funktionsweite Sichtbarkeit (siehe Kap [[#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]). Dies bedeutet, dass das:
* Labels nur innerhalb einer Funktion gültig ist
* Labels einen von Variablen/Funktionen/Datentypen unabhängigen Namensraum haben
* Kein Prototyp für ein Label notwendig ist, wenn es bei Nutzung über goto noch nicht gesetzt worden ist, also nach vorne gesprungen wird
=== goto ===
<code>Syntax: goto label;</code><br />
Mit der Goto-Anweisung wird die Programmausführung an der mit <code>label</code> gekennzeichneten Stelle fortgesetzt.
Folgendes gilt es bei der Nutzung von goto zu beachten:
* Mit einer <code>goto</code> Anweisung kann an eine beliebige Steller innerhalb der '''identischen''' Funktion gesprungen werden. Es kann nicht zu einem Label in einer anderen Funktion gesprungen werden (hierzu ist <code>setjmp()</code> und <code>longjmp()</code> zu nutzen)
* Mit der Goto Anweisung kann gleichermaßen in einen Block hinein, als auch herausgesprungen werden:
:<syntaxhighlight lang="C">
goto first_time;
for(;;) {
if(a>10)
goto last_time:
first_time:
a++;
}
last_time: ;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0;
goto first_time;
for(;;) {
printf("a=%d\n",a);
if(a>10)
goto last_time;
first_time:
a++;
}
last_time: ; //Leeranweisung wäre hier nicht nötig
return 0; //da dem Label ein return folgt!
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Wird mit der <code>goto</code> Anweisung der Initialisierungsteil einer Variablen übersprungen, so ist zwar die Variable existent, beinhaltet aber nicht ihren Initialisierungswert
Beispiel:
<syntaxhighlight lang="C">
goto label1;
if(a==3) {
label2:
printf("True\n");
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=3;
goto label1;
if(a==3) {
label2:
printf("True\n");
a++;
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In Java gibt es das Schlüsselwort goto, welches aber ohne Funktion ist. Es gibt jedoch Labels, die mit "break label" angesprungen werden können
=== Anwendungsbeispiele ===
Prinzipiell sind Goto-Anweisungen zu vermeiden. In einigen Anwendungsfällen erweist sich goto als nützlich:
* Nutzung nur einer <code>return</code> Anweisung in einer Funktionen
:<syntaxhighlight lang="C">
#include <unistd.h>
int input(int hdl,size_t buflen) {
int rc=-1;
unsigned char packettype;
if(read(hdl,&packettype,1) != 1)
goto exit;
unsigned short packetlen;
if(read(hdl,&packetlen,2) != 2)
goto exit;
if((1+packetlen) > buflen) {
rc=-2;
goto exit;
}
rc=packetlen;
exit:
return rc;
}
</syntaxhighlight>
* Konstruktor mit mehreren Initialisierungsteilen
:<syntaxhighlight lang="C">
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Abbruch einer verschachtelten Schleife
:<syntaxhighlight lang="C">
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Sonstiges ==
=== ??-Trigraphs ===
Zeichenfolge bestehend aus 3 Zeichen beginnend mit 2 Fragezeichen.
Die beiden Fragezeichen entsprechen einem ESCAPE-Operator (siehe Kap [[#Char-Konstanten|Char-Konstanten]]), welcher das nachfolgende Zeichen durch ein anderes ASCII Zeichen ersetzt. Die Ersetzung findet auch innerhalb von Strings statt.<br />
Trigraphs wurden früher genutzt, als die ALTGR Taste noch nicht üblich war.
<syntaxhighlight>
??< → { ??> → }
??( → [ ??) → ]
??/ → \ ??! → |
??' → ^ ??- → ~
??= → #
</syntaxhighlight>
Bei neuer C Varianten muss zur Nutzung von Trigraphs der Compiler mittels -trigraphs aktiviert werden.
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
seqwc25asopv2xzqtxy2qyqr3t96gtz
1090662
1090661
2026-09-10T12:22:49Z
D. Justen
102048
Formulierung geändert
1090662
wikitext
text/x-wiki
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
<!-- Falls du ein automatisch erstelltes Inhaltsverzeichnis nicht willst, ersetze das nachfolgende TOC durch NOTOC -->
<!-- Einklammerung mit noinclude, damit dieses nicht in der Druckversion erscheint -->
<noinclude>__TOC__</noinclude>
Die Programmiersprache C/C++ beinhaltet mehrere Sprachen/ Syntaxen:
* C-Syntax
* Präprozessor-Syntax
* Printf/Scanf Formatstring Syntax
* Terminal Emulation
* Compiler/Linker Anweisungen
Letztere beiden werden nur rudimentär in dieser Vorlesung/diesem Skript behandelt. Alle anderen sind Bestandteil dieser Vorlesung.
In diesem Kapitel sollen zunächst allgemeine Eigenschaften der Sprache, der grundlegende Syntax und die Kontrollstrukturen erklärt werden. Bei vielen Erklärungen sind Code-Beispiele vorhanden. Da man aus Fehlern am meisten lernt, sind zum Teil auch negative Beispiele enthalten. Für ein besseres Verständnis empfiehlt es sich, Code-Beispiele selbst nachzuvollziehen.<br />
Sofern sich die Eigenschaften auf eine bestimmte C-/C++- oder Compiler-Version beziehen, wird dies gesondert vermerkt.
== Zeichensatz ==
Der Syntax von C nutzt die unteren 128 Zeichen des ASCII Zeichensatzes. Da UTF-8 in den ersten 128 Zeichen deckungsgleich zu ASCII ist, kann auch dieser zur Erstellung des Source Codes genutzt werden.
Zeichen außerhalb dieses gültigen Zeichensatzes können folglich nur in Strings oder Kommentaren vorkommen. Werden Zeichen außerhalb der unteren 128 Zeichen in Strings genutzt, so gilt Folgendes zu berücksichtigen:
* Die String-Funktionalitäten der Standard-C Library gehen von dem regulären ASCII Zeichensatz aus, so dass z.B. die Suche, der Vergleich oder die Konvertierung fehlschlagen kann
* Strings werden oftmals in Verbindung mit printf() genutzt, d.h. auf der Standardausgabe ausgegeben. Der verwendete Zeichensatz sollte hier identisch zum verwendeten Zeichensatz der Terminal-Emulation sein!
== Kommentarzeichen ==
Kommentare dienen dazu, den Source Code mit zusätzlichen Hinweisen zu versehen, so dass die Intension der Anweisungen sichtbar wird. Kommentarzeichen werden durch den Compiler vor dem eigentlichen Übersetzungsdurchlauf entfernt und durch ein Leerzeichen ersetzt [C11 6.4.9]. Innerhalb von Strings wird nicht nach Kommentarzeichen gesucht.
<code>
Syntax: /* */
</code>
Blockkommentar zum Kommentieren eines Bereiches, auch über mehrere Zeilen hinweg. Dieses Kommentarzeichen kann nicht verschachtelt werden, d.h. '*/' beendet die Kommentierung, unabhängig von der Anzahl der zuvor geöffneten Kommentierungen!
<code>
Syntax: //
</code>
Zeilenkommentar zum Kommentieren bis zum Zeilenende (wurde in der Programmiersprache BCPL definiert, aber nicht von C, sondern erst von C++ übernommen).
Sollen größere Bereiche auskommentiert werden, so empfiehlt sich die Nutzung der Präprozessoranweisung #if 0 ... #endif.
Beispiele:
<syntaxhighlight lang="C">
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt
Compiler-Warning nur aufgrund des Compiler-Schalters -Wall! */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Namenskonventionen ==
Folgende Regeln gelten bzgl. der Benennung von Variablen und Funktionen:
* Variablen und Funktionsnamen können aus Buchstaben, Zahlen und dem Unterstrich bestehen. Sie müssen mit einem Buchstaben oder einem Unterstrich beginnen
* Seit C95 können weitere Zeichen aus dem Universal Coded Character Set (UCS) genutzt werden [C11 D.1]
* C ist Case sensitiv, d.h. es wird zwischen Groß- und Kleinbuchstaben unterschieden
* Schlüsselwörter können nicht für Variablen/Funktionsnamen/Datentypen genutzt werden
Namenskonventionen von Libraryfunktionen:
* In C (und C++) sind Schlüsselwörter und Standardlibraryfunktionen zumeist in Kleinbuchstaben geschrieben. In der C-Standardlibrary werden oftmals verkürzte Ausdrücke (z.B. isalnum() (zum Testen ob ein Zeichen ein Buchstaben oder ein Digit ist) und in C++ der Unterstrich als Worttrenner (z.b. out_of_range) genutzt
* Makros (siehe Kap.[[Programmieren in C/C++: Präprozessor | Präprozessor]]) werden per Konvention in GROSSBUCHSTABEN und ggf. mit Unterstrich als Worttrenner geschrieben.
* Namen beginnend mit doppelten Unterstrich oder beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (z.B. __LINE__ _Reserved) sind für den Compiler und der Standard-C-Library vorbehalten und sollten im eigenen Programm nicht benutzt werden.
== Zeilenfortsetzung ==
Mit dem Backslash Operator (gefolgt von einem Zeilenende) kann eine Zeile in der nächsten Zeile fortgesetzt werden. Der Compiler löscht das \-Zeichen mit anschließendem Zeilenende und ersetzt dies durch nichts. Dies ist insbesondere bei Anweisungen notwendig, die am Ende der Zeile abgeschlossen sein müssen (z.B. Strings, Makros).
Beispiele:
<syntaxhighlight lang="c">
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Innerhalb von Char-Literatoren und Strings wird '\' als Escape-Operator genutzt, welche das '\' und ein oder mehrere folgende Zeichen ersetzt (siehe Kap.[[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Grundlagen:Literale/Konstanten]]). Daher darf hinter Backslash als Zeilenfortsetzungszeichen kein weiteres Zeichen folgen.
== Gültigkeit/Sichtbarkeit von Variablen ==
Vorrangig in der objektorientierten Programmierung werden mit Namensräumen Objekte und deren Methoden/Attribute in einer Art Baumstruktur strukturiert. Dies ermöglicht eine eindeutige Ansprache von Variablen/Objekte, aber auch eine doppelte Verwendung von Methoden-/Attributnamen in unterschiedlichen Namensräumen. Ergänzend zu den Namensräumen kann mit public/private/proteced eine Zugriffsbeschränkung von Methoden/Attributen definiert werden.
Die Programmiersprache C unterstützt keinen Namensraum. Zugriffsmodifikatoren werden indirekt über Header-Dateien getätigt. Hinsichtlich der Gültigkeit/Sichtbarkeit unterscheidet C folgende Bereiche [C11 6.2.1]:
* Funktionen (Function Scope)
* Datei (File Scope)
* Block (Block Scope)
* Funktionsparameter in Prototypen (Function Prototype Scope)
Innerhalb eines Gültigkeitsbereiches dürfen Variablen-/Funktions-/Datentypnamen nicht doppelt genutzt werden.<br />
In der Programmiersprache C++ sind weitere Scope wie z.B. Class Scope, Enumationation Scope und ergänzend das Konzept von Namensräumen vorhanden (Beschreibung folgt).
=== Funktionsweite Sichtbarkeit ===
Eine Label-Definition (als Sprungmarke für die goto-Anweisungen) erfolgt immer mit funktionsweiter Sichtbarkeit/Gültigkeit. Die genaue Beschreibung dieses Sichtbarkeitstyps erfolgt im Rahmen des Kapitels [[Programmieren in C/C++: Grundlagen #Label + Goto|Grundlagen:Label+Goto]].
=== Dateiweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp-Definition außerhalb eines Block-Scopes oder von Funktionsparameter, so sind diese innerhalb der gesamten Datei und bei Funktionen/Variablen ergänzend Projektweit (für alle Objektdateien) sichtbar/gültig (= global) (In der C-Spec unter dem Stichwort 'Linkage' beschrieben, siehe Kapitel [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage| DatentypeSpecifier:Internal/External Linkage]]). Alle globalen Funktionen/Variablen können von allen Dateien aus genutzt/zugegriffen werden (sofern sie zuvor deklariert wurden).<br />
Beispiel:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Deklaration von global,
//welche in Datei1.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
printf("global=%d\n",global);
return 0;
} | datei2_c=#include <stdio.h>
//Deklaration von global,
//welche in example.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
printf("func() called\n");
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird das Schlüsselwort 'static' der Variablen/Funktionsdefinition vorangestellt, so wird die Sichtbarkeit/Gültigkeit auf Dateiweit eingeschränkt. Variablen/Funktionen können nur innerhalb der (Objekt-) Datei genutzt werden und sind für anderen (Objekt-)Dateien unsichtbar. (Siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage|DatentypeSpecifier:Internal/External Linkage]] Internal/External Linkage)
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
printf("example.c:var1=%d\n",var1);
void func(void); //Prototyp für func()
func();
return 0;
} | datei2_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
printf("datei2.c:var1=%d\n",var1);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Projektweite Gültigkeit bedeutet insbesondere, dass keine doppelten Benennung von Variablen/Funktionen/Datentypen innerhalb des gesamten Projektes erlaubt sind, d.h. alle Variablen/Funktionennamen über alle Dateien/Librarys eindeutig sein müssen.<br>
Beispiel 1:
{| class="wikitable"
|-
! Datei1.c !! Datei.2
|-
| <syntaxhighlight lang="C">
#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
}</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
} | datei2_c=#include <stdio.h>
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der Linker meldet beim Zusammenfügen der Objekt-Dateien, dass die Variable a bereits woanders definiert sei (multiple definition of `a';)!
Beispiel 2:
<syntaxhighlight lang="C">
#include <stdio.h> //fuer printf() size_t stderr
int printf=7;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int printf=7;
int main(int argc,char *argv[])
{
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hier meldet der Compiler eine Fehlermeldung, da das Symbol printf zu einen als Variable und zum anderen als Funktion (innerhalb der inkludierten Datei stdio.h beschrieben) genutzt wird ('printf' redeclared as different kind of symbol).
=== Blockweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp Definition innerhalb einer Funktion, als Funktionsparameter oder eines Blockes, so sind diese nur innerhalb des Blockes sichtbar/gültig (=Lokale Variable). Blöcke können verschachtelt sein, so dass das bei identischer Namensgebung innere Definitionen Vorrang haben. Ebenso haben Blockdefinitionen Vorrang vor Datei-/Projektdefinitionen (überdecken diese):
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
} | datei2_c=#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sichtbarkeit von Funktionsparameter in Protypen ===
Soll eine Funktion aufgerufen werden, die zuvor nicht definiert wurde, so ist ein Prototyp/(Forward)deklaration der Funktion notwendig (siehe nachfolgendes Kapitel). Die Parameterliste dieses Prototyps hat seinen eigenen Gültigkeitsbereich.<br/>
Beispiel:
<syntaxhighlight lang="C">
int a; //a im File Scope
int func(int a, int b); //a und b im Function Prototyp scope
</syntaxhighlight>
Hinweis:
* Bei Prototypen ist die Angabe von Variablenname nicht notwendig. Die alleinige Angabe des Datentyps ist ausreichend
=== Zuordnung der Gültigkeitsbereiche zu globalen/lokalen Variablen ===
Zum einfacheren Verständnis wird im Skript von folgenden Begrifflichkeiten gesprochen:
* '''Globale''' Variablen-/Funktionen-/Datentypdefinitionen → Projektweite Sichtbarkeit/Gültigkeit
* '''Statisch globale''' Variable/Funktionen → Dateiweite Sichtbarkeit/Gültigkeit
* '''Lokale''' Variablen/Funktionen/Funktionsparameter/Datentypen → Nur innerhalb des zugehörigen Blockes sichtbare/gültig
* '''Statisch lokale''' Variablen → Nur innerhalb der Funktion sichtbar/gültig, mit der Besonderheit, dass die Gültigkeit über der Laufzeit der Funktion gilt (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Static Storage Class Specifier|DatentypeSpecifier:Static Storage Class Specifier]])
=== Speicherzuweisung ===
Für die einzelnen Gültigkeitsbereiche werden im Speicher (und auch in der Objekt-Datei) unterschiedliche Speicherbereiche (Segmente) vorgehalten, d.h. der Compiler teilt den Speicher in unterschiedliche Bereiche auf und weist den Variablen/Funktionen in Abhängigkeit der Gültigkeit/Sichtbarkeit unterschiedliche Speicherbereiche zu!
[[File:Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten).png|thumb|Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten)]]
Zur Ermöglichung von Rekursion werden lokale Variable auf dem Stack gehandelt. Mit Aufruf einer Funktion oder öffnen eines neuen Block-Scopes wird Speicher auf dem Stack reserviert, der bei Beenden des Scopes wieder freigegeben wird. Die Speicheradresse von lokalen Variablen ist somit nicht Fix, sondern hängt von der Aufrufhierarchie ab!
Globale und statisch globale Variablen werden nicht auf dem Stack gehalten, sondern bekommen einen 'festen' Speicherbereich (hier DATA/BSS/RODATA) während der gesamten Laufzeit des Programms zugewiesen. Die Adresse dieser Variablen sind somit konstant. Das genutzte Speichersegment von globalen Variablen hängen von der Art der Variablen ab. Initialisierte Variablen werden im DATA-Segment gesammelt, welcher mit dem Initialisierungswert der Variablen initialisiert wird. Nicht initialisierte globale Variablen landen im BSS-Segment, so dass diese mit Programmstart durch Füllen dieses Blockes mit 0 auf 0 gesetzt werden.
Konstante globale Variablen werden im RODATA-Segment gehalten. Über das Betriebssystem kann dieser Speicherbereich auf nur Lesbar gesetzt werden.
Dynamische Speicheranforderungen, resp. Speicher, dessen Gültigkeit über die Laufzeit einer Funktion hinausgeht, wird im Heap gesammelt. Für die Verwaltung dieses Speichers ist der Programmierer zuständig.
Entsprechend globalen Variablen wird für Funktionen ebenfalls ein eigener Speicherbereich (TEXT Segment) vorgesehen. Im Gegensatz zu Variablen, wo im Speicher der dazugehörige Inhalt gespeichert ist, ist der Speicherinhalt von Funktionen die Maschinenanweisungen. Die Speicheradresse der Funktionen sind konstant.
Hinweis:
* Die Speicheradresse von sowohl globalen und statisch globalen Variablen als auch von Funktionen ist konstant und ändert sich während der Laufzeit des Programms nicht. Die Adressvergabe dieser Variablen und Funktionen erfolgt somit nicht zur Laufzeit sondern durch die Toolchain (hier der Linker).
* Dieses Konzept ist allgemeingültig, gilt nicht nur für die Programmiersprache C/C++
== Definition/Deklaration(Prototyp) ==
Der C-Compiler ist ein Single-Pass Compiler (siehe Kap [[Programmieren in C/C++: Einführung/Literatur#Arbeitsweise eines Compilers | Einführung/Literatur:Arbeitsweise eines Compilers ]]), d.h. für den Übersetzungsvorgang wird der Quellcode einmalig eingelesen und von vorne nach hinten abgearbeitet. Dies bedingt, dass keine Vorwärtsbezüge im Quelltext enthalten sein dürfen:
* keine Variable genutzt werden kann, die erst später definiert wird (da der Compiler in Abhängigkeit des Datentyps (den er dann noch nicht kennt) keine entsprechende Maschinensprachebefehle erzeugen kann)
* keine Funktion aufgerufen werden kann, die erst später definiert wird (da der Compiler nicht weiß, welcher Datentyp die Übergabewerte haben und folglich keine Maschinensprachebefehle zur Konvertierung und Übergabe der Variablen erzeugen kann)
* kein Datentyp genutzt werden kann (struct, union, enum, typedef), welcher erst später definiert wird (da der Compiler nicht weiß, wieviel Speicher er für die Variable reservieren muss)
Eine Lösungsvariante dieser Problematik ist, im Quellcode alle Variablen/Funktionen/Datentypen/Makros zu definieren, bevor diese erstmalig genutzt werden (Funktion main() steht dann folglich am Ende des Quellcodes):
<syntaxhighlight lang="C">
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
//Hier kein Zugriff auf var möglich!
//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(void) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
var++; //Hier kein Zugriff auf var möglich!
uchar xyz;//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(int argc, char *argv[]) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Sollen globale Funktionen/Variablen in Datei1.c genutzt werden, die in Datei2.c definiert sind, so schlägt diese Vorgehensweise fehl. Um auch dieses zu ermöglichen, bietet C die Möglichkeiten von Prototypen/Deklarationen an. Diese teilt dem Compiler mit, wie im späteren Ablauf die Variable, die Funktion definiert wird, bzw. dass es diesen Datentyp geben wird:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
} | datei2_c=#include <stdio.h>
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Innerhalb der C-Spezifikation werden für den Umgang mit dieser Problematik die Begriffe 'Declaration' und 'Definition' genutzt. Da diese Begriffe jedoch nicht klar abgegrenzt werden und auch für viele weitere Aspekte genutzt werden, sollen in diesem Skript in Anlehnung an den Wikipedia Artikel {{w|Deklaration (Programmierung)|Deklaration (Programmierung)}} (im Absatz zur Programmiersprache C/C++) die Begriffe Definition/Deklaration wie folgt genutzt werden:
;Definition: entspricht der Belegung/Reservierung von Speicherplatz
:* Bei der Definition einer Variablen wird hiermit Speicherplatz entsprechend dem Datentyp der Variable belegt:
:<syntaxhighlight lang="C">
int var1; //entsprechend der Größe des Datentyps int wird
//Speicherplatz für die Variable var1 reserviert
int var2=4711; //Dito, ergänzend wird dieser Speicherplatz mit dem
//Wert 4711 initialisiert
</syntaxhighlight>
:* Bei einer Funktion wird Speicherplatz zur Aufnahme der Maschinenbefehle belegt:
:<syntaxhighlight lang="C">
void foo(void) { //Die Anweisungen in den geschweiften Klammern
//werden in Maschinenbefehle übersetzt. D.h. die
//Funktion foo() belegt Speicher, dessen Inhalt
//die Maschinensprachebefehle sind
}
</syntaxhighlight>
:* Ergänzend wird der Begriff Definition auch in Verbindung mit der Definition von neuen Datentypen genutzt!
;Deklaration/Prototyp: ist die Mitteilung an den Compiler, wie diese Variable/Funktion an einer späteren Stelle im Source-Code oder in einer anderen Source-Datei definiert wird. Auf Grundlage dieser 'vorab' Information kann der Compiler die passenden Maschinensprachebefehle für den Zugriff/Aufruf auf die Variablen/Funktion einsetzen:
:<syntaxhighlight lang="C">
extern int var1; //Deklaration von var1
extern void foo(void); //Deklaration von foo()
void foo(void); //Deklaration von foo()
</syntaxhighlight><br />
Insbesondere bei dem Umgang mit der Deklaration gilt es Folgendes zu berücksichtigen:
* Deklarationen werden entweder:
:* am Anfang einer C-Datei geschrieben, so dass Funktionen/Variablen im Zugriff stehen, die erst später in der C-Datei definiert werden (entspricht dann der Private Anweisung in anderen Sprachen)
:* in Header-Dateien geschrieben, so dass diese Variable/Funktionen für alle sichtbar sind, welche diese Header-Datei einbinden (entspricht der Public Anweisung in anderen Sprachen)
* Deklarationen von Funktionen werden in der C-Spec als (function) Prototyp bezeichnet und sind dadurch gekennzeichnet, dass diese mit einem Semikolon abgeschlossen sind. Der Specifier 'extern' ist hier optional und sagt eigentlich aus, dass diese Funktion external Linkage besitzt (siehe [[Programmieren in C/C++:_DatentypeSpecifier#Internal/External Linkage | DatentypeSpecifier:Internal/External Linkage]]). Die Benennung der Parametervariablen sind gleichermaßen optional:
:<syntaxhighlight lang="C">
extern int foo(int var1, float var2); //Deklaration
extern int foo(int , float ); //Deklaration
int foo(int var1, float var2); //Deklaration + external Linkage
int foo(int , float ); //Deklaration + external Linkage
</syntaxhighlight>
* Für globale Variablen gibt es keine (Variablen) Prototype. Stattdessen muss zur Bekanntgabe des Datentyps der Specifier 'extern' vorangestellt werden, mit welchen ergänzend zum Ausdruck gebracht wird, das diese Variable external Linkage und damit globale Gültigkeit hat (siehe Kap [[Programmieren in C/C++: DatentypeSpecifier# Extern - Storage Class Specifier| DatentypeSpecifier:Extern - Storage Class Specifier]]). Da die Deklaration einzig zur Bestimmung der Zugriffsmethoden auf Maschinenspracheebene genutzt wird, können diese keine Initialisierungswerte enthalten:
:<syntaxhighlight lang="C">
extern int var1;
extern int var2=7; //KO Deklarationen können keine
//Initialisierungswerte haben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern int foo;
extern int foo=7;
int main(int argc, char *argv[]) {
return foo;
}
int foo=7;| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen von statisch globalen, lokalen und statisch lokalen Variablen nicht möglich sind:
:<syntaxhighlight lang="C">
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sich auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sicht auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen für identische Variablen/Funktionen können beliebig oft erfolgen, sofern der Datentyp identisch ist:
:<syntaxhighlight lang="C">
extern int var;
extern int var; //OK, doppelt Deklaration mit identischen Datentyp
extern unsigned int var; //KO, Doppelte Deklaration mit unterschiedlichen
// Datentyp
</syntaxhighlight>
* Sofern eine Deklaration und eine Definition in der identischen Datei erfolgen überprüft der Compiler, ob Deklaration und Definition identisch sind. Es empfiehlt sich, die eigene Header-Datei (in welcher die Deklaration normalerweise enthalten ist) zu inkludieren:
:{| class="wikitable"
|-
! Datei1.c !! Datei1.h
|-
| <syntaxhighlight lang="C">
//Include der eigenen Header-Datei
#include "datei1.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
</syntaxhighlight> ||
<syntaxhighlight lang="C">
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Include der eigenen Header-Datei
#include "example.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
int main(int argc, char *argv[]) {
return 0;
} | example_h=
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Datei kann eine Variable identischen Datentyps mehrmals definiert werden (bei identischen Initialisierungswert). Diese Definitionen werden vom Compiler als eine Definition angesehen. Wenn jedoch eine identische Variable in unterschiedlichen Dateien definiert wird, so legt jede Datei eine eigene unabhängige Variable an, welche dann beim Zusammenführen der Objektdateien durch den Linker zu Fehler führt. Da Header-Datei zumeist in mehrere C-Dateien inkludiert werden, sind Definitionen in Header-Dateien 'verboten'.
* Deklarationen innerhalb eines Block-Scopes oder eines Function Prototyp Scopes sind nur in diesen Bereich gültig.
== Grundlegende Datentypen und Typsicherheit ==
Die Programmiersprache C kennt folgende grundlegende Datentypen (siehe Kap. [[Programmieren in C/C++: Datentypen | Datentypen]]). Von jedem Datentyp kann ein Zeiger angelegt werden:
{| class="wikitable"
|-
! Datentyp !! Bsp. für Datentyp !! Bsp. für Zeiger auf Datentyp
|-
| Ganzzahl ||
<syntaxhighlight lang="C">
char var;
int var;
short int var;
long int var;
long long int var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
char *ptr;
int *ptr;
short int *ptr;
long int *ptr;
long long int *ptr;
</syntaxhighlight>
|-
| Gleitkommazahl ||
<syntaxhighlight lang="C">
double var;
float var;
long double var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
double *ptr;
float *ptr;
long double *ptr;
</syntaxhighlight>
|-
| Funktionen ||
<syntaxhighlight lang="C">
void func(void) {}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
void (*pfunc)(void);
</syntaxhighlight>
|-
| Arrays ||
<syntaxhighlight lang="C">
int arr[10];
float arr[3][3];
</syntaxhighlight>
||
<syntaxhighlight lang="C">
int (*parr);
float (*parr)[3];
void (*pfunc[5])(void);
</syntaxhighlight>
|-
| Strukturen/Unions ||
<syntaxhighlight lang="C">
struct xyz {int x,y,z};
union abc {int a,b,c};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
struct xyz *ptr;
union abc *ptr;
</syntaxhighlight>
|-
| Aufzählungstyp ||
<syntaxhighlight lang="C">
enum abc {A,B,C};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
enum abc *ptr;
</syntaxhighlight>
|-
| Boolescher Datentyp ||
<syntaxhighlight lang="C">
_Bool var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Bool *ptr;
</syntaxhighlight>
|-
| Komplexe Zahlen ||
<syntaxhighlight lang="C">
_Complex var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Complex *ptr;
</syntaxhighlight>
|}
C/C++ unterscheidet zwischen vorzeichenbehafteten <code>signed</code> und vorzeichenlosen <code>unsigned</code> ganzzahligen Datentypen. Vorzeichenlose Datentypen können nur positive Zahlen incl. der 0 aufnehmen (Anwendungsbereich bspw. Speicheradressen/Arrayindexe, welche nicht negativ sein können). Deren max. Zahlenwert ergibt sich aus der Datenbreite N des Datentyps 2<sup>N</sup>-1. Ein Vergleich eines vorzeichenlosen Datentyps mit ≥ 0 ist somit immer TRUE:
<syntaxhighlight lang="C">
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt"); //dieser ggf. vom Compiler wegoptimiert wird!
for(var=10; var>=0; var--); //Endlosschleife! 0 dekrementiert ergibt 255
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt\n"); //dieser ggf. vom Compiler wegoptimiert wird!
//Beim Öfffnen des Compiler-Fensters ist die IF-Anweisung nicht farblich
//hervorgehoben. Dies bedeutet, dass diese Zeile wegoptimiert wurde und folglich
//kein Maschinencode für diese Anweisung erzeugt wurde
for(var=10; var>=0; var--) //Endlosschleife! 0 dekrementiert ergibt 255
printf("%u ",var),fflush(stdout);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Vorzeichenlose Datentypen halbieren den verfügbaren Zahlenbereich und 'weisen' dem oberen Wertebereich den negativen Zahlen zu.<br>
Wird ein ganzzahliger Datentyp ohne Angabe des Vorzeichentyps (signedness) definiert, so ist diese vorzeichenbehaftet. Bei vorzeichenlosen Variablen muss explizit <code>unsigned</code> vorangestellt werden. Die Voranstellung von <code>signed</code> ist optional. Einzige Ausnahme stellt der Datentyp char dar. Hier gibt die Spezifikation keine default signedness vor, so dass bei Nutzung dieses Datentyps zur Aufnahme von Zahlen immer signed oder unsigned vorangestellt werden sollte!<br>
Innerhalb des Formatstrings bei den printf()/scanf() Anweisungen '''muss''' die signedness vom Programmierer händisch berücksichtigt werden. Die Formatanweisung %d und %i interpretieren die übergebenen Zahl als vorzeichenbehaftete Zahl. Soll eine vorzeichenlose Zahl ausgegeben werden, so muss %u verwendet werden:
<syntaxhighlight lang="C">
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%d varu=%u",vari,varu); //Korrekt
printf("vari=%u varu=%i",vari,varu); //Falsche Werteausgaben!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%12d varu=%12u\n",vari,varu); //Korrekt
printf("vari=%12u varu=%12i\n",vari,varu); //Falsche Werteausgaben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit der Definition (dem Anlegen) einer Variablen eines Datentyps wird Speicher entsprechend der Größe des Datentyps reserviert. Optional kann dieser Speicher initialisiert werden. Über den Datentyp wird ausgesagt, wie der Inhalt des Speichers zu interpretieren ist:
<syntaxhighlight lang="C">
char var1; //Speicherplatzreservierung von 1 Byte
//Inhalt der Speicherstelle wird als Zahl interpretiert
//(Hinweis: ASCII-Zeichen sind Zahlen)
double var2=47.11; //Speicherplatzreservierung von 8 Byte
//Inhalt der Speicherstellen wird als Gleitkommazahl
//interpretiert (bestehend aus je einer Ganzzahl für
//Mantisse und Exponent)
short arr[10]; //Speicherplatzreservierung von 10*2 Byte
//Inhalt der 10 Speicherstellen werden als Ganzzahl
//interpretiert
</syntaxhighlight>
Die Funktionalität der Operatoren hängt vom Datentyp der Operanden ab. Der Plus-Operator angewendet auf ganzzahlige Operanden führt eine Ganzzahl Addition aus, angewendet auf gleitkomma Operanden eine Gleitkomma Addition. Ist einer der Operanden ein Zeiger, so wird eine Zeigeraddition angewendet. Für andere Datentypen ist der Plus-Operator nicht definiert, so dass der Compiler einen Fehler wirft. '''Bei der Betrachtung eines Ausdruckes sollte dem genutzten Datentypen folglich eine besondere Aufmerksamkeit zuteil werden''':
<syntaxhighlight lang="C">
int vari=47;
vari+12; //(int) + (int) → Ganzzahladdition
float varf=12.3;
3.1415F+varf; //(float) + (float) → Gleitkommaaddition
int *ptr=&vari;
ptr+3; //(int *) + (int) → Zeigeraddition
int arr[3];
arr+3; //(int (*)) + (int) → Zeigeraddition
</syntaxhighlight>
Das Ergebnis einer Operation hat ebenfalls einen Datentyp. Eine Ganzzahl Addition gibt bspw. als Ergebnis einen Ganzahl Datentyp zurück, eine Gleitkomma Addtition einen Gleitkomma Datentyp und ein Vergleichsoperator den Datentyp _Bool:
<syntaxhighlight lang="C">
int vari1=47;
int vari2=11;
vari1 + 12 + vari2; //((int)+(int)+(int))→((int)+(int))→(int)
40 < vari1 < 50; //((int)<(int)<(int))→((_Bool=int)<(int))→(_Bool=int)
</syntaxhighlight>
Wie Operatoren haben auch Funktionen Operanden (in Form von Übergabeparameter). Das Ergebnis eines Funktionsaufrufes wird ebenfalls in Form eines Datentyps zurückgegeben:
<syntaxhighlight lang="C">
float add(int par1,par2) {return par1+par2;}
int vari1=47;
int vari2=11;
vari1 + add(var2,12); //(int)+((int),(int)→(float))→(int)+(float)→(float)
</syntaxhighlight>
Wird auf einen Operator gleichermaßen ein vorzeichenbehafteter und ein vorzeichenloser Operand angewendet, so kann es zu unerwarteten Konvertierungsproblemen führen:
<syntaxhighlight lang="C">
unsigned char varu=12;
signed char vars=-12;
float varf;
varf = varu + vars;
if(vars < varu)
</syntaxhighlight>
Sind die Datentypen der Operanden nicht 'kompatibel', so 'passt' der Compiler die Datentypen im Falle von Ganzahl und Gleitkomadatentypen per impliziter Regel an (siehe Kap. [[Programmieren in C/C++: Datentypen#Implizite Typumwandlung | Datentypen:Implizite Typumwandlung]]). Über explizite Typumwandlung (siehe Kap.[[Programmieren in C/C++: Datentypen# Explizite Typumwandlung|Datentypen:Explizite Typumwandlung]]) kann ein Datentyp z.T. in einen anderen Datentyp gewandelt werden.
In allen anderen Fällen ist C Typsicher, d.h. der Compiler gibt zumindest eine Warning aus, wenn die Datentypen nicht identisch sind und der Compiler keine implizite Regel anwenden kann.
Tipp:
* Compiler gibt bei Fehlermeldung oftmals die erwarteten und die vorhandenen Datentyp an. Wenn solch eine Fehlermeldung kommt, sollten sie sich a) überlegen, was wollten sie syntaktisch geschrieben haben und b) was haben sie in der Tat geschrieben. Ein Google nach einer Lösung des Compilerproblems löst zumeist nicht das Problem, sondern umgeht es!
Hinweis:
* Ein guter Programmierer sollte die Datentypen so wählen, dass:
:* die Datentypen zum Inhalt und zum Wertebereiches passen
:* keine Datentypkonvertierungen notwendig sind
: andernfalls besteht die Gefahr, dass hiermit Laufzeitfehler einprogrammiert werden.
* Wenn Datentypkonvertierungen notwendig sind, sollte die explizite Konvertierung genutzt werden
== Abhängigkeiten bzgl. Rechnerarchitektur ==
Kenngrößen von Prozessoren sind unter anderem die Anzahl der Bits für den Datentransport und für Arithmetisch-/Logische-Operationen (→ Datenbreite) und die Anzahl der Bits für die Adressierung des Speichers (→ Adressierungsbreite). Die Datenbreite sagt dabei aus, welche max. Datenbreite ein Maschinenbefehl (zumeist in einem Taktzyklus) transportieren/berechnen kann. Werden programmtechnisch größere Datenbreiten benötigt, bedingt dies, dass hierzu mehrere Maschinenbefehle notwendig sind. Wenn kleinere Datenbreiten notwendig sind, so wird oftmals das Ergebnis abgeschnitten (sofern der Prozessor keine Befehle für den Umgang mit kleineren Datentyp beherrscht):
{| class="wikitable"
|-
! 32-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 64-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 16-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
|-
| <syntaxhighlight lang="C">
int32_t a32,b32;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int64_t a64,b64;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int16_t a16,b16;
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=b32;
mov eax,b32
mov a32,eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=b64;
mov eax ,b64
mov edx ,b64+4
mov a64 ,eax
mov a64+4,edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
//a16=b16;
movz eax,b16
mov a16,ax
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=a32+b32;
mov edx, a32
mov eax, b32
add eax, edx
mov a32, eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=a64+b64;
mov ecx , a64
mov ebx , a64+4
mov eax , b64
mov edx , b64+4
add eax , ecx
adc edx , ebx
mov a64 , eax
mov a64+4, edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a16=16+b16;
movzx eax, a16
mov edx, eax
movzx eax, b16
add eax, edx
mov a16, ax
</syntaxhighlight>
|}
Die Adressierungsbreite gibt an, mit welcher Bitbreite der Speicher adressiert werden kann:
* Bei einem 32-Bit System können 2<sup>32</sup>=4.294.967.295=4Gi Bytes/Speicherstellen adressiert werden
* Bei einem 16-Bit System können 2<sup>16</sup>=65.536=64Ki Bytes/Speicherstellen adressiert werden
* Bei einem 64-Bit System können 2<sup>64</sup>=18.446.744.073.709.551.616 =16Ei ~18Exa Bytes/Speicherstellen adressiert werden
Waren die Datenbreite und die Adressierungsbreite bei den ersten Prozessoren noch unterschiedlich, so sind diese heutzutage zumeist identisch. Bei einem 32-Bit Prozessor bedeutet dies, dass dieser max. 4Gi Bytes Speicherstellenstellen adressieren kann und Maschinenbefehle für den Datentransport und die Berechnung von 32-Bit Datenworten beinhaltet.
Die Datenbreite und auch die Adressierungsbereite haben direkten Einfluss auf die Programmiersprache:
* Wird defaultmäßig mit größerer Datenbreite gerechnet, als der Prozessor 'von Hause' aus unterstützt, so werden die erzeugten Maschinenprogramme größer und langsamer (Umgedreht bedeutet dies jedoch nicht, dass die Maschinenprogramme kleiner und schneller werden)
* Die max. Größe von Verbunddatentypen und Arrays ergibt sich aus der Adressierungsbreite des Prozessors
Die Intention der Programmiersprache C/C++ ist, die Prozessorarchitektur optimal zu nutzen. Dementsprechend sind diverse Eigenschaften der Sprache nicht fest spezifiziert, sondern von der Rechnerarchitektur abhängig.
=== Integer Datentyp ===
Intention von C/C++ ist, dass der Umgang mit dem Grunddatentyp 'int' möglichst direkt in einen Maschinensprachebefehl umgesetzt werden kann.<br />
Bei einem 16-Bit Prozessor hat der Datentyp int daher eine Breite von 16-Bit und bei einem 32-Bit Prozessor eine Breite von 32-Bit (siehe Kap [[Programmieren in C/C++: Datentypen # Ganzzahlige Datentypen|Datentypen:Ganzahl Datentypen]]). Über vorangestellte Qualifier kann dieser Grunddatentyp verkleinert/vergrößert werden.
=== Integer Arithmetik ===
Ganzzahlen haben nur einen begrenzten Wertebereich. Wird dieser bspw. durch eine Addition überschritten (d.h. das Rechenergebnis benötigt zur Darstellung mehr Stellen, als der Datentyp 'hergibt'), so gibt es zwei Vorgehensweisen:
* Arithmetischer Überlauf (siehe {{w|arithmetischer Überlauf}}): Die nicht speicherfähigen Stellen werden verworfen, so dass i.d.R. ein falsches Ergebnis erzeugt wird!
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist (254+3)%256=1
c=a*b; //c ist (254*3)%256=250
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char a=254,b=3,c1,c2;
c1=a+b; //c ist (254+3)%256=1
c2=a*b; //c ist (254*3)%256=250
printf("c1=%hhu c2=%hhu\n",c1,c2);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Sättigungsarithmetik (siehe {{w|Sättigungsarithmetik}}): Alle Operationen laufen innerhalb eines festen Intervalls ab, so dass Überläufe und Unterläufe auf dieses Intervall begrenzt werden:
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist MAX((254+3),255)=255
c=a*b; //c ist MAX((254*3),255)=255
</syntaxhighlight>
Die Spezifikation von C macht bezüglich der zu nutzenden Methodik keine Vorgaben, so dass das Handling von der ALU des Prozessors abhängt. Aus Komplexitäts- und Geschwindigkeitsgründen ist dies zumeist der arithmetische Überlauf. Nur bei Spezialprozessoren (z.B. DSP Digital Signal Processor) kommt z.T. die Sättigungsarithmetik zum Einsatz.
=== Gleitkomma Datentyp und Arithmetik ===
Für den Umgang mit Gleitkommazahlen bieten einige Prozessoren spezielle Recheneinheiten ({{w|Gleitkommaeinheit}} Floating Point Units FPU) an. Sowohl die Darstellung von Gleitkommazahlen als auch das Verhalten bei Überlauf/Unterlauf ist damit Herstellerabhängig. Um auch diese Einheiten effektiv nutzen zu können, ist die C/C++ Spezifikation in diesem Bereich ebenfalls sehr offen.
=== Max. Speicherbedarf von Variablen ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C/C++ von der zugrundeliegenden Rechnerarchitektur abhängig:
<syntaxhighlight lang="C">
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Zur Darstellung bitte Compiler-Fenster öffnen
//und dort den CC65-Compiler für den 6502 Prozessor auswählen
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Im Falle von globalen Variablen erzeugt der Compiler/Linker eine Fehlermeldung. Werden von diesen Datentypen Variablen als lokale Variablen angelegt, so erzeugt dies zur Laufzeit einen Stackoverflow.
=== Zeigervariable ===
Eine Zeigervariable ist eine Variable, die eine Speicheradresse speichert. Die Größe dieses Datentyps hängt von der Adressierungsbreite des Prozessors ab. Unabhängig von dem Datentyp, auf den die Zeigervariable zeigt, ergibt sich folgende Breite:
* 4-Byte bei einer 32-Bit Rechnerarchitektur
* 8-Byte bei einer 64-Bit Rechnerarchitektur
* 2-Byte bei einer 16-Bit Rechnerarchitektur
=== Datentyp size_t ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C von der zugrundeliegenden Rechnerarchitektur abhängig. Sie ergibt sich aus der Adressierungsbreite. Da die Datenbreite des Datentyps int zumeist kleiner als die Adressierungsbreite ist, existiert in C/C++ der vorzeichenlose Datentyp size_t.<br />
Alle Funktionen, welche den Speicherbedarf übergeben bekommen, bzw. zurückgeben (bspw. strlen(), memcpy(), sizeof()) , nutzen den Datentyp size_t:
<syntaxhighlight lang="C">
//Prototypen
size_t strlen(char *str); //Die max. Stringlänge ist durch den
//adressierbaren Speicher vorgegeben
void *malloc(size_t size);
void *memcpy(void *dest, const void *src, size_t n);
</syntaxhighlight>
Der Datentyp size_t ist in der Header-Datei stddef.h der Standard-C-Library per typedef gesetzt. Im Normalfall muss diese Header-Datei nicht explizit inkludiert werden, da bei Nutzung von z.B. strlen() diese bereits durch die Header-Datei string.h inkludiert wird:
<syntaxhighlight lang="C">
typedef unsigned long long size_t; //Bei einer 64-Bit Rechnerarchitektur
</syntaxhighlight>
Hinweis:
* Der Datentyp size_t ist immer ein vorzeichenloser Datentyp (es gibt keine negativen Speicheradressen).
* Mit dem Datentype ssize_t wird eine vorzeichenbehaftete Variante zur Verfügung gestellt, welche hilfreich ist, wenn Speicheradresse subtrahiert werden sollen.
* Soll der Wert vom Datentyp size_t mittels printf() ausgegeben werden, so ist der 'Length Modifier' z und der 'Conversion Specifier' u zu nutzen:
:<syntaxhighlight lang="C">
size_t var=strlen("String");
printf("%zu",var);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]) {
size_t var=strlen("String");
printf("%zu",var);
printf("%d",var); //Hier sollte es eine Compiler-Warning geben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Boolescher-Datentype/Operatoren ==
Ursprünglich gab es den booleschen Datentyp in der Programmiersprache C nicht. Mit C99 wurde zwar der Datentyp <code>_Bool</code> eingeführt, dies änderte jedoch nicht den Umgang mit Anweisungen und Operatoren, die einen booleschen Datentyp erwarten/zurückgeben!
An allen Stellen, an denen ein boolescher Datentyp erwartet wird (z.B. IF-Abfrage, bei booleschen Operationen) wird der Datentyp Ganzzahl, Gleitkommazahl oder Zeiger erwartet (= Scalar-Type) und ausgewertet. Der hierin gespeicherte Zahlenwert sagt aus, ob diese Zahl als True oder False zu interpretieren ist:
* False, wenn Ganzzahl gleich 0 oder Gleitkommazahl gleich 0.0 oder Zeiger gleich NULL
* True, wenn Ganzzahl ungleich 0 oder Gleitkommazahl ungleich 0.0 oder Zeiger ungleich NULL
Beispiel:
<syntaxhighlight lang="C">
int a=3;
double b=0.0;
int *ptr=&a;
while(1);
if(a) {}
for( ; b && ptr ; );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
double b=0.0;
int *ptr=&a;
while(0);
if(a) {}
for( ; b && ptr ; ) {}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Operatoren, welchen einen booleschen Wert zurückliefern (Vergleichs-Operatoren und Boolesche-Operatoren), liefern ein Integer-Datentyp zurück:
* (int)0 für False
* (int)1 für True
Beispiel:
<syntaxhighlight lang="C">
int a=3;
int b= (a==3); //b=1
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
int b= (a==3); //b=1
printf("%d",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
In den if()/for()/while() Anweisungen ist folglich kein explizites Konvertieren eines Ganzzahl-/Gleitkomma-/Zeigerwertes mittels des Vergleichs-Operators in einen Booleschen Wert notwendig:
<syntaxhighlight lang="C">
int a;
double b;
if(a) //entspricht if(a!=0)
if(!b) //entspricht if(b==0.0)
while(1) //entspricht while(True)
for(int lauf=1; lauf ; lauf--);
</syntaxhighlight>
Umgedreht kann ein boolescher Wert oder auch das Ergebnis einer booleschen Operation direkt mit einer Ganzzahl- oder Gleitkommazahl verknüpft werden:
<syntaxhighlight lang="C">
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
if( a==1 & b==2)
if(3 < a < 9) //Vorsicht, die Schreibweise lässt ein
//anderes Verhalten erwarten!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
printf("%d\n",a);
if(a==1 & b==2)
printf("true\n");
else
printf("false\n");
if(3 < a < 9)
if( (a==1) & (b==2))
printf("true\n");
else
printf("false\n");
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit C99 wurde der Datentyp <code>_Bool</code> eingeführt. Dieser entspricht weiterhin einem Integerdatentyp mit der Besonderheit, dass beim Zuweisen eines Wertes dieses auf true oder false geprüft wird und Variablen dieses Datentyps nur die Werte 0 oder 1 annehmen können:
<syntaxhighlight lang="C">
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool! möglich
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool!
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für den einfacheren Umgang mit dem 'neuen' Datentyp wurde in der Header-Datei <code>stdbool.h</code> die Makros <code>true</code> (als Austauschwert für die Ganzzahl 1) und <code>false</code> (als Austauschwert für die Ganzahl 0) definiert. Ergänzend wird hier der Datentyp <code>bool</code> als Alias auf <code>_Bool</code> gesetzt.
<syntaxhighlight lang="C">
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
int main(int argc,char *argv[]) {
foo(4,3,6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In C++ gibt es anstatt des Datentypes <code>_Bool</code> den Datentyp <code>bool</code>. Auch sind die beiden Konstanten <code>true</code> und <code>false</code> ohne zusätzliches Einbinden der Header-Datei vorhanden. Der weitere Umgang ist jedoch identisch zu C.
== Literale/Konstanten ==
In Computerprogramm werden an diversen Stellen Konstanten in Source Code genutzt. Sei es als Initialisierungswert für Variablen, als Vergleichswert für Abfragen, zur Definition von Schleifendurchläufe oder als Strings für die Kommunikation. Der Syntax der Programmiersprache bietet dazu verschiedene Möglichkeiten, wie Zahlen zu beschreiben sind und wie der Datentyp vorgeben wird.</br>
Ungeachtet der Schreibweise werden im Computer alle Zahlen identisch als binäre Zalen gespeichert. Beispiele, wie die Zahlen intern gespeichert werden:
<syntaxhighlight lang="C">
int var=17; //0000 0000 0000 0000 0000 0000 0001 0001
short var=0x307;// 0000 0011 0000 0111
char var=017; // 0000 1111
int var=-1; //1111 1111 1111 1111 1111 1111 1111 1111
float var=0.0; //0000 0000 0000 0000 0000 0000 0000 0000
float var=1.0; //0011 1111 1000 0000 0000 0000 0000 0000
</syntaxhighlight>
=== Ganzzahl-Konstanten ===
Im Allgemeinen ordnet der Compiler einer numerischen, ganzzahligen Konstanten den kleinstmöglichen Datentyp beginnend vom Datentyp integer zu. Sobald der Wert der Konstanten den Wertebereich von integer übersteigt, wird der nächst größere passende Datentyp gewählt. Ergänzend gilt, dass alle Ganzzahl-Konstanten als vorzeichenbehaftete Ganzzahl-Konstanten angesehen werden!<br />
Beispiele für integer Konstanten:
<pre>
123
+123
-123 → Formal wird das Minus als Operator angesehen
und die positive Zahl 123 negiert
0x123 → Konstante ist in hexadezimaler Schreibweise notiert
0123 → Konstante ist in oktaler Schreibweise notiert
0b011 → Konstante ist in binärer Schreibweise notiert
nicht offizieller C-Syntax, wird aber von vielen Compiler unterstützt
ab C23-Spezifikation offiziell im C-Syntax enthalten!
6'432'108 → Tausendertrenner (ab C23 und in C++)
6'4'3'2'10 → Tausendertrenner
0x12'23'5 → Tausendertrenner
0b1001'001 → Tausendertrenner
5123123123 → Wertebereich größer als 2^31 so dass automatisch
zum nächst größeren Datentyp konvertiert wird
</pre>
Mit den Suffixen L/l und LL/ll kann der Datentyp long und long long erzwungen werden:
<pre>
12L → Konstante wird in eine long Integer Konstante konvertiert
4711LL → Konstante wird in eine Long Long Konstante konvertiert
</pre>
Mit dem Suffix U/u kann die Konstante explizit auf unsigned gesetzt werden:
<pre>
12U → Konstante wird als vorzeichenlose Zahl gesepeichert
4711ULL → Konstante wird in eine vorzeichenlose
Long Long Konstante konvertiert
</pre>
=== Char-Konstanten ===
In einfachen Anführungsstrichen geschriebene ASCII Zeichen werden entsprechend der {{w|American Standard Code for Information Interchange | ASCII-Tabelle}} als Zahlenwert (Datentyp int) dargestellt:
<pre>
'A' → Integerkonstante 65
'a' → Integerkonstante 97
…
</pre>
Über den {{w|Escape-Sequenz|Escape-Operator}} (Zeichen Backslash '\') wird das/die dem ESCAPE Operator folgende Zeichen gesondert interpretiert. Die im Source-Code erhaltene Zeichenfolge wird im Computerprogramm als ein Zahlenwert (Datentyp int) gespeichert. Dies ist u.A. zur Darstellung von ' und " aber auch zur Darstellung der unteren 32 Zeichen der ASCII Tabelle notwendig (Siehe auch {{w|Steuerzeichen}})
<pre>
ESCAPE Integer- → Bedeutung / (Terminal)funktionalität
Sequence konstante
'\0' = 0 → 0 Character = Stringendezeichen
'\a' = 7 → Bell (erzeugt auf dem Terminal einen Ton)
'\b' = 8 → Backspace (Bewegt den Cursor um eine Position nach links)
'\t' = 9 → Horizontal Tab (Bewegt den Curso auf die nächste horizontale
Tabulatorposition, Abstand ist Terminalspezifisch)
'\n' = 10 → NewLine (Zeilenvorschub)
'\v' = 11 → Vertial Tab
'\r' = 13 → Carriage Return (Wagenrücklauf, Bewegt den Cursor an den
Zeilenanfang)
'\"' = 34 → Double Quote
'\'' = 39 → Single Quote
'\?' = 63 → Question mark
'\\' = 92 → Backslash
'\f' = 12 → FormFeed (Erzeugt auf dem Terminal/Drucker
einen Seitenvorschub)
'\ooo' = 0ooo → Oktal, wobei o Digits von 0..7 sein müssen
'\xdd' = 0xdd → Hexadezimal, wobei d Digits von 0..9 A..F sein müssen
'\udddd' Unicode mit 4 Digits
'\Udddddddd' Unicode mit 8 Digits
</pre>
Beispiel
<syntaxhighlight lang="C">
'A' == 65 == '\101' == '\x41' == '\u0041' == '\U00000041'
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
//Programmiersprache wurde auf C++ gesetzt
if('A' == 65) printf("'A' == 65\n");
if('A' == '\101') printf("'A' == '\\101'\n");
if('A' == '\x41') printf("'A' == '\\x41'\n");
if('A' == '\u0041') printf("'A' == '\\u0041'\n");
if('A' == '\U00000041') printf("'A' == '\\U00000041'\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true|
lang=c++
}} Öffnen im Compiler Explorer] }}
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
u'b' → unicode 16 (nur C++)
U'b' → unicode 32 (nur C++)
L'b' → wchar_t
</pre>
Hinweis
* Die ASCII-Tabelle basiert auf einer 7-Bit Zeichenkodierung, so dass bspw. die Umlaute 'ä', 'ö' und 'ü' dort nicht kodiert sind. Sollen auch diese Zeichen genutzt werden, so empfiehlt sich der Datentyp wchar_t
=== Gleitkommakonstanten ===
Alle Gleitkommakonstanten sind ohne weitere Angaben vom Datentyp double!
<pre>
555.12
555. → 555.0
.1 → 0.1
4e2 → 400.0
1'234.678'9 → Tausendertrenner (ab C23 und in C++)
0x22.11p13 → Konstante in Hexadezimalen Schreibweise (ab C99)
</pre>
Über Suffixe kann ein alternativer Datentyp erzwungen werden:
<pre>
3.0F → Datentyp float
3.0l → Datentyp long double
</pre>
Hinweis:
* Aufgrund der unterschiedlichen Basis zwischen dem menschlichen Zehner-System und dem computerinternen Binär-System entstehen insbesondere bei den Nachkommastellen Rundungsfehler. Die Konstante 0.1f wird durch die Wandlung intern als 1.00000001490116119384765625e-1 dargestellt (siehe [[Programmieren in C/C++: Datentypen#Gleitkomma Datentypen | Datentypen:Gleitkomma Datentypen]])
* Die C-Spec verlangt, dass die binäre Repräsentation von Gleitkommazahlen zur Laufzeit (z.B. durch die Funktion atof() strtod() scanf("%f")) identisch zur der zur Compilezeit ist. Beispiel:
:<syntaxhighlight lang="C">
if(3.14==atof("3.14")) printf("muss erfüllt sein");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
if(3.14==atof("3.14")) printf("muss erfüllt sein\n");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
printf("Intern wird 3.14 wie folgt dargestellt %14.20f",3.14);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Konstanten Ausdrücke ===
Ergänzend zu den Zahlenwerten werden auch Ausdrücke durch den Compiler ausgewertet. Als Voraussetzung für die Ausdrücke gilt, dass alle Operatoren Literale/Konstante sein müssen, so dass der Compiler die Berechnung durchführen kann. Als Operatoren können alle im normalem Syntax erlaubten Operatoren (z.B.: +,-,*,/,&,&&,|,||,>>,<<,==,!=) genutzt werden.<br />
Beispiel:
<syntaxhighlight lang="C">
int var1=7*3+5; → wird vom Compiler durch 26 ersetzt
int var2=(4710+(8-1))&-8; → wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); → wird vom Compiler durch 16 * var1 + 154 ersetzt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int var1=7*3+5; //→ wird vom Compiler durch 26 ersetzt
int var2;
var2=(4710+(8-1))&-8; //→ wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); //→ wird vom Compiler durch var1 * 16 + 154 ersetzt
return 0;
} | execCompilerOptions=-Wall|
h=g|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Konstante Ausdrücke bieten sich an, um den Sourcecode lesbarer zu gestalten. Da der Compiler die Berechnung durchführt, wird zur Laufzeit keine Rechenleistung benötigt. Einzig die Compiledauer wird etwas erhöht:
<syntaxhighlight lang="C">
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180); //siehe nachfolgende Hinweise
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int ad_get(void) {
return 615; //614;
}
int main(int argc,char *argv[]) {
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180);
printf("%f\n%f\n",alpha1,alpha2);
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Ergänzend zu den oben aufgeführten Operatoren erlauben einige Compiler weitere Funktionen der Math.h Library in Konstantenausdrücken (z.B. sin(), cos(), ...)
* Konstanten Ausdrücke werden innerhalb des Compilers durch den Präprozessor ausgewertet, so dass dieser die Ergebnisse ebenfalls nutzen kann:
:<syntaxhighlight lang="C">
#define BUF_SIZE 512
#if (BUF_SIZE & (BUF_SIZE -1)) != 0
#endif
</syntaxhighlight>
=== String Konstanten ===
Stringkonstanten erzeugen ein Array von Characters. Mit dem abschließenden Hochkommata wird das Array um ein Stringendezeichen ergänzt:
<pre>
"abc" → (char []) {'a','b','c','\0'}
</pre>
Adjacent Strings Konstanten werden vom Compiler zu einer String-Kontante zusammengefasst, so dass nur ein Stringendezeichen vorhanden ist:
<pre>
"xxx" "yyy" → (char []) {'x','x','x','y','y','y','\0'}
</pre>
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
L"string" → (wchar_t[7]){L's',L't',L'r' …)
</pre>
Über Postfixes können in C++ Objekte erzeugt werden:
<pre>
"string"s → erzeugt einen String vom Datentyp std::string
"string"sw → Erzeugt einen String vom Datentyp std::string_view
</pre>
String Konstanten werden Compilerintern über unnamed Variablen realisiert, welche als globale Variable angelegt werden und per default const sind:
<syntaxhighlight lang="C">
printf("Wert=%d",4);
//entspricht
const char unnamed1[]="Wert=%d";
printf(unnamed1,4);
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
printf("Wert=%d\n",4);
//entspricht
const char unnamed1[]="Wert=%d\n";
printf(unnamed1,4);
fflush(stdout); //Zur Darstellung der Ausgabe, da nachfolgend
//das Programm abstürzt und die gepufferte Ausgabe
//nicht zur Anzeige gebracht wird
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für doppelte String Konstanten wird nur einmal Speicher reserviert:
<syntaxhighlight lang="C">
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2) printf("Identische Startadressen");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2)
printf("Identische Startadressen");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Initialisierungsliste / Compound Literal ==
Arrays, Strukturen und Unions bestehen zumeist aus mehreren Elementen. Zur Initialisierung solcher Variablen werden die Initialisierungswerte in geschweiften Klammern als Initialisierungsliste zusammengefasst.
<code>
Syntax: {Initialisierungsliste}
</code>
Für eine Initialisierungsliste wird kein Speicher vorgehalten. Vielmehr wird bei der Variablendefinition die Variable direkt mit dem Inhalt der Liste initialisiert. Der Datentyp der Initialisierungsliste ergibt sich aus dem Datentyp der zu initialisierenden Variable:
<syntaxhighlight lang="C">
int arr[5] = { 1,2,3,4,5 };
struct xyz { int x,y,z;}; //Definition einer Struktur
struct xyz var = { 1,2,3 };
</syntaxhighlight>
Wird der Initialisierungsliste ein Datentyp in runden Klammern vorangestellt, so wird hiermit eine 'unnamend' Variable/Objekt, ein Compound Literal erstellt:
<code>
Syntax: (type) {Initialisierungsliste}
</code>
Ein Compound Literal entspricht einer anonymen Variablen des angegebenen Datentyps. Wie bei einer normalen Variablendefinition wird hier ebenfalls eine Variable angelegt und diese mit den Initialisierungswerten initialisiert. Im Unterschied zu einer normalen Variable kann auf solch eine Variable im Nachgang nicht mehr zugegriffen werden. Der Rückgabewert eines Compound Literals entspricht somit dem einer Variablen.</br>
Compound Literale bieten sich überall dort an, wo Variablen nur für einen einmaligen Zweck angelegt werden (bspw. bei der Parameterübergabe von Funktionen):
<syntaxhighlight lang="C">
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawline(struct point start,struct point end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start.x,start.y,end.x,end.y);
}
void printarray(int arr[4]) {
printf("[ ");
for(size_t idx=0;idx<4;idx++)
printf("%d ",arr[idx]);
printf("]\n");
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Über den Adressoperator kann auch die Adresse der anonymen Variablen ermittelt werden. In diesem Falle ist dann der Gültigkeitsbereich/-dauer des Compound Literals zu berücksichtigen. Wird eine Compound Literals außerhalb eines Block-Scopes angelegt, so entspricht sie einer globalen Variable, andernfalls einer lokalen Variablen. Außerhalb des Gültigkeitsbereiches verliert die Adresse auf solch eine Variable ihre Gültigkeit:
<syntaxhighlight lang="C">
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawlinep(struct point *start,struct point *end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start->x,start->y,end->x,end->y);
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Compound-Literal sind per Default keine Konstanten, können also zur Laufzeit geändert werden (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Const Type Qualifier|DatentypeSpecifier:Const Type Qualifier]]):
:<syntaxhighlight lang="C">
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweiften Klammern <code>{ }</code> sind nicht mit dem Block-Operator (siehe [[Programmieren in C/C++: Grundlagen#Block / Compound-Statement | Block / Compound-Statement]]) zu verwechseln. Werden die geschweiften Klammern bei der Initialisierung von Variablen genutzt, dann beschreibt der Inhalt der geschweiften Klammern eine Initialisierungsliste. Wird diesen ein Datentyp vorangestellt, dann wird hiermit eine Compound Literal definiert.
== Variableninitialisierung ==
Mit der Definition einer Variable kann diese optional initialisiert werden. Der tatsächliche Zeitpunkt der Variableninitialisierung (zur Laufzeit oder zur Compilezeit) und damit die Ausführung der Initialisierung (Maschinensprachebefehle oder Speichervorbelegung) hängt von der Gültigkeit/Sichtbarkeit der Variablen ab(siehe [[Programmieren in C/C++: Grundlagen#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]).
=== Globale + Static lokale Variablen ===
Globale und statisch globale Variablen werden in einem während der Laufzeit des Programms festen Speicherbereich gehalten. Zum Startzeitpunkt des Programms ist der Speicherplatz solch einer Variable mit dem Initialisierungswert gefüllt, so das bei erstmaliger Nutzung dieser Variablen diese ihre Initialisierungswerte enthalten. Die Belegung des Speicherplatzes erfolgt durch den Compiler, so dass als Initialisierungswerte / Inhalt der Initialisierungsliste nur Konstanten oder Konstanten-Ausdrücke (siehe [[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Literale/Konstanten]]) erlaubt sind:
<syntaxhighlight lang="C">
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
double sin(double); //DJ: Include-Anweisung in wikibooks schlägt fehlt
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
int main(int argc,char *argv[]) {
printf("%hd %hd %hd\n",array[0],array[1],array[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Nicht initialisierte globale und static lokale Variablen werden mit 0 initialisiert! D.h. die Speicherstellen dieser Variablen werden mit dem Wert 0 vorbelegt::
<syntaxhighlight lang="C">
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
int main(int argc,char *argv[]) {
printf("f=%d\n",f);
printf("%f %f %f\n",arr[0],arr[1],arr[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Lokale Variable ===
Der Speicherplatz für lokale Variable wird auf dem Stack zur Verfügung gestellt. Mit jedem öffnenden Block-Scope wird Speicher für die innerhalb dies Block-Scopes vorhandenen Variablen vom Stack nach dem LIFO Prinzip reserviert und mit der Variablendefinition Maschinencode zur Initialisierung der Speicherstellen ausgeführt (sofern Variable einen Initialisierungswert hat):
<syntaxhighlight lang="C">
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für int) und 8 Bytes (für double)
int var1=12; //erzeugt Maschinencode zur Initialisierung
//der ersten 4 Byte mit dem Wert 12
double var2=sin(f); //erzeugte Maschinencode, welche zunächst
//die Funktion sin() mit dem Übergabewert f
//aufruft und dessen Rückgabewert in die
//nächsten 8 Byte des reservierten Speichers
//kopiert
...
{ //siehe zuvor
int var3=var1; //siehe zuvor
double var4=var2+var1;
} //siehe nachfolgenden
} //Freigabe des zuvor reservierten Speichers
</syntaxhighlight>
Dies gilt auch für Funktionsaufrufe. Mit der öffnenden geschweiften Funktionsklammer wird ebenfalls Speicher reserviert:
<syntaxhighlight lang="C">
void foo(int par)
{ //Öffnende Funktionsklammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für (Übergabe)Variable par und 4 Bytes für Variable var
int var; //Da keine Initialisierung vorhanden ist wird auch
//kein Maschinencode zur Initialisierung ausgeführt
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Byte für Variable x
int x;
...
</syntaxhighlight>
Aufgrund der mit der Initialisierung bedingten Erzeugung von Maschinencode können die Initialisierungswerte/Inhalte der Initialisierungsliste bei lokalen Variablen aus beliebigen Ausdrücken bestehen und müssen keine Konstanten oder Konstanten Ausdrücke sein:
<syntaxhighlight lang="C">
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sin(f)}; //werden zur Laufzeit berechnet
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h> //fuer sinf()
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sinf(f)}; //werden zur Laufzeit berechnet
printf("%f\n",(double)summe);
printf("%f %f %f\n",(double)arr[0],(double)arr[1],(double)arr[2]);
}
int main(int argc,char *argv[]) {
foo(3,4);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dieser Maschinencode wird jedes Mal ausgeführt, wenn die dazugehörige Anweisung abgearbeitet wird und bedingt dementsprechend Rechenzeit. Zehnmaliges Ausführen einer Funktion oder zehnmaliges Öffnen eines Block-Scopes innerhalb einer For-Schleife führt zur zehnmaligen Ausführung der oben genannten Sachverhalte:
<syntaxhighlight lang="C">
void foo(int);
void var(void) {
for(int lauf=10; lauf>0; lauf--)
{ //zehnmaliges Reservieren von Speicher
int var=lauf*2; //zehnmalige Initialisierung
foo(var);
} //Freigabe des Speichers
}
void foo(int par) { //zehnmaliges Reservieren von Speicher
int var=12; //zehnmalige Initialisierung
} //Freigabe des Speichers
</syntaxhighlight>
Nicht initialisierte lokale Variablen werden nicht initialisiert, d.h. keine zusätzlichen Maschinenbefehle zum Initialisieren erzeugt. Der Variablenwert entspricht dann einem 'Zufallswert' oder korrekter gesagt dem Inhalt der Variablen, welcher zuvor der Speicherstelle zugewiesen war:
<syntaxhighlight lang="C">
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//und damit auch dessen zuletzt gültigen Wert
}
int main(int argc, char *argv[]) {
int var1=first(); //var1 beinhaltet Wert 7
int var2=second(); //var2 beinhaltet Wert 7
printf("var_foo=%d\n",var1);
printf("var_far=%d\n",var2);
return 0;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//(und damit auch dessen zuletzt gültigen Wert)
}
int main(int argc, char *argv[]) {
printf("%d\n",second()); //Zufallswert (0, da Stack mit 0 initialisiert ist)
printf("%d\n",first()); //Stack belegen
printf("%d\n",second()); //Zufallswert (7, da Speicherstelle zuvor mit 7
return 0; //belegt wurde)
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird eine Variableninitialisierung mit einer switch oder goto Anweisung übersprungen, so wird zwar die Variable angelegt (Speicherplatz reserviert), jedoch die Maschinenbefehle zur Initialisierung dieser Variablen nicht ausgeführt (siehe auch [[Programmieren in C/C++: Grundlagen# Switch-Anweisung|Switch-Anweisung]] und [[Programmieren in C/C++: Grundlagen# Label + Goto|Label + Goto]]). Die Variable enthält dann einen Zufallswert:
<syntaxhighlight lang="C">
switch(value) {
case 0:
int lok=7;
printf("%d",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(int value) {
switch(value) {
case 0:
int lok=7;
printf("%d\n",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d\n",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
}
void far(void) {
int var1=4711;
int var2=1799;
printf("Marke: %d, Erscheinungsjahr: %d\n",var1,var2);
}
int main(int argc,char *argv[]) {
foo(2); //Zufallswert (0, da Stack mit 0 initialisiert ist)
foo(0); //Initialisierungswert
far(); //Stack belegen
foo(2); //Zufallswert
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei erstmaligem Funktionsaufruf kann eine nicht initialisierten lokale Variablen den Wert 0 beinhalten (Stackframe wird mit Programmstart auf 0 gesetzt). Beim nächsten Aufruf der Funktion ist zumeist die Speicherstelle der lokalen Variablen mit anderen Werten gefüllt worden, so dass nun ein anderer 'Zufallswert' als 'Initialisierungswert' enthalten ist
=== C++ ===
In C++ ist ergänzend die Initialisierung einer Variablen über () möglich. Bei Objekten wird hierüber der zugehörige Konstruktor aufgerufen. Bei primitiven Datentypen entspricht der Wert in den Klammern dem Initialisierungswert:
<syntaxhighlight lang="C++">
int variable(10); //Bei primitiven Datentype entspricht dies
//int variable=10;
struct test {
int a;
test(int par) {a=par;} //Konstruktor der Struktur test
};
struct test test(4); //Konstruktor test(int par) wird aufgerufen
struct test test(4,5); //KO, kein passender Konstruktor vorhanden
</syntaxhighlight>
=== Sonstiges ===
Folgende weitere Sachverhalten gilt es bzgl. Variableninitialisierung zu berücksichtigen:
* Nach C-Spezifikation ist eine Initialisierung von Variablen nicht notwendig. Es liegt folglich kein Fehler vor, wenn auf eine nicht initialisierte Variable lesend zugegriffen wird. Ungeachtet der C-Spezifikation überprüft der Compiler mit dem Schalter '-Wall' diesen Sachverhalt und gibt eine Warning aus
* Deklarationen/Prototypen können keinen Initialisierungswert enthalten
<syntaxhighlight lang="C++">
extern int var=7; //Fehlerhaft
</syntaxhighlight>
* Const und lokale Static Variablen sollten initialisiert werden, auch wenn C in diesem Fall keinen Fehler meldet!
<syntaxhighlight lang="C++">
const int konstante; //Syntaktisch OK, Initialisierungswert fraglich!
static int statisch;
</syntaxhighlight>
== Anweisung (Statement) & Expression ==
Eine Anweisung (Statement) stellt entsprechend dem Wikipedia Artikel {{w|Anweisung_(Programmierung) | Anweisung}} ''"ein in der Syntax einer Programmiersprache formulierte einzelne Vorschrift dar, die im Rahmen der Abarbeitung des Programms auszuführen ist"''.</br>
Aus der Statement Spezifikation ergibt sich folglich, welche Bestandteile ein Programm beinhaltet kann. In der C-Spezifikation [C11 6.8] sind folgende Anweisungen definiert:
: labeled-statement: Eine Sprungmarke für die Switch- und die Goto-Anweisung
: compound-statement: siehe nachfolgendes Kapitel
: expression-statement: siehe nachfolgendes Kapitel
: selection-statement: Eine if() oder switch() Anweisung
: iteration-statement: Eine while(), do while() oder eine for() Anweisung
: jump-statement: Eine goto, break, continue oder return Anweisung
so dass ein Programmablauf wie folgt aussehen könnte:
<syntaxhighlight lang="C">
int main(int argc, char argv[]) {
int var; //declaration innerhalb eines compound-statements
label: //labeled-statement
var=var*2+1; //expression-statement
for(var=0;var<100;var++); //iteration-statement
if(var<0) //selection-statement
printf("var<0"); //espression-statement
{ int lok=var; lok++; } //compound-statement
goto label; //jump-statement
return 0;
}
</syntaxhighlight>
=== Ausdruck (Expression) ===
Entsprechend der C-Spezifikation [C11 6.5] ist ein Ausdruck eine Folge von Operatoren und Operanden, die die Berechnung eines Werts angibt, ein Objekt oder eine Funktion bezeichnet, Nebenwirkungen erzeugt oder eine Kombination davon ausführt. Die Wertberechnungen der Operanden eines Operators werden vor der Wertberechnung des Ergebnisses des Operators ausgeführt (siehe auch {{w|lang=en|Expression_(computer_science)|Expression}}).
Beispiele:
<syntaxhighlight lang="C">
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöung der globalen Variable a)
int func(int par) { a++; return par*2;}
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int a=0;
int func(int par) {
a++;
return par*2;
}
int main(int argc,char *argv[]) {
int a=4,b=7;
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöhung der globalen Variable a)
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ausdrücke entsprechen somit Rechenvorschriften, die ausgewertet werden. Ausdrücke sind in C/C++ überall dort erlaubt, wo ein Operand erwartet wird:
<syntaxhighlight lang="C">
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func3(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf()]) {}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
//Ausdruck innerhalb eines Funktionskopfes
int func1(int par) {
return 1;
}
int func2(void) {
return 1;
}
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf("func() called\n")])
{
printf("func() body\n");
}
int main(int argc,char *argv[]) {
int a=1;
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func1(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
func3(1,arr);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dies ist unter anderen ein Grund dafür, dass C/C++ als unleserlich gilt. Zur besseren Lesbarkeit eines Codes sollte dieses 'Feature' nur dann genutzt werden, wenn es zwingend notwendig ist.
=== Discarded Value / null statement ===
Alle Ausdrücke und nicht void-Funktionen haben einen Rückgabewert, der weiter verwendet werden kann:
<syntaxhighlight lang="C">
a+7 //Rückgabewert ist das Ergebnis der Addtion
printf("hallo") //printf() Funktion ist vom Typ int und gibt die Anzahl
//der ausgegebenen Zeichen zurück
a //gibt den Inhalt der Variablen zurück
7 //gibt den 'Inhalt' der Konstanten zurück
b=(a=7) //der Zuweisungsoperator gibt den Zuweisungswert zurück
</syntaxhighlight>
Der letzte Rückgabewert eines fasst jeden Ausdruckes wird somit nicht genutzt. Dies wird Discarded Value bezeichnet:
<syntaxhighlight lang="C">
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der einfachste Fall eines Discarded Values ist ein Leeranweisung / null statement, d.h. die Anweisung besteht nur aus einem Semikolon. Dies stellt eine syntaktisch korrekte Anweisung dar, die keine Auswirkung hat:
<syntaxhighlight lang="C">
; //Leeranweisung
</syntaxhighlight >
Überall wo statements/Anweisungen erwartet werden (bspw. bei einer for-Schleife, bei einer if-Anweisungen) kann anstatt einer statements eine Leeranweisung stehen, welche dementsprechend nichts ausführt:
<syntaxhighlight lang="C">
for(size_t idx=0; str[idx]!=0; idx++)
; //Leeranweisung
while(a++ < 100)
; //Leeranweisungen
</syntaxhighlight>
An einige Stellen bietet sich die Nutzung dieser Sachverhalte als vorteilhaft an. Oft führen diese Sachverhalten jedoch zu Ausführungsfehlern, da sie aufgrund des korrekten Syntax vom Compiler nicht als Fehler gemeldet werden und beim Suchen dementsprechend nur schwer zu finden sind! Ggf. gibt der Compiler für einige Sachverhalte eine Warnung aus, so dass es vorteilhaft ist, Compiler-Warnings zu beachten!
Hinweise:
* Soll bewusst der Rückgabewert verworfen werden, so kann/sollte mit dem explizten Cast auf (void) der Rückgabewert explizit 'verworfen' werden. Dies ist u.A. hilfreiche bei Variablen, die (noch) nicht benutzt werden und der Compiler die Warning "unsued Variable" ausgibt:
:<syntaxhighlight lang="C">
(void)a; //Zur Vermeidung von Compiler-Warnings "Unused Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(void) {
return 4711;
}
int main(int argc,char *argv[]) {
int a;
(void)a; //Zur Vermeidung von Compiler-Warnings "Unsued Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Mit der Anweisung <nowiki>[[nodiscard]]</nowiki> (ab C++17, ab C23) wird der Compiler angewiesen, dass der Aufrufer einer Funktion mit Rückgabewert der Rückgabewert entgegenzunehmen ist. Wird der Rückgabewert verworfen, so gibt der Compiler eine Fehlermeldung aus:
:<syntaxhighlight lang="C">
[[nodiscard]] int Client(int socket);
Client(5); ////Fehlermeldung, da Rückgabewert nicht verwendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
[[nodiscard]] int Client(int socket) {
return socket+1;
}
int Server(int socket) {
return socket+1;
}
int main(int argc,char *argv[]) {
Server(5); //keine Fehlermeldung
Client(5); //Fehlermeldung, da Rückgabewert nicht verwendet wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sequence Point ===
Ein Sequenzpunkt (u.A. das abschließende Semikolon am Ende der Anweisung) ist nach dem Wikipedia Artikel {{w|lang=en|Sequence_point|Sequence Point}} definiert als der Punkt in der Ausführung eines Computerprogramms, an dem garantiert ist, dass alle Nebenwirkungen früherer Bewertungen durchgeführt wurden und noch keine Nebenwirkungen von nachfolgenden Bewertungen durchgeführt wurden.</br>
Sequenzpunkte führen somit zur Trennung der Abarbeitungsreihenfolge innerhalb von Ausdrücken. Das abschließende Semikolon am Ende eines Ausdruckes sorgt somit dafür, dass zunächst der vorangegangene Ausdruck abgearbeitet wird, bevor der nächste Ausdruck beachtet wird.</br>
Beschreibt das Semikolon explizit einen Sequenzpunkt, so gibt es auch andere Operatoren, die einen Sequenzpunkt beinhalten. Bei solchen Operatoren wird somit zunächst vollständig der erste Teilausdruck ausgewertet, bevor der nächste folgt. Zwei Beispiele für Operatoren mit Sequenzpunkt sind das logische Und <code>&&</code> und der <code>?</code>-Operator:
<syntaxhighlight lang="C">
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(int par) {
return printf("func(%d) called\n",par);
}
int main(int argc,char *argv[]) {
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein weiteres Beispiel ist der Komma-Operator. Hier teilt das Komma den Gesamtausdruck in mehrere Teilausdrücke auf, die nacheinander abgearbeitet werden (siehe
[[Programmieren in C/C++: Grundlagen#Komma-Operator | Komma-Operator]]).
=== Abarbeitungsreihenfolge ===
Die Abarbeitungsreihenfolge der Operatoren innerhalb eines Ausdruckes wird durch die Prioritätenliste/Rangfolge (siehe [[C-Programmierung: _Liste_der_Operatoren_nach_Priorität| C-Programmierung:Liste der Operatoren nach Priorität]]) vorgegeben. Operatoren mit höherer Priorität werden vor Operatoren mit niedriger Priorität ausgeführt. Die ()-Klammer hat die höchste Priorität:
<syntaxhighlight lang="C">
//Der Ausdruck
c = sizeof(x) + ++a / 3;
//wird aufgrund der Prioritäten wie folgt ausgewertet:
c= (sizeof(x)) + ( (++a) / 3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=2;
int c;
int x=0;
c = sizeof(x) + ++a / 3;
printf("a=%d c=%d\n",a,c);
//Wird aufgrund der Prioritäten wie folgt ausgewertet:
a=2;
c= (sizeof(x)) + ( (++a) / 3);
printf("a=%d c=%d\n",a,c);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei identischer Priorität ergibt sich die Abarbeitungsreihenfolge aus der Assoziativität (L-R oder R-L):
<syntaxhighlight lang="C">
a=33 / 5 / 2;
//Wird aufgrund der L-R Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2;
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
a = b = c = d*2; //→ a=(b=(c=(d*2)));
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a;
a=33 / 5 / 2;
printf("a=%d\n",a);
//Wird aufgrund der Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2
printf("a=%d\n",a);
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
int b,c,d=8;
a = b = c = d*2; //→ a=(b=(c=(d*2)));
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
An einigen Stellen gibt die C/C++ Spezifikation die Abarbeitungsreihenfolge nicht vor (indeterminately-sequenced), überlässt diese somit dem Compiler:
* Bei Funktionsaufrufen ist die Abarbeitungsreihenfolge der Parameter nicht spezifiziert:
:<syntaxhighlight lang="C">
//Quelle: C-Spec Kap. 6.5.2.2
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int f1(void) {
printf("f1 called\n");
return 1;
}
int f2(void) {
printf("f2 called\n");
return 2;
}
int f3(void) {
printf("f3 called\n");
return 3;
}
int f4(void) {
printf("f4 called\n");
return 4;
}
void func1(int par1,int par2) {
printf("func1(%d,%d) called\n",par1,par2);
}
void func2(int par1,int par2) {
printf("func2(%d,%d) called\n",par1,par2);
}
int main(int argc,char *argv[]) {
//Quelle: C-Spec Kap. 6.5.2.2
void (*pf[2])(int,int)={func1,func2};
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Per Postinkrement/-dekrement Operator sagt aus, dass für die eigentliche Operation der Wert der Variablen genutzt wird und im Anschluss die Variable erhöht / erniedrigt werden soll. Nach C-Spezifikation [C11 6.5.2.4] muss dies spätestens vor dem nächsten Sequence Point erfolgt sein. Der genaue Zeitpunkt innerhalb des Sequence Points ist jedoch nicht vorgegeben:
:<syntaxhighlight lang="C">
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
printf("a=%d b=%d\n",a,b);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Initialisierungliste ist Abarbeitungsreihenfolge nicht spezifiziert:
<syntaxhighlight lang="C">
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
printf("var={a=%d b=%d c=%d}\n",var.a,var.b,var.c);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Compound-Statement ===
Ein Compound-Statement ist innerhalb der C-Spezifikation ein alternativer Ausdruck für ein block-scope. Dieser fasst mehrere Statements und Deklarationen zu einem Statement zusammen:
<code>
Syntax: {Declaration-or-statement-list/textsuperscript<sub>OPT</sub>}
</code>
Ein Block wird nicht wie bei einer Anweisung mit einem Semikolon abgeschlossen (Das angehängte Semikolon wäre dann eine separate leere Anweisung!).
Ein Block hat blockweite Sichtbarkeit (siehe [[Programmieren in C/C++: Grundlagen#Blockweite Sichtbarkeit | Blockweite Sichtbarkeit]]), , so dass hier definierte Variablen nur hier gültig sind. Deklarationen sind ebenfalls nur in dem Block gültig:
<syntaxhighlight lang="C">
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Verwendung findet das Compound-Statement a) als Strukturierungsmöglichkeit innerhalb von Funktionen (zur Darstellung, dass dieser Bereich 'zusammengehörig' ist) und b) an den Stellen, an denen C/C++ nur eine Anweisung erwartet. Dies sind bspw. die If- und die For-Anweisungen:
<syntaxhighlight lang="C">
for(..) Anweisung; //For-Schleife führt nur diese eine Anweisung aus
for(…) {Block} //For-Schleife führt Block (als eine Anweisung) aus
if(..) Anweisung; else Anweisung; //IF-Anweisung führt nur 'eine'
//Anweisung aus
if(..) {Block} else {Block} //IF-Anweisung führt Block aus
if( ) {Block}; else {Block}; //Semikolon ist eine separate
//Leer-Anweisung, so dass else
//nicht zur IF-Anweisung zugeordnet
//werden kann (2 Anweisungen vor Else)</syntaxhighlight>
=== Embedded Statement ===
Embedded Statements sind eine GNU-C Erweiterung (siehe [https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html GNU-C-Manual 3.18]). Da diese vom Autor als sehr nützlich angesehen und auch von diversen Compilern und auch in C++ unterstützt werden, werden diese nachfolgend beschrieben.
Ein Compound-Statement fasst mehrere Anweisungen zu einer Anweisung zusammen, hat jedoch kein Rückgabewert. Ein Embedded-Statement entspricht einem Compound-Statement mit der Ergänzung, dass dieser einen Rückgabewert hat, so dass ein Embedded-Statement überall dort eingesetzt werden kann, wo eine Operand erwartet wird.
<code>
Syntax: ({Declaration-or-statement-list<sub>OPT</sub>})
</code>
Der Rückgabewert (und Datentyp) wird nicht über eine return-Anweisung angegeben, sondern entstammt aus dem Rückgabewert der letzten Anweisung innerhalb der Liste:
<syntaxhighlight lang="C">
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
printf("var=%d\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein Embedded-Statement ähnelt folglich einem Funktionsaufruf mit dem Unterschied, dass a) in der Tat kein Funktionsaufruf stattfindet und b) der Rückgabewert nicht mit return, sondern über die letzte Anweisung zurückgegeben wird. Der Anwendungsfall ist dort zu finden, wo eine Operand erwartet wird und mehrere Anweisungen zum Ermitteln des Operanden notwendig sind:
<syntaxhighlight lang="C">
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
printf("Bedingung erfüllt");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Ein Embedded-Statement ist insbesondere bei Nutzung von Makros (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]) hilfreich
* Mittels eines Embedded-Statement kann eine anonyme Funktion/Lambdafunktion dargestellt werden:
<syntaxhighlight lang="C">
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {return a%2?a:0;} ; func;})
,arr);
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {printf("Called:%d\n",a);return a%2?a:0;} ; func;})
,arr);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Funktionen / Prozeduren ==
Funktionen/Prozeduren sind ein Strukturierungsmerkmal, so dass Teile der Funktionalität des Programmes wiederverwendbar sind. C/C++ unterscheidet nicht zwischen Funktionen (haben einen Rückgabewert, können damit als Operand in Ausdrücken verwendet werden) und Prozeduren (haben keine Rückgabewert, resp. Rückgabetyp void). <br/>
Mit jedem Aufruf einer Funktion wird für den zugehörigen Block ein eigener Stack-Kontext angelegt, so dass Funktionen sich selbst aufrufen können (Rekursion). Jeder Funktionsinstanz hat somit seinen eigenen lokalen Variablenbereich, teilen sich jedoch die globalen und die statisch lokalen Variablen.<br />
Mit dem Aufruf einer Funktion können Parameter übergeben werden, wobei die Übergabeparameter vom Aufrufer (Caller) durch den Aufruf in die lokalen Variablen des Aufgerufenen (Callee) kopiert/zugewiesen werden (Call by Value). Wird ein Zeiger übergeben, hat der Callee über die Dereferenzierung des Zeigers die Möglichkeit, die Variablen des Caller zu verändern (Call by Reference) (siehe Kap. [[Programmieren in C/C++: Zeiger #Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen).]]).
Hinweise:
* Die Klammerung hinter dem Funktionsnamen (<code>foo()</code>) zeigt an, dass es sich um einen Funktionsaufruf (Verzweigung der Programmausführung zu der Startadresse der Funktion) handelt:
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
foo(); //Klammern hinter dem Funktionsnamen bedeuten Aufruf der Funktion
</syntaxhighlight>
* Die Nutzung des Funktionsnamens ohne Klammerung (<code>foo</code>) gibt die Startadresse der Funktion zurück. Die Startadresse kann in einem Zeiger auf Funktionen gespeichert werden (siehe Kap. [[Programmieren in C/C++: Zeiger#Zeiger auf Funktionen | Zeiger:Zeiger auf Funktionen]]):
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
printf("foo called");
};
int main(int argc, char *argv[]) {
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
fptr(); //Aufruf der Funktion
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklaration/Definition vor dem ersten Aufruf der Funktion 'notwendig', damit Compiler die Übergabeparameter entsprechend bereitstellt und ggf. eine implizite Typkonvertierung durchführt (dito Rückgabewert). Die Angabe der Variablennamen können bei der Deklaration entfallen
* Die fehlende Angabe der Übergabeparameter bedeutet in C (bis einschl. C18), dass diese Funktion mit beliebigen Übergabeparametern aufgerufen werden kann und der Compiler keine Typprüfung durchführt:
:<syntaxhighlight lang="C">
int func(/*Keine Übergabeparameter angegeben*/) {...}
//kann wie folgt aufgerufen werden
func();
func(4);
func("hallo Welt",4.7);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func() {
printf("foo called\n");
};
int main(int argc, char *argv[]) {
func();
func(4);
func("hallo Welt",4.7);
//Ab C23 hat sich die Bedeutung geändert.
//Zum Testen C-Versionsvorgabe -sdc=xxx unter Compiler-options aendern
return 0;
} | execCompilerOptions=-Wall -std=c17|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:→ unbedingt vermeiden<br />
:Hat die Funktion keinen Übergabewert, so wird dies in C mit void gekennzeichnet
* In C++ bedeutet die Schreibweise ohne Datentypbeschreibung, dass keine Parameter erwartet werden
* In der Parameterliste von Funktionen dient in der GNU-C Spezifikation das Semikolon zum Trennen zwischen Deklaration von Übergabeparameter und den Übergabeparametern. Alle Übergabewerte links vom Semikolon sind (Forward)deklarationen:
:<syntaxhighlight lang="C">
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Aufruf
test1(3,7); //a=7 b=3
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim);
//Aufruf
test2("hallo",6);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim) {
printf("dim=%d\n",dim);
}
int main(int argc, char *argv[]) {
//Aufrufe
test1(3,7); //a=7 b=3
test2("hallo",6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Return-Anweisung ===
Mit der Return-Anweisung wird eine Funktion (vorzeitig) beendet. Der optionale Parameter dient der Angabe des Rückgabewertes der Funktion an den Aufrufer. Der Datentyp des Parameters ergibt sich aus dem Rückgabedatentyp der Funktion.
<code>
Syntax: return expression<sub>OPT</sub>
</code>
Der Rückgabewert expresion sagt aus, dass hier nicht nur Konstanten oder Variablen stehen können, sondern ein komplexer Ausdrücke erlaubt ist. Der resultierende Datentyp des Ausdruckes sollte dem Rückgabedatentyp der Funktion entsprechen, andernfalls wird eine implizite Typkonvertierung vollzogen (sofern möglich):<syntaxhighlight lang="C">
int foo(double a, double b) {
return (int)(a*a+b*b);
}
</syntaxhighlight>
Hinweise:
* Bei nicht void-Funktionen ist eine return-Anweisung mit einer Expression entsprechend dem Datentyp der Funktion zwingend notwendig:
:<syntaxhighlight lang="C">
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
double a=func(); //int wird in double konvertiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
int main(int argc, char *argv[]) {
double a=func(); //int wird in double konvertiert
printf("a=%f\n",a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei einer void-Funktion ist die return-Anweisung ohne Expression optional. Hier entspricht der schließende Block der Return-Anweisung
:<syntaxhighlight lang="C">
void func(char *str) {
if(str==NULL)
return;
printf("%s",str);
}
</syntaxhighlight>
Sollen mehr als ein Rückgabewert an den Aufrufer zurückgegeben werden so empfiehlt sich:
* die Rückgabewerte in einer Struktur zu packen (siehe [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++) |Datentypen:Verbundtyp Struktur/Klasse (nur C++)]])
* die Rückgabewerte über die Aufrufparameter als Call-by-Reference zu übergeben (siehe [[Programmieren in C/C++: Zeiger#Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen]])
==== Rückgabewert aus Datentypsicht ====
Aus Datentypsicht kann der Funktionsname inkl. den Parameter(n) in einem Ausdruck mit dem Datentyp des Rückgabewertes der Funktion ausgetauscht werden:
<syntaxhighlight lang="C">
int foo(void) {return 4711;}
int var;
var=1+foo(); //Aus Datentypsicht (int)=(int)+(int)
</syntaxhighlight>
Daraus ergibt sich, dass bei Arrays/Strukturen/Unions direkt auf einzelne Komponenten zugegriffen werden kann, ohne diese zuvor einer Variablen zuzuweisen:
<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
if(foo(12).x == 12) printf("Identisch\n");
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
if(far(3)[2] == 2) printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <stdlib.h>
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
int main(int argc, char *argv[]) {
if(foo(12).x == 12)
printf("Identisch\n");
if(far(3)[2] == 2)
printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
==== Fehlerrückgabe ====
Viele Funktionen können unter gewissen Umständen nicht korrekt ausgeführt werden. Z.B. aufgrund dessen, dass:
* der benötigter Speicher vom Heap nicht bereitgestellt werden kann
* Übergabeparameter außerhalb des zulässigen Wertebereiches liegen
* angeforderte Ressource (Datei, Geräte, …) nicht vorhanden/verfügbar sind
Solche Fälle gilt es dem Aufrufer mitzuteilen, da in diesen Fällen die vom Aufrufer geforderte Funktionalität nicht erfüllt ist und der Aufrufer ggf. nicht weiterarbeiten kann. Zur Mitteilung des Fehlers sollte vorrangig der Rückgabewerte genutzt werden. (auch wenn in C++ mit Exception eine Alternative hierzu bereitsteht)
<syntaxhighlight lang="C">
char *strdup(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup1(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
int main(int argc, char *argv[]) {
char *dup=strdup1("hallo");
if(dup == NULL)
printf("Fehler\n");
else
printf("dup='%s'\n",dup);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Standard-C Library-Funktionen geben in diesem Fall zumeist ein -1 (Rückgabewert Ganzzahl) oder einen NULL-Zeiger (Rückgabewert Zeiger) zurück. Der genaue Fehlergrund ist dann ergänzend in der globalen Variablen errno gespeichert. Mittels der Standard-C Funktion strerror() kann die Zahl in einen für den Anwender/Programmierer lesbaren String umgewandelt werden (die GNU-C Library Funktion printf() bietet ergänzend den Conversion Spezifier %m als alternative Ausgabemöglichkeit an):
<syntaxhighlight lang="C">
#include <errno.h>
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY|O_CREAT|O_EXCL,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY{{!}}O_CREAT{{!}}O_EXCL,
S_IRUSR{{!}}S_IWUSR{{!}}S_IRGRP{{!}}S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'''Für eine sauber Programmierung sollte diese Methodik generell angewendet werden.''' Jede Funktion, welche Fehlschlagen kann, teilt dies per Rückgabewert dem Aufrufer mit. Der Rückgabewert einer jeden Funktion wird vom Aufrufer kontrolliert.
=== Main-Funktion ===
Mit Start der Anwendung übergibt das Betriebssystem die Kontrolle an die Anwendung und führt dort die Funktion main aus. Als Übergabe- und Rückgabeparameter sind folgende Varianten erlaubt:
<syntaxhighlight lang="C">
int main(void) { }
int main(int argc, char *argv[]) { }
</syntaxhighlight>
Mit dem Start der Anwendung kann, wie bei jedem Funktionsaufruf, Parameter an den startenden Prozess übergeben werden. Die Parameter werden als Array von Strings übergeben. Im Parameter argc ist die Anzahl der Strings enthalten. Im Parameter argv[0..argc-1] sind die einzelnen Strings enthalten. Sofern vorhanden ist im ersten String der Programmname/Aufrufname der Anwendung enthalten:
<syntaxhighlight lang="C">
int main(int argc, char *argv[]) {
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++)
printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int max_width=0;
int ret;
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++) {
ret=printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
max_width=ret>max_width ? ret : max_width;
}
//Trennzeichen drucken
char term[max_width];
memset(term,'-',max_width);
printf("%.*s\n",max_width-1,term);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Im Compiler-Explorer können die Parameter im Executor unter 'Execution Arguments', getrennt mit Leerzeichen eingegeben werden.
Wird die Funktion main beendet, entweder über die return Anweisung oder den Aufruf der exit() Funktion, wird die Kontrolle zurück an den startenden Prozess (zumeist Shell) gegeben. Über den Rückgabewert wird im Allgemeinen dem Aufrufer der Fehlerstatus mitgeteilt (EXIT_SUCCESS oder 0 bedeutet fehlerfreie , EXIT_FAILURE oder Werte ungleich 0 fehlerhafte Ausführung).
Hinweise:
* Der Return-Wert der main-Funktion kann mit >>echo $? in der Bash abgefragt werden
* Mittels <code>exit(int status)</code> kann das Programm an jeder Stelle innerhalb des Programms beendet werden. <code>status</code> entspricht dann der expression der return Anweisung von main()
* Ungeachtet des Rückgabedatentyps int bei der Defintion der main() Funktion beträgt der zulässige Wertebereich für Linux Anwendungen 0..255. Der korrekte Rückgabedatentyp der main() Funktion müsste somit 'unsigned char' lauten
=== Inline Funktion ===
Wie der Name inline andeutet, ist die Intention von Inline, dass die aufgerufen Funktion Bestandteil der aufrufenden Funktion ist. Die aufgerufene Funktion soll somit im Kontext des Aufrufers ausgeführt werden, so dass kein eigener Stack bereitgestellt werden muss. Der Start der Funktion kann somit schneller erfolgen:
<code>
inline int foo(void) { }
</code>
Das Funktionseinbindung/zusammenführung erfolgt durch den Compiler (und nicht durch den Linker). Damit das inline vom Compiler ausgeführt werden kann, muss die zu inlinende Funktion vor dem Aufruf definiert sein, d.h. sie muss in derselben C-Datei oder in einer der einzubindenden Header-Dateien enthalten sein [C11 6.7.4].
Hinweis:
* Das 'inlinen' von Funktionen über die eigene Objektdatei hinweg erfolgt in C/C++ über Link Time Optimization (LTO). Hierzu fügt der Compiler den Zwischencode mit in die Objektdatei, so dass der Linker das 'inlinen' vollziehen kann (siehe {{w|lang=en|Interprocedural_optimization| Interprocedural Optimization}})
=== Variadic Function / Ellipsis Punctuator ===
Mit dem Ellipsis Puncturator '…' kann in Funktionsdefinitionen angegebenen werden, dass an dieser Stelle beliebig viele Parameter/Argumente übergeben werden können. Dies wird unter anderen in der printf() Anweisung genutzt:
<syntaxhighlight lang="C">
int printf(const char *fmt, ... );
</syntaxhighlight>
Die wie folgt aufgerufen werden kann:
<syntaxhighlight lang="C">
printf("Hello World"); //es folgt kein Parameter
printf("%d",100); //es folgt ein Parameter vom Datentyp int
printf("%f",1.1); //es folgt ein Parameter vom Datentyp double
printf(conststr,1,2,3,"xyz") //Ohne Worte
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n"); //es folgt kein Parameter
printf("%d\n",100); //es folgt ein Parameter vom Datentyp int
printf("%f\n",1.1); //es folgt ein Parameter vom Datentyp double
const char *conststr="%d %x %c '%s'\n";
printf(conststr,1,2,33,"xyz"); //Ohne Worte
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei der Parameterübergabe wird der Datentyp nicht mit übergeben, so dass die aufgerufene Funktion keine Möglichkeit hat, den Datentype der Parameter zur Laufzeit zu ermitteln. Einzig werden bei Aufruf der variadischen Funktion so viel Bytes auf den Stack gelegt, wie der Datentyp der einzelnen Übergabeparameter groß ist:
:<code>int --> 4 Byte</code>
:<code>double --> 8 Bytes</code>
:<code>Zeiger --> 4/8 Byte</code>
Damit die aufgerufene Funktion die fehlende Datentypinformation dennoch mitgeteilt bekommt, erfolgt dies am Beispiel der printf Funktion über den Format-String:
<syntaxhighlight lang="C">
int vari;
printf("%d",vari); //%d erwartet einen Integer Übergabeparameter (4-Byte)
size_t vars;
printf(" %zu %d ", vars, vari); // %zu zur Mitteilung, dass anstatt
//integer nun size_t als Datentyp übergeben wird
//und somit anstatt 4 Bytes 8 Bytes vom Stack genommen werden
</syntaxhighlight>
<code>printf()</code> entnimmt entsprechend der Datentypbeschreibung im Formatstring die passende Anzahl an Bytes vom Stack.
Da der Compiler für die optionalen Parameter nicht den Zieldatentyp kennt, erlaubt die C-Spezifikation als Übergabedatentypen hier nur die Grunddatentypen <code>signed int, unsigned int, long, long long, double</code> und <code>Zeiger</code>. Entspricht der übergebene Parameter nicht einen dieser Datentypen, so wird er mittels implizit Cast entsprechend nachfolgender Tabelle gewandelt [C11 6.5.2.2 Default Argument Promotions]:
{| class="wikitable"
|-
! Ausgangstyp !! Umwandlungstyp
|-
| char, signed char, short || int
|-
| unsigned char, unsigned short || unsigned int
|-
| float || double
|-
| Alle anderen Datentypen || bleiben erhalten
|}
Bspw.:
<syntaxhighlight lang="C">
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Über den Length-Modifier Parameter im Formatstring kann printf mitgeteilt
//werden, dass von dem übergebenem Integerwert weniger Bytes zu
//interpretieren sind
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
Zum Umgang mit dem variadischen Parameter stellt C die Funktionen <code>va_start(), va_arg(), va_copy()</code> und <code>va_end()</code> bereit. Auf Grundlage des dazugehörigen Datentyps <code>va_list</code> können variadische Parameter auch an Unterfunktionen weitergereicht werden (bspw vprintf()). Dieses Thema bedingt jedoch genaue Kenntnisse vom Umgang mit dem Stack und ist nicht Bestandteil dieser Vorlesung.
=== Funktion in Funktion ===
Die GNU-C Reference (nicht C++) erlaubt es, Funktionen innerhalb von Blöcken (und damit innerhalb von Funktionen) zu definieren. Diese innere Funktion steht dann nur in diesem Block zur Verfügung und kann von außerhalb des Blockes nicht aufgerufen werden. Als Gimmick können Funktionen in Funktionen auf die zuvor definierten lokalen Variablen der inkludierenden Funktion zugreifen:
<syntaxhighlight lang="C">
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Variable Length Array (VLA) ==
Im Normalfall ergibt sich die Anzahl der Elemente eines Arrays aus einer Konstanten, so dass der Compiler zur Compilezeit passend Speicher reserviert (siehe Kap. [[Programmieren in C/C++: Array | Array]]):
<syntaxhighlight lang="C">
int arr[4]; //Compiler reserviert für Variable arr
//4*sizeof(int) Speicherplatz
</syntaxhighlight>
Bei Variable Lenght Array wird die Arraydimension nicht über eine Konstante, sondern über eine Variable oder einen Ausdruck angegeben. D.h. die tatsächliche Dimension des Arrays ergibt sich erst zum Ausführungszeitpunkt der Definition:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //Arraydimension ergibt sich zum Ausführungszeitpunkt
n++; //Nachträgliches Ändern von n ändert nicht
//die Größe des Arrays!
}
</syntaxhighlight>
Ein Variable Length Array kann nur als lokale Variable oder als Übergabeparameter definiert werden (wobei im letzteren Fall kein Speicher hiermit reserviert wird). Eine Initialisierung eines VLA's mit der Definition ist nicht möglich, d.h. nach der Definition beinhaltet das Array 'zufällige' Werte. Es empfiehlt sich daher, diese bspw. mit memset händisch zu initialisieren (siehe auch Kap [[Programmieren in C/C++: Array#Initialisierung | Array:Initialisierung]]):
<syntaxhighlight lang="C">
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
for(size_t lauf=0;lauf<n;lauf++)
printf("str[%zu]=%d\n",lauf,str[lauf]);
}
int main(int argc, char *argv[]) {
foo(4);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mittels sizeof kann weiterhin der Speicherbedarf ermittelt werden, wobei sizeof mit einem VLA als Argument kein Konstantenausdruck ist. Stattdessen wird die Größe zur Laufzeit ermittelt:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
printf("size=%zu\n",size);
}
int main(int argc, char *argv[]) {
foo(5);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
VLA wurden erstmals in C mit C99 eingeführt. In C11 wurden VLA's als optional eingestuft und mit C23 zurück auf notwendig gesetzt. In C++ sind VLA's nicht definiert, werden jedoch vom GCC Compiler unterstützt. Als alternativen Datentyp wird hier std::array empfohlen.
Hinweis:
* VLA sind nicht direkt in einem Switch-Case Block definierbar. Wird hier ein VLA benötigt, so muss hierzu ein Block erzeugt werden:
:<syntaxhighlight lang="C">
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int value=argc;
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Operatoren ==
In der Programmiersprache C sind folgende Punctuators [C11 6.4.6] definiert:
<syntaxhighlight>
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |= , # ##
<: :> <% %> %: %:%:
</syntaxhighlight>
Die Funktionalitäten sind identisch zu Java. Aufgrund des Datentyps Zeiger gibt es in C ergänzend den Punctuator <code>-></code> (siehe Kap [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++)|Datentypen:Verbundtyp Struktur/Klasse (nur C++)]]). Der Präprozessor bedingt die beiden Punctuatoren <code>#</code> und <code>##</code> (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]).
Die letzten 6 Punctuators <code><: :> <% %> %: %:%:</code> werden zu <code>[ ] { } # ##</code> ersetzt. Sie sind für Computersysteme gedacht, welche keine ALTGR-Taste besitzen.<br />
Java kennt ergänzend den <code>>>></code> Operatoren, welcher in C über den normalen Schiebebefehl und den zugrundeliegenden Datentyp gesteuert wird.
Wie in Java sind einige Punctuators vom Kontext abhängig und haben damit unterschiedliche Funktionalitäten:
<syntaxhighlight>
++ → (Postfix) ++ vs. ++(Präfix)
-- → (Postfix) -- vs. --(Präfix)
+/- → Vorzeichen vs. Addition/Subtraktion
() → Funktionsaufruf() vs. Befehlsbestandteil if() vs. Priorisierung
</syntaxhighlight>
Für den Umgang mit dem Datentyp Zeiger besitzen einige Punctuatoren ergänzende Funktionalitäten (siehe Kap [[Programmieren in C/C++: Zeiger| Zeiger]]):
<syntaxhighlight>
& → Bitweises UND:
Anwendung: Ganzahlausdruck & Ganzahlausdruck
& → Adressoperator:
Anwendung: &Variable
* → Multiplikation
Anwendung: Ganzahl-/Gleitkommaausdruck * Ganzahl-/Gleitkommaausdruck
* → Datentyp Zeiger
Anwendung: Datentyp * Variablenname;
* → Dereferenzierung:
Anwendung: * Zeiger
</syntaxhighlight>
Punctuatoren, welche von Java abweichende / ergänzende Funktionalitäten haben, werden nachfolgend gesondert beschrieben.
Sind in einer Anweisung mehrere Operatoren enthalten, so hängt die Abarbeitungsreihenfolge von der Rangfolge/Priorität der Operatoren ab (siehe [[Programmieren in C/C++: Grundlagen#Abarbeitungsreihenfolge | Abarbeitungsreihenfolge]]).<br />
Die Rangfolge ist identisch zu Java, wobei C mehr Operatoren kennt. Generell empfiehlt sich, lieber eine Klammer zu viel als zu wenig zusetzen. Klammern haben die höchste Priorität.
=== Zuweisungs-Operator ===
Die Zuweisung ('='-Operator, assignment expression) weist dem L-Value den R-Value zu.
Der Zuweisungs-Operator gibt den L-Value als Rückgabewert der Zuweisung zurück, so dass mehrere Zuweisungen in einem Ausdruck möglich sind. Die Abarbeitungsreihenfolge ist von rechts nach links (R-L Assoziativität). Wird der 'letzte' Rückgabewert nicht verwendet, so wird dieser verworfen (siehe Kap. [[Programmieren in C/C++: Grundlagen#Discarded Value / null statement | Discarded Value / null statement]]).<br />
Beispiel:
<syntaxhighlight lang="C">
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
//der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
//Compilerfehler geworfen wird
x*=y=z //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a,b,c=3,d=4;
int x,y,z;
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
; //der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
; //Compilerfehler geworfen wird
x*=y=z; //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen return 0;
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Auf beiden Seiten der Zuweisung muss der identische Datentyp stehen. Wenn andernfalls eine implizite Typkonvertierung nicht möglich ist, gibt der Compiler einen Fehler aus:
:<syntaxhighlight lang="C">
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
(void)b;
(void)c;
(void)d;
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
* Bei der Parameterübergabe beim Funktionsaufruf wird ebenfalls indirekt der Zuweisungs-Operator angewendet. Die Parameter des Aufrufers werden per Zuweisung den lokalen Variablen der aufgerufenen Funktion zugewiesen
:<syntaxhighlight lang="C">
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int main(int argc, char *argv[]) {
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
=== Komma-Operator ===
Der Komma-Operator erlaubt es, zwei Ausdrücke auszuführen, wo nur einer erlaubt wäre. Die Ergebnisse/Rückgabewerte aller durch diesen Operator verknüpften Ausdrücke, außer dem letzten werden verworfen. Der letzte Ausdruck dient als Rückgabewert.
Folgendes gilt es bei der Nutzung des Komma-Operators zu beachten:
* Der Komma-Operator wird von links nach rechts ausgewertet (L-R Assoziativität)
* Das Komma selbst stellt eine Sequence Point dar (siehe Kap [[Programmieren in C/C++: Grundlagen#Sequence Point|Sequence Point]])
* An Stellen, wo das Komma zum Syntax gehört (z.B. Trennung der Übergabeparameter bei der Funktionsdefinition und beim Funktionsaufruf, Trennung von Variablen bei der Variablendefinition/-deklaration, Trennung der enum Konstanten) muss der Ausdruck ergänzend geklammert werden, wenn der Komma-Operator gefordert ist
* Der Komma-Operator hat von allen Operatoren die niedrigste Priorität/Rangfolge, so dass dieser Operator als letztes 'ausgewertet' wird
Beispiel:
<syntaxhighlight lang="C">
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
int c=1,d=2,e=3;
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
void func(int value){}
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int value){
printf("func called with %d\n",value);
}
int main(int argc, char *argv[]) {
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
printf("a=%d\n",a);
int c=1,d=2,e=3;
printf("c=%d,d=%d,e=%d\n",c,d,e);
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
printf("c=%d,f=%d\n",c,f);
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'Sinnvolle' Anwendungsbeispiele:
* Bei For-Schleifen, so dass mehrere Variablen initialisiert und mehrere Variablen mit jedem Schleifendurchlauf geändert werden können:
:<syntaxhighlight lang="C">
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf]);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf])
printf("sum=%d lauf=%d\n",sum,lauf);
printf("sum=%d\n",sum);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der Return-Anweisung, bei welcher zur Darstellung der Zusammengehörigkeit mehrere Aktionen ausgeführt werden sollen:
:<syntaxhighlight lang="C">
return errno=EINVAL,-1;
return printf("Fehler"),-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <errno.h>
int foo(void) {
return errno=EINVAL,-1;
}
int far(void) {
return printf("Fehler\n"),-1;
}
int main(int argc, char *argv[]) {
printf("foo()=%d\n",foo());
printf("far()=%d\n",far());
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* An Stellen, wo nur eine Anweisung erlaubt ist (und man zu faul ist, einen Block zu öffnen)
:<syntaxhighlight lang="C">
if(…) y=2,z=3;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int y=0,z=0;
if(1) y=2,z=3;
printf("y=%d z=%d\n",y,z);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In vielen Ländern wird das Komma zur Darstellung von Gleitkommazahlen genutzt. Wird versehentlicher Weise dies in C/C++ übernommen, so führt dies zu einem unerwarteten Verhalten:
:<syntaxhighlight lang="C">
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
printf("var=%f\n",var);
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
printf("var=%f\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== ?-Operator / Conditional-Operator ===
Operator mit 3 Operanden, welcher in Abhängigkeit des ersten Ausdruckes den zweiten oder dritten Ausdruck ausführt und dessen Rückgabewert zurückgibt.
<code>
Syntax: Logical-OR-expression ? expression : condition-expression
</code>
Entspricht der if()-Anweisung, wobei der ?-Operator als solches einen Wert zurückgibt! <code>Expression</code> wird nur ausgeführt, wenn <code>Logical-OR-Expression</code> zu true ausgewertet wird. Andernfalls wird <code>condition-expression</code> ausgeführt. Der zurückgegebene Datentyp ergibt sich aus der <code>expression</code> resp. <code>condition-expression</code>. '''Beide Ausdrücke sollten somit einen identischen resultierenden Datentyp besitzen!'''
Folgendes gilt es bei der Nutzung des ?-Operators zu beachten:
* Der Datentyp <code>expression</code> und <code>condition-expression</code> sollte identisch sein:
<syntaxhighlight lang="C">
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Nach der GNU-C Reference kann der mittlere Ausdruck fehlen. In diesem Fall wird stattdessen das Ergebnis des linken Operanden dort eingesetzt (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)
<syntaxhighlight lang="C">
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
printf("b=%d\n",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* In der Abarbeitungsreihenfolge liegt der ?-Operator oberhalb der Komma- und des Zuweisungsoperators. Soll im <code>condition-expresion</code> Ausdruck der Komma- oder Zuweisung-Operator genutzt werden, so ist <code>condition-expression</code> zu klammern. Andernfalls bedingt die niedrige Priorität des Komma-Operators ein anders Verhalten, als erwartet:
<syntaxhighlight lang="C">
int a=7,max=5,var;
max=a>max ? a : max; //Alles bestens
var= a>5 ? a++,5:6; //Alles bestens
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=7;
int max=5;
max=a>max ? a : max; //Alles bestens
printf("max=%d\n",max);
int var;
var= a>5 ? a++,5:6; //Alles bestens
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
printf("var=%d a=%d\n",var,a);
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
printf("var=%d a=%d\n",var,a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Nutzung des ?-Operators empfiehlt sich an diversen Stellen:
* Bei Makros:
:<syntaxhighlight lang="C">
#define MAX(a,b) (a>b?a:b)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
int main(int argc, char *argv[]) {
printf("MAX(4,5)=%d\n",MAX(4,5));
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Beim Fehlerhandling:
:<syntaxhighlight lang="C">
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion ausgeführt wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn ret==0 ist
//andernfalls wird ret zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 0;
}
int init2(void) {
printf("init2() called\n");
return 0;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn Ret==0 ist
//andernfalls wird Ret zurückgegeben
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Logische Verknüpfungen ===
Alle logischen Operationen nutzen als Operanden Ganzzahlen ,Gleitkommazahlen oder Zeiger. Der Operand wird als false angesehen, wenn der Operand 0, 0.0 oder NULL ist. Andernfalls als true. Das Ergebnis ist immer vom Datentyp int und hat den Wert von 0 oder 1.
<code>Syntax: Expression && Expression</code><br />
<code>Syntax: Expression || Expression</code><br />
<code>Syntax: ! Expression</code><br/>
Bei der logischen UND und ODER Verknüpfung wird zuerst der linke Ausdruck ausgewertet (Operator ist ein Sequence Point). Der rechte Ausdruck wird nur ausgeführt, wenn:
* bei der logischen UND Verknüpfung der linke Ausdruck TRUE ergab
* bei der logische OR Verknüpfung der linke Ausdruck FALSE ergab
Andernfalls steht das Ergebnis schon mit der Auswertung des linken Operanden fest.<br />
In der theoretischen Informatik wird dies 'Non-strict-evaluation' genannt, bei welcher der Rückgabewert feststeht, bevor alle Ausdrücke bearbeitet worden sind.
Beispiel für das Verhalten des Ausbleibens der Auswertung des zweiten Operators:
<syntaxhighlight lang="C">
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a || ++a)
b=1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a {{!}}{{!}} ++a)
b=1;
printf("a=%d b=%d\n",a,b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Diese Funktionalität ist insbesondere beim Umgang mit Fehlern vorteilhaft:
* Prüfen, ob eine Variable einen gültigen Wert hat, bevor sie weiterverwendet wird
<syntaxhighlight lang="C">
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
else
printf("Kein Substring im String gefunden\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion aufgerufen wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 1;
}
int init2(void) {
printf("init1() called\n");
return 1;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Bitweise Verknüpfungen ===
Alle bitweisen Operationen nutzen als Operanden Ganzzahlen. Bei vorzeichenbehafteten Zahlen ist das Ergebnis nach [C11 6.5] Implementierungsabhängig, wobei das Vorzeichenbit zumeist als eigenständiges Bit angesehen wird und bei UND/ODER/EXOR als normales BIT betrachtet wird.
<code>Syntax: Ganzzahl & Ganzzahl → Bitweise UND Operation</code><br />
<code>Syntax: Ganzzahl | Ganzzahl → Bitweise ODER Operation</code><br />
<code>Syntax: Ganzzahl ^ Ganzzahl → Bitweise EXOR Operation</code><br />
<code>Syntax: ~ Ganzzahl → Bitweise Negierung</code><br />
<code>Syntax: Ganzzahl >> additive-expression</code><br />
<code>Syntax: Ganzzahl << additive-expression</code><br />
Mittels des Schiebeoperators können '''Ganzzahlen''' um <code>additive-expression</code> bitweise nach Links <code><<</code> oder Rechts <code>>></code> verschoben werden. Der resultierende Datentyp ergibt sich aus dem linken Operanden. Der rechte Operand muss positiv und der Wert kleiner gleich der Bitbreite des linken Operanden sein. Andernfalls ist das Ergebnis implementierungsspezifisch.
Nach [C11 6.5.7] ist das Ergebnis der Schiebeoperation implementierungsspezifisch, wenn der linke Operand eine negative vorzeichenbehaftete Zahl ist. In der Regel wendet der Compiler jedoch folgende Schiebeoperation an:
* Logisches Schieben (zu füllende Bit-Stellen werden mit 0 aufgefüllt), wenn der linke Operand einen vorzeichenlosen Datentyp hat
* Arithmetisches Schieben (zu füllende Bit-Stelle beim Rechtsschieben wird mit dem Vorzeichenbit aufgefüllt), wenn der linke Operand ein vorzeichenbehaftete Datentyp ist. Hiermit wird das Vorzeichen beibehalten, so dass eine negative Zahl nach dem Schieben weiterhin negativ ist (In Java erfolgt dies durch den >>> - Operator)
Hinweis:
* Ein Schieben um eine Stelle nach rechts entspricht einer Division durch 2
* Ein Schieben um eine Stelle nach links entspricht einer Multiplikation mit 2
=== sizeof-Operator ===
Der sizeof-Operator dient zur Ermittlung des Speicherbedarfs (in Bytes) einer Variablen/eines Datentyps.
<code>Syntax: sizeof (type-name)</code><br />
<code>Syntax: sizeof unary-expression</code><br />
Als Argument für den Sizeof-Operator kann wahlweise ein Datentyp, eine Variable oder ein Ausdruck genutzt werden. Sizeof gilt als Konstantenausdruck, d.h. seine Berechnung erfolgt durch den Compiler, sodass:
* sizeof zur Initialisierung von globalen Variablen genutzt werden
:<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz); //3*sizeof(int)=12
int main(int argc, char *argv[]) {
printf("size=%zu\n",size);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* bei einem Ausdruck dieser nicht ausgeführt wird, sondern nur der resultierende Datentyp bestimmt wird und dessen Größe zurückgegeben
:<syntaxhighlight lang="C">
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der resultierende Datentyp des Rückgabewertes ist size_t.
Es empfiehlt sich, den sizeof-Operator mit Klammern zu nutzen, andernfalls wird im Falle eines Ausdruckes der Speicherbedarf des linken Operanden angegeben:
<syntaxhighlight lang="C">
size_t size;
short var;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
size_t size;
short var=0;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
printf("size=%zu var=%d\n",size,var);
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* sizeof angewendet auf char gibt immer den Wert 1 zurück.
* sizeof ist nicht auf Operanden vom Typ Funktion, void, Felder ohne Größenangabe und Bitfelder anwendbar
* wird sizeof auf ein VLA angewendet, so entspricht sizeof nicht mehr einen Konstantenausdruck, sondern einem Funktionsaufruf
:<syntaxhighlight lang="C">
void foo(int n) {
int arr[n];
size_t size=sizeof(arr); //Speicherbedarf ist kein Konstantenausdruck
//sondern wird zur Laufzeit berechnet
</syntaxhighlight>
* Sizeof entspricht nicht strlen(), da sizeof den für die Variable reservierten Speicherbereich zurückgibt und nicht wie strlen() den Inhalt des Speicher hinsichtlich des Stringendezeichens auswertet.
:<syntaxhighlight lang="C">
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Anweisungen ==
=== If-Anweisung ===
<code>Syntax: if (expression) statement</code><br />
<code>Syntax: if (expression) statement else statement</code><br />
Das Ergebnis des Ausdruckes (Ganzzahl, Gleitkommazahl oder Zeiger) wird auf ungleich 0, 0.0 oder NULL getestet. Trifft dies zu, so wird statement ausgeführt. Andernfalls wird das else statement ausgeführt, sofern vorhanden. Sollen mehrere Anweisungen ausgeführt werden, so sind diese mittels Block zusammenzufassen (diesen dann bitte nicht mit ; abschließen).
Beispiel:
<syntaxhighlight lang="C">
if(a==1)
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
if(a) //entspricht a!=0
if(printf("hallo")<0) //prüfen, ob printf() fehlschlägt
if( ({int dummy=a;a=b;b=dummy;})==6)
if(a=7) //Zuweisung!
if(7=a) //KO, Eine Konstante kann kein L-Value sein
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1,b=2;
if(a==1)
printf("a==1\n");
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
printf("a=1\n");
if(a) //entspricht a!=0
printf("a\n");
if(printf("hallo\n")<0) //prüfen, ob printf() fehlschlägt
printf("printf()\n");
if( ({int dummy=a;a=b;b=dummy;})==6)
printf("({...})\n");
if(a=7) //Zuweisung!
printf("a=7\n");
if(7=a) //KO, Eine Konstante kann kein L-Value sein
;
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei der Anweisung <code>if(a==7)</code> finden aus syntaktischer Sicht zwei Aktionen statt. Zunächst wird geprüft, ob a gleich 7 ist. Dieser Vergleich liefert true(=1) oder false(=0) zurück. Die If-Anweisung prüft im Anschluss, ob das Argument true oder false ist.
=== For-Anweisung ===
<code>Syntax: for(Initialisierungsteil<sub>OPT</sub> ; Test<sub>OPT</sub> ; Fortsetzung<sub>OPT</sub>) Statement</code>
Die For-Anweisung wird vom Compiler wie folgt umgesetzt:
<poem> '''Initialisierungsteil'''<sub>OPT</sub>
Goto Next
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
'''Statement'''
Continue:
'''Fortsetzung'''<sub>OPT</sub>
Next:
if('''Test'''<sub>OPT</sub>) goto Goon
Break:
</poem>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
for(summe=lauf=0;lauf<20;lauf++)
summe+=lauf;
printf("summe=%d\n",summe);
//Initialisierungsteil
summe=lauf=0;
goto Next;
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
//Statement
summe+=lauf;
Continue: __attribute__((unused))
//Fortsetzung
lauf++;
Next:
//if(TestOPT) goto Goon
if(lauf<20) goto Goon;
Break: __attribute__((unused))
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die einzelne Elemente haben folgende Bedeutung/Besonderheiten:
;Initialisierungsteil: Zum Initialisieren von Schleifenvariablen, wird einmalig mit Beginn der FOR-Anweisung ausgeführt.
:* kann Leer sein, dann erfolgt keine Initialisierung
:* Ab C99: Hier kann eine lokale Variable definiert werden, welche nur innerhalb dieser For-Anweisung gültig ist
;Testteil: Hierin wird vor jedem Schleifendurchlauf geprüft, ob die Schleifenbedingung erfüllt ist. Wenn Bedingung nicht erfüllt ist (Ganzzahl, Gleitkommazahl oder Zeiger gleich 0,0.0 oder NULL), wird die For-Schleife beendet.
:* Kann leer sein, dann wird dieser Teil als true angesehen
;Fortsetzungsteil: Wird nach jeden Schleifendurchlauf ausgeführt. In der Regel sollte hier die Schleifenvariable aktualisiert werden
:* Kann leer sein
;Statement: In der Schleife auszuführender Ausdruck
:* Sollen mehrere Ausdrücke ausgeführt werden, so sind diese in einem Block zusammen zu fassen.
:Ergänzende Anweisungen innerhalb des Statements/Block
:* 'continue' zum Fortsetzen des Schleifendurchlaufes, d.h. Sprung zum Fortsetzungs-Teil
:* 'break', zum Beenden des Schleifendurchlaufes
Beispiele:
* For-Schleife mit lokaler Schleifenvariable
:<syntaxhighlight lang="C">
char string[]="hallo";
for(size_t lauf=0; lauf < strlen(string); lauf++)
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife mit Break-Anweisung
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
printf("lauf=%zu\n",lauf);
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife, bei welcher die gesamte Aktion innerhalb der For-Anweisung ausgeführt wird
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;
src[l]!=0 && l <sizeof(dest);
printf("l=%zu\n",l),dest[l]=src[l],l++);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;src[l]!=0 && l <sizeof(dest); printf("l=%zu\n",l),dest[l]=src[l],l++);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleifenvariable muss keine Zählvariable sein
:<syntaxhighlight lang="C">
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
printf("Anzahl Einsen in %b = %d\n",zahl,bits);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zeiger als Schleifenvariable
:<syntaxhighlight lang="C">
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
printf("src='%s' dst='%s'\n",src,dst);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Zur Geschwindigkeitsoptimierung sollten im Test- und Fortsetzungsteil keine Funktionsaufrufe mit Werten enthalten sein, die sich innerhalb der Schleife nicht ändern:
:<syntaxhighlight lang="C">
for(size_t lauf=0;lauf<strlen("hallo");lauf++)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zur Geschwindigkeitssteigerung sollte im Testteil auf 0 abgefragt werden, d.h. die Schleifenvariable dekrementiert werden
:<syntaxhighlight lang="C">
for(int lauf=700000;lauf;lauf--)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(ssize_t lauf=700000000;lauf;lauf--)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
for(ssize_t lauf=0;lauf<700000000;lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Alternativ zu einer Laufvariablen empfiehlt sich die Nutzung von Pointer als Schleifenvariable;
:<syntaxhighlight lang="C">
for(char *ptr=str; *ptr; ptr++);
</syntaxhighlight>
=== While-Anweisung ===
<code>Syntax: while(expression) Statement </code><br />
<code>Syntax: do Statement while(expression);</code><br />
Die While-Anweisungen werden vom Compiler wie folgt umgesetzt:
{| class="wikitable"
! while()-Anweisung !! do while()-Anweisung
|-
| <poem>
Continue:
if(!'''expression''')
goto Break
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
'''Statement'''
goto Continue
Break:
</poem> ||
<poem>
GoOn:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
'''Statement'''
Continue:
if('''expression''')
goto GoOn
Break:
</poem>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
lauf=summe=0;
while(lauf<10) {
if(lauf>=5)
break;
lauf++;
if(lauf<3)
continue;
summe+=lauf;
}
printf("summe=%d\n",summe);
lauf=summe=0;
Continue1:
if(!(lauf<10))
goto Break1;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
//Statement
if(lauf>=5) {
goto Break1;
}
lauf++;
if(lauf<3)
goto Continue1;
summe+=lauf;
goto Continue1;
Break1:
printf("summe=%d\n",summe);
lauf=summe=0;
do {
lauf++;
if(lauf>5)
break;
if(lauf<3)
continue;
summe+=lauf;
} while(lauf<10);
printf("summe=%d\n",summe);
lauf=summe=0;
GoOn2:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
//Statement
lauf++;
if(lauf>5)
goto Break2;
if(lauf<3)
goto Continue2;
summe+=lauf;
Continue2:
if(lauf<10)
goto GoOn2;
Break2: __attribute__((unused));
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Folgendes gilt es bei der Nutzung der While-Anweisung zu beachten:
* Soll mehr als ein Statement innerhalb der While-Schleife ausgeführt werden, so sind diese in einem Block zu schreiben
* Statement kann eine Leeranweisung (gekennzeichnet durch ein Semikolon) sein
:<syntaxhighlight lang="C">
while(1);
do ; while(1);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf1=1000;
while(lauf1--);
int lauf2=1000;
do ; while(lauf2--);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der do-While-Schleife ist das abschließende Semikolon Bestandteil des Befehls
* expression muss eine Ganzzahl, Gleitkommazahl oder Zeiger zurückgeben, der bei False (0, 0.0 oder NULL) die Schleife beendet.
Beispiele:
* Endlosschleife
:<syntaxhighlight lang="C">
while(1) {}
</syntaxhighlight>
* Schleife zum Durchlaufen eines String
:<syntaxhighlight lang="C">
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
printf("Stringlänge=%zu\n",len);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Switch-Anweisung ===
<code>Syntax: switch(expression) statement</code><br />
<code>Syntax: statement:= case constant-expression: statement<sub>opt</sub> default: statement<sub>opt</sub></code><br />
Die Switch-Anweisung entspricht einer verschachtelten If-Anweisung, mit der Besonderheit, dass der auszuführende Code nicht im If-Zweig stattfindet, sondern dort ein goto zum eigentlichen Code enthalten ist:
{| class="wikitable"
! Switch-Anweisung !! Compilerumsetzung
|-
|<syntaxhighlight lang="C">
switch(a) {
case 1:
int a=7;
//Code
break;
case 2:
printf("%d",a);
case 3: {
int a;
//Code
}
case 4 ... 8:
default:
//Code
}
</syntaxhighlight>
||<poem>
if(a==1)
goto label1;
else if(a==2)
goto label2;
else
goto label_default;
//-------------------
label1:
//Code
goto label_break;
label2:
//Code
label_default:
goto label_break;
label_break:
</poem>
|}
Folgendes gilt es bei der Nutzung der Switch-Anweisung zu beachten:
* <code>Expression</code> muss zu einer Ganzzahl (int, short, char, long, long long) oder enum (entspricht einer Ganzzahl) ausgewertet werden
* <code>constant-expression</code> muss eine Ganzzahl-Konstante oder ein Enumelement sein. Sie darf nicht doppelt im Block vorkommen. Der genaue Datentyp ergibt sich aus dem Datentyp der <code>expression</code>
* Lt. Spezifikation ist ein nur <code>statement</code> hinter der switch-Anweisung erlaubt, so dass nur ein <code>case</code> Fall oder der <code>default</code> Fall bedient werden kann::<syntaxhighlight lang="C">
int var=1;
switch(var) case 1: printf("hallo");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) case 1: printf("hallo");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweifte Klammer der <code>switch</code>-Anweisung erzeugt einen Block, so dass a) hier mehrere <code>case</code>-Fälle und b) hierin definierte Variablen innerhalb des gesamten Blocks zur Verfügung stehen (sind somit nicht <code>case</code> abhängig). Die <code>case</code> Anweisung ist nichts anderes als eine Sprungmarken (welche durch die switch-Anweisung angesprungen wird) so dass der Initialisierungsteil der lokalen Variablen übersprungen / nicht ausgeführt werden kann:
:<syntaxhighlight lang="C">
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("%d %d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
break;
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1;
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("a=%d b=%d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
(void)a;
break;
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* GNU-C (siehe [https://www.gnu.org/software/c-intro-and-ref/manual/html_node/switch-Statement.html Switch-Statement]) erlaubt ergänzend zur Angabe einer Konstante die Angabe eines Wertebereiches:
:<syntaxhighlight lang="C">
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=2;
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
printf("a im Bereich von 1 bis 8\n");
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* <code>break</code> ist optional. Mittels <code>break</code> wird an das Ende der Switch-Anweisung gesprungen. Wenn <code>break</code> weggelassen wird, wird die nachfolgende Anweisungen ausgeführt. Ggf. gibt der Compiler eine Warning aus. Mittels der GCC-Compiler-Anweisung __attribute__((fallthrough)); kann diese Warning unterdrückt werden:
:<syntaxhighlight lang="C">
switch(a) {
case 0: //ggf. Compiler-Warning
__attribute__((fallthrough)); case 1:
case 2:
break;
}
</syntaxhighlight>
* Ein Variable Length Array ist als Variable im Switch-Block direkt nicht erlaubt. Ist dies notwendig, so ist das VLA in einem inneren Block zu kapseln:
:<syntaxhighlight lang="C">
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Case - Anweisungen sind nichts anderes als Sprungmarken (Labels), so dass CASE-Anweisungen überall innerhalb des Switch-Blockes stehen können:
:<syntaxhighlight lang="C">
int prime(int value) {return value+1;}
void hallo(int var) {
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int prime(int value) {
return value+1;
}
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:oder anderen Anweisungen innerhalb des Switch-Blockes enthalten sein können:
:<syntaxhighlight lang="C">
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++;
case 7: *dst = *src++;
case 6: *dst = *src++;
case 5: *dst = *src++;
case 4: *dst = *src++;
case 3: *dst = *src++;
case 2: *dst = *src++;
case 1: *dst = *src++;
}while(--n>0);
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h> //fuer uintptr_t
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++; printf("%02hhx ",*dst);
case 7: *dst = *src++; printf("%02hhx ",*dst);
case 6: *dst = *src++; printf("%02hhx ",*dst);
case 5: *dst = *src++; printf("%02hhx ",*dst);
case 4: *dst = *src++; printf("%02hhx ",*dst);
case 3: *dst = *src++; printf("%02hhx ",*dst);
case 2: *dst = *src++; printf("%02hhx ",*dst);
case 1: *dst = *src++; printf("%02hhx ",*dst);
}while(--n>0);
}
}
int main(int argc, char *argv[])
{
char src[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char dst;
send(&dst,src,20);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Eine Switch-Case Anweisung über Strings sind in C/C++ nicht möglich:
:<syntaxhighlight lang="C">
switch(str) {
case "hallo":
return 1;
case "du da":
return 2;
case "xyz":
return 3;
default:
rReturn -1;
}
</syntaxhighlight>
:Ein direkte Lösungsansatz ist die Nutzung von strcmp() zum Vergleichen von String. Da strcmp zeichenweise den String vergleicht, ist dieser Ansatz langsam. Alternativ bietet sich an, von allen String einen Hash-Wert zu berechnen und zunächst diesen Hash-Wert zu kontrollieren. Da der Hash-Wert nicht eindeutig ist, muss ergänzend ein strcmp() erfolgen:
:<syntaxhighlight lang="C">
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h>
//Lösungsansatz von: https://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
#define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
#define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
#define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
#define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
#define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
#define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
#define HASH_LAUFZEIT(s) (H256(s,0,0))
//Eigener Lösungsatz zur Umsetzung des vorherigen HASH-Algorithmus
//so dass dieser zur Compilezeit berechnet werden kann
//Was fehlt ist die abschließende EXOR berechnung!
//Problem war, dass die Array-Dereferenzierung nicht zur Compilezeit
//aufelöst werden kann
#define HH0(a,x) (x*65599u+a)
#define HH1(a) HH0(a,HH0(0,HH0(0,HH0(0,0))))
#define HH2(a,b) HH0(b,HH0(a,HH0(0,HH0(0,0))))
#define HH3(a,b,c) HH0(c,HH0(b,HH0(a,HH0(0,0))))
#define HH4(a,b,c,d) HH0(d,HH0(c,HH0(b,HH0(a,0))))
#define HH4x(a,b,c,d,x) HH0(d,HH0(c,HH0(b,HH0(a,x))))
#define HH5(a,b,c,d,e) HH4x(b,c,d,e,HH4x(0,0,0,a,0))
#define HH6(a,b,c,d,e,f) HH4x(c,d,e,f,HH4x(0,0,a,b,0))
#define HH7(a,b,c,d,e,f,g) HH4x(d,e,f,g,HH4x(0,a,b,c,0))
#define HH8(a,b,c,d,e,f,g,h) HH4x(e,f,g,h,HH4x(a,b,c,d,0))
#define HH9(a,b,c,d,e,f,g,h,i) HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0)))
#define HH10(a,b,c,d,e,f,g,h,i,j) HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0)))
#define HH11(a,b,c,d,e,f,g,h,i,j,k) HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0)))
#define HH12(a,b,c,d,e,f,g,h,i,j,k,l) HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0)))
#define HH13(a,b,c,d,e,f,g,h,i,j,k,l,m) HH4x(j,k,l,m,HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0))))
#define HH14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) HH4x(k,l,m,n,HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0))))
#define HH15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) HH4x(l,m,n,o,HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0))))
#define HH16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) HH4x(m,n,o,p,HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0))))
#define EIGHTEENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \
a11,a12,a13,a14,a15,a16,a17,a18, ...) a18
#define CONCAT(c,d) c ## d
#define CONCATI(a,b) CONCAT(a,b)
#define HASH_COMPILEZEIT(...) CONCATI(HH , EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0))(__VA_ARGS__)
//Lösungsansatz basierend auf: https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/preprocessor/macros/__VA_ARGS__/count-arguments
#define COUNT_ARGUMENTS(...) EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main(int argc, char *argv[]) {
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:Siehe:[https://benhoyt.com/writings/hash-table-in-c/ Hash Table in C]
== Label + Goto ==
=== Label ===
<code>Syntax: name:</code><br />
Labels dienen zur Kennzeichnung einer Anweisung, so dass die Programmausführung an dieser Stelle fortgesetzt, resp. mit einer GOTO-Anweisung angesprungen werden kann. Ein Label ist durch den folgenden Doppelpunkt gekennzeichnet. Dem Label muss eine Anweisung folgen, welches auch eine Leeranweisung (Semikolon) sein kann.
Folgendes gilt es bei der Nutzung von Labels zu beachten:
* Ein Label entspricht der Speicheradresse des der Label-Anweisung folgenden Anweisung
* Bei nicht genutzten Labels (mit goto nicht angesprungene Labels) gibt der Compiler eine Warning aus. Diese kann beim GCC-Compiler mit __attribute__((unused)) unterdrückt werden
* die Case- und die Default-Anweisung aus der Switch-Anweisung entspricht einem Label
<br />
Labels hat eine funktionsweite Sichtbarkeit (siehe Kap [[#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]). Dies bedeutet, dass das:
* Labels nur innerhalb einer Funktion gültig ist
* Labels einen von Variablen/Funktionen/Datentypen unabhängigen Namensraum haben
* Kein Prototyp für ein Label notwendig ist, wenn es bei Nutzung über goto noch nicht gesetzt worden ist, also nach vorne gesprungen wird
=== goto ===
<code>Syntax: goto label;</code><br />
Mit der Goto-Anweisung wird die Programmausführung an der mit <code>label</code> gekennzeichneten Stelle fortgesetzt.
Folgendes gilt es bei der Nutzung von goto zu beachten:
* Mit einer <code>goto</code> Anweisung kann an eine beliebige Steller innerhalb der '''identischen''' Funktion gesprungen werden. Es kann nicht zu einem Label in einer anderen Funktion gesprungen werden (hierzu ist <code>setjmp()</code> und <code>longjmp()</code> zu nutzen)
* Mit der Goto Anweisung kann gleichermaßen in einen Block hinein, als auch herausgesprungen werden:
:<syntaxhighlight lang="C">
goto first_time;
for(;;) {
if(a>10)
goto last_time:
first_time:
a++;
}
last_time: ;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0;
goto first_time;
for(;;) {
printf("a=%d\n",a);
if(a>10)
goto last_time;
first_time:
a++;
}
last_time: ; //Leeranweisung wäre hier nicht nötig
return 0; //da dem Label ein return folgt!
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Wird mit der <code>goto</code> Anweisung der Initialisierungsteil einer Variablen übersprungen, so ist zwar die Variable existent, beinhaltet aber nicht ihren Initialisierungswert
Beispiel:
<syntaxhighlight lang="C">
goto label1;
if(a==3) {
label2:
printf("True\n");
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=3;
goto label1;
if(a==3) {
label2:
printf("True\n");
a++;
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In Java gibt es das Schlüsselwort goto, welches aber ohne Funktion ist. Es gibt jedoch Labels, die mit "break label" angesprungen werden können
=== Anwendungsbeispiele ===
Prinzipiell sind Goto-Anweisungen zu vermeiden. In einigen Anwendungsfällen erweist sich goto als nützlich:
* Nutzung nur einer <code>return</code> Anweisung in einer Funktionen
:<syntaxhighlight lang="C">
#include <unistd.h>
int input(int hdl,size_t buflen) {
int rc=-1;
unsigned char packettype;
if(read(hdl,&packettype,1) != 1)
goto exit;
unsigned short packetlen;
if(read(hdl,&packetlen,2) != 2)
goto exit;
if((1+packetlen) > buflen) {
rc=-2;
goto exit;
}
rc=packetlen;
exit:
return rc;
}
</syntaxhighlight>
* Konstruktor mit mehreren Initialisierungsteilen
:<syntaxhighlight lang="C">
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Abbruch einer verschachtelten Schleife
:<syntaxhighlight lang="C">
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Sonstiges ==
=== ??-Trigraphs ===
Zeichenfolge bestehend aus 3 Zeichen beginnend mit 2 Fragezeichen.
Die beiden Fragezeichen entsprechen einem ESCAPE-Operator (siehe Kap [[#Char-Konstanten|Char-Konstanten]]), welcher das nachfolgende Zeichen durch ein anderes ASCII Zeichen ersetzt. Die Ersetzung findet auch innerhalb von Strings statt.<br />
Trigraphs wurden früher genutzt, als die ALTGR Taste noch nicht üblich war.
<syntaxhighlight>
??< → { ??> → }
??( → [ ??) → ]
??/ → \ ??! → |
??' → ^ ??- → ~
??= → #
</syntaxhighlight>
Bei neuer C Varianten muss zur Nutzung von Trigraphs der Compiler mittels -trigraphs aktiviert werden.
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
lnkwaqzl3jq05rr1dg8696abyxena4i
1090663
1090662
2026-09-10T12:30:03Z
D. Justen
102048
Formulierung geändert
1090663
wikitext
text/x-wiki
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
<!-- Falls du ein automatisch erstelltes Inhaltsverzeichnis nicht willst, ersetze das nachfolgende TOC durch NOTOC -->
<!-- Einklammerung mit noinclude, damit dieses nicht in der Druckversion erscheint -->
<noinclude>__TOC__</noinclude>
Die Programmiersprache C/C++ beinhaltet mehrere Sprachen/ Syntaxen:
* C-Syntax
* Präprozessor-Syntax
* Printf/Scanf Formatstring Syntax
* Terminal Emulation
* Compiler/Linker Anweisungen
Letztere beiden werden nur rudimentär in dieser Vorlesung/diesem Skript behandelt. Alle anderen sind Bestandteil dieser Vorlesung.
In diesem Kapitel sollen zunächst allgemeine Eigenschaften der Sprache, der grundlegende Syntax und die Kontrollstrukturen erklärt werden. Bei vielen Erklärungen sind Code-Beispiele vorhanden. Da man aus Fehlern am meisten lernt, sind zum Teil auch negative Beispiele enthalten. Für ein besseres Verständnis empfiehlt es sich, Code-Beispiele selbst nachzuvollziehen.<br />
Sofern sich die Eigenschaften auf eine bestimmte C-/C++- oder Compiler-Version beziehen, wird dies gesondert vermerkt.
== Zeichensatz ==
Der Syntax von C nutzt die unteren 128 Zeichen des ASCII Zeichensatzes. Da UTF-8 in den ersten 128 Zeichen deckungsgleich zu ASCII ist, kann auch dieser zur Erstellung des Source Codes genutzt werden.
Zeichen außerhalb dieses gültigen Zeichensatzes können folglich nur in Strings oder Kommentaren vorkommen. Werden Zeichen außerhalb der unteren 128 Zeichen in Strings genutzt, so gilt Folgendes zu berücksichtigen:
* Die String-Funktionalitäten der Standard-C Library gehen von dem regulären ASCII Zeichensatz aus, so dass z.B. die Suche, der Vergleich oder die Konvertierung fehlschlagen kann
* Strings werden oftmals in Verbindung mit printf() genutzt, d.h. auf der Standardausgabe ausgegeben. Der verwendete Zeichensatz sollte hier identisch zum verwendeten Zeichensatz der Terminal-Emulation sein!
== Kommentarzeichen ==
Kommentare dienen dazu, den Source Code mit zusätzlichen Hinweisen zu versehen, so dass die Intension der Anweisungen sichtbar wird. Kommentarzeichen werden durch den Compiler vor dem eigentlichen Übersetzungsdurchlauf entfernt und durch ein Leerzeichen ersetzt [C11 6.4.9]. Innerhalb von Strings wird nicht nach Kommentarzeichen gesucht.
<code>
Syntax: /* */
</code>
Blockkommentar zum Kommentieren eines Bereiches, auch über mehrere Zeilen hinweg. Dieses Kommentarzeichen kann nicht verschachtelt werden, d.h. '*/' beendet die Kommentierung, unabhängig von der Anzahl der zuvor geöffneten Kommentierungen!
<code>
Syntax: //
</code>
Zeilenkommentar zum Kommentieren bis zum Zeilenende (wurde in der Programmiersprache BCPL definiert, aber nicht von C, sondern erst von C++ übernommen).
Sollen größere Bereiche auskommentiert werden, so empfiehlt sich die Nutzung der Präprozessoranweisung #if 0 ... #endif.
Beispiele:
<syntaxhighlight lang="C">
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt
Compiler-Warning nur aufgrund des Compiler-Schalters -Wall! */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Namenskonventionen ==
Folgende Regeln gelten bzgl. der Benennung von Variablen und Funktionen:
* Variablen und Funktionsnamen können aus Buchstaben, Zahlen und dem Unterstrich bestehen. Sie müssen mit einem Buchstaben oder einem Unterstrich beginnen
* Seit C95 können weitere Zeichen aus dem Universal Coded Character Set (UCS) genutzt werden [C11 D.1]
* C ist Case sensitiv, d.h. es wird zwischen Groß- und Kleinbuchstaben unterschieden
* Schlüsselwörter können nicht für Variablen/Funktionsnamen/Datentypen genutzt werden
Namenskonventionen von Libraryfunktionen:
* In C (und C++) sind Schlüsselwörter und Standardlibraryfunktionen zumeist in Kleinbuchstaben geschrieben. In der C-Standardlibrary werden oftmals verkürzte Ausdrücke (z.B. isalnum() (zum Testen ob ein Zeichen ein Buchstaben oder ein Digit ist) und in C++ der Unterstrich als Worttrenner (z.b. out_of_range) genutzt
* Makros (siehe Kap.[[Programmieren in C/C++: Präprozessor | Präprozessor]]) werden per Konvention in GROSSBUCHSTABEN und ggf. mit Unterstrich als Worttrenner geschrieben.
* Namen beginnend mit doppelten Unterstrich oder beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (z.B. __LINE__ _Reserved) sind für den Compiler und der Standard-C-Library vorbehalten und sollten im eigenen Programm nicht benutzt werden.
== Zeilenfortsetzung ==
Mit dem Backslash Operator (gefolgt von einem Zeilenende) kann eine Zeile in der nächsten Zeile fortgesetzt werden. Der Compiler löscht das \-Zeichen mit anschließendem Zeilenende und ersetzt dies durch nichts. Dies ist insbesondere bei Anweisungen notwendig, die am Ende der Zeile abgeschlossen sein müssen (z.B. Strings, Makros).
Beispiele:
<syntaxhighlight lang="c">
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Innerhalb von Char-Literatoren und Strings wird '\' als Escape-Operator genutzt, welche das '\' und ein oder mehrere folgende Zeichen ersetzt (siehe Kap.[[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Grundlagen:Literale/Konstanten]]). Daher darf hinter Backslash als Zeilenfortsetzungszeichen kein weiteres Zeichen folgen.
== Gültigkeit/Sichtbarkeit von Variablen ==
Vorrangig in der objektorientierten Programmierung werden mit Namensräumen Objekte und deren Methoden/Attribute in einer Art Baumstruktur strukturiert. Dies ermöglicht eine eindeutige Ansprache von Variablen/Objekte, aber auch eine doppelte Verwendung von Methoden-/Attributnamen in unterschiedlichen Namensräumen. Ergänzend zu den Namensräumen kann mit public/private/proteced eine Zugriffsbeschränkung von Methoden/Attributen definiert werden.
Die Programmiersprache C unterstützt keinen Namensraum. Zugriffsmodifikatoren werden indirekt über Header-Dateien getätigt. Hinsichtlich der Gültigkeit/Sichtbarkeit unterscheidet C folgende Bereiche [C11 6.2.1]:
* Funktionen (Function Scope)
* Datei (File Scope)
* Block (Block Scope)
* Funktionsparameter in Prototypen (Function Prototype Scope)
Innerhalb eines Gültigkeitsbereiches dürfen Variablen-/Funktions-/Datentypnamen nicht doppelt genutzt werden.<br />
In der Programmiersprache C++ sind weitere Scope wie z.B. Class Scope, Enumationation Scope und ergänzend das Konzept von Namensräumen vorhanden (Beschreibung folgt).
=== Funktionsweite Sichtbarkeit ===
Eine Label-Definition (als Sprungmarke für die goto-Anweisungen) erfolgt immer mit funktionsweiter Sichtbarkeit/Gültigkeit. Die genaue Beschreibung dieses Sichtbarkeitstyps erfolgt im Rahmen des Kapitels [[Programmieren in C/C++: Grundlagen #Label + Goto|Grundlagen:Label+Goto]].
=== Dateiweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp-Definition außerhalb eines Block-Scopes oder von Funktionsparameter, so sind diese innerhalb der gesamten Datei und bei Funktionen/Variablen ergänzend Projektweit (für alle Objektdateien) sichtbar/gültig (= global) (In der C-Spec unter dem Stichwort 'Linkage' beschrieben, siehe Kapitel [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage| DatentypeSpecifier:Internal/External Linkage]]). Alle globalen Funktionen/Variablen können von allen Dateien aus genutzt/zugegriffen werden (sofern sie zuvor deklariert wurden).<br />
Beispiel:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Deklaration von global,
//welche in Datei1.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
printf("global=%d\n",global);
return 0;
} | datei2_c=#include <stdio.h>
//Deklaration von global,
//welche in example.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
printf("func() called\n");
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird das Schlüsselwort 'static' der Variablen/Funktionsdefinition vorangestellt, so wird die Sichtbarkeit/Gültigkeit auf Dateiweit eingeschränkt. Variablen/Funktionen können nur innerhalb der (Objekt-) Datei genutzt werden und sind für anderen (Objekt-)Dateien unsichtbar. (Siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage|DatentypeSpecifier:Internal/External Linkage]] Internal/External Linkage)
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
printf("example.c:var1=%d\n",var1);
void func(void); //Prototyp für func()
func();
return 0;
} | datei2_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
printf("datei2.c:var1=%d\n",var1);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Projektweite Gültigkeit bedeutet insbesondere, dass keine doppelten Benennung von Variablen/Funktionen/Datentypen innerhalb des gesamten Projektes erlaubt sind, d.h. alle Variablen/Funktionennamen über alle Dateien/Librarys eindeutig sein müssen.<br>
Beispiel 1:
{| class="wikitable"
|-
! Datei1.c !! Datei.2
|-
| <syntaxhighlight lang="C">
#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
}</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
} | datei2_c=#include <stdio.h>
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der Linker meldet beim Zusammenfügen der Objekt-Dateien, dass die Variable a bereits woanders definiert sei (multiple definition of `a';)!
Beispiel 2:
<syntaxhighlight lang="C">
#include <stdio.h> //fuer printf() size_t stderr
int printf=7;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int printf=7;
int main(int argc,char *argv[])
{
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hier meldet der Compiler eine Fehlermeldung, da das Symbol printf zu einen als Variable und zum anderen als Funktion (innerhalb der inkludierten Datei stdio.h beschrieben) genutzt wird ('printf' redeclared as different kind of symbol).
=== Blockweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp Definition innerhalb einer Funktion, als Funktionsparameter oder eines Blockes, so sind diese nur innerhalb des Blockes sichtbar/gültig (=Lokale Variable). Blöcke können verschachtelt sein, so dass das bei identischer Namensgebung innere Definitionen Vorrang haben. Ebenso haben Blockdefinitionen Vorrang vor Datei-/Projektdefinitionen (überdecken diese):
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
} | datei2_c=#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sichtbarkeit von Funktionsparameter in Protypen ===
Soll eine Funktion aufgerufen werden, die zuvor nicht definiert wurde, so ist ein Prototyp/(Forward)deklaration der Funktion notwendig (siehe nachfolgendes Kapitel). Die Parameterliste dieses Prototyps hat seinen eigenen Gültigkeitsbereich.<br/>
Beispiel:
<syntaxhighlight lang="C">
int a; //a im File Scope
int func(int a, int b); //a und b im Function Prototyp scope
</syntaxhighlight>
Hinweis:
* Bei Prototypen ist die Angabe von Variablenname nicht notwendig. Die alleinige Angabe des Datentyps ist ausreichend
=== Zuordnung der Gültigkeitsbereiche zu globalen/lokalen Variablen ===
Zum einfacheren Verständnis wird im Skript von folgenden Begrifflichkeiten gesprochen:
* '''Globale''' Variablen-/Funktionen-/Datentypdefinitionen → Projektweite Sichtbarkeit/Gültigkeit
* '''Statisch globale''' Variable/Funktionen → Dateiweite Sichtbarkeit/Gültigkeit
* '''Lokale''' Variablen/Funktionen/Funktionsparameter/Datentypen → Nur innerhalb des zugehörigen Blockes sichtbare/gültig
* '''Statisch lokale''' Variablen → Nur innerhalb der Funktion sichtbar/gültig, mit der Besonderheit, dass die Gültigkeit über der Laufzeit der Funktion gilt (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Static Storage Class Specifier|DatentypeSpecifier:Static Storage Class Specifier]])
=== Speicherzuweisung ===
Für die einzelnen Gültigkeitsbereiche werden im Speicher (und auch in der Objekt-Datei) unterschiedliche Speicherbereiche (Segmente) vorgehalten, d.h. der Compiler teilt den Speicher in unterschiedliche Bereiche auf und weist den Variablen/Funktionen in Abhängigkeit der Gültigkeit/Sichtbarkeit unterschiedliche Speicherbereiche zu!
[[File:Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten).png|thumb|Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten)]]
Zur Ermöglichung von Rekursion werden lokale Variable auf dem Stack gehandelt. Mit Aufruf einer Funktion oder öffnen eines neuen Block-Scopes wird Speicher auf dem Stack reserviert, der bei Beenden des Scopes wieder freigegeben wird. Die Speicheradresse von lokalen Variablen ist somit nicht Fix, sondern hängt von der Aufrufhierarchie ab!
Globale und statisch globale Variablen werden nicht auf dem Stack gehalten, sondern bekommen einen 'festen' Speicherbereich (hier DATA/BSS/RODATA) während der gesamten Laufzeit des Programms zugewiesen. Die Adresse dieser Variablen sind somit konstant. Das genutzte Speichersegment von globalen Variablen hängen von der Art der Variablen ab. Initialisierte Variablen werden im DATA-Segment gesammelt, welcher mit dem Initialisierungswert der Variablen initialisiert wird. Nicht initialisierte globale Variablen landen im BSS-Segment, so dass diese mit Programmstart durch Füllen dieses Blockes mit 0 auf 0 gesetzt werden.
Konstante globale Variablen werden im RODATA-Segment gehalten. Über das Betriebssystem kann dieser Speicherbereich auf nur Lesbar gesetzt werden.
Dynamische Speicheranforderungen, resp. Speicher, dessen Gültigkeit über die Laufzeit einer Funktion hinausgeht, wird im Heap gesammelt. Für die Verwaltung dieses Speichers ist der Programmierer zuständig.
Entsprechend globalen Variablen wird für Funktionen ebenfalls ein eigener Speicherbereich (TEXT Segment) vorgesehen. Im Gegensatz zu Variablen, wo im Speicher der dazugehörige Inhalt gespeichert ist, ist der Speicherinhalt von Funktionen die Maschinenanweisungen. Die Speicheradresse der Funktionen sind konstant.
Hinweis:
* Die Speicheradresse von sowohl globalen und statisch globalen Variablen als auch von Funktionen ist konstant und ändert sich während der Laufzeit des Programms nicht. Die Adressvergabe dieser Variablen und Funktionen erfolgt somit nicht zur Laufzeit sondern durch die Toolchain (hier der Linker).
* Dieses Konzept ist allgemeingültig, gilt nicht nur für die Programmiersprache C/C++
== Definition/Deklaration(Prototyp) ==
Der C-Compiler ist ein Single-Pass Compiler (siehe Kap [[Programmieren in C/C++: Einführung/Literatur#Arbeitsweise eines Compilers | Einführung/Literatur:Arbeitsweise eines Compilers ]]), d.h. für den Übersetzungsvorgang wird der Quellcode einmalig eingelesen und von vorne nach hinten abgearbeitet. Dies bedingt, dass keine Vorwärtsbezüge im Quelltext enthalten sein dürfen:
* keine Variable genutzt werden kann, die erst später definiert wird (da der Compiler in Abhängigkeit des Datentyps (den er dann noch nicht kennt) keine entsprechende Maschinensprachebefehle erzeugen kann)
* keine Funktion aufgerufen werden kann, die erst später definiert wird (da der Compiler nicht weiß, welcher Datentyp die Übergabewerte haben und folglich keine Maschinensprachebefehle zur Konvertierung und Übergabe der Variablen erzeugen kann)
* kein Datentyp genutzt werden kann (struct, union, enum, typedef), welcher erst später definiert wird (da der Compiler nicht weiß, wieviel Speicher er für die Variable reservieren muss)
Eine Lösungsvariante dieser Problematik ist, im Quellcode alle Variablen/Funktionen/Datentypen/Makros zu definieren, bevor diese erstmalig genutzt werden (Funktion main() steht dann folglich am Ende des Quellcodes):
<syntaxhighlight lang="C">
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
//Hier kein Zugriff auf var möglich!
//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(void) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
var++; //Hier kein Zugriff auf var möglich!
uchar xyz;//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(int argc, char *argv[]) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Sollen globale Funktionen/Variablen in Datei1.c genutzt werden, die in Datei2.c definiert sind, so schlägt diese Vorgehensweise fehl. Um auch dieses zu ermöglichen, bietet C die Möglichkeiten von Prototypen/Deklarationen an. Diese teilt dem Compiler mit, wie im späteren Ablauf die Variable, die Funktion definiert wird, bzw. dass es diesen Datentyp geben wird:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
} | datei2_c=#include <stdio.h>
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Innerhalb der C-Spezifikation werden für den Umgang mit dieser Problematik die Begriffe 'Declaration' und 'Definition' genutzt. Da diese Begriffe jedoch nicht klar abgegrenzt werden und auch für viele weitere Aspekte genutzt werden, sollen in diesem Skript in Anlehnung an den Wikipedia Artikel {{w|Deklaration (Programmierung)|Deklaration (Programmierung)}} (im Absatz zur Programmiersprache C/C++) die Begriffe Definition/Deklaration wie folgt genutzt werden:
;Definition: entspricht der Belegung/Reservierung von Speicherplatz
:* Bei der Definition einer Variablen wird hiermit Speicherplatz entsprechend dem Datentyp der Variable belegt:
:<syntaxhighlight lang="C">
int var1; //entsprechend der Größe des Datentyps int wird
//Speicherplatz für die Variable var1 reserviert
int var2=4711; //Dito, ergänzend wird dieser Speicherplatz mit dem
//Wert 4711 initialisiert
</syntaxhighlight>
:* Bei einer Funktion wird Speicherplatz zur Aufnahme der Maschinenbefehle belegt:
:<syntaxhighlight lang="C">
void foo(void) { //Die Anweisungen in den geschweiften Klammern
//werden in Maschinenbefehle übersetzt. D.h. die
//Funktion foo() belegt Speicher, dessen Inhalt
//die Maschinensprachebefehle sind
}
</syntaxhighlight>
:* Ergänzend wird der Begriff Definition auch in Verbindung mit der Definition von neuen Datentypen genutzt!
;Deklaration/Prototyp: ist die Mitteilung an den Compiler, wie diese Variable/Funktion an einer späteren Stelle im Source-Code oder in einer anderen Source-Datei definiert wird. Auf Grundlage dieser 'vorab' Information kann der Compiler die passenden Maschinensprachebefehle für den Zugriff/Aufruf auf die Variablen/Funktion einsetzen:
:<syntaxhighlight lang="C">
extern int var1; //Deklaration von var1
extern void foo(void); //Deklaration von foo()
void foo(void); //Deklaration von foo()
</syntaxhighlight><br />
Insbesondere bei dem Umgang mit der Deklaration gilt es Folgendes zu berücksichtigen:
* Deklarationen werden entweder:
:* am Anfang einer C-Datei geschrieben, so dass Funktionen/Variablen im Zugriff stehen, die erst später in der C-Datei definiert werden (entspricht dann der Private Anweisung in anderen Sprachen)
:* in Header-Dateien geschrieben, so dass diese Variable/Funktionen für alle sichtbar sind, welche diese Header-Datei einbinden (entspricht der Public Anweisung in anderen Sprachen)
* Deklarationen von Funktionen werden in der C-Spec als (function) Prototyp bezeichnet und sind dadurch gekennzeichnet, dass diese mit einem Semikolon abgeschlossen sind. Der Specifier 'extern' ist hier optional und sagt eigentlich aus, dass diese Funktion external Linkage besitzt (siehe [[Programmieren in C/C++:_DatentypeSpecifier#Internal/External Linkage | DatentypeSpecifier:Internal/External Linkage]]). Die Benennung der Parametervariablen sind gleichermaßen optional:
:<syntaxhighlight lang="C">
extern int foo(int var1, float var2); //Deklaration
extern int foo(int , float ); //Deklaration
int foo(int var1, float var2); //Deklaration + external Linkage
int foo(int , float ); //Deklaration + external Linkage
</syntaxhighlight>
* Für globale Variablen gibt es keine (Variablen) Prototype. Stattdessen muss zur Bekanntgabe des Datentyps der Specifier 'extern' vorangestellt werden, mit welchen ergänzend zum Ausdruck gebracht wird, das diese Variable external Linkage und damit globale Gültigkeit hat (siehe Kap [[Programmieren in C/C++: DatentypeSpecifier# Extern - Storage Class Specifier| DatentypeSpecifier:Extern - Storage Class Specifier]]). Da die Deklaration einzig zur Bestimmung der Zugriffsmethoden auf Maschinenspracheebene genutzt wird, können diese keine Initialisierungswerte enthalten:
:<syntaxhighlight lang="C">
extern int var1;
extern int var2=7; //KO Deklarationen können keine
//Initialisierungswerte haben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern int foo;
extern int foo=7;
int main(int argc, char *argv[]) {
return foo;
}
int foo=7;| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen von statisch globalen, lokalen und statisch lokalen Variablen nicht möglich sind:
:<syntaxhighlight lang="C">
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sich auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sicht auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen für identische Variablen/Funktionen können beliebig oft erfolgen, sofern der Datentyp identisch ist:
:<syntaxhighlight lang="C">
extern int var;
extern int var; //OK, doppelt Deklaration mit identischen Datentyp
extern unsigned int var; //KO, Doppelte Deklaration mit unterschiedlichen
// Datentyp
</syntaxhighlight>
* Sofern eine Deklaration und eine Definition in der identischen Datei erfolgen überprüft der Compiler, ob Deklaration und Definition identisch sind. Es empfiehlt sich, die eigene Header-Datei (in welcher die Deklaration normalerweise enthalten ist) zu inkludieren:
:{| class="wikitable"
|-
! Datei1.c !! Datei1.h
|-
| <syntaxhighlight lang="C">
//Include der eigenen Header-Datei
#include "datei1.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
</syntaxhighlight> ||
<syntaxhighlight lang="C">
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Include der eigenen Header-Datei
#include "example.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
int main(int argc, char *argv[]) {
return 0;
} | example_h=
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Datei kann eine Variable identischen Datentyps mehrmals definiert werden (bei identischen Initialisierungswert). Diese Definitionen werden vom Compiler als eine Definition angesehen. Wenn jedoch eine identische Variable in unterschiedlichen Dateien definiert wird, so legt jede Datei eine eigene unabhängige Variable an, welche dann beim Zusammenführen der Objektdateien durch den Linker zu Fehler führt. Da Header-Datei zumeist in mehrere C-Dateien inkludiert werden, sind Definitionen in Header-Dateien 'verboten'.
* Deklarationen innerhalb eines Block-Scopes oder eines Function Prototyp Scopes sind nur in diesen Bereich gültig.
== Grundlegende Datentypen und Typsicherheit ==
Die Programmiersprache C kennt folgende grundlegende Datentypen (siehe Kap. [[Programmieren in C/C++: Datentypen | Datentypen]]). Von jedem Datentyp kann ein Zeiger angelegt werden:
{| class="wikitable"
|-
! Datentyp !! Bsp. für Datentyp !! Bsp. für Zeiger auf Datentyp
|-
| Ganzzahl ||
<syntaxhighlight lang="C">
char var;
int var;
short int var;
long int var;
long long int var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
char *ptr;
int *ptr;
short int *ptr;
long int *ptr;
long long int *ptr;
</syntaxhighlight>
|-
| Gleitkommazahl ||
<syntaxhighlight lang="C">
double var;
float var;
long double var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
double *ptr;
float *ptr;
long double *ptr;
</syntaxhighlight>
|-
| Funktionen ||
<syntaxhighlight lang="C">
void func(void) {}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
void (*pfunc)(void);
</syntaxhighlight>
|-
| Arrays ||
<syntaxhighlight lang="C">
int arr[10];
float arr[3][3];
</syntaxhighlight>
||
<syntaxhighlight lang="C">
int (*parr);
float (*parr)[3];
void (*pfunc[5])(void);
</syntaxhighlight>
|-
| Strukturen/Unions ||
<syntaxhighlight lang="C">
struct xyz {int x,y,z};
union abc {int a,b,c};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
struct xyz *ptr;
union abc *ptr;
</syntaxhighlight>
|-
| Aufzählungstyp ||
<syntaxhighlight lang="C">
enum abc {A,B,C};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
enum abc *ptr;
</syntaxhighlight>
|-
| Boolescher Datentyp ||
<syntaxhighlight lang="C">
_Bool var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Bool *ptr;
</syntaxhighlight>
|-
| Komplexe Zahlen ||
<syntaxhighlight lang="C">
_Complex var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Complex *ptr;
</syntaxhighlight>
|}
C/C++ unterscheidet zwischen vorzeichenbehafteten <code>signed</code> und vorzeichenlosen <code>unsigned</code> ganzzahligen Datentypen. Vorzeichenlose Datentypen können nur positive Zahlen incl. der 0 aufnehmen (Anwendungsbereich bspw. Speicheradressen/Arrayindexe, welche nicht negativ sein können). Deren max. Zahlenwert ergibt sich aus der Datenbreite N des Datentyps 2<sup>N</sup>-1. Ein Vergleich eines vorzeichenlosen Datentyps mit ≥ 0 ist somit immer TRUE:
<syntaxhighlight lang="C">
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt"); //dieser ggf. vom Compiler wegoptimiert wird!
for(var=10; var>=0; var--); //Endlosschleife! 0 dekrementiert ergibt 255
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt\n"); //dieser ggf. vom Compiler wegoptimiert wird!
//Beim Öfffnen des Compiler-Fensters ist die IF-Anweisung nicht farblich
//hervorgehoben. Dies bedeutet, dass diese Zeile wegoptimiert wurde und folglich
//kein Maschinencode für diese Anweisung erzeugt wurde
for(var=10; var>=0; var--) //Endlosschleife! 0 dekrementiert ergibt 255
printf("%u ",var),fflush(stdout);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Vorzeichenlose Datentypen halbieren den verfügbaren Zahlenbereich und 'weisen' dem oberen Wertebereich den negativen Zahlen zu.<br>
Wird ein ganzzahliger Datentyp ohne Angabe des Vorzeichentyps (signedness) definiert, so ist diese vorzeichenbehaftet. Bei vorzeichenlosen Variablen muss explizit <code>unsigned</code> vorangestellt werden. Die Voranstellung von <code>signed</code> ist optional. Einzige Ausnahme stellt der Datentyp char dar. Hier gibt die Spezifikation keine default signedness vor, so dass bei Nutzung dieses Datentyps zur Aufnahme von Zahlen immer signed oder unsigned vorangestellt werden sollte!<br>
Innerhalb des Formatstrings bei den printf()/scanf() Anweisungen '''muss''' die signedness vom Programmierer händisch berücksichtigt werden. Die Formatanweisung %d und %i interpretieren die übergebenen Zahl als vorzeichenbehaftete Zahl. Soll eine vorzeichenlose Zahl ausgegeben werden, so muss %u verwendet werden:
<syntaxhighlight lang="C">
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%d varu=%u",vari,varu); //Korrekt
printf("vari=%u varu=%i",vari,varu); //Falsche Werteausgaben!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%12d varu=%12u\n",vari,varu); //Korrekt
printf("vari=%12u varu=%12i\n",vari,varu); //Falsche Werteausgaben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit der Definition (dem Anlegen) einer Variablen eines Datentyps wird Speicher entsprechend der Größe des Datentyps reserviert. Optional kann dieser Speicher initialisiert werden. Über den Datentyp wird ausgesagt, wie der Inhalt des Speichers zu interpretieren ist:
<syntaxhighlight lang="C">
char var1; //Speicherplatzreservierung von 1 Byte
//Inhalt der Speicherstelle wird als Zahl interpretiert
//(Hinweis: ASCII-Zeichen sind Zahlen)
double var2=47.11; //Speicherplatzreservierung von 8 Byte
//Inhalt der Speicherstellen wird als Gleitkommazahl
//interpretiert (bestehend aus je einer Ganzzahl für
//Mantisse und Exponent)
short arr[10]; //Speicherplatzreservierung von 10*2 Byte
//Inhalt der 10 Speicherstellen werden als Ganzzahl
//interpretiert
</syntaxhighlight>
Die Funktionalität der Operatoren hängt vom Datentyp der Operanden ab. Der Plus-Operator angewendet auf ganzzahlige Operanden führt eine Ganzzahl Addition aus, angewendet auf gleitkomma Operanden eine Gleitkomma Addition. Ist einer der Operanden ein Zeiger, so wird eine Zeigeraddition angewendet. Für andere Datentypen ist der Plus-Operator nicht definiert, so dass der Compiler einen Fehler wirft. '''Bei der Betrachtung eines Ausdruckes sollte dem genutzten Datentypen folglich eine besondere Aufmerksamkeit zuteil werden''':
<syntaxhighlight lang="C">
int vari=47;
vari+12; //(int) + (int) → Ganzzahladdition
float varf=12.3;
3.1415F+varf; //(float) + (float) → Gleitkommaaddition
int *ptr=&vari;
ptr+3; //(int *) + (int) → Zeigeraddition
int arr[3];
arr+3; //(int (*)) + (int) → Zeigeraddition
</syntaxhighlight>
Das Ergebnis einer Operation hat ebenfalls einen Datentyp. Eine Ganzzahl Addition gibt bspw. als Ergebnis einen Ganzahl Datentyp zurück, eine Gleitkomma Addtition einen Gleitkomma Datentyp und ein Vergleichsoperator den Datentyp _Bool:
<syntaxhighlight lang="C">
int vari1=47;
int vari2=11;
vari1 + 12 + vari2; //((int)+(int)+(int))→((int)+(int))→(int)
40 < vari1 < 50; //((int)<(int)<(int))→((_Bool=int)<(int))→(_Bool=int)
</syntaxhighlight>
Wie Operatoren haben auch Funktionen Operanden (in Form von Übergabeparameter). Das Ergebnis eines Funktionsaufrufes wird ebenfalls in Form eines Datentyps zurückgegeben:
<syntaxhighlight lang="C">
float add(int par1,par2) {return par1+par2;}
int vari1=47;
int vari2=11;
vari1 + add(var2,12); //(int)+((int),(int)→(float))→(int)+(float)→(float)
</syntaxhighlight>
Wird auf einen Operator gleichermaßen ein vorzeichenbehafteter und ein vorzeichenloser Operand angewendet, so kann es zu unerwarteten Konvertierungsproblemen führen:
<syntaxhighlight lang="C">
unsigned char varu=12;
signed char vars=-12;
float varf;
varf = varu + vars;
if(vars < varu)
</syntaxhighlight>
Sind die Datentypen der Operanden nicht 'kompatibel', so 'passt' der Compiler die Datentypen im Falle von Ganzahl und Gleitkomadatentypen per impliziter Regel an (siehe Kap. [[Programmieren in C/C++: Datentypen#Implizite Typumwandlung | Datentypen:Implizite Typumwandlung]]). Über explizite Typumwandlung (siehe Kap.[[Programmieren in C/C++: Datentypen# Explizite Typumwandlung|Datentypen:Explizite Typumwandlung]]) kann ein Datentyp z.T. in einen anderen Datentyp gewandelt werden.
In allen anderen Fällen ist C Typsicher, d.h. der Compiler gibt zumindest eine Warning aus, wenn die Datentypen nicht identisch sind und der Compiler keine implizite Regel anwenden kann.
Tipp:
* Compiler gibt bei Fehlermeldung oftmals die erwarteten und die vorhandenen Datentyp an. Wenn solch eine Fehlermeldung kommt, sollten sie sich a) überlegen, was wollten sie syntaktisch geschrieben haben und b) was haben sie in der Tat geschrieben. Ein Google nach einer Lösung des Compilerproblems löst zumeist nicht das Problem, sondern umgeht es!
Hinweis:
* Ein guter Programmierer sollte die Datentypen so wählen, dass:
:* die Datentypen zum Inhalt und zum Wertebereiches passen
:* keine Datentypkonvertierungen notwendig sind
: andernfalls besteht die Gefahr, dass hiermit Laufzeitfehler einprogrammiert werden.
* Wenn Datentypkonvertierungen notwendig sind, sollte die explizite Konvertierung genutzt werden
== Abhängigkeiten bzgl. Rechnerarchitektur ==
Kenngrößen von Prozessoren sind unter anderem die Anzahl der Bits für den Datentransport und für Arithmetisch-/Logische-Operationen (→ Datenbreite) und die Anzahl der Bits für die Adressierung des Speichers (→ Adressierungsbreite). Die Datenbreite sagt dabei aus, welche max. Datenbreite ein Maschinenbefehl (zumeist in einem Taktzyklus) transportieren/berechnen kann. Werden programmtechnisch größere Datenbreiten benötigt, bedingt dies, dass hierzu mehrere Maschinenbefehle notwendig sind. Wenn kleinere Datenbreiten notwendig sind, so wird oftmals das Ergebnis abgeschnitten (sofern der Prozessor keine Befehle für den Umgang mit kleineren Datentyp beherrscht):
{| class="wikitable"
|-
! 32-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 64-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 16-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
|-
| <syntaxhighlight lang="C">
int32_t a32,b32;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int64_t a64,b64;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int16_t a16,b16;
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=b32;
mov eax,b32
mov a32,eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=b64;
mov eax ,b64
mov edx ,b64+4
mov a64 ,eax
mov a64+4,edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
//a16=b16;
movz eax,b16
mov a16,ax
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=a32+b32;
mov edx, a32
mov eax, b32
add eax, edx
mov a32, eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=a64+b64;
mov ecx , a64
mov ebx , a64+4
mov eax , b64
mov edx , b64+4
add eax , ecx
adc edx , ebx
mov a64 , eax
mov a64+4, edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a16=16+b16;
movzx eax, a16
mov edx, eax
movzx eax, b16
add eax, edx
mov a16, ax
</syntaxhighlight>
|}
Die Adressierungsbreite gibt an, mit welcher Bitbreite der Speicher adressiert werden kann:
* Bei einem 32-Bit System können 2<sup>32</sup>=4.294.967.295=4Gi Bytes/Speicherstellen adressiert werden
* Bei einem 16-Bit System können 2<sup>16</sup>=65.536=64Ki Bytes/Speicherstellen adressiert werden
* Bei einem 64-Bit System können 2<sup>64</sup>=18.446.744.073.709.551.616 =16Ei ~18Exa Bytes/Speicherstellen adressiert werden
Waren die Datenbreite und die Adressierungsbreite bei den ersten Prozessoren noch unterschiedlich, so sind diese heutzutage zumeist identisch. Bei einem 32-Bit Prozessor bedeutet dies, dass dieser max. 4Gi Bytes Speicherstellenstellen adressieren kann und Maschinenbefehle für den Datentransport und die Berechnung von 32-Bit Datenworten beinhaltet.
Die Datenbreite und auch die Adressierungsbereite haben direkten Einfluss auf die Programmiersprache:
* Wird defaultmäßig mit größerer Datenbreite gerechnet, als der Prozessor 'von Hause' aus unterstützt, so werden die erzeugten Maschinenprogramme größer und langsamer (Umgedreht bedeutet dies jedoch nicht, dass die Maschinenprogramme kleiner und schneller werden)
* Die max. Größe von Verbunddatentypen und Arrays ergibt sich aus der Adressierungsbreite des Prozessors
Die Intention der Programmiersprache C/C++ ist, die Prozessorarchitektur optimal zu nutzen. Dementsprechend sind diverse Eigenschaften der Sprache nicht fest spezifiziert, sondern von der Rechnerarchitektur abhängig.
=== Integer Datentyp ===
Intention von C/C++ ist, dass der Umgang mit dem Grunddatentyp 'int' möglichst direkt in einen Maschinensprachebefehl umgesetzt werden kann.<br />
Bei einem 16-Bit Prozessor hat der Datentyp int daher eine Breite von 16-Bit und bei einem 32-Bit Prozessor eine Breite von 32-Bit (siehe Kap [[Programmieren in C/C++: Datentypen # Ganzzahlige Datentypen|Datentypen:Ganzahl Datentypen]]). Über vorangestellte Qualifier kann dieser Grunddatentyp verkleinert/vergrößert werden.
=== Integer Arithmetik ===
Ganzzahlen haben nur einen begrenzten Wertebereich. Wird dieser bspw. durch eine Addition überschritten (d.h. das Rechenergebnis benötigt zur Darstellung mehr Stellen, als der Datentyp 'hergibt'), so gibt es zwei Vorgehensweisen:
* Arithmetischer Überlauf (siehe {{w|arithmetischer Überlauf}}): Die nicht speicherfähigen Stellen werden verworfen, so dass i.d.R. ein falsches Ergebnis erzeugt wird!
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist (254+3)%256=1
c=a*b; //c ist (254*3)%256=250
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char a=254,b=3,c1,c2;
c1=a+b; //c ist (254+3)%256=1
c2=a*b; //c ist (254*3)%256=250
printf("c1=%hhu c2=%hhu\n",c1,c2);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Sättigungsarithmetik (siehe {{w|Sättigungsarithmetik}}): Alle Operationen laufen innerhalb eines festen Intervalls ab, so dass Überläufe und Unterläufe auf dieses Intervall begrenzt werden:
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist MAX((254+3),255)=255
c=a*b; //c ist MAX((254*3),255)=255
</syntaxhighlight>
Die Spezifikation von C macht bezüglich der zu nutzenden Methodik keine Vorgaben, so dass das Handling von der ALU des Prozessors abhängt. Aus Komplexitäts- und Geschwindigkeitsgründen ist dies zumeist der arithmetische Überlauf. Nur bei Spezialprozessoren (z.B. DSP Digital Signal Processor) kommt z.T. die Sättigungsarithmetik zum Einsatz.
=== Gleitkomma Datentyp und Arithmetik ===
Für den Umgang mit Gleitkommazahlen bieten einige Prozessoren spezielle Recheneinheiten ({{w|Gleitkommaeinheit}} Floating Point Units FPU) an. Sowohl die Darstellung von Gleitkommazahlen als auch das Verhalten bei Überlauf/Unterlauf ist damit Herstellerabhängig. Um auch diese Einheiten effektiv nutzen zu können, ist die C/C++ Spezifikation in diesem Bereich ebenfalls sehr offen.
=== Max. Speicherbedarf von Variablen ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C/C++ von der zugrundeliegenden Rechnerarchitektur abhängig:
<syntaxhighlight lang="C">
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Zur Darstellung bitte Compiler-Fenster öffnen
//und dort den CC65-Compiler für den 6502 Prozessor auswählen
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Im Falle von globalen Variablen erzeugt der Compiler/Linker eine Fehlermeldung. Werden von diesen Datentypen Variablen als lokale Variablen angelegt, so erzeugt dies zur Laufzeit einen Stackoverflow.
=== Zeigervariable ===
Eine Zeigervariable ist eine Variable, die eine Speicheradresse speichert. Die Größe dieses Datentyps hängt von der Adressierungsbreite des Prozessors ab. Unabhängig von dem Datentyp, auf den die Zeigervariable zeigt, ergibt sich folgende Breite:
* 4-Byte bei einer 32-Bit Rechnerarchitektur
* 8-Byte bei einer 64-Bit Rechnerarchitektur
* 2-Byte bei einer 16-Bit Rechnerarchitektur
=== Datentyp size_t ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C von der zugrundeliegenden Rechnerarchitektur abhängig. Sie ergibt sich aus der Adressierungsbreite. Da die Datenbreite des Datentyps int zumeist kleiner als die Adressierungsbreite ist, existiert in C/C++ der vorzeichenlose Datentyp size_t.<br />
Alle Funktionen, welche den Speicherbedarf übergeben bekommen, bzw. zurückgeben (bspw. strlen(), memcpy(), sizeof()) , nutzen den Datentyp size_t:
<syntaxhighlight lang="C">
//Prototypen
size_t strlen(char *str); //Die max. Stringlänge ist durch den
//adressierbaren Speicher vorgegeben
void *malloc(size_t size);
void *memcpy(void *dest, const void *src, size_t n);
</syntaxhighlight>
Der Datentyp size_t ist in der Header-Datei stddef.h der Standard-C-Library per typedef gesetzt. Im Normalfall muss diese Header-Datei nicht explizit inkludiert werden, da bei Nutzung von z.B. strlen() diese bereits durch die Header-Datei string.h inkludiert wird:
<syntaxhighlight lang="C">
typedef unsigned long long size_t; //Bei einer 64-Bit Rechnerarchitektur
</syntaxhighlight>
Hinweis:
* Der Datentyp size_t ist immer ein vorzeichenloser Datentyp (es gibt keine negativen Speicheradressen).
* Mit dem Datentype ssize_t wird eine vorzeichenbehaftete Variante zur Verfügung gestellt, welche hilfreich ist, wenn Speicheradresse subtrahiert werden sollen.
* Soll der Wert vom Datentyp size_t mittels printf() ausgegeben werden, so ist der 'Length Modifier' z und der 'Conversion Specifier' u zu nutzen:
:<syntaxhighlight lang="C">
size_t var=strlen("String");
printf("%zu",var);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]) {
size_t var=strlen("String");
printf("%zu",var);
printf("%d",var); //Hier sollte es eine Compiler-Warning geben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Boolescher-Datentype/Operatoren ==
Ursprünglich gab es den booleschen Datentyp in der Programmiersprache C nicht. Mit C99 wurde zwar der Datentyp <code>_Bool</code> eingeführt, dies änderte jedoch nicht den Umgang mit Anweisungen und Operatoren, die einen booleschen Datentyp erwarten/zurückgeben!
An allen Stellen, an denen ein boolescher Datentyp erwartet wird (z.B. IF-Abfrage, bei booleschen Operationen) wird der Datentyp Ganzzahl, Gleitkommazahl oder Zeiger erwartet (= Scalar-Type) und ausgewertet. Der hierin gespeicherte Zahlenwert sagt aus, ob diese Zahl als True oder False zu interpretieren ist:
* False, wenn Ganzzahl gleich 0 oder Gleitkommazahl gleich 0.0 oder Zeiger gleich NULL
* True, wenn Ganzzahl ungleich 0 oder Gleitkommazahl ungleich 0.0 oder Zeiger ungleich NULL
Beispiel:
<syntaxhighlight lang="C">
int a=3;
double b=0.0;
int *ptr=&a;
while(1);
if(a) {}
for( ; b && ptr ; );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
double b=0.0;
int *ptr=&a;
while(0);
if(a) {}
for( ; b && ptr ; ) {}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Operatoren, welchen einen booleschen Wert zurückliefern (Vergleichs-Operatoren und Boolesche-Operatoren), liefern ein Integer-Datentyp zurück:
* (int)0 für False
* (int)1 für True
Beispiel:
<syntaxhighlight lang="C">
int a=3;
int b= (a==3); //b=1
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
int b= (a==3); //b=1
printf("%d",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
In den if()/for()/while() Anweisungen ist folglich kein explizites Konvertieren eines Ganzzahl-/Gleitkomma-/Zeigerwertes mittels des Vergleichs-Operators in einen Booleschen Wert notwendig:
<syntaxhighlight lang="C">
int a;
double b;
if(a) //entspricht if(a!=0)
if(!b) //entspricht if(b==0.0)
while(1) //entspricht while(True)
for(int lauf=1; lauf ; lauf--);
</syntaxhighlight>
Umgedreht kann ein boolescher Wert oder auch das Ergebnis einer booleschen Operation direkt mit einer Ganzzahl- oder Gleitkommazahl verknüpft werden:
<syntaxhighlight lang="C">
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
if( a==1 & b==2)
if(3 < a < 9) //Vorsicht, die Schreibweise lässt ein
//anderes Verhalten erwarten!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
printf("%d\n",a);
if(a==1 & b==2)
printf("true\n");
else
printf("false\n");
if(3 < a < 9)
if( (a==1) & (b==2))
printf("true\n");
else
printf("false\n");
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit C99 wurde der Datentyp <code>_Bool</code> eingeführt. Dieser entspricht weiterhin einem Integerdatentyp mit der Besonderheit, dass beim Zuweisen eines Wertes dieses auf true oder false geprüft wird und Variablen dieses Datentyps nur die Werte 0 oder 1 annehmen können:
<syntaxhighlight lang="C">
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool! möglich
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool!
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für den einfacheren Umgang mit dem 'neuen' Datentyp wurde in der Header-Datei <code>stdbool.h</code> die Makros <code>true</code> (als Austauschwert für die Ganzzahl 1) und <code>false</code> (als Austauschwert für die Ganzahl 0) definiert. Ergänzend wird hier der Datentyp <code>bool</code> als Alias auf <code>_Bool</code> gesetzt.
<syntaxhighlight lang="C">
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
int main(int argc,char *argv[]) {
foo(4,3,6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In C++ gibt es anstatt des Datentypes <code>_Bool</code> den Datentyp <code>bool</code>. Auch sind die beiden Konstanten <code>true</code> und <code>false</code> ohne zusätzliches Einbinden der Header-Datei vorhanden. Der weitere Umgang ist jedoch identisch zu C.
== Literale/Konstanten ==
In Computerprogramm werden an diversen Stellen Konstanten in Source Code genutzt. Sei es als Initialisierungswert für Variablen, als Vergleichswert für Abfragen, zur Definition von Schleifendurchläufe oder als Strings für die Kommunikation. Der Syntax der Programmiersprache bietet dazu verschiedene Möglichkeiten, wie Zahlen zu beschreiben sind und wie der Datentyp vorgeben wird.</br>
Ungeachtet der Schreibweise werden im Computer alle Zahlen identisch als binäre Zalen gespeichert. Beispiele, wie die Zahlen intern gespeichert werden:
<syntaxhighlight lang="C">
int var=17; //0000 0000 0000 0000 0000 0000 0001 0001
short var=0x307;// 0000 0011 0000 0111
char var=017; // 0000 1111
int var=-1; //1111 1111 1111 1111 1111 1111 1111 1111
float var=0.0; //0000 0000 0000 0000 0000 0000 0000 0000
float var=1.0; //0011 1111 1000 0000 0000 0000 0000 0000
</syntaxhighlight>
=== Ganzzahl-Konstanten ===
Im Allgemeinen ordnet der Compiler einer numerischen, ganzzahligen Konstanten den kleinstmöglichen Datentyp beginnend vom Datentyp integer zu. Sobald der Wert der Konstanten den Wertebereich von integer übersteigt, wird der nächst größere passende Datentyp gewählt. Ergänzend gilt, dass alle Ganzzahl-Konstanten als vorzeichenbehaftete Ganzzahl-Konstanten angesehen werden!<br />
Beispiele für integer Konstanten:
<pre>
123
+123
-123 → Formal wird das Minus als Operator angesehen
und die positive Zahl 123 negiert
0x123 → Konstante ist in hexadezimaler Schreibweise notiert
0123 → Konstante ist in oktaler Schreibweise notiert
0b011 → Konstante ist in binärer Schreibweise notiert
nicht offizieller C-Syntax, wird aber von vielen Compiler unterstützt
ab C23-Spezifikation offiziell im C-Syntax enthalten!
6'432'108 → Tausendertrenner (ab C23 und in C++)
6'4'3'2'10 → Tausendertrenner
0x12'23'5 → Tausendertrenner
0b1001'001 → Tausendertrenner
5123123123 → Wertebereich größer als 2^31 so dass automatisch
zum nächst größeren Datentyp konvertiert wird
</pre>
Mit den Suffixen L/l und LL/ll kann der Datentyp long und long long erzwungen werden:
<pre>
12L → Konstante wird in eine long Integer Konstante konvertiert
4711LL → Konstante wird in eine Long Long Konstante konvertiert
</pre>
Mit dem Suffix U/u kann die Konstante explizit auf unsigned gesetzt werden:
<pre>
12U → Konstante wird als vorzeichenlose Zahl gesepeichert
4711ULL → Konstante wird in eine vorzeichenlose
Long Long Konstante konvertiert
</pre>
=== Char-Konstanten ===
In einfachen Anführungsstrichen geschriebene ASCII Zeichen werden entsprechend der {{w|American Standard Code for Information Interchange | ASCII-Tabelle}} als Zahlenwert (Datentyp int) dargestellt:
<pre>
'A' → Integerkonstante 65
'a' → Integerkonstante 97
…
</pre>
Über den {{w|Escape-Sequenz|Escape-Operator}} (Zeichen Backslash '\') wird das/die dem ESCAPE Operator folgende Zeichen gesondert interpretiert. Die im Source-Code erhaltene Zeichenfolge wird im Computerprogramm als ein Zahlenwert (Datentyp int) gespeichert. Dies ist u.A. zur Darstellung von ' und " aber auch zur Darstellung der unteren 32 Zeichen der ASCII Tabelle notwendig (Siehe auch {{w|Steuerzeichen}})
<pre>
ESCAPE Integer- → Bedeutung / (Terminal)funktionalität
Sequence konstante
'\0' = 0 → 0 Character = Stringendezeichen
'\a' = 7 → Bell (erzeugt auf dem Terminal einen Ton)
'\b' = 8 → Backspace (Bewegt den Cursor um eine Position nach links)
'\t' = 9 → Horizontal Tab (Bewegt den Curso auf die nächste horizontale
Tabulatorposition, Abstand ist Terminalspezifisch)
'\n' = 10 → NewLine (Zeilenvorschub)
'\v' = 11 → Vertial Tab
'\r' = 13 → Carriage Return (Wagenrücklauf, Bewegt den Cursor an den
Zeilenanfang)
'\"' = 34 → Double Quote
'\'' = 39 → Single Quote
'\?' = 63 → Question mark
'\\' = 92 → Backslash
'\f' = 12 → FormFeed (Erzeugt auf dem Terminal/Drucker
einen Seitenvorschub)
'\ooo' = 0ooo → Oktal, wobei o Digits von 0..7 sein müssen
'\xdd' = 0xdd → Hexadezimal, wobei d Digits von 0..9 A..F sein müssen
'\udddd' Unicode mit 4 Digits
'\Udddddddd' Unicode mit 8 Digits
</pre>
Beispiel
<syntaxhighlight lang="C">
'A' == 65 == '\101' == '\x41' == '\u0041' == '\U00000041'
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
//Programmiersprache wurde auf C++ gesetzt
if('A' == 65) printf("'A' == 65\n");
if('A' == '\101') printf("'A' == '\\101'\n");
if('A' == '\x41') printf("'A' == '\\x41'\n");
if('A' == '\u0041') printf("'A' == '\\u0041'\n");
if('A' == '\U00000041') printf("'A' == '\\U00000041'\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true|
lang=c++
}} Öffnen im Compiler Explorer] }}
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
u'b' → unicode 16 (nur C++)
U'b' → unicode 32 (nur C++)
L'b' → wchar_t
</pre>
Hinweis
* Die ASCII-Tabelle basiert auf einer 7-Bit Zeichenkodierung, so dass bspw. die Umlaute 'ä', 'ö' und 'ü' dort nicht kodiert sind. Sollen auch diese Zeichen genutzt werden, so empfiehlt sich der Datentyp wchar_t
=== Gleitkommakonstanten ===
Alle Gleitkommakonstanten sind ohne weitere Angaben vom Datentyp double!
<pre>
555.12
555. → 555.0
.1 → 0.1
4e2 → 400.0
1'234.678'9 → Tausendertrenner (ab C23 und in C++)
0x22.11p13 → Konstante in Hexadezimalen Schreibweise (ab C99)
</pre>
Über Suffixe kann ein alternativer Datentyp erzwungen werden:
<pre>
3.0F → Datentyp float
3.0l → Datentyp long double
</pre>
Hinweis:
* Aufgrund der unterschiedlichen Basis zwischen dem menschlichen Zehner-System und dem computerinternen Binär-System entstehen insbesondere bei den Nachkommastellen Rundungsfehler. Die Konstante 0.1f wird durch die Wandlung intern als 1.00000001490116119384765625e-1 dargestellt (siehe [[Programmieren in C/C++: Datentypen#Gleitkomma Datentypen | Datentypen:Gleitkomma Datentypen]])
* Die C-Spec verlangt, dass die binäre Repräsentation von Gleitkommazahlen zur Laufzeit (z.B. durch die Funktion atof() strtod() scanf("%f")) identisch zur der zur Compilezeit ist. Beispiel:
:<syntaxhighlight lang="C">
if(3.14==atof("3.14")) printf("muss erfüllt sein");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
if(3.14==atof("3.14")) printf("muss erfüllt sein\n");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
printf("Intern wird 3.14 wie folgt dargestellt %14.20f",3.14);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Konstanten Ausdrücke ===
Ergänzend zu den Zahlenwerten werden auch Ausdrücke durch den Compiler ausgewertet. Als Voraussetzung für die Ausdrücke gilt, dass alle Operatoren Literale/Konstante sein müssen, so dass der Compiler die Berechnung durchführen kann. Als Operatoren können alle im normalem Syntax erlaubten Operatoren (z.B.: +,-,*,/,&,&&,|,||,>>,<<,==,!=) genutzt werden.<br />
Beispiel:
<syntaxhighlight lang="C">
int var1=7*3+5; → wird vom Compiler durch 26 ersetzt
int var2=(4710+(8-1))&-8; → wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); → wird vom Compiler durch 16 * var1 + 154 ersetzt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int var1=7*3+5; //→ wird vom Compiler durch 26 ersetzt
int var2;
var2=(4710+(8-1))&-8; //→ wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); //→ wird vom Compiler durch var1 * 16 + 154 ersetzt
return 0;
} | execCompilerOptions=-Wall|
h=g|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Konstante Ausdrücke bieten sich an, um den Sourcecode lesbarer zu gestalten. Da der Compiler die Berechnung durchführt, wird zur Laufzeit keine Rechenleistung benötigt. Einzig die Compiledauer wird etwas erhöht:
<syntaxhighlight lang="C">
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180); //siehe nachfolgende Hinweise
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int ad_get(void) {
return 615; //614;
}
int main(int argc,char *argv[]) {
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180);
printf("%f\n%f\n",alpha1,alpha2);
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Ergänzend zu den oben aufgeführten Operatoren erlauben einige Compiler weitere Funktionen der Math.h Library in Konstantenausdrücken (z.B. sin(), cos(), ...)
* Konstanten Ausdrücke werden innerhalb des Compilers durch den Präprozessor ausgewertet, so dass dieser die Ergebnisse ebenfalls nutzen kann:
:<syntaxhighlight lang="C">
#define BUF_SIZE 512
#if (BUF_SIZE & (BUF_SIZE -1)) != 0
#endif
</syntaxhighlight>
=== String Konstanten ===
Stringkonstanten erzeugen ein Array von Characters. Mit dem abschließenden Hochkommata wird das Array um ein Stringendezeichen ergänzt:
<pre>
"abc" → (char []) {'a','b','c','\0'}
</pre>
Adjacent Strings Konstanten werden vom Compiler zu einer String-Kontante zusammengefasst, so dass nur ein Stringendezeichen vorhanden ist:
<pre>
"xxx" "yyy" → (char []) {'x','x','x','y','y','y','\0'}
</pre>
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
L"string" → (wchar_t[7]){L's',L't',L'r' …)
</pre>
Über Postfixes können in C++ Objekte erzeugt werden:
<pre>
"string"s → erzeugt einen String vom Datentyp std::string
"string"sw → Erzeugt einen String vom Datentyp std::string_view
</pre>
String Konstanten werden Compilerintern über unnamed Variablen realisiert, welche als globale Variable angelegt werden und per default const sind:
<syntaxhighlight lang="C">
printf("Wert=%d",4);
//entspricht
const char unnamed1[]="Wert=%d";
printf(unnamed1,4);
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
printf("Wert=%d\n",4);
//entspricht
const char unnamed1[]="Wert=%d\n";
printf(unnamed1,4);
fflush(stdout); //Zur Darstellung der Ausgabe, da nachfolgend
//das Programm abstürzt und die gepufferte Ausgabe
//nicht zur Anzeige gebracht wird
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für doppelte String Konstanten wird nur einmal Speicher reserviert:
<syntaxhighlight lang="C">
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2) printf("Identische Startadressen");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2)
printf("Identische Startadressen");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Initialisierungsliste / Compound Literal ==
Arrays, Strukturen und Unions bestehen zumeist aus mehreren Elementen. Zur Initialisierung solcher Variablen werden die Initialisierungswerte in geschweiften Klammern als Initialisierungsliste zusammengefasst.
<code>
Syntax: {Initialisierungsliste}
</code>
Für eine Initialisierungsliste wird kein Speicher vorgehalten. Vielmehr wird bei der Variablendefinition die Variable direkt mit dem Inhalt der Liste initialisiert. Der Datentyp der Initialisierungsliste ergibt sich aus dem Datentyp der zu initialisierenden Variable:
<syntaxhighlight lang="C">
int arr[5] = { 1,2,3,4,5 };
struct xyz { int x,y,z;}; //Definition einer Struktur
struct xyz var = { 1,2,3 };
</syntaxhighlight>
Wird der Initialisierungsliste ein Datentyp in runden Klammern vorangestellt, so wird hiermit eine 'unnamend' Variable/Objekt, ein Compound Literal erstellt:
<code>
Syntax: (type) {Initialisierungsliste}
</code>
Ein Compound Literal entspricht einer anonymen Variablen des angegebenen Datentyps. Wie bei einer normalen Variablendefinition wird hier ebenfalls eine Variable angelegt und diese mit den Initialisierungswerten initialisiert. Im Unterschied zu einer normalen Variable kann auf solch eine Variable im Nachgang nicht mehr zugegriffen werden. Der Rückgabewert eines Compound Literals entspricht somit dem einer Variablen.</br>
Compound Literale bieten sich überall dort an, wo Variablen nur für einen einmaligen Zweck angelegt werden (bspw. bei der Parameterübergabe von Funktionen):
<syntaxhighlight lang="C">
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawline(struct point start,struct point end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start.x,start.y,end.x,end.y);
}
void printarray(int arr[4]) {
printf("[ ");
for(size_t idx=0;idx<4;idx++)
printf("%d ",arr[idx]);
printf("]\n");
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Über den Adressoperator kann auch die Adresse der anonymen Variablen ermittelt werden. In diesem Falle ist dann der Gültigkeitsbereich/-dauer des Compound Literals zu berücksichtigen. Wird eine Compound Literals außerhalb eines Block-Scopes angelegt, so entspricht sie einer globalen Variable, andernfalls einer lokalen Variablen. Außerhalb des Gültigkeitsbereiches verliert die Adresse auf solch eine Variable ihre Gültigkeit:
<syntaxhighlight lang="C">
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawlinep(struct point *start,struct point *end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start->x,start->y,end->x,end->y);
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Compound-Literal sind per Default keine Konstanten, können also zur Laufzeit geändert werden (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Const Type Qualifier|DatentypeSpecifier:Const Type Qualifier]]):
:<syntaxhighlight lang="C">
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweiften Klammern <code>{ }</code> sind nicht mit dem Block-Operator (siehe [[Programmieren in C/C++: Grundlagen#Block / Compound-Statement | Block / Compound-Statement]]) zu verwechseln. Werden die geschweiften Klammern bei der Initialisierung von Variablen genutzt, dann beschreibt der Inhalt der geschweiften Klammern eine Initialisierungsliste. Wird diesen ein Datentyp vorangestellt, dann wird hiermit eine Compound Literal definiert.
== Variableninitialisierung ==
Mit der Definition einer Variable kann diese optional initialisiert werden. Der tatsächliche Zeitpunkt der Variableninitialisierung (zur Laufzeit oder zur Compilezeit) und damit die Ausführung der Initialisierung (Maschinensprachebefehle oder Speichervorbelegung) hängt von der Gültigkeit/Sichtbarkeit der Variablen ab(siehe [[Programmieren in C/C++: Grundlagen#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]).
=== Globale + Static lokale Variablen ===
Globale und statisch globale Variablen werden in einem während der Laufzeit des Programms festen Speicherbereich gehalten. Zum Startzeitpunkt des Programms ist der Speicherplatz solch einer Variable mit dem Initialisierungswert gefüllt, so das bei erstmaliger Nutzung dieser Variablen diese ihre Initialisierungswerte enthalten. Die Belegung des Speicherplatzes erfolgt durch den Compiler, so dass als Initialisierungswerte / Inhalt der Initialisierungsliste nur Konstanten oder Konstanten-Ausdrücke (siehe [[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Literale/Konstanten]]) erlaubt sind:
<syntaxhighlight lang="C">
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
double sin(double); //DJ: Include-Anweisung in wikibooks schlägt fehlt
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
int main(int argc,char *argv[]) {
printf("%hd %hd %hd\n",array[0],array[1],array[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Nicht initialisierte globale und static lokale Variablen werden mit 0 initialisiert! D.h. die Speicherstellen dieser Variablen werden mit dem Wert 0 vorbelegt::
<syntaxhighlight lang="C">
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
int main(int argc,char *argv[]) {
printf("f=%d\n",f);
printf("%f %f %f\n",arr[0],arr[1],arr[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Lokale Variable ===
Der Speicherplatz für lokale Variable wird auf dem Stack zur Verfügung gestellt. Mit jedem öffnenden Block-Scope wird Speicher für die innerhalb dies Block-Scopes vorhandenen Variablen vom Stack nach dem LIFO Prinzip reserviert und mit der Variablendefinition Maschinencode zur Initialisierung der Speicherstellen ausgeführt (sofern Variable einen Initialisierungswert hat):
<syntaxhighlight lang="C">
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für int) und 8 Bytes (für double)
int var1=12; //erzeugt Maschinencode zur Initialisierung
//der ersten 4 Byte mit dem Wert 12
double var2=sin(f); //erzeugte Maschinencode, welche zunächst
//die Funktion sin() mit dem Übergabewert f
//aufruft und dessen Rückgabewert in die
//nächsten 8 Byte des reservierten Speichers
//kopiert
...
{ //siehe zuvor
int var3=var1; //siehe zuvor
double var4=var2+var1;
} //siehe nachfolgenden
} //Freigabe des zuvor reservierten Speichers
</syntaxhighlight>
Dies gilt auch für Funktionsaufrufe. Mit der öffnenden geschweiften Funktionsklammer wird ebenfalls Speicher reserviert:
<syntaxhighlight lang="C">
void foo(int par)
{ //Öffnende Funktionsklammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für (Übergabe)Variable par und 4 Bytes für Variable var
int var; //Da keine Initialisierung vorhanden ist wird auch
//kein Maschinencode zur Initialisierung ausgeführt
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Byte für Variable x
int x;
...
</syntaxhighlight>
Aufgrund der mit der Initialisierung bedingten Erzeugung von Maschinencode können die Initialisierungswerte/Inhalte der Initialisierungsliste bei lokalen Variablen aus beliebigen Ausdrücken bestehen und müssen keine Konstanten oder Konstanten Ausdrücke sein:
<syntaxhighlight lang="C">
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sin(f)}; //werden zur Laufzeit berechnet
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h> //fuer sinf()
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sinf(f)}; //werden zur Laufzeit berechnet
printf("%f\n",(double)summe);
printf("%f %f %f\n",(double)arr[0],(double)arr[1],(double)arr[2]);
}
int main(int argc,char *argv[]) {
foo(3,4);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dieser Maschinencode wird jedes Mal ausgeführt, wenn die dazugehörige Anweisung abgearbeitet wird und bedingt dementsprechend Rechenzeit. Zehnmaliges Ausführen einer Funktion oder zehnmaliges Öffnen eines Block-Scopes innerhalb einer For-Schleife führt zur zehnmaligen Ausführung der oben genannten Sachverhalte:
<syntaxhighlight lang="C">
void foo(int);
void var(void) {
for(int lauf=10; lauf>0; lauf--)
{ //zehnmaliges Reservieren von Speicher
int var=lauf*2; //zehnmalige Initialisierung
foo(var);
} //Freigabe des Speichers
}
void foo(int par) { //zehnmaliges Reservieren von Speicher
int var=12; //zehnmalige Initialisierung
} //Freigabe des Speichers
</syntaxhighlight>
Nicht initialisierte lokale Variablen werden nicht initialisiert, d.h. keine zusätzlichen Maschinenbefehle zum Initialisieren erzeugt. Der Variablenwert entspricht dann einem 'Zufallswert' oder korrekter gesagt dem Inhalt der Variablen, welcher zuvor der Speicherstelle zugewiesen war:
<syntaxhighlight lang="C">
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//und damit auch dessen zuletzt gültigen Wert
}
int main(int argc, char *argv[]) {
int var1=first(); //var1 beinhaltet Wert 7
int var2=second(); //var2 beinhaltet Wert 7
printf("var_foo=%d\n",var1);
printf("var_far=%d\n",var2);
return 0;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//(und damit auch dessen zuletzt gültigen Wert)
}
int main(int argc, char *argv[]) {
printf("%d\n",second()); //Zufallswert (0, da Stack mit 0 initialisiert ist)
printf("%d\n",first()); //Stack belegen
printf("%d\n",second()); //Zufallswert (7, da Speicherstelle zuvor mit 7
return 0; //belegt wurde)
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird eine Variableninitialisierung mit einer switch oder goto Anweisung übersprungen, so wird zwar die Variable angelegt (Speicherplatz reserviert), jedoch die Maschinenbefehle zur Initialisierung dieser Variablen nicht ausgeführt (siehe auch [[Programmieren in C/C++: Grundlagen# Switch-Anweisung|Switch-Anweisung]] und [[Programmieren in C/C++: Grundlagen# Label + Goto|Label + Goto]]). Die Variable enthält dann einen Zufallswert:
<syntaxhighlight lang="C">
switch(value) {
case 0:
int lok=7;
printf("%d",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(int value) {
switch(value) {
case 0:
int lok=7;
printf("%d\n",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d\n",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
}
void far(void) {
int var1=4711;
int var2=1799;
printf("Marke: %d, Erscheinungsjahr: %d\n",var1,var2);
}
int main(int argc,char *argv[]) {
foo(2); //Zufallswert (0, da Stack mit 0 initialisiert ist)
foo(0); //Initialisierungswert
far(); //Stack belegen
foo(2); //Zufallswert
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei erstmaligem Funktionsaufruf kann eine nicht initialisierten lokale Variablen den Wert 0 beinhalten (Stackframe wird mit Programmstart auf 0 gesetzt). Beim nächsten Aufruf der Funktion ist zumeist die Speicherstelle der lokalen Variablen mit anderen Werten gefüllt worden, so dass nun ein anderer 'Zufallswert' als 'Initialisierungswert' enthalten ist
=== C++ ===
In C++ ist ergänzend die Initialisierung einer Variablen über () möglich. Bei Objekten wird hierüber der zugehörige Konstruktor aufgerufen. Bei primitiven Datentypen entspricht der Wert in den Klammern dem Initialisierungswert:
<syntaxhighlight lang="C++">
int variable(10); //Bei primitiven Datentype entspricht dies
//int variable=10;
struct test {
int a;
test(int par) {a=par;} //Konstruktor der Struktur test
};
struct test test(4); //Konstruktor test(int par) wird aufgerufen
struct test test(4,5); //KO, kein passender Konstruktor vorhanden
</syntaxhighlight>
=== Sonstiges ===
Folgende weitere Sachverhalten gilt es bzgl. Variableninitialisierung zu berücksichtigen:
* Nach C-Spezifikation ist eine Initialisierung von Variablen nicht notwendig. Es liegt folglich kein Fehler vor, wenn auf eine nicht initialisierte Variable lesend zugegriffen wird. Ungeachtet der C-Spezifikation überprüft der Compiler mit dem Schalter '-Wall' diesen Sachverhalt und gibt eine Warning aus
* Deklarationen/Prototypen können keinen Initialisierungswert enthalten
<syntaxhighlight lang="C++">
extern int var=7; //Fehlerhaft
</syntaxhighlight>
* Const und lokale Static Variablen sollten initialisiert werden, auch wenn C in diesem Fall keinen Fehler meldet!
<syntaxhighlight lang="C++">
const int konstante; //Syntaktisch OK, Initialisierungswert fraglich!
static int statisch;
</syntaxhighlight>
== Anweisung (Statement) & Expression ==
Eine Anweisung (Statement) stellt entsprechend dem Wikipedia Artikel {{w|Anweisung_(Programmierung) | Anweisung}} ''"ein in der Syntax einer Programmiersprache formulierte einzelne Vorschrift dar, die im Rahmen der Abarbeitung des Programms auszuführen ist"''.</br>
Aus der Statement Spezifikation ergibt sich folglich, welche Bestandteile ein Programm beinhaltet kann. In der C-Spezifikation [C11 6.8] sind folgende Anweisungen definiert:
: labeled-statement: Eine Sprungmarke für die Switch- und die Goto-Anweisung
: compound-statement: siehe nachfolgendes Kapitel
: expression-statement: siehe nachfolgendes Kapitel
: selection-statement: Eine if() oder switch() Anweisung
: iteration-statement: Eine while(), do while() oder eine for() Anweisung
: jump-statement: Eine goto, break, continue oder return Anweisung
so dass ein Programmablauf wie folgt aussehen könnte:
<syntaxhighlight lang="C">
int main(int argc, char argv[]) {
int var; //declaration innerhalb eines compound-statements
label: //labeled-statement
var=var*2+1; //expression-statement
for(var=0;var<100;var++); //iteration-statement
if(var<0) //selection-statement
printf("var<0"); //espression-statement
{ int lok=var; lok++; } //compound-statement
goto label; //jump-statement
return 0;
}
</syntaxhighlight>
=== Ausdruck (Expression) ===
Entsprechend der C-Spezifikation [C11 6.5] ist ein Ausdruck eine Folge von Operatoren und Operanden, die die Berechnung eines Werts angibt, ein Objekt oder eine Funktion bezeichnet, Nebenwirkungen erzeugt oder eine Kombination davon ausführt. Die Wertberechnungen der Operanden eines Operators werden vor der Wertberechnung des Ergebnisses des Operators ausgeführt (siehe auch {{w|lang=en|Expression_(computer_science)|Expression}}).
Beispiele:
<syntaxhighlight lang="C">
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöung der globalen Variable a)
int func(int par) { a++; return par*2;}
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int a=0;
int func(int par) {
a++;
return par*2;
}
int main(int argc,char *argv[]) {
int a=4,b=7;
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöhung der globalen Variable a)
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ausdrücke entsprechen somit Rechenvorschriften, die ausgewertet werden. Ausdrücke sind in C/C++ überall dort erlaubt, wo ein Operand erwartet wird:
<syntaxhighlight lang="C">
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func3(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf()]) {}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
//Ausdruck innerhalb eines Funktionskopfes
int func1(int par) {
return 1;
}
int func2(void) {
return 1;
}
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf("func() called\n")])
{
printf("func() body\n");
}
int main(int argc,char *argv[]) {
int a=1;
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func1(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
func3(1,arr);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dies ist unter anderen ein Grund dafür, dass C/C++ als unleserlich gilt. Zur besseren Lesbarkeit eines Codes sollte dieses 'Feature' nur dann genutzt werden, wenn es zwingend notwendig ist.
=== Discarded Value / null statement ===
Alle Ausdrücke und nicht void-Funktionen haben einen Rückgabewert, der weiter verwendet werden kann:
<syntaxhighlight lang="C">
a+7 //Rückgabewert ist das Ergebnis der Addtion
printf("hallo") //printf() Funktion ist vom Typ int und gibt die Anzahl
//der ausgegebenen Zeichen zurück
a //gibt den Inhalt der Variablen zurück
7 //gibt den 'Inhalt' der Konstanten zurück
b=(a=7) //der Zuweisungsoperator gibt den Zuweisungswert zurück
</syntaxhighlight>
Der letzte Rückgabewert eines fasst jeden Ausdruckes wird somit nicht genutzt. Dies wird Discarded Value bezeichnet:
<syntaxhighlight lang="C">
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der einfachste Fall eines Discarded Values ist ein Leeranweisung / null statement, d.h. die Anweisung besteht nur aus einem Semikolon. Dies stellt eine syntaktisch korrekte Anweisung dar, die keine Auswirkung hat:
<syntaxhighlight lang="C">
; //Leeranweisung
</syntaxhighlight >
Überall wo statements/Anweisungen erwartet werden (bspw. bei einer for-Schleife, bei einer if-Anweisungen) kann anstatt einer statements eine Leeranweisung stehen, welche dementsprechend nichts ausführt:
<syntaxhighlight lang="C">
for(size_t idx=0; str[idx]!=0; idx++)
; //Leeranweisung
while(a++ < 100)
; //Leeranweisungen
</syntaxhighlight>
An einige Stellen bietet sich die Nutzung dieser Sachverhalte als vorteilhaft an. Oft führen diese Sachverhalten jedoch zu Ausführungsfehlern, da sie aufgrund des korrekten Syntax vom Compiler nicht als Fehler gemeldet werden und beim Suchen dementsprechend nur schwer zu finden sind! Ggf. gibt der Compiler für einige Sachverhalte eine Warnung aus, so dass es vorteilhaft ist, Compiler-Warnings zu beachten!
Hinweise:
* Soll bewusst der Rückgabewert verworfen werden, so kann/sollte mit dem explizten Cast auf (void) der Rückgabewert explizit 'verworfen' werden. Dies ist u.A. hilfreiche bei Variablen, die (noch) nicht benutzt werden und der Compiler die Warning "unsued Variable" ausgibt:
:<syntaxhighlight lang="C">
(void)a; //Zur Vermeidung von Compiler-Warnings "Unused Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(void) {
return 4711;
}
int main(int argc,char *argv[]) {
int a;
(void)a; //Zur Vermeidung von Compiler-Warnings "Unsued Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Mit der Anweisung <nowiki>[[nodiscard]]</nowiki> (ab C++17, ab C23) wird der Compiler angewiesen, dass der Aufrufer einer Funktion mit Rückgabewert der Rückgabewert entgegenzunehmen ist. Wird der Rückgabewert verworfen, so gibt der Compiler eine Fehlermeldung aus:
:<syntaxhighlight lang="C">
[[nodiscard]] int Client(int socket);
Client(5); ////Fehlermeldung, da Rückgabewert nicht verwendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
[[nodiscard]] int Client(int socket) {
return socket+1;
}
int Server(int socket) {
return socket+1;
}
int main(int argc,char *argv[]) {
Server(5); //keine Fehlermeldung
Client(5); //Fehlermeldung, da Rückgabewert nicht verwendet wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sequence Point ===
Ein Sequenzpunkt (u.A. das abschließende Semikolon am Ende der Anweisung) ist nach dem Wikipedia Artikel {{w|lang=en|Sequence_point|Sequence Point}} definiert als der Punkt in der Ausführung eines Computerprogramms, an dem garantiert ist, dass alle Nebenwirkungen früherer Bewertungen durchgeführt wurden und noch keine Nebenwirkungen von nachfolgenden Bewertungen durchgeführt wurden.</br>
Sequenzpunkte führen somit zur Trennung der Abarbeitungsreihenfolge innerhalb von Ausdrücken. Das abschließende Semikolon am Ende eines Ausdruckes sorgt somit dafür, dass zunächst der vorangegangene Ausdruck abgearbeitet wird, bevor der nächste Ausdruck beachtet wird.</br>
Beschreibt das Semikolon explizit einen Sequenzpunkt, so gibt es auch andere Operatoren, die einen Sequenzpunkt beinhalten. Bei solchen Operatoren wird somit zunächst vollständig der erste Teilausdruck ausgewertet, bevor der nächste folgt. Zwei Beispiele für Operatoren mit Sequenzpunkt sind das logische Und <code>&&</code> und der <code>?</code>-Operator:
<syntaxhighlight lang="C">
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(int par) {
return printf("func(%d) called\n",par);
}
int main(int argc,char *argv[]) {
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein weiteres Beispiel ist der Komma-Operator. Hier teilt das Komma den Gesamtausdruck in mehrere Teilausdrücke auf, die nacheinander abgearbeitet werden (siehe
[[Programmieren in C/C++: Grundlagen#Komma-Operator | Komma-Operator]]).
=== Abarbeitungsreihenfolge ===
Die Abarbeitungsreihenfolge der Operatoren innerhalb eines Ausdruckes wird durch die Prioritätenliste/Rangfolge (siehe [[C-Programmierung: _Liste_der_Operatoren_nach_Priorität| C-Programmierung:Liste der Operatoren nach Priorität]]) vorgegeben. Operatoren mit höherer Priorität werden vor Operatoren mit niedriger Priorität ausgeführt. Die ()-Klammer hat die höchste Priorität:
<syntaxhighlight lang="C">
//Der Ausdruck
c = sizeof(x) + ++a / 3;
//wird aufgrund der Prioritäten wie folgt ausgewertet:
c= (sizeof(x)) + ( (++a) / 3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=2;
int c;
int x=0;
c = sizeof(x) + ++a / 3;
printf("a=%d c=%d\n",a,c);
//Wird aufgrund der Prioritäten wie folgt ausgewertet:
a=2;
c= (sizeof(x)) + ( (++a) / 3);
printf("a=%d c=%d\n",a,c);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei identischer Priorität ergibt sich die Abarbeitungsreihenfolge aus der Assoziativität (L-R oder R-L):
<syntaxhighlight lang="C">
a=33 / 5 / 2;
//Wird aufgrund der L-R Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2;
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
a = b = c = d*2; //→ a=(b=(c=(d*2)));
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a;
a=33 / 5 / 2;
printf("a=%d\n",a);
//Wird aufgrund der Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2
printf("a=%d\n",a);
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
int b,c,d=8;
a = b = c = d*2; //→ a=(b=(c=(d*2)));
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
An einigen Stellen gibt die C/C++ Spezifikation die Abarbeitungsreihenfolge nicht vor (indeterminately-sequenced), überlässt diese somit dem Compiler:
* Bei Funktionsaufrufen ist die Abarbeitungsreihenfolge der Parameter nicht spezifiziert:
:<syntaxhighlight lang="C">
//Quelle: C-Spec Kap. 6.5.2.2
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int f1(void) {
printf("f1 called\n");
return 1;
}
int f2(void) {
printf("f2 called\n");
return 2;
}
int f3(void) {
printf("f3 called\n");
return 3;
}
int f4(void) {
printf("f4 called\n");
return 4;
}
void func1(int par1,int par2) {
printf("func1(%d,%d) called\n",par1,par2);
}
void func2(int par1,int par2) {
printf("func2(%d,%d) called\n",par1,par2);
}
int main(int argc,char *argv[]) {
//Quelle: C-Spec Kap. 6.5.2.2
void (*pf[2])(int,int)={func1,func2};
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Per Postinkrement/-dekrement Operator sagt aus, dass für die eigentliche Operation der Wert der Variablen genutzt wird und im Anschluss die Variable erhöht / erniedrigt werden soll. Nach C-Spezifikation [C11 6.5.2.4] muss dies spätestens vor dem nächsten Sequence Point erfolgt sein. Der genaue Zeitpunkt innerhalb des Sequence Points ist jedoch nicht vorgegeben:
:<syntaxhighlight lang="C">
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
printf("a=%d b=%d\n",a,b);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Initialisierungliste ist Abarbeitungsreihenfolge nicht spezifiziert:
<syntaxhighlight lang="C">
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
printf("var={a=%d b=%d c=%d}\n",var.a,var.b,var.c);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Compound-Statement ===
Ein Compound-Statement ist innerhalb der C-Spezifikation ein alternativer Ausdruck für ein block-scope. Dieser fasst mehrere Statements und Deklarationen zu einem Statement zusammen:
<code>
Syntax: {Declaration-or-statement-list/textsuperscript<sub>OPT</sub>}
</code>
Ein Block wird nicht wie bei einer Anweisung mit einem Semikolon abgeschlossen (Das angehängte Semikolon wäre dann eine separate leere Anweisung!).
Ein Block hat blockweite Sichtbarkeit (siehe [[Programmieren in C/C++: Grundlagen#Blockweite Sichtbarkeit | Blockweite Sichtbarkeit]]), , so dass hier definierte Variablen nur hier gültig sind. Deklarationen sind ebenfalls nur in dem Block gültig:
<syntaxhighlight lang="C">
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Verwendung findet das Compound-Statement a) als Strukturierungsmöglichkeit innerhalb von Funktionen (zur Darstellung, dass dieser Bereich 'zusammengehörig' ist) und b) an den Stellen, an denen C/C++ nur eine Anweisung erwartet. Dies sind bspw. die If- und die For-Anweisungen:
<syntaxhighlight lang="C">
for(..) Anweisung; //For-Schleife führt nur diese eine Anweisung aus
for(…) {Block} //For-Schleife führt Block (als eine Anweisung) aus
if(..) Anweisung; else Anweisung; //IF-Anweisung führt nur 'eine'
//Anweisung aus
if(..) {Block} else {Block} //IF-Anweisung führt Block aus
if( ) {Block}; else {Block}; //Semikolon ist eine separate
//Leer-Anweisung, so dass else
//nicht zur IF-Anweisung zugeordnet
//werden kann (2 Anweisungen vor Else)</syntaxhighlight>
=== Embedded Statement ===
Embedded Statements sind eine GNU-C Erweiterung (siehe [https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html GNU-C-Manual 3.18]). Da diese vom Autor als sehr nützlich angesehen und auch von diversen Compilern und auch in C++ unterstützt werden, werden diese nachfolgend beschrieben.
Ein Compound-Statement fasst mehrere Anweisungen zu einer Anweisung zusammen, hat jedoch kein Rückgabewert. Ein Embedded-Statement entspricht einem Compound-Statement mit der Ergänzung, dass dieser einen Rückgabewert hat, so dass ein Embedded-Statement überall dort eingesetzt werden kann, wo eine Operand erwartet wird.
<code>
Syntax: ({Declaration-or-statement-list<sub>OPT</sub>})
</code>
Der Rückgabewert (und Datentyp) wird nicht über eine return-Anweisung angegeben, sondern entstammt aus dem Rückgabewert der letzten Anweisung innerhalb der Liste:
<syntaxhighlight lang="C">
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
printf("var=%d\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein Embedded-Statement ähnelt folglich einem Funktionsaufruf mit dem Unterschied, dass a) in der Tat kein Funktionsaufruf stattfindet und b) der Rückgabewert nicht mit return, sondern über die letzte Anweisung zurückgegeben wird. Der Anwendungsfall ist dort zu finden, wo eine Operand erwartet wird und mehrere Anweisungen zum Ermitteln des Operanden notwendig sind:
<syntaxhighlight lang="C">
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
printf("Bedingung erfüllt");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Ein Embedded-Statement ist insbesondere bei Nutzung von Makros (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]) hilfreich
* Mittels eines Embedded-Statement kann eine anonyme Funktion/Lambdafunktion dargestellt werden:
<syntaxhighlight lang="C">
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {return a%2?a:0;} ; func;})
,arr);
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {printf("Called:%d\n",a);return a%2?a:0;} ; func;})
,arr);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Funktionen / Prozeduren ==
Funktionen/Prozeduren sind ein Strukturierungsmerkmal, so dass Teile der Funktionalität des Programmes wiederverwendbar sind. C/C++ unterscheidet nicht zwischen Funktionen (haben einen Rückgabewert, können damit als Operand in Ausdrücken verwendet werden) und Prozeduren (haben keine Rückgabewert, resp. Rückgabetyp void). <br/>
Mit jedem Aufruf einer Funktion wird für den zugehörigen Block ein eigener Stack-Kontext angelegt, so dass Funktionen sich selbst aufrufen können (Rekursion). Jeder Funktionsinstanz hat somit seinen eigenen lokalen Variablenbereich, teilen sich jedoch die globalen und die statisch lokalen Variablen.<br />
Mit dem Aufruf einer Funktion können Parameter übergeben werden, wobei die Übergabeparameter vom Aufrufer (Caller) durch den Aufruf in die lokalen Variablen des Aufgerufenen (Callee) kopiert/zugewiesen werden (Call by Value). Wird ein Zeiger übergeben, hat der Callee über die Dereferenzierung des Zeigers die Möglichkeit, die Variablen des Caller zu verändern (Call by Reference) (siehe Kap. [[Programmieren in C/C++: Zeiger #Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen).]]).
Hinweise:
* Die Klammerung hinter dem Funktionsnamen (<code>foo()</code>) zeigt an, dass es sich um einen Funktionsaufruf (Verzweigung der Programmausführung zu der Startadresse der Funktion) handelt:
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
foo(); //Klammern hinter dem Funktionsnamen bedeuten Aufruf der Funktion
</syntaxhighlight>
* Die Nutzung des Funktionsnamens ohne Klammerung (<code>foo</code>) gibt die Startadresse der Funktion zurück. Die Startadresse kann in einem Zeiger auf Funktionen gespeichert werden (siehe Kap. [[Programmieren in C/C++: Zeiger#Zeiger auf Funktionen | Zeiger:Zeiger auf Funktionen]]):
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
printf("foo called");
};
int main(int argc, char *argv[]) {
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
fptr(); //Aufruf der Funktion
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklaration/Definition vor dem ersten Aufruf der Funktion 'notwendig', damit Compiler die Übergabeparameter entsprechend bereitstellt und ggf. eine implizite Typkonvertierung durchführt (dito Rückgabewert). Die Angabe der Variablennamen können bei der Deklaration entfallen
* Die fehlende Angabe der Übergabeparameter bedeutet in C (bis einschl. C18), dass diese Funktion mit beliebigen Übergabeparametern aufgerufen werden kann und der Compiler keine Typprüfung durchführt:
:<syntaxhighlight lang="C">
int func(/*Keine Übergabeparameter angegeben*/) {...}
//kann wie folgt aufgerufen werden
func();
func(4);
func("hallo Welt",4.7);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func() {
printf("foo called\n");
};
int main(int argc, char *argv[]) {
func();
func(4);
func("hallo Welt",4.7);
//Ab C23 hat sich die Bedeutung geändert.
//Zum Testen C-Versionsvorgabe -sdc=xxx unter Compiler-options aendern
return 0;
} | execCompilerOptions=-Wall -std=c17|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:→ unbedingt vermeiden<br />
:Hat die Funktion keinen Übergabewert, so wird dies in C mit void gekennzeichnet
* In C++ bedeutet die Schreibweise ohne Datentypbeschreibung, dass keine Parameter erwartet werden
* In der Parameterliste von Funktionen dient in der GNU-C Spezifikation das Semikolon zum Trennen zwischen Deklaration von Übergabeparameter und den Übergabeparametern. Alle Übergabewerte links vom Semikolon sind (Forward)deklarationen:
:<syntaxhighlight lang="C">
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Aufruf
test1(3,7); //a=7 b=3
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim);
//Aufruf
test2("hallo",6);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim) {
printf("dim=%d\n",dim);
}
int main(int argc, char *argv[]) {
//Aufrufe
test1(3,7); //a=7 b=3
test2("hallo",6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Return-Anweisung ===
Mit der Return-Anweisung wird eine Funktion (vorzeitig) beendet. Der optionale Parameter dient der Angabe des Rückgabewertes der Funktion an den Aufrufer. Der Datentyp des Parameters ergibt sich aus dem Rückgabedatentyp der Funktion.
<code>
Syntax: return expression<sub>OPT</sub>
</code>
Der Rückgabewert expresion sagt aus, dass hier nicht nur Konstanten oder Variablen stehen können, sondern ein komplexer Ausdrücke erlaubt ist. Der resultierende Datentyp des Ausdruckes sollte dem Rückgabedatentyp der Funktion entsprechen, andernfalls wird eine implizite Typkonvertierung vollzogen (sofern möglich):<syntaxhighlight lang="C">
int foo(double a, double b) {
return (int)(a*a+b*b);
}
</syntaxhighlight>
Hinweise:
* Bei nicht void-Funktionen ist eine return-Anweisung mit einer Expression entsprechend dem Datentyp der Funktion zwingend notwendig:
:<syntaxhighlight lang="C">
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
double a=func(); //int wird in double konvertiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
int main(int argc, char *argv[]) {
double a=func(); //int wird in double konvertiert
printf("a=%f\n",a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei einer void-Funktion ist die return-Anweisung ohne Expression optional. Hier entspricht der schließende Block der Return-Anweisung
:<syntaxhighlight lang="C">
void func(char *str) {
if(str==NULL)
return;
printf("%s",str);
}
</syntaxhighlight>
Sollen mehr als ein Rückgabewert an den Aufrufer zurückgegeben werden so empfiehlt sich:
* die Rückgabewerte in einer Struktur zu packen (siehe [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++) |Datentypen:Verbundtyp Struktur/Klasse (nur C++)]])
* die Rückgabewerte über die Aufrufparameter als Call-by-Reference zu übergeben (siehe [[Programmieren in C/C++: Zeiger#Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen]])
==== Rückgabewert aus Datentypsicht ====
Aus Datentypsicht kann der Funktionsname inkl. den Parameter(n) in einem Ausdruck mit dem Datentyp des Rückgabewertes der Funktion ausgetauscht werden:
<syntaxhighlight lang="C">
int foo(void) {return 4711;}
int var;
var=1+foo(); //Aus Datentypsicht (int)=(int)+(int)
</syntaxhighlight>
Daraus ergibt sich, dass bei Arrays/Strukturen/Unions direkt auf einzelne Komponenten zugegriffen werden kann, ohne diese zuvor einer Variablen zuzuweisen:
<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
if(foo(12).x == 12) printf("Identisch\n");
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
if(far(3)[2] == 2) printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <stdlib.h>
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
int main(int argc, char *argv[]) {
if(foo(12).x == 12)
printf("Identisch\n");
if(far(3)[2] == 2)
printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
==== Fehlerrückgabe ====
Viele Funktionen können unter gewissen Umständen nicht korrekt ausgeführt werden. Z.B. aufgrund dessen, dass:
* der benötigter Speicher vom Heap nicht bereitgestellt werden kann
* Übergabeparameter außerhalb des zulässigen Wertebereiches liegen
* angeforderte Ressource (Datei, Geräte, …) nicht vorhanden/verfügbar sind
Solche Fälle gilt es dem Aufrufer mitzuteilen, da in diesen Fällen die vom Aufrufer geforderte Funktionalität nicht erfüllt ist und der Aufrufer ggf. nicht weiterarbeiten kann. Zur Mitteilung des Fehlers sollte vorrangig der Rückgabewerte genutzt werden. (auch wenn in C++ mit Exception eine Alternative hierzu bereitsteht)
<syntaxhighlight lang="C">
char *strdup(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup1(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
int main(int argc, char *argv[]) {
char *dup=strdup1("hallo");
if(dup == NULL)
printf("Fehler\n");
else
printf("dup='%s'\n",dup);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Standard-C Library-Funktionen geben in diesem Fall zumeist ein -1 (Rückgabewert Ganzzahl) oder einen NULL-Zeiger (Rückgabewert Zeiger) zurück. Der genaue Fehlergrund ist dann ergänzend in der globalen Variablen errno gespeichert. Mittels der Standard-C Funktion strerror() kann die Zahl in einen für den Anwender/Programmierer lesbaren String umgewandelt werden (die GNU-C Library Funktion printf() bietet ergänzend den Conversion Spezifier %m als alternative Ausgabemöglichkeit an):
<syntaxhighlight lang="C">
#include <errno.h>
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY|O_CREAT|O_EXCL,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY{{!}}O_CREAT{{!}}O_EXCL,
S_IRUSR{{!}}S_IWUSR{{!}}S_IRGRP{{!}}S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'''Für eine sauber Programmierung sollte diese Methodik generell angewendet werden.''' Jede Funktion, welche Fehlschlagen kann, teilt dies per Rückgabewert dem Aufrufer mit. Der Rückgabewert einer jeden Funktion wird vom Aufrufer kontrolliert.
=== Main-Funktion ===
Mit Start der Anwendung übergibt das Betriebssystem die Kontrolle an die Anwendung und führt dort die Funktion main aus. Als Übergabe- und Rückgabeparameter sind folgende Varianten erlaubt:
<syntaxhighlight lang="C">
int main(void) { }
int main(int argc, char *argv[]) { }
</syntaxhighlight>
Mit dem Start der Anwendung kann, wie bei jedem Funktionsaufruf, Parameter an den startenden Prozess übergeben werden. Die Parameter werden als Array von Strings übergeben. Im Parameter argc ist die Anzahl der Strings enthalten. Im Parameter argv[0..argc-1] sind die einzelnen Strings enthalten. Sofern vorhanden ist im ersten String der Programmname/Aufrufname der Anwendung enthalten:
<syntaxhighlight lang="C">
int main(int argc, char *argv[]) {
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++)
printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int max_width=0;
int ret;
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++) {
ret=printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
max_width=ret>max_width ? ret : max_width;
}
//Trennzeichen drucken
char term[max_width];
memset(term,'-',max_width);
printf("%.*s\n",max_width-1,term);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Im Compiler-Explorer können die Parameter im Executor unter 'Execution Arguments', getrennt mit Leerzeichen eingegeben werden.
Wird die Funktion main beendet, entweder über die return Anweisung oder den Aufruf der exit() Funktion, wird die Kontrolle zurück an den startenden Prozess (zumeist Shell) gegeben. Über den Rückgabewert wird im Allgemeinen dem Aufrufer der Fehlerstatus mitgeteilt (EXIT_SUCCESS oder 0 bedeutet fehlerfreie , EXIT_FAILURE oder Werte ungleich 0 fehlerhafte Ausführung).
Hinweise:
* Der Return-Wert der main-Funktion kann mit >>echo $? in der Bash abgefragt werden
* Mittels <code>exit(int status)</code> kann das Programm an jeder Stelle innerhalb des Programms beendet werden. <code>status</code> entspricht dann der expression der return Anweisung von main()
* Ungeachtet des Rückgabedatentyps int bei der Defintion der main() Funktion beträgt der zulässige Wertebereich für Linux Anwendungen 0..255. Der korrekte Rückgabedatentyp der main() Funktion müsste somit 'unsigned char' lauten
=== Inline Funktion ===
Wie der Name inline andeutet, ist die Intention von Inline, dass die aufgerufen Funktion Bestandteil der aufrufenden Funktion ist. Die aufgerufene Funktion soll somit im Kontext des Aufrufers ausgeführt werden, so dass kein eigener Stack bereitgestellt werden muss. Der Start der Funktion kann somit schneller erfolgen:
<code>
inline int foo(void) { }
</code>
Das Funktionseinbindung/zusammenführung erfolgt durch den Compiler (und nicht durch den Linker). Damit das inline vom Compiler ausgeführt werden kann, muss die zu inlinende Funktion vor dem Aufruf definiert sein, d.h. sie muss in derselben C-Datei oder in einer der einzubindenden Header-Dateien enthalten sein [C11 6.7.4].
Hinweis:
* Das 'inlinen' von Funktionen über die eigene Objektdatei hinweg erfolgt in C/C++ über Link Time Optimization (LTO). Hierzu fügt der Compiler den Zwischencode mit in die Objektdatei, so dass der Linker das 'inlinen' vollziehen kann (siehe {{w|lang=en|Interprocedural_optimization| Interprocedural Optimization}})
=== Variadic Function / Ellipsis Punctuator ===
Mit dem Ellipsis Puncturator '…' kann in Funktionsdefinitionen angegebenen werden, dass an dieser Stelle beliebig viele Parameter/Argumente übergeben werden können. Dies wird unter anderen in der printf() Anweisung genutzt:
<syntaxhighlight lang="C">
int printf(const char *fmt, ... );
</syntaxhighlight>
Die wie folgt aufgerufen werden kann:
<syntaxhighlight lang="C">
printf("Hello World"); //es folgt kein Parameter
printf("%d",100); //es folgt ein Parameter vom Datentyp int
printf("%f",1.1); //es folgt ein Parameter vom Datentyp double
printf(conststr,1,2,3,"xyz") //Ohne Worte
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n"); //es folgt kein Parameter
printf("%d\n",100); //es folgt ein Parameter vom Datentyp int
printf("%f\n",1.1); //es folgt ein Parameter vom Datentyp double
const char *conststr="%d %x %c '%s'\n";
printf(conststr,1,2,33,"xyz"); //Ohne Worte
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei der Parameterübergabe wird der Datentyp nicht mit übergeben, so dass die aufgerufene Funktion keine Möglichkeit hat, den Datentype der Parameter zur Laufzeit zu ermitteln. Einzig werden bei Aufruf der variadischen Funktion so viel Bytes auf den Stack gelegt, wie der Datentyp der einzelnen Übergabeparameter groß ist:
:<code>int --> 4 Byte</code>
:<code>double --> 8 Bytes</code>
:<code>Zeiger --> 4/8 Byte</code>
Damit die aufgerufene Funktion die fehlende Datentypinformation dennoch mitgeteilt bekommt, erfolgt dies am Beispiel der printf Funktion über den Format-String:
<syntaxhighlight lang="C">
int vari;
printf("%d",vari); //%d erwartet einen Integer Übergabeparameter (4-Byte)
size_t vars;
printf(" %zu %d ", vars, vari); // %zu zur Mitteilung, dass anstatt
//integer nun size_t als Datentyp übergeben wird
//und somit anstatt 4 Bytes 8 Bytes vom Stack genommen werden
</syntaxhighlight>
<code>printf()</code> entnimmt entsprechend der Datentypbeschreibung im Formatstring die passende Anzahl an Bytes vom Stack.
Da der Compiler für die optionalen Parameter nicht den Zieldatentyp kennt, erlaubt die C-Spezifikation als Übergabedatentypen hier nur die Grunddatentypen <code>signed int, unsigned int, long, long long, double</code> und <code>Zeiger</code>. Entspricht der übergebene Parameter nicht einen dieser Datentypen, so wird er mittels implizit Cast entsprechend nachfolgender Tabelle gewandelt [C11 6.5.2.2 Default Argument Promotions]:
{| class="wikitable"
|-
! Ausgangstyp !! Umwandlungstyp
|-
| char, signed char, short || int
|-
| unsigned char, unsigned short || unsigned int
|-
| float || double
|-
| Alle anderen Datentypen || bleiben erhalten
|}
Bspw.:
<syntaxhighlight lang="C">
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Über den Length-Modifier Parameter im Formatstring kann printf mitgeteilt
//werden, dass von dem übergebenem Integerwert weniger Bytes zu
//interpretieren sind
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
Zum Umgang mit dem variadischen Parameter stellt C die Funktionen <code>va_start(), va_arg(), va_copy()</code> und <code>va_end()</code> bereit. Auf Grundlage des dazugehörigen Datentyps <code>va_list</code> können variadische Parameter auch an Unterfunktionen weitergereicht werden (bspw vprintf()). Dieses Thema bedingt jedoch genaue Kenntnisse vom Umgang mit dem Stack und ist nicht Bestandteil dieser Vorlesung.
=== Funktion in Funktion ===
Die GNU-C Reference (nicht C++) erlaubt es, Funktionen innerhalb von Blöcken (und damit innerhalb von Funktionen) zu definieren. Diese innere Funktion steht dann nur in diesem Block zur Verfügung und kann von außerhalb des Blockes nicht aufgerufen werden. Als Gimmick können Funktionen in Funktionen auf die zuvor definierten lokalen Variablen der inkludierenden Funktion zugreifen:
<syntaxhighlight lang="C">
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Variable Length Array (VLA) ==
Im Normalfall ergibt sich die Anzahl der Elemente eines Arrays aus einer Konstanten, so dass der Compiler zur Compilezeit passend Speicher reserviert (siehe Kap. [[Programmieren in C/C++: Array | Array]]):
<syntaxhighlight lang="C">
int arr[4]; //Compiler reserviert für Variable arr
//4*sizeof(int) Speicherplatz
</syntaxhighlight>
Bei Variable Lenght Array wird die Arraydimension nicht über eine Konstante, sondern über eine Variable oder einen Ausdruck angegeben. D.h. die tatsächliche Dimension des Arrays ergibt sich erst zum Ausführungszeitpunkt der Definition:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //Arraydimension ergibt sich zum Ausführungszeitpunkt
n++; //Nachträgliches Ändern von n ändert nicht
//die Größe des Arrays!
}
</syntaxhighlight>
Ein Variable Length Array kann nur als lokale Variable oder als Übergabeparameter definiert werden (wobei im letzteren Fall kein Speicher hiermit reserviert wird). Eine Initialisierung eines VLA's mit der Definition ist nicht möglich, d.h. nach der Definition beinhaltet das Array 'zufällige' Werte. Es empfiehlt sich daher, diese bspw. mit memset händisch zu initialisieren (siehe auch Kap [[Programmieren in C/C++: Array#Initialisierung | Array:Initialisierung]]):
<syntaxhighlight lang="C">
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
for(size_t lauf=0;lauf<n;lauf++)
printf("str[%zu]=%d\n",lauf,str[lauf]);
}
int main(int argc, char *argv[]) {
foo(4);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mittels sizeof kann weiterhin der Speicherbedarf ermittelt werden, wobei sizeof mit einem VLA als Argument kein Konstantenausdruck ist. Stattdessen wird die Größe zur Laufzeit ermittelt:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
printf("size=%zu\n",size);
}
int main(int argc, char *argv[]) {
foo(5);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
VLA wurden erstmals in C mit C99 eingeführt. In C11 wurden VLA's als optional eingestuft und mit C23 zurück auf notwendig gesetzt. In C++ sind VLA's nicht definiert, werden jedoch vom GCC Compiler unterstützt. Als alternativen Datentyp wird hier std::array empfohlen.
Hinweis:
* VLA sind nicht direkt in einem Switch-Case Block definierbar. Wird hier ein VLA benötigt, so muss hierzu ein Block erzeugt werden:
:<syntaxhighlight lang="C">
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int value=argc;
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Operatoren ==
In der Programmiersprache C sind folgende Punctuators [C11 6.4.6] definiert:
<syntaxhighlight>
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |= , # ##
<: :> <% %> %: %:%:
</syntaxhighlight>
Die Funktionalitäten sind identisch zu Java. Aufgrund des Datentyps Zeiger gibt es in C ergänzend den Punctuator <code>-></code> (siehe Kap [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++)|Datentypen:Verbundtyp Struktur/Klasse (nur C++)]]). Der Präprozessor bedingt die beiden Punctuatoren <code>#</code> und <code>##</code> (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]).
Die letzten 6 Punctuators <code><: :> <% %> %: %:%:</code> werden zu <code>[ ] { } # ##</code> ersetzt. Sie sind für Computersysteme gedacht, welche keine ALTGR-Taste besitzen.<br />
Java kennt ergänzend den <code>>>></code> Operatoren, welcher in C über den normalen Schiebebefehl und den zugrundeliegenden Datentyp gesteuert wird.
Wie in Java sind einige Punctuators vom Kontext abhängig und haben damit unterschiedliche Funktionalitäten:
<syntaxhighlight>
++ → (Postfix) ++ vs. ++(Präfix)
-- → (Postfix) -- vs. --(Präfix)
+/- → Vorzeichen vs. Addition/Subtraktion
() → Funktionsaufruf() vs. Befehlsbestandteil if() vs. Priorisierung
</syntaxhighlight>
Für den Umgang mit dem Datentyp Zeiger besitzen einige Punctuatoren ergänzende Funktionalitäten (siehe Kap [[Programmieren in C/C++: Zeiger| Zeiger]]):
<syntaxhighlight>
& → Bitweises UND:
Anwendung: Ganzahlausdruck & Ganzahlausdruck
& → Adressoperator:
Anwendung: &Variable
* → Multiplikation
Anwendung: Ganzahl-/Gleitkommaausdruck * Ganzahl-/Gleitkommaausdruck
* → Datentyp Zeiger
Anwendung: Datentyp * Variablenname;
* → Dereferenzierung:
Anwendung: * Zeiger
</syntaxhighlight>
Punctuatoren, welche von Java abweichende / ergänzende Funktionalitäten haben, werden nachfolgend gesondert beschrieben.
Sind in einer Anweisung mehrere Operatoren enthalten, so hängt die Abarbeitungsreihenfolge von der Rangfolge/Priorität der Operatoren ab (siehe [[Programmieren in C/C++: Grundlagen#Abarbeitungsreihenfolge | Abarbeitungsreihenfolge]]).<br />
Die Rangfolge ist identisch zu Java, wobei C mehr Operatoren kennt. Generell empfiehlt sich, lieber eine Klammer zu viel als zu wenig zusetzen. Klammern haben die höchste Priorität.
=== Zuweisungs-Operator ===
Die Zuweisung ('='-Operator, assignment expression) weist dem L-Value den R-Value zu.
Der Zuweisungs-Operator gibt den L-Value als Rückgabewert der Zuweisung zurück, so dass mehrere Zuweisungen in einem Ausdruck möglich sind. Die Abarbeitungsreihenfolge ist von rechts nach links (R-L Assoziativität). Wird der 'letzte' Rückgabewert nicht verwendet, so wird dieser verworfen (siehe Kap. [[Programmieren in C/C++: Grundlagen#Discarded Value / null statement | Discarded Value / null statement]]).<br />
Beispiel:
<syntaxhighlight lang="C">
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
//der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
//Compilerfehler geworfen wird
x*=y=z //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a,b,c=3,d=4;
int x,y,z;
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
; //der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
; //Compilerfehler geworfen wird
x*=y=z; //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen return 0;
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Auf beiden Seiten der Zuweisung muss der identische Datentyp stehen. Wenn andernfalls eine implizite Typkonvertierung nicht möglich ist, gibt der Compiler einen Fehler aus:
:<syntaxhighlight lang="C">
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
(void)b;
(void)c;
(void)d;
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
* Bei der Parameterübergabe beim Funktionsaufruf wird ebenfalls indirekt der Zuweisungs-Operator angewendet. Die Parameter des Aufrufers werden per Zuweisung den lokalen Variablen der aufgerufenen Funktion zugewiesen
:<syntaxhighlight lang="C">
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int main(int argc, char *argv[]) {
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
=== Komma-Operator ===
Der Komma-Operator erlaubt es, zwei Ausdrücke auszuführen, wo nur einer erlaubt wäre. Die Ergebnisse/Rückgabewerte aller durch diesen Operator verknüpften Ausdrücke, außer dem letzten werden verworfen. Der letzte Ausdruck dient als Rückgabewert.
Folgendes gilt es bei der Nutzung des Komma-Operators zu beachten:
* Der Komma-Operator wird von links nach rechts ausgewertet (L-R Assoziativität)
* Das Komma selbst stellt eine Sequence Point dar (siehe Kap [[Programmieren in C/C++: Grundlagen#Sequence Point|Sequence Point]])
* An Stellen, wo das Komma zum Syntax gehört (z.B. Trennung der Übergabeparameter bei der Funktionsdefinition und beim Funktionsaufruf, Trennung von Variablen bei der Variablendefinition/-deklaration, Trennung der enum Konstanten) muss der Ausdruck ergänzend geklammert werden, wenn der Komma-Operator gefordert ist
* Der Komma-Operator hat von allen Operatoren die niedrigste Priorität/Rangfolge, so dass dieser Operator als letztes 'ausgewertet' wird
Beispiel:
<syntaxhighlight lang="C">
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
int c=1,d=2,e=3;
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
void func(int value){}
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int value){
printf("func called with %d\n",value);
}
int main(int argc, char *argv[]) {
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
printf("a=%d\n",a);
int c=1,d=2,e=3;
printf("c=%d,d=%d,e=%d\n",c,d,e);
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
printf("c=%d,f=%d\n",c,f);
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'Sinnvolle' Anwendungsbeispiele:
* Bei For-Schleifen, so dass mehrere Variablen initialisiert und mehrere Variablen mit jedem Schleifendurchlauf geändert werden können:
:<syntaxhighlight lang="C">
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf]);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf])
printf("sum=%d lauf=%d\n",sum,lauf);
printf("sum=%d\n",sum);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der Return-Anweisung, bei welcher zur Darstellung der Zusammengehörigkeit mehrere Aktionen ausgeführt werden sollen:
:<syntaxhighlight lang="C">
return errno=EINVAL,-1;
return printf("Fehler"),-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <errno.h>
int foo(void) {
return errno=EINVAL,-1;
}
int far(void) {
return printf("Fehler\n"),-1;
}
int main(int argc, char *argv[]) {
printf("foo()=%d\n",foo());
printf("far()=%d\n",far());
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* An Stellen, wo nur eine Anweisung erlaubt ist (und man zu faul ist, einen Block zu öffnen)
:<syntaxhighlight lang="C">
if(…) y=2,z=3;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int y=0,z=0;
if(1) y=2,z=3;
printf("y=%d z=%d\n",y,z);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In vielen Ländern wird das Komma zur Darstellung von Gleitkommazahlen genutzt. Wird versehentlicher Weise dies in C/C++ übernommen, so führt dies zu einem unerwarteten Verhalten:
:<syntaxhighlight lang="C">
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
printf("var=%f\n",var);
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
printf("var=%f\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== ?-Operator / Conditional-Operator ===
Operator mit 3 Operanden, welcher in Abhängigkeit des ersten Ausdruckes den zweiten oder dritten Ausdruck ausführt und dessen Rückgabewert zurückgibt.
<code>
Syntax: Logical-OR-expression ? expression : condition-expression
</code>
Entspricht der if()-Anweisung, wobei der ?-Operator als solches einen Wert zurückgibt! <code>Expression</code> wird nur ausgeführt, wenn <code>Logical-OR-Expression</code> zu true ausgewertet wird. Andernfalls wird <code>condition-expression</code> ausgeführt. Der zurückgegebene Datentyp ergibt sich aus der <code>expression</code> resp. <code>condition-expression</code>. '''Beide Ausdrücke sollten somit einen identischen resultierenden Datentyp besitzen!'''
Folgendes gilt es bei der Nutzung des ?-Operators zu beachten:
* Der Datentyp <code>expression</code> und <code>condition-expression</code> sollte identisch sein:
<syntaxhighlight lang="C">
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Nach der GNU-C Reference kann der mittlere Ausdruck fehlen. In diesem Fall wird stattdessen das Ergebnis des linken Operanden dort eingesetzt (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)
<syntaxhighlight lang="C">
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
printf("b=%d\n",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* In der Abarbeitungsreihenfolge liegt der ?-Operator oberhalb der Komma- und des Zuweisungsoperators. Soll im <code>condition-expresion</code> Ausdruck der Komma- oder Zuweisung-Operator genutzt werden, so ist <code>condition-expression</code> zu klammern. Andernfalls bedingt die niedrige Priorität des Komma-Operators ein anders Verhalten, als erwartet:
<syntaxhighlight lang="C">
int a=7,max=5,var;
max=a>max ? a : max; //Alles bestens
var= a>5 ? a++,5:6; //Alles bestens
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=7;
int max=5;
max=a>max ? a : max; //Alles bestens
printf("max=%d\n",max);
int var;
var= a>5 ? a++,5:6; //Alles bestens
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
printf("var=%d a=%d\n",var,a);
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
printf("var=%d a=%d\n",var,a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Nutzung des ?-Operators empfiehlt sich an diversen Stellen:
* Bei Makros:
:<syntaxhighlight lang="C">
#define MAX(a,b) (a>b?a:b)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
int main(int argc, char *argv[]) {
printf("MAX(4,5)=%d\n",MAX(4,5));
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Beim Fehlerhandling:
:<syntaxhighlight lang="C">
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion ausgeführt wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn ret==0 ist
//andernfalls wird ret zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 0;
}
int init2(void) {
printf("init2() called\n");
return 0;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn Ret==0 ist
//andernfalls wird Ret zurückgegeben
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Logische Verknüpfungen ===
Alle logischen Operationen nutzen als Operanden Ganzzahlen ,Gleitkommazahlen oder Zeiger. Der Operand wird als false angesehen, wenn der Operand 0, 0.0 oder NULL ist. Andernfalls als true. Das Ergebnis ist immer vom Datentyp int und hat den Wert von 0 oder 1.
<code>Syntax: Expression && Expression</code><br />
<code>Syntax: Expression || Expression</code><br />
<code>Syntax: ! Expression</code><br/>
Bei der logischen UND und ODER Verknüpfung wird zuerst der linke Ausdruck ausgewertet (Operator ist ein Sequence Point). Der rechte Ausdruck wird nur ausgeführt, wenn:
* bei der logischen UND Verknüpfung der linke Ausdruck TRUE ergab
* bei der logische OR Verknüpfung der linke Ausdruck FALSE ergab
Andernfalls steht das Ergebnis schon mit der Auswertung des linken Operanden fest.<br />
In der theoretischen Informatik wird dies 'Non-strict-evaluation' genannt, bei welcher der Rückgabewert feststeht, bevor alle Ausdrücke bearbeitet worden sind.
Beispiel für das Verhalten des Ausbleibens der Auswertung des zweiten Operators:
<syntaxhighlight lang="C">
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a || ++a)
b=1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a {{!}}{{!}} ++a)
b=1;
printf("a=%d b=%d\n",a,b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Diese Funktionalität ist insbesondere beim Umgang mit Fehlern vorteilhaft:
* Prüfen, ob eine Variable einen gültigen Wert hat, bevor sie weiterverwendet wird
<syntaxhighlight lang="C">
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
else
printf("Kein Substring im String gefunden\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion aufgerufen wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 1;
}
int init2(void) {
printf("init1() called\n");
return 1;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Bitweise Verknüpfungen ===
Alle bitweisen Operationen nutzen als Operanden Ganzzahlen. Bei vorzeichenbehafteten Zahlen ist das Ergebnis nach [C11 6.5] Implementierungsabhängig, wobei das Vorzeichenbit zumeist als eigenständiges Bit angesehen wird und bei UND/ODER/EXOR als normales BIT betrachtet wird.
<code>Syntax: Ganzzahl & Ganzzahl → Bitweise UND Operation</code><br />
<code>Syntax: Ganzzahl | Ganzzahl → Bitweise ODER Operation</code><br />
<code>Syntax: Ganzzahl ^ Ganzzahl → Bitweise EXOR Operation</code><br />
<code>Syntax: ~ Ganzzahl → Bitweise Negierung</code><br />
<code>Syntax: Ganzzahl >> additive-expression</code><br />
<code>Syntax: Ganzzahl << additive-expression</code><br />
Mittels des Schiebeoperators können '''Ganzzahlen''' um <code>additive-expression</code> bitweise nach Links <code><<</code> oder Rechts <code>>></code> verschoben werden. Der resultierende Datentyp ergibt sich aus dem linken Operanden. Der rechte Operand muss positiv und der Wert kleiner gleich der Bitbreite des linken Operanden sein. Andernfalls ist das Ergebnis implementierungsspezifisch.
Nach [C11 6.5.7] ist das Ergebnis der Schiebeoperation implementierungsspezifisch, wenn der linke Operand eine negative vorzeichenbehaftete Zahl ist. In der Regel wendet der Compiler jedoch folgende Schiebeoperation an:
* Logisches Schieben (zu füllende Bit-Stellen werden mit 0 aufgefüllt), wenn der linke Operand einen vorzeichenlosen Datentyp hat
* Arithmetisches Schieben (zu füllende Bit-Stelle beim Rechtsschieben wird mit dem Vorzeichenbit aufgefüllt), wenn der linke Operand ein vorzeichenbehaftete Datentyp ist. Hiermit wird das Vorzeichen beibehalten, so dass eine negative Zahl nach dem Schieben weiterhin negativ ist (In Java erfolgt dies durch den >>> - Operator)
Hinweis:
* Ein Schieben um eine Stelle nach rechts entspricht einer Division durch 2
* Ein Schieben um eine Stelle nach links entspricht einer Multiplikation mit 2
=== sizeof-Operator ===
Der sizeof-Operator dient zur Ermittlung des Speicherbedarfs (in Bytes) einer Variablen/eines Datentyps.
<code>Syntax: sizeof (type-name)</code><br />
<code>Syntax: sizeof unary-expression</code><br />
Als Argument für den Sizeof-Operator kann wahlweise ein Datentyp, eine Variable oder ein Ausdruck genutzt werden. Sizeof gilt als Konstantenausdruck, d.h. seine Berechnung erfolgt durch den Compiler, sodass:
* sizeof zur Initialisierung von globalen Variablen genutzt werden
:<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz); //3*sizeof(int)=12
int main(int argc, char *argv[]) {
printf("size=%zu\n",size);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* bei einem Ausdruck dieser nicht ausgeführt wird, sondern nur der resultierende Datentyp bestimmt wird und dessen Größe zurückgegeben
:<syntaxhighlight lang="C">
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der resultierende Datentyp des Rückgabewertes ist <code>size_t</code>.
Es empfiehlt sich, den sizeof-Operator mit Klammern zu nutzen, andernfalls gibt sizeof bei Anwendung auf einen Ausdruck die Größe des linken Operators zurück:
<syntaxhighlight lang="C">
size_t size;
short var;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
size_t size;
short var=0;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
printf("size=%zu var=%d\n",size,var);
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* sizeof angewendet auf char gibt immer den Wert 1 zurück.
* sizeof ist nicht auf Operanden vom Typ Funktion, void, Felder ohne Größenangabe und Bitfelder anwendbar
* wird sizeof auf ein VLA angewendet, so entspricht sizeof nicht mehr einen Konstantenausdruck, sondern einem Funktionsaufruf
:<syntaxhighlight lang="C">
void foo(int n) {
int arr[n];
size_t size=sizeof(arr); //Speicherbedarf ist kein Konstantenausdruck
//sondern wird zur Laufzeit berechnet
</syntaxhighlight>
* Sizeof entspricht nicht strlen(), da sizeof die Größe des für die Variable reservierten Speicherbereich zurückgibt und nicht wie strlen() den Inhalt des Speicher hinsichtlich des Stringendezeichens auswertet:
:<syntaxhighlight lang="C">
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Anweisungen ==
=== If-Anweisung ===
<code>Syntax: if (expression) statement</code><br />
<code>Syntax: if (expression) statement else statement</code><br />
Das Ergebnis des Ausdruckes (Ganzzahl, Gleitkommazahl oder Zeiger) wird auf ungleich 0, 0.0 oder NULL getestet. Trifft dies zu, so wird statement ausgeführt. Andernfalls wird das else statement ausgeführt, sofern vorhanden. Sollen mehrere Anweisungen ausgeführt werden, so sind diese mittels Block zusammenzufassen (diesen dann bitte nicht mit ; abschließen).
Beispiel:
<syntaxhighlight lang="C">
if(a==1)
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
if(a) //entspricht a!=0
if(printf("hallo")<0) //prüfen, ob printf() fehlschlägt
if( ({int dummy=a;a=b;b=dummy;})==6)
if(a=7) //Zuweisung!
if(7=a) //KO, Eine Konstante kann kein L-Value sein
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1,b=2;
if(a==1)
printf("a==1\n");
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
printf("a=1\n");
if(a) //entspricht a!=0
printf("a\n");
if(printf("hallo\n")<0) //prüfen, ob printf() fehlschlägt
printf("printf()\n");
if( ({int dummy=a;a=b;b=dummy;})==6)
printf("({...})\n");
if(a=7) //Zuweisung!
printf("a=7\n");
if(7=a) //KO, Eine Konstante kann kein L-Value sein
;
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei der Anweisung <code>if(a==7)</code> finden aus syntaktischer Sicht zwei Aktionen statt. Zunächst wird geprüft, ob a gleich 7 ist. Dieser Vergleich liefert true(=1) oder false(=0) zurück. Die If-Anweisung prüft im Anschluss, ob das Argument true oder false ist.
=== For-Anweisung ===
<code>Syntax: for(Initialisierungsteil<sub>OPT</sub> ; Test<sub>OPT</sub> ; Fortsetzung<sub>OPT</sub>) Statement</code>
Die For-Anweisung wird vom Compiler wie folgt umgesetzt:
<poem> '''Initialisierungsteil'''<sub>OPT</sub>
Goto Next
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
'''Statement'''
Continue:
'''Fortsetzung'''<sub>OPT</sub>
Next:
if('''Test'''<sub>OPT</sub>) goto Goon
Break:
</poem>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
for(summe=lauf=0;lauf<20;lauf++)
summe+=lauf;
printf("summe=%d\n",summe);
//Initialisierungsteil
summe=lauf=0;
goto Next;
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
//Statement
summe+=lauf;
Continue: __attribute__((unused))
//Fortsetzung
lauf++;
Next:
//if(TestOPT) goto Goon
if(lauf<20) goto Goon;
Break: __attribute__((unused))
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die einzelne Elemente haben folgende Bedeutung/Besonderheiten:
;Initialisierungsteil: Zum Initialisieren von Schleifenvariablen, wird einmalig mit Beginn der FOR-Anweisung ausgeführt.
:* kann Leer sein, dann erfolgt keine Initialisierung
:* Ab C99: Hier kann eine lokale Variable definiert werden, welche nur innerhalb dieser For-Anweisung gültig ist
;Testteil: Hierin wird vor jedem Schleifendurchlauf geprüft, ob die Schleifenbedingung erfüllt ist. Wenn Bedingung nicht erfüllt ist (Ganzzahl, Gleitkommazahl oder Zeiger gleich 0,0.0 oder NULL), wird die For-Schleife beendet.
:* Kann leer sein, dann wird dieser Teil als true angesehen
;Fortsetzungsteil: Wird nach jeden Schleifendurchlauf ausgeführt. In der Regel sollte hier die Schleifenvariable aktualisiert werden
:* Kann leer sein
;Statement: In der Schleife auszuführender Ausdruck
:* Sollen mehrere Ausdrücke ausgeführt werden, so sind diese in einem Block zusammen zu fassen.
:Ergänzende Anweisungen innerhalb des Statements/Block
:* 'continue' zum Fortsetzen des Schleifendurchlaufes, d.h. Sprung zum Fortsetzungs-Teil
:* 'break', zum Beenden des Schleifendurchlaufes
Beispiele:
* For-Schleife mit lokaler Schleifenvariable
:<syntaxhighlight lang="C">
char string[]="hallo";
for(size_t lauf=0; lauf < strlen(string); lauf++)
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife mit Break-Anweisung
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
printf("lauf=%zu\n",lauf);
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife, bei welcher die gesamte Aktion innerhalb der For-Anweisung ausgeführt wird
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;
src[l]!=0 && l <sizeof(dest);
printf("l=%zu\n",l),dest[l]=src[l],l++);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;src[l]!=0 && l <sizeof(dest); printf("l=%zu\n",l),dest[l]=src[l],l++);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleifenvariable muss keine Zählvariable sein
:<syntaxhighlight lang="C">
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
printf("Anzahl Einsen in %b = %d\n",zahl,bits);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zeiger als Schleifenvariable
:<syntaxhighlight lang="C">
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
printf("src='%s' dst='%s'\n",src,dst);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Zur Geschwindigkeitsoptimierung sollten im Test- und Fortsetzungsteil keine Funktionsaufrufe mit Werten enthalten sein, die sich innerhalb der Schleife nicht ändern:
:<syntaxhighlight lang="C">
for(size_t lauf=0;lauf<strlen("hallo");lauf++)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zur Geschwindigkeitssteigerung sollte im Testteil auf 0 abgefragt werden, d.h. die Schleifenvariable dekrementiert werden
:<syntaxhighlight lang="C">
for(int lauf=700000;lauf;lauf--)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(ssize_t lauf=700000000;lauf;lauf--)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
for(ssize_t lauf=0;lauf<700000000;lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Alternativ zu einer Laufvariablen empfiehlt sich die Nutzung von Pointer als Schleifenvariable;
:<syntaxhighlight lang="C">
for(char *ptr=str; *ptr; ptr++);
</syntaxhighlight>
=== While-Anweisung ===
<code>Syntax: while(expression) Statement </code><br />
<code>Syntax: do Statement while(expression);</code><br />
Die While-Anweisungen werden vom Compiler wie folgt umgesetzt:
{| class="wikitable"
! while()-Anweisung !! do while()-Anweisung
|-
| <poem>
Continue:
if(!'''expression''')
goto Break
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
'''Statement'''
goto Continue
Break:
</poem> ||
<poem>
GoOn:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
'''Statement'''
Continue:
if('''expression''')
goto GoOn
Break:
</poem>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
lauf=summe=0;
while(lauf<10) {
if(lauf>=5)
break;
lauf++;
if(lauf<3)
continue;
summe+=lauf;
}
printf("summe=%d\n",summe);
lauf=summe=0;
Continue1:
if(!(lauf<10))
goto Break1;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
//Statement
if(lauf>=5) {
goto Break1;
}
lauf++;
if(lauf<3)
goto Continue1;
summe+=lauf;
goto Continue1;
Break1:
printf("summe=%d\n",summe);
lauf=summe=0;
do {
lauf++;
if(lauf>5)
break;
if(lauf<3)
continue;
summe+=lauf;
} while(lauf<10);
printf("summe=%d\n",summe);
lauf=summe=0;
GoOn2:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
//Statement
lauf++;
if(lauf>5)
goto Break2;
if(lauf<3)
goto Continue2;
summe+=lauf;
Continue2:
if(lauf<10)
goto GoOn2;
Break2: __attribute__((unused));
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Folgendes gilt es bei der Nutzung der While-Anweisung zu beachten:
* Soll mehr als ein Statement innerhalb der While-Schleife ausgeführt werden, so sind diese in einem Block zu schreiben
* Statement kann eine Leeranweisung (gekennzeichnet durch ein Semikolon) sein
:<syntaxhighlight lang="C">
while(1);
do ; while(1);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf1=1000;
while(lauf1--);
int lauf2=1000;
do ; while(lauf2--);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der do-While-Schleife ist das abschließende Semikolon Bestandteil des Befehls
* expression muss eine Ganzzahl, Gleitkommazahl oder Zeiger zurückgeben, der bei False (0, 0.0 oder NULL) die Schleife beendet.
Beispiele:
* Endlosschleife
:<syntaxhighlight lang="C">
while(1) {}
</syntaxhighlight>
* Schleife zum Durchlaufen eines String
:<syntaxhighlight lang="C">
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
printf("Stringlänge=%zu\n",len);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Switch-Anweisung ===
<code>Syntax: switch(expression) statement</code><br />
<code>Syntax: statement:= case constant-expression: statement<sub>opt</sub> default: statement<sub>opt</sub></code><br />
Die Switch-Anweisung entspricht einer verschachtelten If-Anweisung, mit der Besonderheit, dass der auszuführende Code nicht im If-Zweig stattfindet, sondern dort ein goto zum eigentlichen Code enthalten ist:
{| class="wikitable"
! Switch-Anweisung !! Compilerumsetzung
|-
|<syntaxhighlight lang="C">
switch(a) {
case 1:
int a=7;
//Code
break;
case 2:
printf("%d",a);
case 3: {
int a;
//Code
}
case 4 ... 8:
default:
//Code
}
</syntaxhighlight>
||<poem>
if(a==1)
goto label1;
else if(a==2)
goto label2;
else
goto label_default;
//-------------------
label1:
//Code
goto label_break;
label2:
//Code
label_default:
goto label_break;
label_break:
</poem>
|}
Folgendes gilt es bei der Nutzung der Switch-Anweisung zu beachten:
* <code>Expression</code> muss zu einer Ganzzahl (int, short, char, long, long long) oder enum (entspricht einer Ganzzahl) ausgewertet werden
* <code>constant-expression</code> muss eine Ganzzahl-Konstante oder ein Enumelement sein. Sie darf nicht doppelt im Block vorkommen. Der genaue Datentyp ergibt sich aus dem Datentyp der <code>expression</code>
* Lt. Spezifikation ist ein nur <code>statement</code> hinter der switch-Anweisung erlaubt, so dass nur ein <code>case</code> Fall oder der <code>default</code> Fall bedient werden kann::<syntaxhighlight lang="C">
int var=1;
switch(var) case 1: printf("hallo");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) case 1: printf("hallo");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweifte Klammer der <code>switch</code>-Anweisung erzeugt einen Block, so dass a) hier mehrere <code>case</code>-Fälle und b) hierin definierte Variablen innerhalb des gesamten Blocks zur Verfügung stehen (sind somit nicht <code>case</code> abhängig). Die <code>case</code> Anweisung ist nichts anderes als eine Sprungmarken (welche durch die switch-Anweisung angesprungen wird) so dass der Initialisierungsteil der lokalen Variablen übersprungen / nicht ausgeführt werden kann:
:<syntaxhighlight lang="C">
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("%d %d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
break;
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1;
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("a=%d b=%d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
(void)a;
break;
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* GNU-C (siehe [https://www.gnu.org/software/c-intro-and-ref/manual/html_node/switch-Statement.html Switch-Statement]) erlaubt ergänzend zur Angabe einer Konstante die Angabe eines Wertebereiches:
:<syntaxhighlight lang="C">
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=2;
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
printf("a im Bereich von 1 bis 8\n");
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* <code>break</code> ist optional. Mittels <code>break</code> wird an das Ende der Switch-Anweisung gesprungen. Wenn <code>break</code> weggelassen wird, wird die nachfolgende Anweisungen ausgeführt. Ggf. gibt der Compiler eine Warning aus. Mittels der GCC-Compiler-Anweisung __attribute__((fallthrough)); kann diese Warning unterdrückt werden:
:<syntaxhighlight lang="C">
switch(a) {
case 0: //ggf. Compiler-Warning
__attribute__((fallthrough)); case 1:
case 2:
break;
}
</syntaxhighlight>
* Ein Variable Length Array ist als Variable im Switch-Block direkt nicht erlaubt. Ist dies notwendig, so ist das VLA in einem inneren Block zu kapseln:
:<syntaxhighlight lang="C">
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Case - Anweisungen sind nichts anderes als Sprungmarken (Labels), so dass CASE-Anweisungen überall innerhalb des Switch-Blockes stehen können:
:<syntaxhighlight lang="C">
int prime(int value) {return value+1;}
void hallo(int var) {
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int prime(int value) {
return value+1;
}
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:oder anderen Anweisungen innerhalb des Switch-Blockes enthalten sein können:
:<syntaxhighlight lang="C">
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++;
case 7: *dst = *src++;
case 6: *dst = *src++;
case 5: *dst = *src++;
case 4: *dst = *src++;
case 3: *dst = *src++;
case 2: *dst = *src++;
case 1: *dst = *src++;
}while(--n>0);
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h> //fuer uintptr_t
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++; printf("%02hhx ",*dst);
case 7: *dst = *src++; printf("%02hhx ",*dst);
case 6: *dst = *src++; printf("%02hhx ",*dst);
case 5: *dst = *src++; printf("%02hhx ",*dst);
case 4: *dst = *src++; printf("%02hhx ",*dst);
case 3: *dst = *src++; printf("%02hhx ",*dst);
case 2: *dst = *src++; printf("%02hhx ",*dst);
case 1: *dst = *src++; printf("%02hhx ",*dst);
}while(--n>0);
}
}
int main(int argc, char *argv[])
{
char src[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char dst;
send(&dst,src,20);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Eine Switch-Case Anweisung über Strings sind in C/C++ nicht möglich:
:<syntaxhighlight lang="C">
switch(str) {
case "hallo":
return 1;
case "du da":
return 2;
case "xyz":
return 3;
default:
rReturn -1;
}
</syntaxhighlight>
:Ein direkte Lösungsansatz ist die Nutzung von strcmp() zum Vergleichen von String. Da strcmp zeichenweise den String vergleicht, ist dieser Ansatz langsam. Alternativ bietet sich an, von allen String einen Hash-Wert zu berechnen und zunächst diesen Hash-Wert zu kontrollieren. Da der Hash-Wert nicht eindeutig ist, muss ergänzend ein strcmp() erfolgen:
:<syntaxhighlight lang="C">
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h>
//Lösungsansatz von: https://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
#define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
#define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
#define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
#define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
#define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
#define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
#define HASH_LAUFZEIT(s) (H256(s,0,0))
//Eigener Lösungsatz zur Umsetzung des vorherigen HASH-Algorithmus
//so dass dieser zur Compilezeit berechnet werden kann
//Was fehlt ist die abschließende EXOR berechnung!
//Problem war, dass die Array-Dereferenzierung nicht zur Compilezeit
//aufelöst werden kann
#define HH0(a,x) (x*65599u+a)
#define HH1(a) HH0(a,HH0(0,HH0(0,HH0(0,0))))
#define HH2(a,b) HH0(b,HH0(a,HH0(0,HH0(0,0))))
#define HH3(a,b,c) HH0(c,HH0(b,HH0(a,HH0(0,0))))
#define HH4(a,b,c,d) HH0(d,HH0(c,HH0(b,HH0(a,0))))
#define HH4x(a,b,c,d,x) HH0(d,HH0(c,HH0(b,HH0(a,x))))
#define HH5(a,b,c,d,e) HH4x(b,c,d,e,HH4x(0,0,0,a,0))
#define HH6(a,b,c,d,e,f) HH4x(c,d,e,f,HH4x(0,0,a,b,0))
#define HH7(a,b,c,d,e,f,g) HH4x(d,e,f,g,HH4x(0,a,b,c,0))
#define HH8(a,b,c,d,e,f,g,h) HH4x(e,f,g,h,HH4x(a,b,c,d,0))
#define HH9(a,b,c,d,e,f,g,h,i) HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0)))
#define HH10(a,b,c,d,e,f,g,h,i,j) HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0)))
#define HH11(a,b,c,d,e,f,g,h,i,j,k) HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0)))
#define HH12(a,b,c,d,e,f,g,h,i,j,k,l) HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0)))
#define HH13(a,b,c,d,e,f,g,h,i,j,k,l,m) HH4x(j,k,l,m,HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0))))
#define HH14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) HH4x(k,l,m,n,HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0))))
#define HH15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) HH4x(l,m,n,o,HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0))))
#define HH16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) HH4x(m,n,o,p,HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0))))
#define EIGHTEENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \
a11,a12,a13,a14,a15,a16,a17,a18, ...) a18
#define CONCAT(c,d) c ## d
#define CONCATI(a,b) CONCAT(a,b)
#define HASH_COMPILEZEIT(...) CONCATI(HH , EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0))(__VA_ARGS__)
//Lösungsansatz basierend auf: https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/preprocessor/macros/__VA_ARGS__/count-arguments
#define COUNT_ARGUMENTS(...) EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main(int argc, char *argv[]) {
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:Siehe:[https://benhoyt.com/writings/hash-table-in-c/ Hash Table in C]
== Label + Goto ==
=== Label ===
<code>Syntax: name:</code><br />
Labels dienen zur Kennzeichnung einer Anweisung, so dass die Programmausführung an dieser Stelle fortgesetzt, resp. mit einer GOTO-Anweisung angesprungen werden kann. Ein Label ist durch den folgenden Doppelpunkt gekennzeichnet. Dem Label muss eine Anweisung folgen, welches auch eine Leeranweisung (Semikolon) sein kann.
Folgendes gilt es bei der Nutzung von Labels zu beachten:
* Ein Label entspricht der Speicheradresse des der Label-Anweisung folgenden Anweisung
* Bei nicht genutzten Labels (mit goto nicht angesprungene Labels) gibt der Compiler eine Warning aus. Diese kann beim GCC-Compiler mit __attribute__((unused)) unterdrückt werden
* die Case- und die Default-Anweisung aus der Switch-Anweisung entspricht einem Label
<br />
Labels hat eine funktionsweite Sichtbarkeit (siehe Kap [[#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]). Dies bedeutet, dass das:
* Labels nur innerhalb einer Funktion gültig ist
* Labels einen von Variablen/Funktionen/Datentypen unabhängigen Namensraum haben
* Kein Prototyp für ein Label notwendig ist, wenn es bei Nutzung über goto noch nicht gesetzt worden ist, also nach vorne gesprungen wird
=== goto ===
<code>Syntax: goto label;</code><br />
Mit der Goto-Anweisung wird die Programmausführung an der mit <code>label</code> gekennzeichneten Stelle fortgesetzt.
Folgendes gilt es bei der Nutzung von goto zu beachten:
* Mit einer <code>goto</code> Anweisung kann an eine beliebige Steller innerhalb der '''identischen''' Funktion gesprungen werden. Es kann nicht zu einem Label in einer anderen Funktion gesprungen werden (hierzu ist <code>setjmp()</code> und <code>longjmp()</code> zu nutzen)
* Mit der Goto Anweisung kann gleichermaßen in einen Block hinein, als auch herausgesprungen werden:
:<syntaxhighlight lang="C">
goto first_time;
for(;;) {
if(a>10)
goto last_time:
first_time:
a++;
}
last_time: ;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0;
goto first_time;
for(;;) {
printf("a=%d\n",a);
if(a>10)
goto last_time;
first_time:
a++;
}
last_time: ; //Leeranweisung wäre hier nicht nötig
return 0; //da dem Label ein return folgt!
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Wird mit der <code>goto</code> Anweisung der Initialisierungsteil einer Variablen übersprungen, so ist zwar die Variable existent, beinhaltet aber nicht ihren Initialisierungswert
Beispiel:
<syntaxhighlight lang="C">
goto label1;
if(a==3) {
label2:
printf("True\n");
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=3;
goto label1;
if(a==3) {
label2:
printf("True\n");
a++;
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In Java gibt es das Schlüsselwort goto, welches aber ohne Funktion ist. Es gibt jedoch Labels, die mit "break label" angesprungen werden können
=== Anwendungsbeispiele ===
Prinzipiell sind Goto-Anweisungen zu vermeiden. In einigen Anwendungsfällen erweist sich goto als nützlich:
* Nutzung nur einer <code>return</code> Anweisung in einer Funktionen
:<syntaxhighlight lang="C">
#include <unistd.h>
int input(int hdl,size_t buflen) {
int rc=-1;
unsigned char packettype;
if(read(hdl,&packettype,1) != 1)
goto exit;
unsigned short packetlen;
if(read(hdl,&packetlen,2) != 2)
goto exit;
if((1+packetlen) > buflen) {
rc=-2;
goto exit;
}
rc=packetlen;
exit:
return rc;
}
</syntaxhighlight>
* Konstruktor mit mehreren Initialisierungsteilen
:<syntaxhighlight lang="C">
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Abbruch einer verschachtelten Schleife
:<syntaxhighlight lang="C">
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Sonstiges ==
=== ??-Trigraphs ===
Zeichenfolge bestehend aus 3 Zeichen beginnend mit 2 Fragezeichen.
Die beiden Fragezeichen entsprechen einem ESCAPE-Operator (siehe Kap [[#Char-Konstanten|Char-Konstanten]]), welcher das nachfolgende Zeichen durch ein anderes ASCII Zeichen ersetzt. Die Ersetzung findet auch innerhalb von Strings statt.<br />
Trigraphs wurden früher genutzt, als die ALTGR Taste noch nicht üblich war.
<syntaxhighlight>
??< → { ??> → }
??( → [ ??) → ]
??/ → \ ??! → |
??' → ^ ??- → ~
??= → #
</syntaxhighlight>
Bei neuer C Varianten muss zur Nutzung von Trigraphs der Compiler mittels -trigraphs aktiviert werden.
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
6hmt5zzp4ae08ojkrxgljk6eleceycd
1090664
1090663
2026-09-10T12:33:35Z
D. Justen
102048
Formatierung geändert
1090664
wikitext
text/x-wiki
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
<!-- Falls du ein automatisch erstelltes Inhaltsverzeichnis nicht willst, ersetze das nachfolgende TOC durch NOTOC -->
<!-- Einklammerung mit noinclude, damit dieses nicht in der Druckversion erscheint -->
<noinclude>__TOC__</noinclude>
Die Programmiersprache C/C++ beinhaltet mehrere Sprachen/ Syntaxen:
* C-Syntax
* Präprozessor-Syntax
* Printf/Scanf Formatstring Syntax
* Terminal Emulation
* Compiler/Linker Anweisungen
Letztere beiden werden nur rudimentär in dieser Vorlesung/diesem Skript behandelt. Alle anderen sind Bestandteil dieser Vorlesung.
In diesem Kapitel sollen zunächst allgemeine Eigenschaften der Sprache, der grundlegende Syntax und die Kontrollstrukturen erklärt werden. Bei vielen Erklärungen sind Code-Beispiele vorhanden. Da man aus Fehlern am meisten lernt, sind zum Teil auch negative Beispiele enthalten. Für ein besseres Verständnis empfiehlt es sich, Code-Beispiele selbst nachzuvollziehen.<br />
Sofern sich die Eigenschaften auf eine bestimmte C-/C++- oder Compiler-Version beziehen, wird dies gesondert vermerkt.
== Zeichensatz ==
Der Syntax von C nutzt die unteren 128 Zeichen des ASCII Zeichensatzes. Da UTF-8 in den ersten 128 Zeichen deckungsgleich zu ASCII ist, kann auch dieser zur Erstellung des Source Codes genutzt werden.
Zeichen außerhalb dieses gültigen Zeichensatzes können folglich nur in Strings oder Kommentaren vorkommen. Werden Zeichen außerhalb der unteren 128 Zeichen in Strings genutzt, so gilt Folgendes zu berücksichtigen:
* Die String-Funktionalitäten der Standard-C Library gehen von dem regulären ASCII Zeichensatz aus, so dass z.B. die Suche, der Vergleich oder die Konvertierung fehlschlagen kann
* Strings werden oftmals in Verbindung mit printf() genutzt, d.h. auf der Standardausgabe ausgegeben. Der verwendete Zeichensatz sollte hier identisch zum verwendeten Zeichensatz der Terminal-Emulation sein!
== Kommentarzeichen ==
Kommentare dienen dazu, den Source Code mit zusätzlichen Hinweisen zu versehen, so dass die Intension der Anweisungen sichtbar wird. Kommentarzeichen werden durch den Compiler vor dem eigentlichen Übersetzungsdurchlauf entfernt und durch ein Leerzeichen ersetzt [C11 6.4.9]. Innerhalb von Strings wird nicht nach Kommentarzeichen gesucht.
<code>
Syntax: /* */
</code>
Blockkommentar zum Kommentieren eines Bereiches, auch über mehrere Zeilen hinweg. Dieses Kommentarzeichen kann nicht verschachtelt werden, d.h. '*/' beendet die Kommentierung, unabhängig von der Anzahl der zuvor geöffneten Kommentierungen!
<code>
Syntax: //
</code>
Zeilenkommentar zum Kommentieren bis zum Zeilenende (wurde in der Programmiersprache BCPL definiert, aber nicht von C, sondern erst von C++ übernommen).
Sollen größere Bereiche auskommentiert werden, so empfiehlt sich die Nutzung der Präprozessoranweisung #if 0 ... #endif.
Beispiele:
<syntaxhighlight lang="C">
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt
Compiler-Warning nur aufgrund des Compiler-Schalters -Wall! */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Namenskonventionen ==
Folgende Regeln gelten bzgl. der Benennung von Variablen und Funktionen:
* Variablen und Funktionsnamen können aus Buchstaben, Zahlen und dem Unterstrich bestehen. Sie müssen mit einem Buchstaben oder einem Unterstrich beginnen
* Seit C95 können weitere Zeichen aus dem Universal Coded Character Set (UCS) genutzt werden [C11 D.1]
* C ist Case sensitiv, d.h. es wird zwischen Groß- und Kleinbuchstaben unterschieden
* Schlüsselwörter können nicht für Variablen/Funktionsnamen/Datentypen genutzt werden
Namenskonventionen von Libraryfunktionen:
* In C (und C++) sind Schlüsselwörter und Standardlibraryfunktionen zumeist in Kleinbuchstaben geschrieben. In der C-Standardlibrary werden oftmals verkürzte Ausdrücke (z.B. isalnum() (zum Testen ob ein Zeichen ein Buchstaben oder ein Digit ist) und in C++ der Unterstrich als Worttrenner (z.b. out_of_range) genutzt
* Makros (siehe Kap.[[Programmieren in C/C++: Präprozessor | Präprozessor]]) werden per Konvention in GROSSBUCHSTABEN und ggf. mit Unterstrich als Worttrenner geschrieben.
* Namen beginnend mit doppelten Unterstrich oder beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (z.B. __LINE__ _Reserved) sind für den Compiler und der Standard-C-Library vorbehalten und sollten im eigenen Programm nicht benutzt werden.
== Zeilenfortsetzung ==
Mit dem Backslash Operator (gefolgt von einem Zeilenende) kann eine Zeile in der nächsten Zeile fortgesetzt werden. Der Compiler löscht das \-Zeichen mit anschließendem Zeilenende und ersetzt dies durch nichts. Dies ist insbesondere bei Anweisungen notwendig, die am Ende der Zeile abgeschlossen sein müssen (z.B. Strings, Makros).
Beispiele:
<syntaxhighlight lang="c">
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Innerhalb von Char-Literatoren und Strings wird '\' als Escape-Operator genutzt, welche das '\' und ein oder mehrere folgende Zeichen ersetzt (siehe Kap.[[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Grundlagen:Literale/Konstanten]]). Daher darf hinter Backslash als Zeilenfortsetzungszeichen kein weiteres Zeichen folgen.
== Gültigkeit/Sichtbarkeit von Variablen ==
Vorrangig in der objektorientierten Programmierung werden mit Namensräumen Objekte und deren Methoden/Attribute in einer Art Baumstruktur strukturiert. Dies ermöglicht eine eindeutige Ansprache von Variablen/Objekte, aber auch eine doppelte Verwendung von Methoden-/Attributnamen in unterschiedlichen Namensräumen. Ergänzend zu den Namensräumen kann mit public/private/proteced eine Zugriffsbeschränkung von Methoden/Attributen definiert werden.
Die Programmiersprache C unterstützt keinen Namensraum. Zugriffsmodifikatoren werden indirekt über Header-Dateien getätigt. Hinsichtlich der Gültigkeit/Sichtbarkeit unterscheidet C folgende Bereiche [C11 6.2.1]:
* Funktionen (Function Scope)
* Datei (File Scope)
* Block (Block Scope)
* Funktionsparameter in Prototypen (Function Prototype Scope)
Innerhalb eines Gültigkeitsbereiches dürfen Variablen-/Funktions-/Datentypnamen nicht doppelt genutzt werden.<br />
In der Programmiersprache C++ sind weitere Scope wie z.B. Class Scope, Enumationation Scope und ergänzend das Konzept von Namensräumen vorhanden (Beschreibung folgt).
=== Funktionsweite Sichtbarkeit ===
Eine Label-Definition (als Sprungmarke für die goto-Anweisungen) erfolgt immer mit funktionsweiter Sichtbarkeit/Gültigkeit. Die genaue Beschreibung dieses Sichtbarkeitstyps erfolgt im Rahmen des Kapitels [[Programmieren in C/C++: Grundlagen #Label + Goto|Grundlagen:Label+Goto]].
=== Dateiweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp-Definition außerhalb eines Block-Scopes oder von Funktionsparameter, so sind diese innerhalb der gesamten Datei und bei Funktionen/Variablen ergänzend Projektweit (für alle Objektdateien) sichtbar/gültig (= global) (In der C-Spec unter dem Stichwort 'Linkage' beschrieben, siehe Kapitel [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage| DatentypeSpecifier:Internal/External Linkage]]). Alle globalen Funktionen/Variablen können von allen Dateien aus genutzt/zugegriffen werden (sofern sie zuvor deklariert wurden).<br />
Beispiel:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Deklaration von global,
//welche in Datei1.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
printf("global=%d\n",global);
return 0;
} | datei2_c=#include <stdio.h>
//Deklaration von global,
//welche in example.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
printf("func() called\n");
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird das Schlüsselwort 'static' der Variablen/Funktionsdefinition vorangestellt, so wird die Sichtbarkeit/Gültigkeit auf Dateiweit eingeschränkt. Variablen/Funktionen können nur innerhalb der (Objekt-) Datei genutzt werden und sind für anderen (Objekt-)Dateien unsichtbar. (Siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage|DatentypeSpecifier:Internal/External Linkage]] Internal/External Linkage)
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
printf("example.c:var1=%d\n",var1);
void func(void); //Prototyp für func()
func();
return 0;
} | datei2_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
printf("datei2.c:var1=%d\n",var1);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Projektweite Gültigkeit bedeutet insbesondere, dass keine doppelten Benennung von Variablen/Funktionen/Datentypen innerhalb des gesamten Projektes erlaubt sind, d.h. alle Variablen/Funktionennamen über alle Dateien/Librarys eindeutig sein müssen.<br>
Beispiel 1:
{| class="wikitable"
|-
! Datei1.c !! Datei.2
|-
| <syntaxhighlight lang="C">
#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
}</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
} | datei2_c=#include <stdio.h>
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der Linker meldet beim Zusammenfügen der Objekt-Dateien, dass die Variable a bereits woanders definiert sei (multiple definition of `a';)!
Beispiel 2:
<syntaxhighlight lang="C">
#include <stdio.h> //fuer printf() size_t stderr
int printf=7;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int printf=7;
int main(int argc,char *argv[])
{
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hier meldet der Compiler eine Fehlermeldung, da das Symbol printf zu einen als Variable und zum anderen als Funktion (innerhalb der inkludierten Datei stdio.h beschrieben) genutzt wird ('printf' redeclared as different kind of symbol).
=== Blockweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp Definition innerhalb einer Funktion, als Funktionsparameter oder eines Blockes, so sind diese nur innerhalb des Blockes sichtbar/gültig (=Lokale Variable). Blöcke können verschachtelt sein, so dass das bei identischer Namensgebung innere Definitionen Vorrang haben. Ebenso haben Blockdefinitionen Vorrang vor Datei-/Projektdefinitionen (überdecken diese):
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
} | datei2_c=#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sichtbarkeit von Funktionsparameter in Protypen ===
Soll eine Funktion aufgerufen werden, die zuvor nicht definiert wurde, so ist ein Prototyp/(Forward)deklaration der Funktion notwendig (siehe nachfolgendes Kapitel). Die Parameterliste dieses Prototyps hat seinen eigenen Gültigkeitsbereich.<br/>
Beispiel:
<syntaxhighlight lang="C">
int a; //a im File Scope
int func(int a, int b); //a und b im Function Prototyp scope
</syntaxhighlight>
Hinweis:
* Bei Prototypen ist die Angabe von Variablenname nicht notwendig. Die alleinige Angabe des Datentyps ist ausreichend
=== Zuordnung der Gültigkeitsbereiche zu globalen/lokalen Variablen ===
Zum einfacheren Verständnis wird im Skript von folgenden Begrifflichkeiten gesprochen:
* '''Globale''' Variablen-/Funktionen-/Datentypdefinitionen → Projektweite Sichtbarkeit/Gültigkeit
* '''Statisch globale''' Variable/Funktionen → Dateiweite Sichtbarkeit/Gültigkeit
* '''Lokale''' Variablen/Funktionen/Funktionsparameter/Datentypen → Nur innerhalb des zugehörigen Blockes sichtbare/gültig
* '''Statisch lokale''' Variablen → Nur innerhalb der Funktion sichtbar/gültig, mit der Besonderheit, dass die Gültigkeit über der Laufzeit der Funktion gilt (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Static Storage Class Specifier|DatentypeSpecifier:Static Storage Class Specifier]])
=== Speicherzuweisung ===
Für die einzelnen Gültigkeitsbereiche werden im Speicher (und auch in der Objekt-Datei) unterschiedliche Speicherbereiche (Segmente) vorgehalten, d.h. der Compiler teilt den Speicher in unterschiedliche Bereiche auf und weist den Variablen/Funktionen in Abhängigkeit der Gültigkeit/Sichtbarkeit unterschiedliche Speicherbereiche zu!
[[File:Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten).png|thumb|Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten)]]
Zur Ermöglichung von Rekursion werden lokale Variable auf dem Stack gehandelt. Mit Aufruf einer Funktion oder öffnen eines neuen Block-Scopes wird Speicher auf dem Stack reserviert, der bei Beenden des Scopes wieder freigegeben wird. Die Speicheradresse von lokalen Variablen ist somit nicht Fix, sondern hängt von der Aufrufhierarchie ab!
Globale und statisch globale Variablen werden nicht auf dem Stack gehalten, sondern bekommen einen 'festen' Speicherbereich (hier DATA/BSS/RODATA) während der gesamten Laufzeit des Programms zugewiesen. Die Adresse dieser Variablen sind somit konstant. Das genutzte Speichersegment von globalen Variablen hängen von der Art der Variablen ab. Initialisierte Variablen werden im DATA-Segment gesammelt, welcher mit dem Initialisierungswert der Variablen initialisiert wird. Nicht initialisierte globale Variablen landen im BSS-Segment, so dass diese mit Programmstart durch Füllen dieses Blockes mit 0 auf 0 gesetzt werden.
Konstante globale Variablen werden im RODATA-Segment gehalten. Über das Betriebssystem kann dieser Speicherbereich auf nur Lesbar gesetzt werden.
Dynamische Speicheranforderungen, resp. Speicher, dessen Gültigkeit über die Laufzeit einer Funktion hinausgeht, wird im Heap gesammelt. Für die Verwaltung dieses Speichers ist der Programmierer zuständig.
Entsprechend globalen Variablen wird für Funktionen ebenfalls ein eigener Speicherbereich (TEXT Segment) vorgesehen. Im Gegensatz zu Variablen, wo im Speicher der dazugehörige Inhalt gespeichert ist, ist der Speicherinhalt von Funktionen die Maschinenanweisungen. Die Speicheradresse der Funktionen sind konstant.
Hinweis:
* Die Speicheradresse von sowohl globalen und statisch globalen Variablen als auch von Funktionen ist konstant und ändert sich während der Laufzeit des Programms nicht. Die Adressvergabe dieser Variablen und Funktionen erfolgt somit nicht zur Laufzeit sondern durch die Toolchain (hier der Linker).
* Dieses Konzept ist allgemeingültig, gilt nicht nur für die Programmiersprache C/C++
== Definition/Deklaration(Prototyp) ==
Der C-Compiler ist ein Single-Pass Compiler (siehe Kap [[Programmieren in C/C++: Einführung/Literatur#Arbeitsweise eines Compilers | Einführung/Literatur:Arbeitsweise eines Compilers ]]), d.h. für den Übersetzungsvorgang wird der Quellcode einmalig eingelesen und von vorne nach hinten abgearbeitet. Dies bedingt, dass keine Vorwärtsbezüge im Quelltext enthalten sein dürfen:
* keine Variable genutzt werden kann, die erst später definiert wird (da der Compiler in Abhängigkeit des Datentyps (den er dann noch nicht kennt) keine entsprechende Maschinensprachebefehle erzeugen kann)
* keine Funktion aufgerufen werden kann, die erst später definiert wird (da der Compiler nicht weiß, welcher Datentyp die Übergabewerte haben und folglich keine Maschinensprachebefehle zur Konvertierung und Übergabe der Variablen erzeugen kann)
* kein Datentyp genutzt werden kann (struct, union, enum, typedef), welcher erst später definiert wird (da der Compiler nicht weiß, wieviel Speicher er für die Variable reservieren muss)
Eine Lösungsvariante dieser Problematik ist, im Quellcode alle Variablen/Funktionen/Datentypen/Makros zu definieren, bevor diese erstmalig genutzt werden (Funktion main() steht dann folglich am Ende des Quellcodes):
<syntaxhighlight lang="C">
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
//Hier kein Zugriff auf var möglich!
//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(void) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
var++; //Hier kein Zugriff auf var möglich!
uchar xyz;//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(int argc, char *argv[]) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Sollen globale Funktionen/Variablen in Datei1.c genutzt werden, die in Datei2.c definiert sind, so schlägt diese Vorgehensweise fehl. Um auch dieses zu ermöglichen, bietet C die Möglichkeiten von Prototypen/Deklarationen an. Diese teilt dem Compiler mit, wie im späteren Ablauf die Variable, die Funktion definiert wird, bzw. dass es diesen Datentyp geben wird:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
} | datei2_c=#include <stdio.h>
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Innerhalb der C-Spezifikation werden für den Umgang mit dieser Problematik die Begriffe 'Declaration' und 'Definition' genutzt. Da diese Begriffe jedoch nicht klar abgegrenzt werden und auch für viele weitere Aspekte genutzt werden, sollen in diesem Skript in Anlehnung an den Wikipedia Artikel {{w|Deklaration (Programmierung)|Deklaration (Programmierung)}} (im Absatz zur Programmiersprache C/C++) die Begriffe Definition/Deklaration wie folgt genutzt werden:
;Definition: entspricht der Belegung/Reservierung von Speicherplatz
:* Bei der Definition einer Variablen wird hiermit Speicherplatz entsprechend dem Datentyp der Variable belegt:
:<syntaxhighlight lang="C">
int var1; //entsprechend der Größe des Datentyps int wird
//Speicherplatz für die Variable var1 reserviert
int var2=4711; //Dito, ergänzend wird dieser Speicherplatz mit dem
//Wert 4711 initialisiert
</syntaxhighlight>
:* Bei einer Funktion wird Speicherplatz zur Aufnahme der Maschinenbefehle belegt:
:<syntaxhighlight lang="C">
void foo(void) { //Die Anweisungen in den geschweiften Klammern
//werden in Maschinenbefehle übersetzt. D.h. die
//Funktion foo() belegt Speicher, dessen Inhalt
//die Maschinensprachebefehle sind
}
</syntaxhighlight>
:* Ergänzend wird der Begriff Definition auch in Verbindung mit der Definition von neuen Datentypen genutzt!
;Deklaration/Prototyp: ist die Mitteilung an den Compiler, wie diese Variable/Funktion an einer späteren Stelle im Source-Code oder in einer anderen Source-Datei definiert wird. Auf Grundlage dieser 'vorab' Information kann der Compiler die passenden Maschinensprachebefehle für den Zugriff/Aufruf auf die Variablen/Funktion einsetzen:
:<syntaxhighlight lang="C">
extern int var1; //Deklaration von var1
extern void foo(void); //Deklaration von foo()
void foo(void); //Deklaration von foo()
</syntaxhighlight><br />
Insbesondere bei dem Umgang mit der Deklaration gilt es Folgendes zu berücksichtigen:
* Deklarationen werden entweder:
:* am Anfang einer C-Datei geschrieben, so dass Funktionen/Variablen im Zugriff stehen, die erst später in der C-Datei definiert werden (entspricht dann der Private Anweisung in anderen Sprachen)
:* in Header-Dateien geschrieben, so dass diese Variable/Funktionen für alle sichtbar sind, welche diese Header-Datei einbinden (entspricht der Public Anweisung in anderen Sprachen)
* Deklarationen von Funktionen werden in der C-Spec als (function) Prototyp bezeichnet und sind dadurch gekennzeichnet, dass diese mit einem Semikolon abgeschlossen sind. Der Specifier 'extern' ist hier optional und sagt eigentlich aus, dass diese Funktion external Linkage besitzt (siehe [[Programmieren in C/C++:_DatentypeSpecifier#Internal/External Linkage | DatentypeSpecifier:Internal/External Linkage]]). Die Benennung der Parametervariablen sind gleichermaßen optional:
:<syntaxhighlight lang="C">
extern int foo(int var1, float var2); //Deklaration
extern int foo(int , float ); //Deklaration
int foo(int var1, float var2); //Deklaration + external Linkage
int foo(int , float ); //Deklaration + external Linkage
</syntaxhighlight>
* Für globale Variablen gibt es keine (Variablen) Prototype. Stattdessen muss zur Bekanntgabe des Datentyps der Specifier 'extern' vorangestellt werden, mit welchen ergänzend zum Ausdruck gebracht wird, das diese Variable external Linkage und damit globale Gültigkeit hat (siehe Kap [[Programmieren in C/C++: DatentypeSpecifier# Extern - Storage Class Specifier| DatentypeSpecifier:Extern - Storage Class Specifier]]). Da die Deklaration einzig zur Bestimmung der Zugriffsmethoden auf Maschinenspracheebene genutzt wird, können diese keine Initialisierungswerte enthalten:
:<syntaxhighlight lang="C">
extern int var1;
extern int var2=7; //KO Deklarationen können keine
//Initialisierungswerte haben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern int foo;
extern int foo=7;
int main(int argc, char *argv[]) {
return foo;
}
int foo=7;| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen von statisch globalen, lokalen und statisch lokalen Variablen nicht möglich sind:
:<syntaxhighlight lang="C">
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sich auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sicht auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen für identische Variablen/Funktionen können beliebig oft erfolgen, sofern der Datentyp identisch ist:
:<syntaxhighlight lang="C">
extern int var;
extern int var; //OK, doppelt Deklaration mit identischen Datentyp
extern unsigned int var; //KO, Doppelte Deklaration mit unterschiedlichen
// Datentyp
</syntaxhighlight>
* Sofern eine Deklaration und eine Definition in der identischen Datei erfolgen überprüft der Compiler, ob Deklaration und Definition identisch sind. Es empfiehlt sich, die eigene Header-Datei (in welcher die Deklaration normalerweise enthalten ist) zu inkludieren:
:{| class="wikitable"
|-
! Datei1.c !! Datei1.h
|-
| <syntaxhighlight lang="C">
//Include der eigenen Header-Datei
#include "datei1.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
</syntaxhighlight> ||
<syntaxhighlight lang="C">
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Include der eigenen Header-Datei
#include "example.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
int main(int argc, char *argv[]) {
return 0;
} | example_h=
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Datei kann eine Variable identischen Datentyps mehrmals definiert werden (bei identischen Initialisierungswert). Diese Definitionen werden vom Compiler als eine Definition angesehen. Wenn jedoch eine identische Variable in unterschiedlichen Dateien definiert wird, so legt jede Datei eine eigene unabhängige Variable an, welche dann beim Zusammenführen der Objektdateien durch den Linker zu Fehler führt. Da Header-Datei zumeist in mehrere C-Dateien inkludiert werden, sind Definitionen in Header-Dateien 'verboten'.
* Deklarationen innerhalb eines Block-Scopes oder eines Function Prototyp Scopes sind nur in diesen Bereich gültig.
== Grundlegende Datentypen und Typsicherheit ==
Die Programmiersprache C kennt folgende grundlegende Datentypen (siehe Kap. [[Programmieren in C/C++: Datentypen | Datentypen]]). Von jedem Datentyp kann ein Zeiger angelegt werden:
{| class="wikitable"
|-
! Datentyp !! Bsp. für Datentyp !! Bsp. für Zeiger auf Datentyp
|-
| Ganzzahl ||
<syntaxhighlight lang="C">
char var;
int var;
short int var;
long int var;
long long int var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
char *ptr;
int *ptr;
short int *ptr;
long int *ptr;
long long int *ptr;
</syntaxhighlight>
|-
| Gleitkommazahl ||
<syntaxhighlight lang="C">
double var;
float var;
long double var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
double *ptr;
float *ptr;
long double *ptr;
</syntaxhighlight>
|-
| Funktionen ||
<syntaxhighlight lang="C">
void func(void) {}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
void (*pfunc)(void);
</syntaxhighlight>
|-
| Arrays ||
<syntaxhighlight lang="C">
int arr[10];
float arr[3][3];
</syntaxhighlight>
||
<syntaxhighlight lang="C">
int (*parr);
float (*parr)[3];
void (*pfunc[5])(void);
</syntaxhighlight>
|-
| Strukturen/Unions ||
<syntaxhighlight lang="C">
struct xyz {int x,y,z};
union abc {int a,b,c};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
struct xyz *ptr;
union abc *ptr;
</syntaxhighlight>
|-
| Aufzählungstyp ||
<syntaxhighlight lang="C">
enum abc {A,B,C};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
enum abc *ptr;
</syntaxhighlight>
|-
| Boolescher Datentyp ||
<syntaxhighlight lang="C">
_Bool var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Bool *ptr;
</syntaxhighlight>
|-
| Komplexe Zahlen ||
<syntaxhighlight lang="C">
_Complex var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Complex *ptr;
</syntaxhighlight>
|}
C/C++ unterscheidet zwischen vorzeichenbehafteten <code>signed</code> und vorzeichenlosen <code>unsigned</code> ganzzahligen Datentypen. Vorzeichenlose Datentypen können nur positive Zahlen incl. der 0 aufnehmen (Anwendungsbereich bspw. Speicheradressen/Arrayindexe, welche nicht negativ sein können). Deren max. Zahlenwert ergibt sich aus der Datenbreite N des Datentyps 2<sup>N</sup>-1. Ein Vergleich eines vorzeichenlosen Datentyps mit ≥ 0 ist somit immer TRUE:
<syntaxhighlight lang="C">
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt"); //dieser ggf. vom Compiler wegoptimiert wird!
for(var=10; var>=0; var--); //Endlosschleife! 0 dekrementiert ergibt 255
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt\n"); //dieser ggf. vom Compiler wegoptimiert wird!
//Beim Öfffnen des Compiler-Fensters ist die IF-Anweisung nicht farblich
//hervorgehoben. Dies bedeutet, dass diese Zeile wegoptimiert wurde und folglich
//kein Maschinencode für diese Anweisung erzeugt wurde
for(var=10; var>=0; var--) //Endlosschleife! 0 dekrementiert ergibt 255
printf("%u ",var),fflush(stdout);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Vorzeichenlose Datentypen halbieren den verfügbaren Zahlenbereich und 'weisen' dem oberen Wertebereich den negativen Zahlen zu.<br>
Wird ein ganzzahliger Datentyp ohne Angabe des Vorzeichentyps (signedness) definiert, so ist diese vorzeichenbehaftet. Bei vorzeichenlosen Variablen muss explizit <code>unsigned</code> vorangestellt werden. Die Voranstellung von <code>signed</code> ist optional. Einzige Ausnahme stellt der Datentyp char dar. Hier gibt die Spezifikation keine default signedness vor, so dass bei Nutzung dieses Datentyps zur Aufnahme von Zahlen immer signed oder unsigned vorangestellt werden sollte!<br>
Innerhalb des Formatstrings bei den printf()/scanf() Anweisungen '''muss''' die signedness vom Programmierer händisch berücksichtigt werden. Die Formatanweisung %d und %i interpretieren die übergebenen Zahl als vorzeichenbehaftete Zahl. Soll eine vorzeichenlose Zahl ausgegeben werden, so muss %u verwendet werden:
<syntaxhighlight lang="C">
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%d varu=%u",vari,varu); //Korrekt
printf("vari=%u varu=%i",vari,varu); //Falsche Werteausgaben!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%12d varu=%12u\n",vari,varu); //Korrekt
printf("vari=%12u varu=%12i\n",vari,varu); //Falsche Werteausgaben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit der Definition (dem Anlegen) einer Variablen eines Datentyps wird Speicher entsprechend der Größe des Datentyps reserviert. Optional kann dieser Speicher initialisiert werden. Über den Datentyp wird ausgesagt, wie der Inhalt des Speichers zu interpretieren ist:
<syntaxhighlight lang="C">
char var1; //Speicherplatzreservierung von 1 Byte
//Inhalt der Speicherstelle wird als Zahl interpretiert
//(Hinweis: ASCII-Zeichen sind Zahlen)
double var2=47.11; //Speicherplatzreservierung von 8 Byte
//Inhalt der Speicherstellen wird als Gleitkommazahl
//interpretiert (bestehend aus je einer Ganzzahl für
//Mantisse und Exponent)
short arr[10]; //Speicherplatzreservierung von 10*2 Byte
//Inhalt der 10 Speicherstellen werden als Ganzzahl
//interpretiert
</syntaxhighlight>
Die Funktionalität der Operatoren hängt vom Datentyp der Operanden ab. Der Plus-Operator angewendet auf ganzzahlige Operanden führt eine Ganzzahl Addition aus, angewendet auf gleitkomma Operanden eine Gleitkomma Addition. Ist einer der Operanden ein Zeiger, so wird eine Zeigeraddition angewendet. Für andere Datentypen ist der Plus-Operator nicht definiert, so dass der Compiler einen Fehler wirft. '''Bei der Betrachtung eines Ausdruckes sollte dem genutzten Datentypen folglich eine besondere Aufmerksamkeit zuteil werden''':
<syntaxhighlight lang="C">
int vari=47;
vari+12; //(int) + (int) → Ganzzahladdition
float varf=12.3;
3.1415F+varf; //(float) + (float) → Gleitkommaaddition
int *ptr=&vari;
ptr+3; //(int *) + (int) → Zeigeraddition
int arr[3];
arr+3; //(int (*)) + (int) → Zeigeraddition
</syntaxhighlight>
Das Ergebnis einer Operation hat ebenfalls einen Datentyp. Eine Ganzzahl Addition gibt bspw. als Ergebnis einen Ganzahl Datentyp zurück, eine Gleitkomma Addtition einen Gleitkomma Datentyp und ein Vergleichsoperator den Datentyp _Bool:
<syntaxhighlight lang="C">
int vari1=47;
int vari2=11;
vari1 + 12 + vari2; //((int)+(int)+(int))→((int)+(int))→(int)
40 < vari1 < 50; //((int)<(int)<(int))→((_Bool=int)<(int))→(_Bool=int)
</syntaxhighlight>
Wie Operatoren haben auch Funktionen Operanden (in Form von Übergabeparameter). Das Ergebnis eines Funktionsaufrufes wird ebenfalls in Form eines Datentyps zurückgegeben:
<syntaxhighlight lang="C">
float add(int par1,par2) {return par1+par2;}
int vari1=47;
int vari2=11;
vari1 + add(var2,12); //(int)+((int),(int)→(float))→(int)+(float)→(float)
</syntaxhighlight>
Wird auf einen Operator gleichermaßen ein vorzeichenbehafteter und ein vorzeichenloser Operand angewendet, so kann es zu unerwarteten Konvertierungsproblemen führen:
<syntaxhighlight lang="C">
unsigned char varu=12;
signed char vars=-12;
float varf;
varf = varu + vars;
if(vars < varu)
</syntaxhighlight>
Sind die Datentypen der Operanden nicht 'kompatibel', so 'passt' der Compiler die Datentypen im Falle von Ganzahl und Gleitkomadatentypen per impliziter Regel an (siehe Kap. [[Programmieren in C/C++: Datentypen#Implizite Typumwandlung | Datentypen:Implizite Typumwandlung]]). Über explizite Typumwandlung (siehe Kap.[[Programmieren in C/C++: Datentypen# Explizite Typumwandlung|Datentypen:Explizite Typumwandlung]]) kann ein Datentyp z.T. in einen anderen Datentyp gewandelt werden.
In allen anderen Fällen ist C Typsicher, d.h. der Compiler gibt zumindest eine Warning aus, wenn die Datentypen nicht identisch sind und der Compiler keine implizite Regel anwenden kann.
Tipp:
* Compiler gibt bei Fehlermeldung oftmals die erwarteten und die vorhandenen Datentyp an. Wenn solch eine Fehlermeldung kommt, sollten sie sich a) überlegen, was wollten sie syntaktisch geschrieben haben und b) was haben sie in der Tat geschrieben. Ein Google nach einer Lösung des Compilerproblems löst zumeist nicht das Problem, sondern umgeht es!
Hinweis:
* Ein guter Programmierer sollte die Datentypen so wählen, dass:
:* die Datentypen zum Inhalt und zum Wertebereiches passen
:* keine Datentypkonvertierungen notwendig sind
: andernfalls besteht die Gefahr, dass hiermit Laufzeitfehler einprogrammiert werden.
* Wenn Datentypkonvertierungen notwendig sind, sollte die explizite Konvertierung genutzt werden
== Abhängigkeiten bzgl. Rechnerarchitektur ==
Kenngrößen von Prozessoren sind unter anderem die Anzahl der Bits für den Datentransport und für Arithmetisch-/Logische-Operationen (→ Datenbreite) und die Anzahl der Bits für die Adressierung des Speichers (→ Adressierungsbreite). Die Datenbreite sagt dabei aus, welche max. Datenbreite ein Maschinenbefehl (zumeist in einem Taktzyklus) transportieren/berechnen kann. Werden programmtechnisch größere Datenbreiten benötigt, bedingt dies, dass hierzu mehrere Maschinenbefehle notwendig sind. Wenn kleinere Datenbreiten notwendig sind, so wird oftmals das Ergebnis abgeschnitten (sofern der Prozessor keine Befehle für den Umgang mit kleineren Datentyp beherrscht):
{| class="wikitable"
|-
! 32-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 64-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 16-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
|-
| <syntaxhighlight lang="C">
int32_t a32,b32;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int64_t a64,b64;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int16_t a16,b16;
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=b32;
mov eax,b32
mov a32,eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=b64;
mov eax ,b64
mov edx ,b64+4
mov a64 ,eax
mov a64+4,edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
//a16=b16;
movz eax,b16
mov a16,ax
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=a32+b32;
mov edx, a32
mov eax, b32
add eax, edx
mov a32, eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=a64+b64;
mov ecx , a64
mov ebx , a64+4
mov eax , b64
mov edx , b64+4
add eax , ecx
adc edx , ebx
mov a64 , eax
mov a64+4, edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a16=16+b16;
movzx eax, a16
mov edx, eax
movzx eax, b16
add eax, edx
mov a16, ax
</syntaxhighlight>
|}
Die Adressierungsbreite gibt an, mit welcher Bitbreite der Speicher adressiert werden kann:
* Bei einem 32-Bit System können 2<sup>32</sup>=4.294.967.295=4Gi Bytes/Speicherstellen adressiert werden
* Bei einem 16-Bit System können 2<sup>16</sup>=65.536=64Ki Bytes/Speicherstellen adressiert werden
* Bei einem 64-Bit System können 2<sup>64</sup>=18.446.744.073.709.551.616 =16Ei ~18Exa Bytes/Speicherstellen adressiert werden
Waren die Datenbreite und die Adressierungsbreite bei den ersten Prozessoren noch unterschiedlich, so sind diese heutzutage zumeist identisch. Bei einem 32-Bit Prozessor bedeutet dies, dass dieser max. 4Gi Bytes Speicherstellenstellen adressieren kann und Maschinenbefehle für den Datentransport und die Berechnung von 32-Bit Datenworten beinhaltet.
Die Datenbreite und auch die Adressierungsbereite haben direkten Einfluss auf die Programmiersprache:
* Wird defaultmäßig mit größerer Datenbreite gerechnet, als der Prozessor 'von Hause' aus unterstützt, so werden die erzeugten Maschinenprogramme größer und langsamer (Umgedreht bedeutet dies jedoch nicht, dass die Maschinenprogramme kleiner und schneller werden)
* Die max. Größe von Verbunddatentypen und Arrays ergibt sich aus der Adressierungsbreite des Prozessors
Die Intention der Programmiersprache C/C++ ist, die Prozessorarchitektur optimal zu nutzen. Dementsprechend sind diverse Eigenschaften der Sprache nicht fest spezifiziert, sondern von der Rechnerarchitektur abhängig.
=== Integer Datentyp ===
Intention von C/C++ ist, dass der Umgang mit dem Grunddatentyp 'int' möglichst direkt in einen Maschinensprachebefehl umgesetzt werden kann.<br />
Bei einem 16-Bit Prozessor hat der Datentyp int daher eine Breite von 16-Bit und bei einem 32-Bit Prozessor eine Breite von 32-Bit (siehe Kap [[Programmieren in C/C++: Datentypen # Ganzzahlige Datentypen|Datentypen:Ganzahl Datentypen]]). Über vorangestellte Qualifier kann dieser Grunddatentyp verkleinert/vergrößert werden.
=== Integer Arithmetik ===
Ganzzahlen haben nur einen begrenzten Wertebereich. Wird dieser bspw. durch eine Addition überschritten (d.h. das Rechenergebnis benötigt zur Darstellung mehr Stellen, als der Datentyp 'hergibt'), so gibt es zwei Vorgehensweisen:
* Arithmetischer Überlauf (siehe {{w|arithmetischer Überlauf}}): Die nicht speicherfähigen Stellen werden verworfen, so dass i.d.R. ein falsches Ergebnis erzeugt wird!
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist (254+3)%256=1
c=a*b; //c ist (254*3)%256=250
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char a=254,b=3,c1,c2;
c1=a+b; //c ist (254+3)%256=1
c2=a*b; //c ist (254*3)%256=250
printf("c1=%hhu c2=%hhu\n",c1,c2);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Sättigungsarithmetik (siehe {{w|Sättigungsarithmetik}}): Alle Operationen laufen innerhalb eines festen Intervalls ab, so dass Überläufe und Unterläufe auf dieses Intervall begrenzt werden:
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist MAX((254+3),255)=255
c=a*b; //c ist MAX((254*3),255)=255
</syntaxhighlight>
Die Spezifikation von C macht bezüglich der zu nutzenden Methodik keine Vorgaben, so dass das Handling von der ALU des Prozessors abhängt. Aus Komplexitäts- und Geschwindigkeitsgründen ist dies zumeist der arithmetische Überlauf. Nur bei Spezialprozessoren (z.B. DSP Digital Signal Processor) kommt z.T. die Sättigungsarithmetik zum Einsatz.
=== Gleitkomma Datentyp und Arithmetik ===
Für den Umgang mit Gleitkommazahlen bieten einige Prozessoren spezielle Recheneinheiten ({{w|Gleitkommaeinheit}} Floating Point Units FPU) an. Sowohl die Darstellung von Gleitkommazahlen als auch das Verhalten bei Überlauf/Unterlauf ist damit Herstellerabhängig. Um auch diese Einheiten effektiv nutzen zu können, ist die C/C++ Spezifikation in diesem Bereich ebenfalls sehr offen.
=== Max. Speicherbedarf von Variablen ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C/C++ von der zugrundeliegenden Rechnerarchitektur abhängig:
<syntaxhighlight lang="C">
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Zur Darstellung bitte Compiler-Fenster öffnen
//und dort den CC65-Compiler für den 6502 Prozessor auswählen
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Im Falle von globalen Variablen erzeugt der Compiler/Linker eine Fehlermeldung. Werden von diesen Datentypen Variablen als lokale Variablen angelegt, so erzeugt dies zur Laufzeit einen Stackoverflow.
=== Zeigervariable ===
Eine Zeigervariable ist eine Variable, die eine Speicheradresse speichert. Die Größe dieses Datentyps hängt von der Adressierungsbreite des Prozessors ab. Unabhängig von dem Datentyp, auf den die Zeigervariable zeigt, ergibt sich folgende Breite:
* 4-Byte bei einer 32-Bit Rechnerarchitektur
* 8-Byte bei einer 64-Bit Rechnerarchitektur
* 2-Byte bei einer 16-Bit Rechnerarchitektur
=== Datentyp size_t ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C von der zugrundeliegenden Rechnerarchitektur abhängig. Sie ergibt sich aus der Adressierungsbreite. Da die Datenbreite des Datentyps int zumeist kleiner als die Adressierungsbreite ist, existiert in C/C++ der vorzeichenlose Datentyp size_t.<br />
Alle Funktionen, welche den Speicherbedarf übergeben bekommen, bzw. zurückgeben (bspw. strlen(), memcpy(), sizeof()) , nutzen den Datentyp size_t:
<syntaxhighlight lang="C">
//Prototypen
size_t strlen(char *str); //Die max. Stringlänge ist durch den
//adressierbaren Speicher vorgegeben
void *malloc(size_t size);
void *memcpy(void *dest, const void *src, size_t n);
</syntaxhighlight>
Der Datentyp size_t ist in der Header-Datei stddef.h der Standard-C-Library per typedef gesetzt. Im Normalfall muss diese Header-Datei nicht explizit inkludiert werden, da bei Nutzung von z.B. strlen() diese bereits durch die Header-Datei string.h inkludiert wird:
<syntaxhighlight lang="C">
typedef unsigned long long size_t; //Bei einer 64-Bit Rechnerarchitektur
</syntaxhighlight>
Hinweis:
* Der Datentyp size_t ist immer ein vorzeichenloser Datentyp (es gibt keine negativen Speicheradressen).
* Mit dem Datentype ssize_t wird eine vorzeichenbehaftete Variante zur Verfügung gestellt, welche hilfreich ist, wenn Speicheradresse subtrahiert werden sollen.
* Soll der Wert vom Datentyp size_t mittels printf() ausgegeben werden, so ist der 'Length Modifier' z und der 'Conversion Specifier' u zu nutzen:
:<syntaxhighlight lang="C">
size_t var=strlen("String");
printf("%zu",var);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]) {
size_t var=strlen("String");
printf("%zu",var);
printf("%d",var); //Hier sollte es eine Compiler-Warning geben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Boolescher-Datentype/Operatoren ==
Ursprünglich gab es den booleschen Datentyp in der Programmiersprache C nicht. Mit C99 wurde zwar der Datentyp <code>_Bool</code> eingeführt, dies änderte jedoch nicht den Umgang mit Anweisungen und Operatoren, die einen booleschen Datentyp erwarten/zurückgeben!
An allen Stellen, an denen ein boolescher Datentyp erwartet wird (z.B. IF-Abfrage, bei booleschen Operationen) wird der Datentyp Ganzzahl, Gleitkommazahl oder Zeiger erwartet (= Scalar-Type) und ausgewertet. Der hierin gespeicherte Zahlenwert sagt aus, ob diese Zahl als True oder False zu interpretieren ist:
* False, wenn Ganzzahl gleich 0 oder Gleitkommazahl gleich 0.0 oder Zeiger gleich NULL
* True, wenn Ganzzahl ungleich 0 oder Gleitkommazahl ungleich 0.0 oder Zeiger ungleich NULL
Beispiel:
<syntaxhighlight lang="C">
int a=3;
double b=0.0;
int *ptr=&a;
while(1);
if(a) {}
for( ; b && ptr ; );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
double b=0.0;
int *ptr=&a;
while(0);
if(a) {}
for( ; b && ptr ; ) {}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Operatoren, welchen einen booleschen Wert zurückliefern (Vergleichs-Operatoren und Boolesche-Operatoren), liefern ein Integer-Datentyp zurück:
* (int)0 für False
* (int)1 für True
Beispiel:
<syntaxhighlight lang="C">
int a=3;
int b= (a==3); //b=1
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
int b= (a==3); //b=1
printf("%d",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
In den if()/for()/while() Anweisungen ist folglich kein explizites Konvertieren eines Ganzzahl-/Gleitkomma-/Zeigerwertes mittels des Vergleichs-Operators in einen Booleschen Wert notwendig:
<syntaxhighlight lang="C">
int a;
double b;
if(a) //entspricht if(a!=0)
if(!b) //entspricht if(b==0.0)
while(1) //entspricht while(True)
for(int lauf=1; lauf ; lauf--);
</syntaxhighlight>
Umgedreht kann ein boolescher Wert oder auch das Ergebnis einer booleschen Operation direkt mit einer Ganzzahl- oder Gleitkommazahl verknüpft werden:
<syntaxhighlight lang="C">
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
if( a==1 & b==2)
if(3 < a < 9) //Vorsicht, die Schreibweise lässt ein
//anderes Verhalten erwarten!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
printf("%d\n",a);
if(a==1 & b==2)
printf("true\n");
else
printf("false\n");
if(3 < a < 9)
if( (a==1) & (b==2))
printf("true\n");
else
printf("false\n");
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit C99 wurde der Datentyp <code>_Bool</code> eingeführt. Dieser entspricht weiterhin einem Integerdatentyp mit der Besonderheit, dass beim Zuweisen eines Wertes dieses auf true oder false geprüft wird und Variablen dieses Datentyps nur die Werte 0 oder 1 annehmen können:
<syntaxhighlight lang="C">
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool! möglich
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool!
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für den einfacheren Umgang mit dem 'neuen' Datentyp wurde in der Header-Datei <code>stdbool.h</code> die Makros <code>true</code> (als Austauschwert für die Ganzzahl 1) und <code>false</code> (als Austauschwert für die Ganzahl 0) definiert. Ergänzend wird hier der Datentyp <code>bool</code> als Alias auf <code>_Bool</code> gesetzt.
<syntaxhighlight lang="C">
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
int main(int argc,char *argv[]) {
foo(4,3,6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In C++ gibt es anstatt des Datentypes <code>_Bool</code> den Datentyp <code>bool</code>. Auch sind die beiden Konstanten <code>true</code> und <code>false</code> ohne zusätzliches Einbinden der Header-Datei vorhanden. Der weitere Umgang ist jedoch identisch zu C.
== Literale/Konstanten ==
In Computerprogramm werden an diversen Stellen Konstanten in Source Code genutzt. Sei es als Initialisierungswert für Variablen, als Vergleichswert für Abfragen, zur Definition von Schleifendurchläufe oder als Strings für die Kommunikation. Der Syntax der Programmiersprache bietet dazu verschiedene Möglichkeiten, wie Zahlen zu beschreiben sind und wie der Datentyp vorgeben wird.</br>
Ungeachtet der Schreibweise werden im Computer alle Zahlen identisch als binäre Zalen gespeichert. Beispiele, wie die Zahlen intern gespeichert werden:
<syntaxhighlight lang="C">
int var=17; //0000 0000 0000 0000 0000 0000 0001 0001
short var=0x307;// 0000 0011 0000 0111
char var=017; // 0000 1111
int var=-1; //1111 1111 1111 1111 1111 1111 1111 1111
float var=0.0; //0000 0000 0000 0000 0000 0000 0000 0000
float var=1.0; //0011 1111 1000 0000 0000 0000 0000 0000
</syntaxhighlight>
=== Ganzzahl-Konstanten ===
Im Allgemeinen ordnet der Compiler einer numerischen, ganzzahligen Konstanten den kleinstmöglichen Datentyp beginnend vom Datentyp integer zu. Sobald der Wert der Konstanten den Wertebereich von integer übersteigt, wird der nächst größere passende Datentyp gewählt. Ergänzend gilt, dass alle Ganzzahl-Konstanten als vorzeichenbehaftete Ganzzahl-Konstanten angesehen werden!<br />
Beispiele für integer Konstanten:
<pre>
123
+123
-123 → Formal wird das Minus als Operator angesehen
und die positive Zahl 123 negiert
0x123 → Konstante ist in hexadezimaler Schreibweise notiert
0123 → Konstante ist in oktaler Schreibweise notiert
0b011 → Konstante ist in binärer Schreibweise notiert
nicht offizieller C-Syntax, wird aber von vielen Compiler unterstützt
ab C23-Spezifikation offiziell im C-Syntax enthalten!
6'432'108 → Tausendertrenner (ab C23 und in C++)
6'4'3'2'10 → Tausendertrenner
0x12'23'5 → Tausendertrenner
0b1001'001 → Tausendertrenner
5123123123 → Wertebereich größer als 2^31 so dass automatisch
zum nächst größeren Datentyp konvertiert wird
</pre>
Mit den Suffixen L/l und LL/ll kann der Datentyp long und long long erzwungen werden:
<pre>
12L → Konstante wird in eine long Integer Konstante konvertiert
4711LL → Konstante wird in eine Long Long Konstante konvertiert
</pre>
Mit dem Suffix U/u kann die Konstante explizit auf unsigned gesetzt werden:
<pre>
12U → Konstante wird als vorzeichenlose Zahl gesepeichert
4711ULL → Konstante wird in eine vorzeichenlose
Long Long Konstante konvertiert
</pre>
=== Char-Konstanten ===
In einfachen Anführungsstrichen geschriebene ASCII Zeichen werden entsprechend der {{w|American Standard Code for Information Interchange | ASCII-Tabelle}} als Zahlenwert (Datentyp int) dargestellt:
<pre>
'A' → Integerkonstante 65
'a' → Integerkonstante 97
…
</pre>
Über den {{w|Escape-Sequenz|Escape-Operator}} (Zeichen Backslash '\') wird das/die dem ESCAPE Operator folgende Zeichen gesondert interpretiert. Die im Source-Code erhaltene Zeichenfolge wird im Computerprogramm als ein Zahlenwert (Datentyp int) gespeichert. Dies ist u.A. zur Darstellung von ' und " aber auch zur Darstellung der unteren 32 Zeichen der ASCII Tabelle notwendig (Siehe auch {{w|Steuerzeichen}})
<pre>
ESCAPE Integer- → Bedeutung / (Terminal)funktionalität
Sequence konstante
'\0' = 0 → 0 Character = Stringendezeichen
'\a' = 7 → Bell (erzeugt auf dem Terminal einen Ton)
'\b' = 8 → Backspace (Bewegt den Cursor um eine Position nach links)
'\t' = 9 → Horizontal Tab (Bewegt den Curso auf die nächste horizontale
Tabulatorposition, Abstand ist Terminalspezifisch)
'\n' = 10 → NewLine (Zeilenvorschub)
'\v' = 11 → Vertial Tab
'\r' = 13 → Carriage Return (Wagenrücklauf, Bewegt den Cursor an den
Zeilenanfang)
'\"' = 34 → Double Quote
'\'' = 39 → Single Quote
'\?' = 63 → Question mark
'\\' = 92 → Backslash
'\f' = 12 → FormFeed (Erzeugt auf dem Terminal/Drucker
einen Seitenvorschub)
'\ooo' = 0ooo → Oktal, wobei o Digits von 0..7 sein müssen
'\xdd' = 0xdd → Hexadezimal, wobei d Digits von 0..9 A..F sein müssen
'\udddd' Unicode mit 4 Digits
'\Udddddddd' Unicode mit 8 Digits
</pre>
Beispiel
<syntaxhighlight lang="C">
'A' == 65 == '\101' == '\x41' == '\u0041' == '\U00000041'
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
//Programmiersprache wurde auf C++ gesetzt
if('A' == 65) printf("'A' == 65\n");
if('A' == '\101') printf("'A' == '\\101'\n");
if('A' == '\x41') printf("'A' == '\\x41'\n");
if('A' == '\u0041') printf("'A' == '\\u0041'\n");
if('A' == '\U00000041') printf("'A' == '\\U00000041'\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true|
lang=c++
}} Öffnen im Compiler Explorer] }}
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
u'b' → unicode 16 (nur C++)
U'b' → unicode 32 (nur C++)
L'b' → wchar_t
</pre>
Hinweis
* Die ASCII-Tabelle basiert auf einer 7-Bit Zeichenkodierung, so dass bspw. die Umlaute 'ä', 'ö' und 'ü' dort nicht kodiert sind. Sollen auch diese Zeichen genutzt werden, so empfiehlt sich der Datentyp wchar_t
=== Gleitkommakonstanten ===
Alle Gleitkommakonstanten sind ohne weitere Angaben vom Datentyp double!
<pre>
555.12
555. → 555.0
.1 → 0.1
4e2 → 400.0
1'234.678'9 → Tausendertrenner (ab C23 und in C++)
0x22.11p13 → Konstante in Hexadezimalen Schreibweise (ab C99)
</pre>
Über Suffixe kann ein alternativer Datentyp erzwungen werden:
<pre>
3.0F → Datentyp float
3.0l → Datentyp long double
</pre>
Hinweis:
* Aufgrund der unterschiedlichen Basis zwischen dem menschlichen Zehner-System und dem computerinternen Binär-System entstehen insbesondere bei den Nachkommastellen Rundungsfehler. Die Konstante 0.1f wird durch die Wandlung intern als 1.00000001490116119384765625e-1 dargestellt (siehe [[Programmieren in C/C++: Datentypen#Gleitkomma Datentypen | Datentypen:Gleitkomma Datentypen]])
* Die C-Spec verlangt, dass die binäre Repräsentation von Gleitkommazahlen zur Laufzeit (z.B. durch die Funktion atof() strtod() scanf("%f")) identisch zur der zur Compilezeit ist. Beispiel:
:<syntaxhighlight lang="C">
if(3.14==atof("3.14")) printf("muss erfüllt sein");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
if(3.14==atof("3.14")) printf("muss erfüllt sein\n");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
printf("Intern wird 3.14 wie folgt dargestellt %14.20f",3.14);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Konstanten Ausdrücke ===
Ergänzend zu den Zahlenwerten werden auch Ausdrücke durch den Compiler ausgewertet. Als Voraussetzung für die Ausdrücke gilt, dass alle Operatoren Literale/Konstante sein müssen, so dass der Compiler die Berechnung durchführen kann. Als Operatoren können alle im normalem Syntax erlaubten Operatoren (z.B.: +,-,*,/,&,&&,|,||,>>,<<,==,!=) genutzt werden.<br />
Beispiel:
<syntaxhighlight lang="C">
int var1=7*3+5; → wird vom Compiler durch 26 ersetzt
int var2=(4710+(8-1))&-8; → wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); → wird vom Compiler durch 16 * var1 + 154 ersetzt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int var1=7*3+5; //→ wird vom Compiler durch 26 ersetzt
int var2;
var2=(4710+(8-1))&-8; //→ wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); //→ wird vom Compiler durch var1 * 16 + 154 ersetzt
return 0;
} | execCompilerOptions=-Wall|
h=g|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Konstante Ausdrücke bieten sich an, um den Sourcecode lesbarer zu gestalten. Da der Compiler die Berechnung durchführt, wird zur Laufzeit keine Rechenleistung benötigt. Einzig die Compiledauer wird etwas erhöht:
<syntaxhighlight lang="C">
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180); //siehe nachfolgende Hinweise
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int ad_get(void) {
return 615; //614;
}
int main(int argc,char *argv[]) {
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180);
printf("%f\n%f\n",alpha1,alpha2);
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Ergänzend zu den oben aufgeführten Operatoren erlauben einige Compiler weitere Funktionen der Math.h Library in Konstantenausdrücken (z.B. sin(), cos(), ...)
* Konstanten Ausdrücke werden innerhalb des Compilers durch den Präprozessor ausgewertet, so dass dieser die Ergebnisse ebenfalls nutzen kann:
:<syntaxhighlight lang="C">
#define BUF_SIZE 512
#if (BUF_SIZE & (BUF_SIZE -1)) != 0
#endif
</syntaxhighlight>
=== String Konstanten ===
Stringkonstanten erzeugen ein Array von Characters. Mit dem abschließenden Hochkommata wird das Array um ein Stringendezeichen ergänzt:
<pre>
"abc" → (char []) {'a','b','c','\0'}
</pre>
Adjacent Strings Konstanten werden vom Compiler zu einer String-Kontante zusammengefasst, so dass nur ein Stringendezeichen vorhanden ist:
<pre>
"xxx" "yyy" → (char []) {'x','x','x','y','y','y','\0'}
</pre>
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
L"string" → (wchar_t[7]){L's',L't',L'r' …)
</pre>
Über Postfixes können in C++ Objekte erzeugt werden:
<pre>
"string"s → erzeugt einen String vom Datentyp std::string
"string"sw → Erzeugt einen String vom Datentyp std::string_view
</pre>
String Konstanten werden Compilerintern über unnamed Variablen realisiert, welche als globale Variable angelegt werden und per default const sind:
<syntaxhighlight lang="C">
printf("Wert=%d",4);
//entspricht
const char unnamed1[]="Wert=%d";
printf(unnamed1,4);
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
printf("Wert=%d\n",4);
//entspricht
const char unnamed1[]="Wert=%d\n";
printf(unnamed1,4);
fflush(stdout); //Zur Darstellung der Ausgabe, da nachfolgend
//das Programm abstürzt und die gepufferte Ausgabe
//nicht zur Anzeige gebracht wird
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für doppelte String Konstanten wird nur einmal Speicher reserviert:
<syntaxhighlight lang="C">
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2) printf("Identische Startadressen");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2)
printf("Identische Startadressen");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Initialisierungsliste / Compound Literal ==
Arrays, Strukturen und Unions bestehen zumeist aus mehreren Elementen. Zur Initialisierung solcher Variablen werden die Initialisierungswerte in geschweiften Klammern als Initialisierungsliste zusammengefasst.
<code>
Syntax: {Initialisierungsliste}
</code>
Für eine Initialisierungsliste wird kein Speicher vorgehalten. Vielmehr wird bei der Variablendefinition die Variable direkt mit dem Inhalt der Liste initialisiert. Der Datentyp der Initialisierungsliste ergibt sich aus dem Datentyp der zu initialisierenden Variable:
<syntaxhighlight lang="C">
int arr[5] = { 1,2,3,4,5 };
struct xyz { int x,y,z;}; //Definition einer Struktur
struct xyz var = { 1,2,3 };
</syntaxhighlight>
Wird der Initialisierungsliste ein Datentyp in runden Klammern vorangestellt, so wird hiermit eine 'unnamend' Variable/Objekt, ein Compound Literal erstellt:
<code>
Syntax: (type) {Initialisierungsliste}
</code>
Ein Compound Literal entspricht einer anonymen Variablen des angegebenen Datentyps. Wie bei einer normalen Variablendefinition wird hier ebenfalls eine Variable angelegt und diese mit den Initialisierungswerten initialisiert. Im Unterschied zu einer normalen Variable kann auf solch eine Variable im Nachgang nicht mehr zugegriffen werden. Der Rückgabewert eines Compound Literals entspricht somit dem einer Variablen.</br>
Compound Literale bieten sich überall dort an, wo Variablen nur für einen einmaligen Zweck angelegt werden (bspw. bei der Parameterübergabe von Funktionen):
<syntaxhighlight lang="C">
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawline(struct point start,struct point end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start.x,start.y,end.x,end.y);
}
void printarray(int arr[4]) {
printf("[ ");
for(size_t idx=0;idx<4;idx++)
printf("%d ",arr[idx]);
printf("]\n");
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Über den Adressoperator kann auch die Adresse der anonymen Variablen ermittelt werden. In diesem Falle ist dann der Gültigkeitsbereich/-dauer des Compound Literals zu berücksichtigen. Wird eine Compound Literals außerhalb eines Block-Scopes angelegt, so entspricht sie einer globalen Variable, andernfalls einer lokalen Variablen. Außerhalb des Gültigkeitsbereiches verliert die Adresse auf solch eine Variable ihre Gültigkeit:
<syntaxhighlight lang="C">
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawlinep(struct point *start,struct point *end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start->x,start->y,end->x,end->y);
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Compound-Literal sind per Default keine Konstanten, können also zur Laufzeit geändert werden (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Const Type Qualifier|DatentypeSpecifier:Const Type Qualifier]]):
:<syntaxhighlight lang="C">
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweiften Klammern <code>{ }</code> sind nicht mit dem Block-Operator (siehe [[Programmieren in C/C++: Grundlagen#Block / Compound-Statement | Block / Compound-Statement]]) zu verwechseln. Werden die geschweiften Klammern bei der Initialisierung von Variablen genutzt, dann beschreibt der Inhalt der geschweiften Klammern eine Initialisierungsliste. Wird diesen ein Datentyp vorangestellt, dann wird hiermit eine Compound Literal definiert.
== Variableninitialisierung ==
Mit der Definition einer Variable kann diese optional initialisiert werden. Der tatsächliche Zeitpunkt der Variableninitialisierung (zur Laufzeit oder zur Compilezeit) und damit die Ausführung der Initialisierung (Maschinensprachebefehle oder Speichervorbelegung) hängt von der Gültigkeit/Sichtbarkeit der Variablen ab(siehe [[Programmieren in C/C++: Grundlagen#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]).
=== Globale + Static lokale Variablen ===
Globale und statisch globale Variablen werden in einem während der Laufzeit des Programms festen Speicherbereich gehalten. Zum Startzeitpunkt des Programms ist der Speicherplatz solch einer Variable mit dem Initialisierungswert gefüllt, so das bei erstmaliger Nutzung dieser Variablen diese ihre Initialisierungswerte enthalten. Die Belegung des Speicherplatzes erfolgt durch den Compiler, so dass als Initialisierungswerte / Inhalt der Initialisierungsliste nur Konstanten oder Konstanten-Ausdrücke (siehe [[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Literale/Konstanten]]) erlaubt sind:
<syntaxhighlight lang="C">
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
double sin(double); //DJ: Include-Anweisung in wikibooks schlägt fehlt
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
int main(int argc,char *argv[]) {
printf("%hd %hd %hd\n",array[0],array[1],array[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Nicht initialisierte globale und static lokale Variablen werden mit 0 initialisiert! D.h. die Speicherstellen dieser Variablen werden mit dem Wert 0 vorbelegt::
<syntaxhighlight lang="C">
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
int main(int argc,char *argv[]) {
printf("f=%d\n",f);
printf("%f %f %f\n",arr[0],arr[1],arr[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Lokale Variable ===
Der Speicherplatz für lokale Variable wird auf dem Stack zur Verfügung gestellt. Mit jedem öffnenden Block-Scope wird Speicher für die innerhalb dies Block-Scopes vorhandenen Variablen vom Stack nach dem LIFO Prinzip reserviert und mit der Variablendefinition Maschinencode zur Initialisierung der Speicherstellen ausgeführt (sofern Variable einen Initialisierungswert hat):
<syntaxhighlight lang="C">
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für int) und 8 Bytes (für double)
int var1=12; //erzeugt Maschinencode zur Initialisierung
//der ersten 4 Byte mit dem Wert 12
double var2=sin(f); //erzeugte Maschinencode, welche zunächst
//die Funktion sin() mit dem Übergabewert f
//aufruft und dessen Rückgabewert in die
//nächsten 8 Byte des reservierten Speichers
//kopiert
...
{ //siehe zuvor
int var3=var1; //siehe zuvor
double var4=var2+var1;
} //siehe nachfolgenden
} //Freigabe des zuvor reservierten Speichers
</syntaxhighlight>
Dies gilt auch für Funktionsaufrufe. Mit der öffnenden geschweiften Funktionsklammer wird ebenfalls Speicher reserviert:
<syntaxhighlight lang="C">
void foo(int par)
{ //Öffnende Funktionsklammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für (Übergabe)Variable par und 4 Bytes für Variable var
int var; //Da keine Initialisierung vorhanden ist wird auch
//kein Maschinencode zur Initialisierung ausgeführt
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Byte für Variable x
int x;
...
</syntaxhighlight>
Aufgrund der mit der Initialisierung bedingten Erzeugung von Maschinencode können die Initialisierungswerte/Inhalte der Initialisierungsliste bei lokalen Variablen aus beliebigen Ausdrücken bestehen und müssen keine Konstanten oder Konstanten Ausdrücke sein:
<syntaxhighlight lang="C">
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sin(f)}; //werden zur Laufzeit berechnet
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h> //fuer sinf()
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sinf(f)}; //werden zur Laufzeit berechnet
printf("%f\n",(double)summe);
printf("%f %f %f\n",(double)arr[0],(double)arr[1],(double)arr[2]);
}
int main(int argc,char *argv[]) {
foo(3,4);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dieser Maschinencode wird jedes Mal ausgeführt, wenn die dazugehörige Anweisung abgearbeitet wird und bedingt dementsprechend Rechenzeit. Zehnmaliges Ausführen einer Funktion oder zehnmaliges Öffnen eines Block-Scopes innerhalb einer For-Schleife führt zur zehnmaligen Ausführung der oben genannten Sachverhalte:
<syntaxhighlight lang="C">
void foo(int);
void var(void) {
for(int lauf=10; lauf>0; lauf--)
{ //zehnmaliges Reservieren von Speicher
int var=lauf*2; //zehnmalige Initialisierung
foo(var);
} //Freigabe des Speichers
}
void foo(int par) { //zehnmaliges Reservieren von Speicher
int var=12; //zehnmalige Initialisierung
} //Freigabe des Speichers
</syntaxhighlight>
Nicht initialisierte lokale Variablen werden nicht initialisiert, d.h. keine zusätzlichen Maschinenbefehle zum Initialisieren erzeugt. Der Variablenwert entspricht dann einem 'Zufallswert' oder korrekter gesagt dem Inhalt der Variablen, welcher zuvor der Speicherstelle zugewiesen war:
<syntaxhighlight lang="C">
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//und damit auch dessen zuletzt gültigen Wert
}
int main(int argc, char *argv[]) {
int var1=first(); //var1 beinhaltet Wert 7
int var2=second(); //var2 beinhaltet Wert 7
printf("var_foo=%d\n",var1);
printf("var_far=%d\n",var2);
return 0;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//(und damit auch dessen zuletzt gültigen Wert)
}
int main(int argc, char *argv[]) {
printf("%d\n",second()); //Zufallswert (0, da Stack mit 0 initialisiert ist)
printf("%d\n",first()); //Stack belegen
printf("%d\n",second()); //Zufallswert (7, da Speicherstelle zuvor mit 7
return 0; //belegt wurde)
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird eine Variableninitialisierung mit einer switch oder goto Anweisung übersprungen, so wird zwar die Variable angelegt (Speicherplatz reserviert), jedoch die Maschinenbefehle zur Initialisierung dieser Variablen nicht ausgeführt (siehe auch [[Programmieren in C/C++: Grundlagen# Switch-Anweisung|Switch-Anweisung]] und [[Programmieren in C/C++: Grundlagen# Label + Goto|Label + Goto]]). Die Variable enthält dann einen Zufallswert:
<syntaxhighlight lang="C">
switch(value) {
case 0:
int lok=7;
printf("%d",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(int value) {
switch(value) {
case 0:
int lok=7;
printf("%d\n",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d\n",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
}
void far(void) {
int var1=4711;
int var2=1799;
printf("Marke: %d, Erscheinungsjahr: %d\n",var1,var2);
}
int main(int argc,char *argv[]) {
foo(2); //Zufallswert (0, da Stack mit 0 initialisiert ist)
foo(0); //Initialisierungswert
far(); //Stack belegen
foo(2); //Zufallswert
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei erstmaligem Funktionsaufruf kann eine nicht initialisierten lokale Variablen den Wert 0 beinhalten (Stackframe wird mit Programmstart auf 0 gesetzt). Beim nächsten Aufruf der Funktion ist zumeist die Speicherstelle der lokalen Variablen mit anderen Werten gefüllt worden, so dass nun ein anderer 'Zufallswert' als 'Initialisierungswert' enthalten ist
=== C++ ===
In C++ ist ergänzend die Initialisierung einer Variablen über () möglich. Bei Objekten wird hierüber der zugehörige Konstruktor aufgerufen. Bei primitiven Datentypen entspricht der Wert in den Klammern dem Initialisierungswert:
<syntaxhighlight lang="C++">
int variable(10); //Bei primitiven Datentype entspricht dies
//int variable=10;
struct test {
int a;
test(int par) {a=par;} //Konstruktor der Struktur test
};
struct test test(4); //Konstruktor test(int par) wird aufgerufen
struct test test(4,5); //KO, kein passender Konstruktor vorhanden
</syntaxhighlight>
=== Sonstiges ===
Folgende weitere Sachverhalten gilt es bzgl. Variableninitialisierung zu berücksichtigen:
* Nach C-Spezifikation ist eine Initialisierung von Variablen nicht notwendig. Es liegt folglich kein Fehler vor, wenn auf eine nicht initialisierte Variable lesend zugegriffen wird. Ungeachtet der C-Spezifikation überprüft der Compiler mit dem Schalter '-Wall' diesen Sachverhalt und gibt eine Warning aus
* Deklarationen/Prototypen können keinen Initialisierungswert enthalten
<syntaxhighlight lang="C++">
extern int var=7; //Fehlerhaft
</syntaxhighlight>
* Const und lokale Static Variablen sollten initialisiert werden, auch wenn C in diesem Fall keinen Fehler meldet!
<syntaxhighlight lang="C++">
const int konstante; //Syntaktisch OK, Initialisierungswert fraglich!
static int statisch;
</syntaxhighlight>
== Anweisung (Statement) & Expression ==
Eine Anweisung (Statement) stellt entsprechend dem Wikipedia Artikel {{w|Anweisung_(Programmierung) | Anweisung}} ''"ein in der Syntax einer Programmiersprache formulierte einzelne Vorschrift dar, die im Rahmen der Abarbeitung des Programms auszuführen ist"''.</br>
Aus der Statement Spezifikation ergibt sich folglich, welche Bestandteile ein Programm beinhaltet kann. In der C-Spezifikation [C11 6.8] sind folgende Anweisungen definiert:
: labeled-statement: Eine Sprungmarke für die Switch- und die Goto-Anweisung
: compound-statement: siehe nachfolgendes Kapitel
: expression-statement: siehe nachfolgendes Kapitel
: selection-statement: Eine if() oder switch() Anweisung
: iteration-statement: Eine while(), do while() oder eine for() Anweisung
: jump-statement: Eine goto, break, continue oder return Anweisung
so dass ein Programmablauf wie folgt aussehen könnte:
<syntaxhighlight lang="C">
int main(int argc, char argv[]) {
int var; //declaration innerhalb eines compound-statements
label: //labeled-statement
var=var*2+1; //expression-statement
for(var=0;var<100;var++); //iteration-statement
if(var<0) //selection-statement
printf("var<0"); //espression-statement
{ int lok=var; lok++; } //compound-statement
goto label; //jump-statement
return 0;
}
</syntaxhighlight>
=== Ausdruck (Expression) ===
Entsprechend der C-Spezifikation [C11 6.5] ist ein Ausdruck eine Folge von Operatoren und Operanden, die die Berechnung eines Werts angibt, ein Objekt oder eine Funktion bezeichnet, Nebenwirkungen erzeugt oder eine Kombination davon ausführt. Die Wertberechnungen der Operanden eines Operators werden vor der Wertberechnung des Ergebnisses des Operators ausgeführt (siehe auch {{w|lang=en|Expression_(computer_science)|Expression}}).
Beispiele:
<syntaxhighlight lang="C">
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöung der globalen Variable a)
int func(int par) { a++; return par*2;}
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int a=0;
int func(int par) {
a++;
return par*2;
}
int main(int argc,char *argv[]) {
int a=4,b=7;
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöhung der globalen Variable a)
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ausdrücke entsprechen somit Rechenvorschriften, die ausgewertet werden. Ausdrücke sind in C/C++ überall dort erlaubt, wo ein Operand erwartet wird:
<syntaxhighlight lang="C">
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func3(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf()]) {}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
//Ausdruck innerhalb eines Funktionskopfes
int func1(int par) {
return 1;
}
int func2(void) {
return 1;
}
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf("func() called\n")])
{
printf("func() body\n");
}
int main(int argc,char *argv[]) {
int a=1;
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func1(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
func3(1,arr);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dies ist unter anderen ein Grund dafür, dass C/C++ als unleserlich gilt. Zur besseren Lesbarkeit eines Codes sollte dieses 'Feature' nur dann genutzt werden, wenn es zwingend notwendig ist.
=== Discarded Value / null statement ===
Alle Ausdrücke und nicht void-Funktionen haben einen Rückgabewert, der weiter verwendet werden kann:
<syntaxhighlight lang="C">
a+7 //Rückgabewert ist das Ergebnis der Addtion
printf("hallo") //printf() Funktion ist vom Typ int und gibt die Anzahl
//der ausgegebenen Zeichen zurück
a //gibt den Inhalt der Variablen zurück
7 //gibt den 'Inhalt' der Konstanten zurück
b=(a=7) //der Zuweisungsoperator gibt den Zuweisungswert zurück
</syntaxhighlight>
Der letzte Rückgabewert eines fasst jeden Ausdruckes wird somit nicht genutzt. Dies wird Discarded Value bezeichnet:
<syntaxhighlight lang="C">
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der einfachste Fall eines Discarded Values ist ein Leeranweisung / null statement, d.h. die Anweisung besteht nur aus einem Semikolon. Dies stellt eine syntaktisch korrekte Anweisung dar, die keine Auswirkung hat:
<syntaxhighlight lang="C">
; //Leeranweisung
</syntaxhighlight >
Überall wo statements/Anweisungen erwartet werden (bspw. bei einer for-Schleife, bei einer if-Anweisungen) kann anstatt einer statements eine Leeranweisung stehen, welche dementsprechend nichts ausführt:
<syntaxhighlight lang="C">
for(size_t idx=0; str[idx]!=0; idx++)
; //Leeranweisung
while(a++ < 100)
; //Leeranweisungen
</syntaxhighlight>
An einige Stellen bietet sich die Nutzung dieser Sachverhalte als vorteilhaft an. Oft führen diese Sachverhalten jedoch zu Ausführungsfehlern, da sie aufgrund des korrekten Syntax vom Compiler nicht als Fehler gemeldet werden und beim Suchen dementsprechend nur schwer zu finden sind! Ggf. gibt der Compiler für einige Sachverhalte eine Warnung aus, so dass es vorteilhaft ist, Compiler-Warnings zu beachten!
Hinweise:
* Soll bewusst der Rückgabewert verworfen werden, so kann/sollte mit dem explizten Cast auf (void) der Rückgabewert explizit 'verworfen' werden. Dies ist u.A. hilfreiche bei Variablen, die (noch) nicht benutzt werden und der Compiler die Warning "unsued Variable" ausgibt:
:<syntaxhighlight lang="C">
(void)a; //Zur Vermeidung von Compiler-Warnings "Unused Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(void) {
return 4711;
}
int main(int argc,char *argv[]) {
int a;
(void)a; //Zur Vermeidung von Compiler-Warnings "Unsued Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Mit der Anweisung <nowiki>[[nodiscard]]</nowiki> (ab C++17, ab C23) wird der Compiler angewiesen, dass der Aufrufer einer Funktion mit Rückgabewert der Rückgabewert entgegenzunehmen ist. Wird der Rückgabewert verworfen, so gibt der Compiler eine Fehlermeldung aus:
:<syntaxhighlight lang="C">
[[nodiscard]] int Client(int socket);
Client(5); ////Fehlermeldung, da Rückgabewert nicht verwendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
[[nodiscard]] int Client(int socket) {
return socket+1;
}
int Server(int socket) {
return socket+1;
}
int main(int argc,char *argv[]) {
Server(5); //keine Fehlermeldung
Client(5); //Fehlermeldung, da Rückgabewert nicht verwendet wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sequence Point ===
Ein Sequenzpunkt (u.A. das abschließende Semikolon am Ende der Anweisung) ist nach dem Wikipedia Artikel {{w|lang=en|Sequence_point|Sequence Point}} definiert als der Punkt in der Ausführung eines Computerprogramms, an dem garantiert ist, dass alle Nebenwirkungen früherer Bewertungen durchgeführt wurden und noch keine Nebenwirkungen von nachfolgenden Bewertungen durchgeführt wurden.</br>
Sequenzpunkte führen somit zur Trennung der Abarbeitungsreihenfolge innerhalb von Ausdrücken. Das abschließende Semikolon am Ende eines Ausdruckes sorgt somit dafür, dass zunächst der vorangegangene Ausdruck abgearbeitet wird, bevor der nächste Ausdruck beachtet wird.</br>
Beschreibt das Semikolon explizit einen Sequenzpunkt, so gibt es auch andere Operatoren, die einen Sequenzpunkt beinhalten. Bei solchen Operatoren wird somit zunächst vollständig der erste Teilausdruck ausgewertet, bevor der nächste folgt. Zwei Beispiele für Operatoren mit Sequenzpunkt sind das logische Und <code>&&</code> und der <code>?</code>-Operator:
<syntaxhighlight lang="C">
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(int par) {
return printf("func(%d) called\n",par);
}
int main(int argc,char *argv[]) {
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein weiteres Beispiel ist der Komma-Operator. Hier teilt das Komma den Gesamtausdruck in mehrere Teilausdrücke auf, die nacheinander abgearbeitet werden (siehe
[[Programmieren in C/C++: Grundlagen#Komma-Operator | Komma-Operator]]).
=== Abarbeitungsreihenfolge ===
Die Abarbeitungsreihenfolge der Operatoren innerhalb eines Ausdruckes wird durch die Prioritätenliste/Rangfolge (siehe [[C-Programmierung: _Liste_der_Operatoren_nach_Priorität| C-Programmierung:Liste der Operatoren nach Priorität]]) vorgegeben. Operatoren mit höherer Priorität werden vor Operatoren mit niedriger Priorität ausgeführt. Die ()-Klammer hat die höchste Priorität:
<syntaxhighlight lang="C">
//Der Ausdruck
c = sizeof(x) + ++a / 3;
//wird aufgrund der Prioritäten wie folgt ausgewertet:
c= (sizeof(x)) + ( (++a) / 3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=2;
int c;
int x=0;
c = sizeof(x) + ++a / 3;
printf("a=%d c=%d\n",a,c);
//Wird aufgrund der Prioritäten wie folgt ausgewertet:
a=2;
c= (sizeof(x)) + ( (++a) / 3);
printf("a=%d c=%d\n",a,c);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei identischer Priorität ergibt sich die Abarbeitungsreihenfolge aus der Assoziativität (L-R oder R-L):
<syntaxhighlight lang="C">
a=33 / 5 / 2;
//Wird aufgrund der L-R Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2;
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
a = b = c = d*2; //→ a=(b=(c=(d*2)));
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a;
a=33 / 5 / 2;
printf("a=%d\n",a);
//Wird aufgrund der Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2
printf("a=%d\n",a);
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
int b,c,d=8;
a = b = c = d*2; //→ a=(b=(c=(d*2)));
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
An einigen Stellen gibt die C/C++ Spezifikation die Abarbeitungsreihenfolge nicht vor (indeterminately-sequenced), überlässt diese somit dem Compiler:
* Bei Funktionsaufrufen ist die Abarbeitungsreihenfolge der Parameter nicht spezifiziert:
:<syntaxhighlight lang="C">
//Quelle: C-Spec Kap. 6.5.2.2
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int f1(void) {
printf("f1 called\n");
return 1;
}
int f2(void) {
printf("f2 called\n");
return 2;
}
int f3(void) {
printf("f3 called\n");
return 3;
}
int f4(void) {
printf("f4 called\n");
return 4;
}
void func1(int par1,int par2) {
printf("func1(%d,%d) called\n",par1,par2);
}
void func2(int par1,int par2) {
printf("func2(%d,%d) called\n",par1,par2);
}
int main(int argc,char *argv[]) {
//Quelle: C-Spec Kap. 6.5.2.2
void (*pf[2])(int,int)={func1,func2};
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Per Postinkrement/-dekrement Operator sagt aus, dass für die eigentliche Operation der Wert der Variablen genutzt wird und im Anschluss die Variable erhöht / erniedrigt werden soll. Nach C-Spezifikation [C11 6.5.2.4] muss dies spätestens vor dem nächsten Sequence Point erfolgt sein. Der genaue Zeitpunkt innerhalb des Sequence Points ist jedoch nicht vorgegeben:
:<syntaxhighlight lang="C">
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
printf("a=%d b=%d\n",a,b);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Initialisierungliste ist Abarbeitungsreihenfolge nicht spezifiziert:
<syntaxhighlight lang="C">
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
printf("var={a=%d b=%d c=%d}\n",var.a,var.b,var.c);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Compound-Statement ===
Ein Compound-Statement ist innerhalb der C-Spezifikation ein alternativer Ausdruck für ein block-scope. Dieser fasst mehrere Statements und Deklarationen zu einem Statement zusammen:
<code>
Syntax: {Declaration-or-statement-list/textsuperscript<sub>OPT</sub>}
</code>
Ein Block wird nicht wie bei einer Anweisung mit einem Semikolon abgeschlossen (Das angehängte Semikolon wäre dann eine separate leere Anweisung!).
Ein Block hat blockweite Sichtbarkeit (siehe [[Programmieren in C/C++: Grundlagen#Blockweite Sichtbarkeit | Blockweite Sichtbarkeit]]), , so dass hier definierte Variablen nur hier gültig sind. Deklarationen sind ebenfalls nur in dem Block gültig:
<syntaxhighlight lang="C">
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Verwendung findet das Compound-Statement a) als Strukturierungsmöglichkeit innerhalb von Funktionen (zur Darstellung, dass dieser Bereich 'zusammengehörig' ist) und b) an den Stellen, an denen C/C++ nur eine Anweisung erwartet. Dies sind bspw. die If- und die For-Anweisungen:
<syntaxhighlight lang="C">
for(..) Anweisung; //For-Schleife führt nur diese eine Anweisung aus
for(…) {Block} //For-Schleife führt Block (als eine Anweisung) aus
if(..) Anweisung; else Anweisung; //IF-Anweisung führt nur 'eine'
//Anweisung aus
if(..) {Block} else {Block} //IF-Anweisung führt Block aus
if( ) {Block}; else {Block}; //Semikolon ist eine separate
//Leer-Anweisung, so dass else
//nicht zur IF-Anweisung zugeordnet
//werden kann (2 Anweisungen vor Else)</syntaxhighlight>
=== Embedded Statement ===
Embedded Statements sind eine GNU-C Erweiterung (siehe [https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html GNU-C-Manual 3.18]). Da diese vom Autor als sehr nützlich angesehen und auch von diversen Compilern und auch in C++ unterstützt werden, werden diese nachfolgend beschrieben.
Ein Compound-Statement fasst mehrere Anweisungen zu einer Anweisung zusammen, hat jedoch kein Rückgabewert. Ein Embedded-Statement entspricht einem Compound-Statement mit der Ergänzung, dass dieser einen Rückgabewert hat, so dass ein Embedded-Statement überall dort eingesetzt werden kann, wo eine Operand erwartet wird.
<code>
Syntax: ({Declaration-or-statement-list<sub>OPT</sub>})
</code>
Der Rückgabewert (und Datentyp) wird nicht über eine return-Anweisung angegeben, sondern entstammt aus dem Rückgabewert der letzten Anweisung innerhalb der Liste:
<syntaxhighlight lang="C">
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
printf("var=%d\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein Embedded-Statement ähnelt folglich einem Funktionsaufruf mit dem Unterschied, dass a) in der Tat kein Funktionsaufruf stattfindet und b) der Rückgabewert nicht mit return, sondern über die letzte Anweisung zurückgegeben wird. Der Anwendungsfall ist dort zu finden, wo eine Operand erwartet wird und mehrere Anweisungen zum Ermitteln des Operanden notwendig sind:
<syntaxhighlight lang="C">
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
printf("Bedingung erfüllt");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Ein Embedded-Statement ist insbesondere bei Nutzung von Makros (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]) hilfreich
* Mittels eines Embedded-Statement kann eine anonyme Funktion/Lambdafunktion dargestellt werden:
<syntaxhighlight lang="C">
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {return a%2?a:0;} ; func;})
,arr);
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {printf("Called:%d\n",a);return a%2?a:0;} ; func;})
,arr);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Funktionen / Prozeduren ==
Funktionen/Prozeduren sind ein Strukturierungsmerkmal, so dass Teile der Funktionalität des Programmes wiederverwendbar sind. C/C++ unterscheidet nicht zwischen Funktionen (haben einen Rückgabewert, können damit als Operand in Ausdrücken verwendet werden) und Prozeduren (haben keine Rückgabewert, resp. Rückgabetyp void). <br/>
Mit jedem Aufruf einer Funktion wird für den zugehörigen Block ein eigener Stack-Kontext angelegt, so dass Funktionen sich selbst aufrufen können (Rekursion). Jeder Funktionsinstanz hat somit seinen eigenen lokalen Variablenbereich, teilen sich jedoch die globalen und die statisch lokalen Variablen.<br />
Mit dem Aufruf einer Funktion können Parameter übergeben werden, wobei die Übergabeparameter vom Aufrufer (Caller) durch den Aufruf in die lokalen Variablen des Aufgerufenen (Callee) kopiert/zugewiesen werden (Call by Value). Wird ein Zeiger übergeben, hat der Callee über die Dereferenzierung des Zeigers die Möglichkeit, die Variablen des Caller zu verändern (Call by Reference) (siehe Kap. [[Programmieren in C/C++: Zeiger #Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen).]]).
Hinweise:
* Die Klammerung hinter dem Funktionsnamen (<code>foo()</code>) zeigt an, dass es sich um einen Funktionsaufruf (Verzweigung der Programmausführung zu der Startadresse der Funktion) handelt:
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
foo(); //Klammern hinter dem Funktionsnamen bedeuten Aufruf der Funktion
</syntaxhighlight>
* Die Nutzung des Funktionsnamens ohne Klammerung (<code>foo</code>) gibt die Startadresse der Funktion zurück. Die Startadresse kann in einem Zeiger auf Funktionen gespeichert werden (siehe Kap. [[Programmieren in C/C++: Zeiger#Zeiger auf Funktionen | Zeiger:Zeiger auf Funktionen]]):
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
printf("foo called");
};
int main(int argc, char *argv[]) {
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
fptr(); //Aufruf der Funktion
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklaration/Definition vor dem ersten Aufruf der Funktion 'notwendig', damit Compiler die Übergabeparameter entsprechend bereitstellt und ggf. eine implizite Typkonvertierung durchführt (dito Rückgabewert). Die Angabe der Variablennamen können bei der Deklaration entfallen
* Die fehlende Angabe der Übergabeparameter bedeutet in C (bis einschl. C18), dass diese Funktion mit beliebigen Übergabeparametern aufgerufen werden kann und der Compiler keine Typprüfung durchführt:
:<syntaxhighlight lang="C">
int func(/*Keine Übergabeparameter angegeben*/) {...}
//kann wie folgt aufgerufen werden
func();
func(4);
func("hallo Welt",4.7);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func() {
printf("foo called\n");
};
int main(int argc, char *argv[]) {
func();
func(4);
func("hallo Welt",4.7);
//Ab C23 hat sich die Bedeutung geändert.
//Zum Testen C-Versionsvorgabe -sdc=xxx unter Compiler-options aendern
return 0;
} | execCompilerOptions=-Wall -std=c17|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:→ unbedingt vermeiden<br />
:Hat die Funktion keinen Übergabewert, so wird dies in C mit void gekennzeichnet
* In C++ bedeutet die Schreibweise ohne Datentypbeschreibung, dass keine Parameter erwartet werden
* In der Parameterliste von Funktionen dient in der GNU-C Spezifikation das Semikolon zum Trennen zwischen Deklaration von Übergabeparameter und den Übergabeparametern. Alle Übergabewerte links vom Semikolon sind (Forward)deklarationen:
:<syntaxhighlight lang="C">
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Aufruf
test1(3,7); //a=7 b=3
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim);
//Aufruf
test2("hallo",6);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim) {
printf("dim=%d\n",dim);
}
int main(int argc, char *argv[]) {
//Aufrufe
test1(3,7); //a=7 b=3
test2("hallo",6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Return-Anweisung ===
Mit der Return-Anweisung wird eine Funktion (vorzeitig) beendet. Der optionale Parameter dient der Angabe des Rückgabewertes der Funktion an den Aufrufer. Der Datentyp des Parameters ergibt sich aus dem Rückgabedatentyp der Funktion.
<code>
Syntax: return expression<sub>OPT</sub>
</code>
Der Rückgabewert expresion sagt aus, dass hier nicht nur Konstanten oder Variablen stehen können, sondern ein komplexer Ausdrücke erlaubt ist. Der resultierende Datentyp des Ausdruckes sollte dem Rückgabedatentyp der Funktion entsprechen, andernfalls wird eine implizite Typkonvertierung vollzogen (sofern möglich):<syntaxhighlight lang="C">
int foo(double a, double b) {
return (int)(a*a+b*b);
}
</syntaxhighlight>
Hinweise:
* Bei nicht void-Funktionen ist eine return-Anweisung mit einer Expression entsprechend dem Datentyp der Funktion zwingend notwendig:
:<syntaxhighlight lang="C">
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
double a=func(); //int wird in double konvertiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
int main(int argc, char *argv[]) {
double a=func(); //int wird in double konvertiert
printf("a=%f\n",a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei einer void-Funktion ist die return-Anweisung ohne Expression optional. Hier entspricht der schließende Block der Return-Anweisung
:<syntaxhighlight lang="C">
void func(char *str) {
if(str==NULL)
return;
printf("%s",str);
}
</syntaxhighlight>
Sollen mehr als ein Rückgabewert an den Aufrufer zurückgegeben werden so empfiehlt sich:
* die Rückgabewerte in einer Struktur zu packen (siehe [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++) |Datentypen:Verbundtyp Struktur/Klasse (nur C++)]])
* die Rückgabewerte über die Aufrufparameter als Call-by-Reference zu übergeben (siehe [[Programmieren in C/C++: Zeiger#Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen]])
==== Rückgabewert aus Datentypsicht ====
Aus Datentypsicht kann der Funktionsname inkl. den Parameter(n) in einem Ausdruck mit dem Datentyp des Rückgabewertes der Funktion ausgetauscht werden:
<syntaxhighlight lang="C">
int foo(void) {return 4711;}
int var;
var=1+foo(); //Aus Datentypsicht (int)=(int)+(int)
</syntaxhighlight>
Daraus ergibt sich, dass bei Arrays/Strukturen/Unions direkt auf einzelne Komponenten zugegriffen werden kann, ohne diese zuvor einer Variablen zuzuweisen:
<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
if(foo(12).x == 12) printf("Identisch\n");
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
if(far(3)[2] == 2) printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <stdlib.h>
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
int main(int argc, char *argv[]) {
if(foo(12).x == 12)
printf("Identisch\n");
if(far(3)[2] == 2)
printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
==== Fehlerrückgabe ====
Viele Funktionen können unter gewissen Umständen nicht korrekt ausgeführt werden. Z.B. aufgrund dessen, dass:
* der benötigter Speicher vom Heap nicht bereitgestellt werden kann
* Übergabeparameter außerhalb des zulässigen Wertebereiches liegen
* angeforderte Ressource (Datei, Geräte, …) nicht vorhanden/verfügbar sind
Solche Fälle gilt es dem Aufrufer mitzuteilen, da in diesen Fällen die vom Aufrufer geforderte Funktionalität nicht erfüllt ist und der Aufrufer ggf. nicht weiterarbeiten kann. Zur Mitteilung des Fehlers sollte vorrangig der Rückgabewerte genutzt werden. (auch wenn in C++ mit Exception eine Alternative hierzu bereitsteht)
<syntaxhighlight lang="C">
char *strdup(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup1(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
int main(int argc, char *argv[]) {
char *dup=strdup1("hallo");
if(dup == NULL)
printf("Fehler\n");
else
printf("dup='%s'\n",dup);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Standard-C Library-Funktionen geben in diesem Fall zumeist ein -1 (Rückgabewert Ganzzahl) oder einen NULL-Zeiger (Rückgabewert Zeiger) zurück. Der genaue Fehlergrund ist dann ergänzend in der globalen Variablen errno gespeichert. Mittels der Standard-C Funktion strerror() kann die Zahl in einen für den Anwender/Programmierer lesbaren String umgewandelt werden (die GNU-C Library Funktion printf() bietet ergänzend den Conversion Spezifier %m als alternative Ausgabemöglichkeit an):
<syntaxhighlight lang="C">
#include <errno.h>
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY|O_CREAT|O_EXCL,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY{{!}}O_CREAT{{!}}O_EXCL,
S_IRUSR{{!}}S_IWUSR{{!}}S_IRGRP{{!}}S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'''Für eine sauber Programmierung sollte diese Methodik generell angewendet werden.''' Jede Funktion, welche Fehlschlagen kann, teilt dies per Rückgabewert dem Aufrufer mit. Der Rückgabewert einer jeden Funktion wird vom Aufrufer kontrolliert.
=== Main-Funktion ===
Mit Start der Anwendung übergibt das Betriebssystem die Kontrolle an die Anwendung und führt dort die Funktion main aus. Als Übergabe- und Rückgabeparameter sind folgende Varianten erlaubt:
<syntaxhighlight lang="C">
int main(void) { }
int main(int argc, char *argv[]) { }
</syntaxhighlight>
Mit dem Start der Anwendung kann, wie bei jedem Funktionsaufruf, Parameter an den startenden Prozess übergeben werden. Die Parameter werden als Array von Strings übergeben. Im Parameter argc ist die Anzahl der Strings enthalten. Im Parameter argv[0..argc-1] sind die einzelnen Strings enthalten. Sofern vorhanden ist im ersten String der Programmname/Aufrufname der Anwendung enthalten:
<syntaxhighlight lang="C">
int main(int argc, char *argv[]) {
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++)
printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int max_width=0;
int ret;
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++) {
ret=printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
max_width=ret>max_width ? ret : max_width;
}
//Trennzeichen drucken
char term[max_width];
memset(term,'-',max_width);
printf("%.*s\n",max_width-1,term);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Im Compiler-Explorer können die Parameter im Executor unter 'Execution Arguments', getrennt mit Leerzeichen eingegeben werden.
Wird die Funktion main beendet, entweder über die return Anweisung oder den Aufruf der exit() Funktion, wird die Kontrolle zurück an den startenden Prozess (zumeist Shell) gegeben. Über den Rückgabewert wird im Allgemeinen dem Aufrufer der Fehlerstatus mitgeteilt (EXIT_SUCCESS oder 0 bedeutet fehlerfreie , EXIT_FAILURE oder Werte ungleich 0 fehlerhafte Ausführung).
Hinweise:
* Der Return-Wert der main-Funktion kann mit >>echo $? in der Bash abgefragt werden
* Mittels <code>exit(int status)</code> kann das Programm an jeder Stelle innerhalb des Programms beendet werden. <code>status</code> entspricht dann der expression der return Anweisung von main()
* Ungeachtet des Rückgabedatentyps int bei der Defintion der main() Funktion beträgt der zulässige Wertebereich für Linux Anwendungen 0..255. Der korrekte Rückgabedatentyp der main() Funktion müsste somit 'unsigned char' lauten
=== Inline Funktion ===
Wie der Name inline andeutet, ist die Intention von Inline, dass die aufgerufen Funktion Bestandteil der aufrufenden Funktion ist. Die aufgerufene Funktion soll somit im Kontext des Aufrufers ausgeführt werden, so dass kein eigener Stack bereitgestellt werden muss. Der Start der Funktion kann somit schneller erfolgen:
<code>
inline int foo(void) { }
</code>
Das Funktionseinbindung/zusammenführung erfolgt durch den Compiler (und nicht durch den Linker). Damit das inline vom Compiler ausgeführt werden kann, muss die zu inlinende Funktion vor dem Aufruf definiert sein, d.h. sie muss in derselben C-Datei oder in einer der einzubindenden Header-Dateien enthalten sein [C11 6.7.4].
Hinweis:
* Das 'inlinen' von Funktionen über die eigene Objektdatei hinweg erfolgt in C/C++ über Link Time Optimization (LTO). Hierzu fügt der Compiler den Zwischencode mit in die Objektdatei, so dass der Linker das 'inlinen' vollziehen kann (siehe {{w|lang=en|Interprocedural_optimization| Interprocedural Optimization}})
=== Variadic Function / Ellipsis Punctuator ===
Mit dem Ellipsis Puncturator '…' kann in Funktionsdefinitionen angegebenen werden, dass an dieser Stelle beliebig viele Parameter/Argumente übergeben werden können. Dies wird unter anderen in der printf() Anweisung genutzt:
<syntaxhighlight lang="C">
int printf(const char *fmt, ... );
</syntaxhighlight>
Die wie folgt aufgerufen werden kann:
<syntaxhighlight lang="C">
printf("Hello World"); //es folgt kein Parameter
printf("%d",100); //es folgt ein Parameter vom Datentyp int
printf("%f",1.1); //es folgt ein Parameter vom Datentyp double
printf(conststr,1,2,3,"xyz") //Ohne Worte
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n"); //es folgt kein Parameter
printf("%d\n",100); //es folgt ein Parameter vom Datentyp int
printf("%f\n",1.1); //es folgt ein Parameter vom Datentyp double
const char *conststr="%d %x %c '%s'\n";
printf(conststr,1,2,33,"xyz"); //Ohne Worte
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei der Parameterübergabe wird der Datentyp nicht mit übergeben, so dass die aufgerufene Funktion keine Möglichkeit hat, den Datentype der Parameter zur Laufzeit zu ermitteln. Einzig werden bei Aufruf der variadischen Funktion so viel Bytes auf den Stack gelegt, wie der Datentyp der einzelnen Übergabeparameter groß ist:
:<code>int --> 4 Byte</code>
:<code>double --> 8 Bytes</code>
:<code>Zeiger --> 4/8 Byte</code>
Damit die aufgerufene Funktion die fehlende Datentypinformation dennoch mitgeteilt bekommt, erfolgt dies am Beispiel der printf Funktion über den Format-String:
<syntaxhighlight lang="C">
int vari;
printf("%d",vari); //%d erwartet einen Integer Übergabeparameter (4-Byte)
size_t vars;
printf(" %zu %d ", vars, vari); // %zu zur Mitteilung, dass anstatt
//integer nun size_t als Datentyp übergeben wird
//und somit anstatt 4 Bytes 8 Bytes vom Stack genommen werden
</syntaxhighlight>
<code>printf()</code> entnimmt entsprechend der Datentypbeschreibung im Formatstring die passende Anzahl an Bytes vom Stack.
Da der Compiler für die optionalen Parameter nicht den Zieldatentyp kennt, erlaubt die C-Spezifikation als Übergabedatentypen hier nur die Grunddatentypen <code>signed int, unsigned int, long, long long, double</code> und <code>Zeiger</code>. Entspricht der übergebene Parameter nicht einen dieser Datentypen, so wird er mittels implizit Cast entsprechend nachfolgender Tabelle gewandelt [C11 6.5.2.2 Default Argument Promotions]:
{| class="wikitable"
|-
! Ausgangstyp !! Umwandlungstyp
|-
| char, signed char, short || int
|-
| unsigned char, unsigned short || unsigned int
|-
| float || double
|-
| Alle anderen Datentypen || bleiben erhalten
|}
Bspw.:
<syntaxhighlight lang="C">
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Über den Length-Modifier Parameter im Formatstring kann printf mitgeteilt
//werden, dass von dem übergebenem Integerwert weniger Bytes zu
//interpretieren sind
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
Zum Umgang mit dem variadischen Parameter stellt C die Funktionen <code>va_start(), va_arg(), va_copy()</code> und <code>va_end()</code> bereit. Auf Grundlage des dazugehörigen Datentyps <code>va_list</code> können variadische Parameter auch an Unterfunktionen weitergereicht werden (bspw vprintf()). Dieses Thema bedingt jedoch genaue Kenntnisse vom Umgang mit dem Stack und ist nicht Bestandteil dieser Vorlesung.
=== Funktion in Funktion ===
Die GNU-C Reference (nicht C++) erlaubt es, Funktionen innerhalb von Blöcken (und damit innerhalb von Funktionen) zu definieren. Diese innere Funktion steht dann nur in diesem Block zur Verfügung und kann von außerhalb des Blockes nicht aufgerufen werden. Als Gimmick können Funktionen in Funktionen auf die zuvor definierten lokalen Variablen der inkludierenden Funktion zugreifen:
<syntaxhighlight lang="C">
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Variable Length Array (VLA) ==
Im Normalfall ergibt sich die Anzahl der Elemente eines Arrays aus einer Konstanten, so dass der Compiler zur Compilezeit passend Speicher reserviert (siehe Kap. [[Programmieren in C/C++: Array | Array]]):
<syntaxhighlight lang="C">
int arr[4]; //Compiler reserviert für Variable arr
//4*sizeof(int) Speicherplatz
</syntaxhighlight>
Bei Variable Lenght Array wird die Arraydimension nicht über eine Konstante, sondern über eine Variable oder einen Ausdruck angegeben. D.h. die tatsächliche Dimension des Arrays ergibt sich erst zum Ausführungszeitpunkt der Definition:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //Arraydimension ergibt sich zum Ausführungszeitpunkt
n++; //Nachträgliches Ändern von n ändert nicht
//die Größe des Arrays!
}
</syntaxhighlight>
Ein Variable Length Array kann nur als lokale Variable oder als Übergabeparameter definiert werden (wobei im letzteren Fall kein Speicher hiermit reserviert wird). Eine Initialisierung eines VLA's mit der Definition ist nicht möglich, d.h. nach der Definition beinhaltet das Array 'zufällige' Werte. Es empfiehlt sich daher, diese bspw. mit memset händisch zu initialisieren (siehe auch Kap [[Programmieren in C/C++: Array#Initialisierung | Array:Initialisierung]]):
<syntaxhighlight lang="C">
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
for(size_t lauf=0;lauf<n;lauf++)
printf("str[%zu]=%d\n",lauf,str[lauf]);
}
int main(int argc, char *argv[]) {
foo(4);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mittels sizeof kann weiterhin der Speicherbedarf ermittelt werden, wobei sizeof mit einem VLA als Argument kein Konstantenausdruck ist. Stattdessen wird die Größe zur Laufzeit ermittelt:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
printf("size=%zu\n",size);
}
int main(int argc, char *argv[]) {
foo(5);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
VLA wurden erstmals in C mit C99 eingeführt. In C11 wurden VLA's als optional eingestuft und mit C23 zurück auf notwendig gesetzt. In C++ sind VLA's nicht definiert, werden jedoch vom GCC Compiler unterstützt. Als alternativen Datentyp wird hier std::array empfohlen.
Hinweis:
* VLA sind nicht direkt in einem Switch-Case Block definierbar. Wird hier ein VLA benötigt, so muss hierzu ein Block erzeugt werden:
:<syntaxhighlight lang="C">
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int value=argc;
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Operatoren ==
In der Programmiersprache C sind folgende Punctuators [C11 6.4.6] definiert:
<syntaxhighlight>
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |= , # ##
<: :> <% %> %: %:%:
</syntaxhighlight>
Die Funktionalitäten sind identisch zu Java. Aufgrund des Datentyps Zeiger gibt es in C ergänzend den Punctuator <code>-></code> (siehe Kap [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++)|Datentypen:Verbundtyp Struktur/Klasse (nur C++)]]). Der Präprozessor bedingt die beiden Punctuatoren <code>#</code> und <code>##</code> (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]).
Die letzten 6 Punctuators <code><: :> <% %> %: %:%:</code> werden zu <code>[ ] { } # ##</code> ersetzt. Sie sind für Computersysteme gedacht, welche keine ALTGR-Taste besitzen.<br />
Java kennt ergänzend den <code>>>></code> Operatoren, welcher in C über den normalen Schiebebefehl und den zugrundeliegenden Datentyp gesteuert wird.
Wie in Java sind einige Punctuators vom Kontext abhängig und haben damit unterschiedliche Funktionalitäten:
<syntaxhighlight>
++ → (Postfix) ++ vs. ++(Präfix)
-- → (Postfix) -- vs. --(Präfix)
+/- → Vorzeichen vs. Addition/Subtraktion
() → Funktionsaufruf() vs. Befehlsbestandteil if() vs. Priorisierung
</syntaxhighlight>
Für den Umgang mit dem Datentyp Zeiger besitzen einige Punctuatoren ergänzende Funktionalitäten (siehe Kap [[Programmieren in C/C++: Zeiger| Zeiger]]):
<syntaxhighlight>
& → Bitweises UND:
Anwendung: Ganzahlausdruck & Ganzahlausdruck
& → Adressoperator:
Anwendung: &Variable
* → Multiplikation
Anwendung: Ganzahl-/Gleitkommaausdruck * Ganzahl-/Gleitkommaausdruck
* → Datentyp Zeiger
Anwendung: Datentyp * Variablenname;
* → Dereferenzierung:
Anwendung: * Zeiger
</syntaxhighlight>
Punctuatoren, welche von Java abweichende / ergänzende Funktionalitäten haben, werden nachfolgend gesondert beschrieben.
Sind in einer Anweisung mehrere Operatoren enthalten, so hängt die Abarbeitungsreihenfolge von der Rangfolge/Priorität der Operatoren ab (siehe [[Programmieren in C/C++: Grundlagen#Abarbeitungsreihenfolge | Abarbeitungsreihenfolge]]).<br />
Die Rangfolge ist identisch zu Java, wobei C mehr Operatoren kennt. Generell empfiehlt sich, lieber eine Klammer zu viel als zu wenig zusetzen. Klammern haben die höchste Priorität.
=== Zuweisungs-Operator ===
Die Zuweisung ('='-Operator, assignment expression) weist dem L-Value den R-Value zu.
Der Zuweisungs-Operator gibt den L-Value als Rückgabewert der Zuweisung zurück, so dass mehrere Zuweisungen in einem Ausdruck möglich sind. Die Abarbeitungsreihenfolge ist von rechts nach links (R-L Assoziativität). Wird der 'letzte' Rückgabewert nicht verwendet, so wird dieser verworfen (siehe Kap. [[Programmieren in C/C++: Grundlagen#Discarded Value / null statement | Discarded Value / null statement]]).<br />
Beispiel:
<syntaxhighlight lang="C">
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
//der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
//Compilerfehler geworfen wird
x*=y=z //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a,b,c=3,d=4;
int x,y,z;
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
; //der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
; //Compilerfehler geworfen wird
x*=y=z; //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen return 0;
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Auf beiden Seiten der Zuweisung muss der identische Datentyp stehen. Wenn andernfalls eine implizite Typkonvertierung nicht möglich ist, gibt der Compiler einen Fehler aus:
:<syntaxhighlight lang="C">
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
(void)b;
(void)c;
(void)d;
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
* Bei der Parameterübergabe beim Funktionsaufruf wird ebenfalls indirekt der Zuweisungs-Operator angewendet. Die Parameter des Aufrufers werden per Zuweisung den lokalen Variablen der aufgerufenen Funktion zugewiesen
:<syntaxhighlight lang="C">
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int main(int argc, char *argv[]) {
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
=== Komma-Operator ===
Der Komma-Operator erlaubt es, zwei Ausdrücke auszuführen, wo nur einer erlaubt wäre. Die Ergebnisse/Rückgabewerte aller durch diesen Operator verknüpften Ausdrücke, außer dem letzten werden verworfen. Der letzte Ausdruck dient als Rückgabewert.
Folgendes gilt es bei der Nutzung des Komma-Operators zu beachten:
* Der Komma-Operator wird von links nach rechts ausgewertet (L-R Assoziativität)
* Das Komma selbst stellt eine Sequence Point dar (siehe Kap [[Programmieren in C/C++: Grundlagen#Sequence Point|Sequence Point]])
* An Stellen, wo das Komma zum Syntax gehört (z.B. Trennung der Übergabeparameter bei der Funktionsdefinition und beim Funktionsaufruf, Trennung von Variablen bei der Variablendefinition/-deklaration, Trennung der enum Konstanten) muss der Ausdruck ergänzend geklammert werden, wenn der Komma-Operator gefordert ist
* Der Komma-Operator hat von allen Operatoren die niedrigste Priorität/Rangfolge, so dass dieser Operator als letztes 'ausgewertet' wird
Beispiel:
<syntaxhighlight lang="C">
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
int c=1,d=2,e=3;
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
void func(int value){}
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int value){
printf("func called with %d\n",value);
}
int main(int argc, char *argv[]) {
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
printf("a=%d\n",a);
int c=1,d=2,e=3;
printf("c=%d,d=%d,e=%d\n",c,d,e);
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
printf("c=%d,f=%d\n",c,f);
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'Sinnvolle' Anwendungsbeispiele:
* Bei For-Schleifen, so dass mehrere Variablen initialisiert und mehrere Variablen mit jedem Schleifendurchlauf geändert werden können:
:<syntaxhighlight lang="C">
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf]);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf])
printf("sum=%d lauf=%d\n",sum,lauf);
printf("sum=%d\n",sum);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der Return-Anweisung, bei welcher zur Darstellung der Zusammengehörigkeit mehrere Aktionen ausgeführt werden sollen:
:<syntaxhighlight lang="C">
return errno=EINVAL,-1;
return printf("Fehler"),-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <errno.h>
int foo(void) {
return errno=EINVAL,-1;
}
int far(void) {
return printf("Fehler\n"),-1;
}
int main(int argc, char *argv[]) {
printf("foo()=%d\n",foo());
printf("far()=%d\n",far());
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* An Stellen, wo nur eine Anweisung erlaubt ist (und man zu faul ist, einen Block zu öffnen)
:<syntaxhighlight lang="C">
if(…) y=2,z=3;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int y=0,z=0;
if(1) y=2,z=3;
printf("y=%d z=%d\n",y,z);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In vielen Ländern wird das Komma zur Darstellung von Gleitkommazahlen genutzt. Wird versehentlicher Weise dies in C/C++ übernommen, so führt dies zu einem unerwarteten Verhalten:
:<syntaxhighlight lang="C">
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
printf("var=%f\n",var);
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
printf("var=%f\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== ?-Operator / Conditional-Operator ===
Operator mit 3 Operanden, welcher in Abhängigkeit des ersten Ausdruckes den zweiten oder dritten Ausdruck ausführt und dessen Rückgabewert zurückgibt.
<code>
Syntax: Logical-OR-expression ? expression : condition-expression
</code>
Entspricht der if()-Anweisung, wobei der ?-Operator als solches einen Wert zurückgibt! <code>Expression</code> wird nur ausgeführt, wenn <code>Logical-OR-Expression</code> zu true ausgewertet wird. Andernfalls wird <code>condition-expression</code> ausgeführt. Der zurückgegebene Datentyp ergibt sich aus der <code>expression</code> resp. <code>condition-expression</code>. '''Beide Ausdrücke sollten somit einen identischen resultierenden Datentyp besitzen!'''
Folgendes gilt es bei der Nutzung des ?-Operators zu beachten:
* Der Datentyp <code>expression</code> und <code>condition-expression</code> sollte identisch sein:
<syntaxhighlight lang="C">
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Nach der GNU-C Reference kann der mittlere Ausdruck fehlen. In diesem Fall wird stattdessen das Ergebnis des linken Operanden dort eingesetzt (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)
<syntaxhighlight lang="C">
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
printf("b=%d\n",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* In der Abarbeitungsreihenfolge liegt der ?-Operator oberhalb der Komma- und des Zuweisungsoperators. Soll im <code>condition-expresion</code> Ausdruck der Komma- oder Zuweisung-Operator genutzt werden, so ist <code>condition-expression</code> zu klammern. Andernfalls bedingt die niedrige Priorität des Komma-Operators ein anders Verhalten, als erwartet:
<syntaxhighlight lang="C">
int a=7,max=5,var;
max=a>max ? a : max; //Alles bestens
var= a>5 ? a++,5:6; //Alles bestens
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=7;
int max=5;
max=a>max ? a : max; //Alles bestens
printf("max=%d\n",max);
int var;
var= a>5 ? a++,5:6; //Alles bestens
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
printf("var=%d a=%d\n",var,a);
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
printf("var=%d a=%d\n",var,a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Nutzung des ?-Operators empfiehlt sich an diversen Stellen:
* Bei Makros:
:<syntaxhighlight lang="C">
#define MAX(a,b) (a>b?a:b)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
int main(int argc, char *argv[]) {
printf("MAX(4,5)=%d\n",MAX(4,5));
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Beim Fehlerhandling:
:<syntaxhighlight lang="C">
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion ausgeführt wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn ret==0 ist
//andernfalls wird ret zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 0;
}
int init2(void) {
printf("init2() called\n");
return 0;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn Ret==0 ist
//andernfalls wird Ret zurückgegeben
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Logische Verknüpfungen ===
Alle logischen Operationen nutzen als Operanden Ganzzahlen ,Gleitkommazahlen oder Zeiger. Der Operand wird als false angesehen, wenn der Operand 0, 0.0 oder NULL ist. Andernfalls als true. Das Ergebnis ist immer vom Datentyp int und hat den Wert von 0 oder 1.
<code>Syntax: Expression && Expression</code><br />
<code>Syntax: Expression || Expression</code><br />
<code>Syntax: ! Expression</code><br/>
Bei der logischen UND und ODER Verknüpfung wird zuerst der linke Ausdruck ausgewertet (Operator ist ein Sequence Point). Der rechte Ausdruck wird nur ausgeführt, wenn:
* bei der logischen UND Verknüpfung der linke Ausdruck TRUE ergab
* bei der logische OR Verknüpfung der linke Ausdruck FALSE ergab
Andernfalls steht das Ergebnis schon mit der Auswertung des linken Operanden fest.<br />
In der theoretischen Informatik wird dies 'Non-strict-evaluation' genannt, bei welcher der Rückgabewert feststeht, bevor alle Ausdrücke bearbeitet worden sind.
Beispiel für das Verhalten des Ausbleibens der Auswertung des zweiten Operators:
<syntaxhighlight lang="C">
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a || ++a)
b=1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a {{!}}{{!}} ++a)
b=1;
printf("a=%d b=%d\n",a,b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Diese Funktionalität ist insbesondere beim Umgang mit Fehlern vorteilhaft:
* Prüfen, ob eine Variable einen gültigen Wert hat, bevor sie weiterverwendet wird
<syntaxhighlight lang="C">
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
else
printf("Kein Substring im String gefunden\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion aufgerufen wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 1;
}
int init2(void) {
printf("init1() called\n");
return 1;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Bitweise Verknüpfungen ===
Alle bitweisen Operationen nutzen als Operanden Ganzzahlen. Bei vorzeichenbehafteten Zahlen ist das Ergebnis nach [C11 6.5] Implementierungsabhängig, wobei das Vorzeichenbit zumeist als eigenständiges Bit angesehen wird und bei UND/ODER/EXOR als normales BIT betrachtet wird.
<code>Syntax: Ganzzahl & Ganzzahl → Bitweise UND Operation</code><br />
<code>Syntax: Ganzzahl | Ganzzahl → Bitweise ODER Operation</code><br />
<code>Syntax: Ganzzahl ^ Ganzzahl → Bitweise EXOR Operation</code><br />
<code>Syntax: ~ Ganzzahl → Bitweise Negierung</code><br />
<code>Syntax: Ganzzahl >> additive-expression</code><br />
<code>Syntax: Ganzzahl << additive-expression</code><br />
Mittels des Schiebeoperators können '''Ganzzahlen''' um <code>additive-expression</code> bitweise nach Links <code><<</code> oder Rechts <code>>></code> verschoben werden. Der resultierende Datentyp ergibt sich aus dem linken Operanden. Der rechte Operand muss positiv und der Wert kleiner gleich der Bitbreite des linken Operanden sein. Andernfalls ist das Ergebnis implementierungsspezifisch.
Nach [C11 6.5.7] ist das Ergebnis der Schiebeoperation implementierungsspezifisch, wenn der linke Operand eine negative vorzeichenbehaftete Zahl ist. In der Regel wendet der Compiler jedoch folgende Schiebeoperation an:
* Logisches Schieben (zu füllende Bit-Stellen werden mit 0 aufgefüllt), wenn der linke Operand einen vorzeichenlosen Datentyp hat
* Arithmetisches Schieben (zu füllende Bit-Stelle beim Rechtsschieben wird mit dem Vorzeichenbit aufgefüllt), wenn der linke Operand ein vorzeichenbehaftete Datentyp ist. Hiermit wird das Vorzeichen beibehalten, so dass eine negative Zahl nach dem Schieben weiterhin negativ ist (In Java erfolgt dies durch den >>> - Operator)
Hinweis:
* Ein Schieben um eine Stelle nach rechts entspricht einer Division durch 2
* Ein Schieben um eine Stelle nach links entspricht einer Multiplikation mit 2
=== sizeof-Operator ===
Der sizeof-Operator dient zur Ermittlung des Speicherbedarfs (in Bytes) einer Variablen/eines Datentyps.
<code>Syntax: sizeof (type-name)</code><br />
<code>Syntax: sizeof unary-expression</code><br />
Als Argument für den Sizeof-Operator kann wahlweise ein Datentyp, eine Variable oder ein Ausdruck genutzt werden. Sizeof gilt als Konstantenausdruck, d.h. seine Berechnung erfolgt durch den Compiler, sodass:
* sizeof zur Initialisierung von globalen Variablen genutzt werden
:<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz); //3*sizeof(int)=12
int main(int argc, char *argv[]) {
printf("size=%zu\n",size);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* bei einem Ausdruck dieser nicht ausgeführt wird, sondern nur der resultierende Datentyp bestimmt wird und dessen Größe zurückgegeben
:<syntaxhighlight lang="C">
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der resultierende Datentyp des Rückgabewertes ist <code>size_t</code>.
Es empfiehlt sich, den sizeof-Operator mit Klammern zu nutzen, andernfalls gibt sizeof bei Anwendung auf einen Ausdruck die Größe des linken Operators zurück:
<syntaxhighlight lang="C">
size_t size;
short var;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
size_t size;
short var=0;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
printf("size=%zu var=%d\n",size,var);
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* sizeof angewendet auf char gibt immer den Wert 1 zurück.
* sizeof ist nicht auf Operanden vom Typ Funktion, void, Felder ohne Größenangabe und Bitfelder anwendbar
* wird sizeof auf ein VLA angewendet, so entspricht sizeof nicht mehr einen Konstantenausdruck, sondern einem Funktionsaufruf
:<syntaxhighlight lang="C">
void foo(int n) {
int arr[n];
size_t size=sizeof(arr); //Speicherbedarf ist kein Konstantenausdruck
//sondern wird zur Laufzeit berechnet
</syntaxhighlight>
* Sizeof entspricht nicht strlen(), da sizeof die Größe des für die Variable reservierten Speicherbereich zurückgibt und nicht wie strlen() den Inhalt des Speicher hinsichtlich des Stringendezeichens auswertet:
:<syntaxhighlight lang="C">
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Anweisungen ==
=== If-Anweisung ===
<code>Syntax: if (expression) statement</code><br />
<code>Syntax: if (expression) statement else statement</code><br />
Das Ergebnis des Ausdruckes (Ganzzahl, Gleitkommazahl oder Zeiger) wird auf ungleich 0, 0.0 oder NULL getestet. Trifft dies zu, so wird <code>statement</code> ausgeführt. Andernfalls wird das <code>else statement</code> ausgeführt, sofern vorhanden. Sollen mehrere Anweisungen ausgeführt werden, so sind diese mittels Block zusammenzufassen (diesen dann bitte nicht mit ; abschließen).
Beispiel:
<syntaxhighlight lang="C">
if(a==1)
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
if(a) //entspricht a!=0
if(printf("hallo")<0) //prüfen, ob printf() fehlschlägt
if( ({int dummy=a;a=b;b=dummy;})==6)
if(a=7) //Zuweisung!
if(7=a) //KO, Eine Konstante kann kein L-Value sein
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1,b=2;
if(a==1)
printf("a==1\n");
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
printf("a=1\n");
if(a) //entspricht a!=0
printf("a\n");
if(printf("hallo\n")<0) //prüfen, ob printf() fehlschlägt
printf("printf()\n");
if( ({int dummy=a;a=b;b=dummy;})==6)
printf("({...})\n");
if(a=7) //Zuweisung!
printf("a=7\n");
if(7=a) //KO, Eine Konstante kann kein L-Value sein
;
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei der Anweisung <code>if(a==7)</code> finden aus syntaktischer Sicht zwei Aktionen statt. Zunächst wird geprüft, ob a gleich 7 ist. Dieser Vergleich liefert true(=1) oder false(=0) zurück. Die If-Anweisung prüft im Anschluss, ob das Argument true oder false ist.
=== For-Anweisung ===
<code>Syntax: for(Initialisierungsteil<sub>OPT</sub> ; Test<sub>OPT</sub> ; Fortsetzung<sub>OPT</sub>) Statement</code>
Die For-Anweisung wird vom Compiler wie folgt umgesetzt:
<poem> '''Initialisierungsteil'''<sub>OPT</sub>
Goto Next
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
'''Statement'''
Continue:
'''Fortsetzung'''<sub>OPT</sub>
Next:
if('''Test'''<sub>OPT</sub>) goto Goon
Break:
</poem>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
for(summe=lauf=0;lauf<20;lauf++)
summe+=lauf;
printf("summe=%d\n",summe);
//Initialisierungsteil
summe=lauf=0;
goto Next;
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
//Statement
summe+=lauf;
Continue: __attribute__((unused))
//Fortsetzung
lauf++;
Next:
//if(TestOPT) goto Goon
if(lauf<20) goto Goon;
Break: __attribute__((unused))
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die einzelne Elemente haben folgende Bedeutung/Besonderheiten:
;Initialisierungsteil: Zum Initialisieren von Schleifenvariablen, wird einmalig mit Beginn der FOR-Anweisung ausgeführt.
:* kann Leer sein, dann erfolgt keine Initialisierung
:* Ab C99: Hier kann eine lokale Variable definiert werden, welche nur innerhalb dieser For-Anweisung gültig ist
;Testteil: Hierin wird vor jedem Schleifendurchlauf geprüft, ob die Schleifenbedingung erfüllt ist. Wenn Bedingung nicht erfüllt ist (Ganzzahl, Gleitkommazahl oder Zeiger gleich 0,0.0 oder NULL), wird die For-Schleife beendet.
:* Kann leer sein, dann wird dieser Teil als true angesehen
;Fortsetzungsteil: Wird nach jeden Schleifendurchlauf ausgeführt. In der Regel sollte hier die Schleifenvariable aktualisiert werden
:* Kann leer sein
;Statement: In der Schleife auszuführender Ausdruck
:* Sollen mehrere Ausdrücke ausgeführt werden, so sind diese in einem Block zusammen zu fassen.
:Ergänzende Anweisungen innerhalb des Statements/Block
:* 'continue' zum Fortsetzen des Schleifendurchlaufes, d.h. Sprung zum Fortsetzungs-Teil
:* 'break', zum Beenden des Schleifendurchlaufes
Beispiele:
* For-Schleife mit lokaler Schleifenvariable
:<syntaxhighlight lang="C">
char string[]="hallo";
for(size_t lauf=0; lauf < strlen(string); lauf++)
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife mit Break-Anweisung
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
printf("lauf=%zu\n",lauf);
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife, bei welcher die gesamte Aktion innerhalb der For-Anweisung ausgeführt wird
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;
src[l]!=0 && l <sizeof(dest);
printf("l=%zu\n",l),dest[l]=src[l],l++);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;src[l]!=0 && l <sizeof(dest); printf("l=%zu\n",l),dest[l]=src[l],l++);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleifenvariable muss keine Zählvariable sein
:<syntaxhighlight lang="C">
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
printf("Anzahl Einsen in %b = %d\n",zahl,bits);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zeiger als Schleifenvariable
:<syntaxhighlight lang="C">
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
printf("src='%s' dst='%s'\n",src,dst);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Zur Geschwindigkeitsoptimierung sollten im Test- und Fortsetzungsteil keine Funktionsaufrufe mit Werten enthalten sein, die sich innerhalb der Schleife nicht ändern:
:<syntaxhighlight lang="C">
for(size_t lauf=0;lauf<strlen("hallo");lauf++)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zur Geschwindigkeitssteigerung sollte im Testteil auf 0 abgefragt werden, d.h. die Schleifenvariable dekrementiert werden
:<syntaxhighlight lang="C">
for(int lauf=700000;lauf;lauf--)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(ssize_t lauf=700000000;lauf;lauf--)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
for(ssize_t lauf=0;lauf<700000000;lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Alternativ zu einer Laufvariablen empfiehlt sich die Nutzung von Pointer als Schleifenvariable;
:<syntaxhighlight lang="C">
for(char *ptr=str; *ptr; ptr++);
</syntaxhighlight>
=== While-Anweisung ===
<code>Syntax: while(expression) Statement </code><br />
<code>Syntax: do Statement while(expression);</code><br />
Die While-Anweisungen werden vom Compiler wie folgt umgesetzt:
{| class="wikitable"
! while()-Anweisung !! do while()-Anweisung
|-
| <poem>
Continue:
if(!'''expression''')
goto Break
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
'''Statement'''
goto Continue
Break:
</poem> ||
<poem>
GoOn:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
'''Statement'''
Continue:
if('''expression''')
goto GoOn
Break:
</poem>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
lauf=summe=0;
while(lauf<10) {
if(lauf>=5)
break;
lauf++;
if(lauf<3)
continue;
summe+=lauf;
}
printf("summe=%d\n",summe);
lauf=summe=0;
Continue1:
if(!(lauf<10))
goto Break1;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
//Statement
if(lauf>=5) {
goto Break1;
}
lauf++;
if(lauf<3)
goto Continue1;
summe+=lauf;
goto Continue1;
Break1:
printf("summe=%d\n",summe);
lauf=summe=0;
do {
lauf++;
if(lauf>5)
break;
if(lauf<3)
continue;
summe+=lauf;
} while(lauf<10);
printf("summe=%d\n",summe);
lauf=summe=0;
GoOn2:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
//Statement
lauf++;
if(lauf>5)
goto Break2;
if(lauf<3)
goto Continue2;
summe+=lauf;
Continue2:
if(lauf<10)
goto GoOn2;
Break2: __attribute__((unused));
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Folgendes gilt es bei der Nutzung der While-Anweisung zu beachten:
* Soll mehr als ein Statement innerhalb der While-Schleife ausgeführt werden, so sind diese in einem Block zu schreiben
* Statement kann eine Leeranweisung (gekennzeichnet durch ein Semikolon) sein
:<syntaxhighlight lang="C">
while(1);
do ; while(1);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf1=1000;
while(lauf1--);
int lauf2=1000;
do ; while(lauf2--);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der do-While-Schleife ist das abschließende Semikolon Bestandteil des Befehls
* expression muss eine Ganzzahl, Gleitkommazahl oder Zeiger zurückgeben, der bei False (0, 0.0 oder NULL) die Schleife beendet.
Beispiele:
* Endlosschleife
:<syntaxhighlight lang="C">
while(1) {}
</syntaxhighlight>
* Schleife zum Durchlaufen eines String
:<syntaxhighlight lang="C">
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
printf("Stringlänge=%zu\n",len);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Switch-Anweisung ===
<code>Syntax: switch(expression) statement</code><br />
<code>Syntax: statement:= case constant-expression: statement<sub>opt</sub> default: statement<sub>opt</sub></code><br />
Die Switch-Anweisung entspricht einer verschachtelten If-Anweisung, mit der Besonderheit, dass der auszuführende Code nicht im If-Zweig stattfindet, sondern dort ein goto zum eigentlichen Code enthalten ist:
{| class="wikitable"
! Switch-Anweisung !! Compilerumsetzung
|-
|<syntaxhighlight lang="C">
switch(a) {
case 1:
int a=7;
//Code
break;
case 2:
printf("%d",a);
case 3: {
int a;
//Code
}
case 4 ... 8:
default:
//Code
}
</syntaxhighlight>
||<poem>
if(a==1)
goto label1;
else if(a==2)
goto label2;
else
goto label_default;
//-------------------
label1:
//Code
goto label_break;
label2:
//Code
label_default:
goto label_break;
label_break:
</poem>
|}
Folgendes gilt es bei der Nutzung der Switch-Anweisung zu beachten:
* <code>Expression</code> muss zu einer Ganzzahl (int, short, char, long, long long) oder enum (entspricht einer Ganzzahl) ausgewertet werden
* <code>constant-expression</code> muss eine Ganzzahl-Konstante oder ein Enumelement sein. Sie darf nicht doppelt im Block vorkommen. Der genaue Datentyp ergibt sich aus dem Datentyp der <code>expression</code>
* Lt. Spezifikation ist ein nur <code>statement</code> hinter der switch-Anweisung erlaubt, so dass nur ein <code>case</code> Fall oder der <code>default</code> Fall bedient werden kann::<syntaxhighlight lang="C">
int var=1;
switch(var) case 1: printf("hallo");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) case 1: printf("hallo");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweifte Klammer der <code>switch</code>-Anweisung erzeugt einen Block, so dass a) hier mehrere <code>case</code>-Fälle und b) hierin definierte Variablen innerhalb des gesamten Blocks zur Verfügung stehen (sind somit nicht <code>case</code> abhängig). Die <code>case</code> Anweisung ist nichts anderes als eine Sprungmarken (welche durch die switch-Anweisung angesprungen wird) so dass der Initialisierungsteil der lokalen Variablen übersprungen / nicht ausgeführt werden kann:
:<syntaxhighlight lang="C">
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("%d %d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
break;
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1;
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("a=%d b=%d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
(void)a;
break;
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* GNU-C (siehe [https://www.gnu.org/software/c-intro-and-ref/manual/html_node/switch-Statement.html Switch-Statement]) erlaubt ergänzend zur Angabe einer Konstante die Angabe eines Wertebereiches:
:<syntaxhighlight lang="C">
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=2;
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
printf("a im Bereich von 1 bis 8\n");
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* <code>break</code> ist optional. Mittels <code>break</code> wird an das Ende der Switch-Anweisung gesprungen. Wenn <code>break</code> weggelassen wird, wird die nachfolgende Anweisungen ausgeführt. Ggf. gibt der Compiler eine Warning aus. Mittels der GCC-Compiler-Anweisung __attribute__((fallthrough)); kann diese Warning unterdrückt werden:
:<syntaxhighlight lang="C">
switch(a) {
case 0: //ggf. Compiler-Warning
__attribute__((fallthrough)); case 1:
case 2:
break;
}
</syntaxhighlight>
* Ein Variable Length Array ist als Variable im Switch-Block direkt nicht erlaubt. Ist dies notwendig, so ist das VLA in einem inneren Block zu kapseln:
:<syntaxhighlight lang="C">
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Case - Anweisungen sind nichts anderes als Sprungmarken (Labels), so dass CASE-Anweisungen überall innerhalb des Switch-Blockes stehen können:
:<syntaxhighlight lang="C">
int prime(int value) {return value+1;}
void hallo(int var) {
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int prime(int value) {
return value+1;
}
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:oder anderen Anweisungen innerhalb des Switch-Blockes enthalten sein können:
:<syntaxhighlight lang="C">
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++;
case 7: *dst = *src++;
case 6: *dst = *src++;
case 5: *dst = *src++;
case 4: *dst = *src++;
case 3: *dst = *src++;
case 2: *dst = *src++;
case 1: *dst = *src++;
}while(--n>0);
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h> //fuer uintptr_t
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++; printf("%02hhx ",*dst);
case 7: *dst = *src++; printf("%02hhx ",*dst);
case 6: *dst = *src++; printf("%02hhx ",*dst);
case 5: *dst = *src++; printf("%02hhx ",*dst);
case 4: *dst = *src++; printf("%02hhx ",*dst);
case 3: *dst = *src++; printf("%02hhx ",*dst);
case 2: *dst = *src++; printf("%02hhx ",*dst);
case 1: *dst = *src++; printf("%02hhx ",*dst);
}while(--n>0);
}
}
int main(int argc, char *argv[])
{
char src[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char dst;
send(&dst,src,20);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Eine Switch-Case Anweisung über Strings sind in C/C++ nicht möglich:
:<syntaxhighlight lang="C">
switch(str) {
case "hallo":
return 1;
case "du da":
return 2;
case "xyz":
return 3;
default:
rReturn -1;
}
</syntaxhighlight>
:Ein direkte Lösungsansatz ist die Nutzung von strcmp() zum Vergleichen von String. Da strcmp zeichenweise den String vergleicht, ist dieser Ansatz langsam. Alternativ bietet sich an, von allen String einen Hash-Wert zu berechnen und zunächst diesen Hash-Wert zu kontrollieren. Da der Hash-Wert nicht eindeutig ist, muss ergänzend ein strcmp() erfolgen:
:<syntaxhighlight lang="C">
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h>
//Lösungsansatz von: https://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
#define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
#define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
#define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
#define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
#define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
#define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
#define HASH_LAUFZEIT(s) (H256(s,0,0))
//Eigener Lösungsatz zur Umsetzung des vorherigen HASH-Algorithmus
//so dass dieser zur Compilezeit berechnet werden kann
//Was fehlt ist die abschließende EXOR berechnung!
//Problem war, dass die Array-Dereferenzierung nicht zur Compilezeit
//aufelöst werden kann
#define HH0(a,x) (x*65599u+a)
#define HH1(a) HH0(a,HH0(0,HH0(0,HH0(0,0))))
#define HH2(a,b) HH0(b,HH0(a,HH0(0,HH0(0,0))))
#define HH3(a,b,c) HH0(c,HH0(b,HH0(a,HH0(0,0))))
#define HH4(a,b,c,d) HH0(d,HH0(c,HH0(b,HH0(a,0))))
#define HH4x(a,b,c,d,x) HH0(d,HH0(c,HH0(b,HH0(a,x))))
#define HH5(a,b,c,d,e) HH4x(b,c,d,e,HH4x(0,0,0,a,0))
#define HH6(a,b,c,d,e,f) HH4x(c,d,e,f,HH4x(0,0,a,b,0))
#define HH7(a,b,c,d,e,f,g) HH4x(d,e,f,g,HH4x(0,a,b,c,0))
#define HH8(a,b,c,d,e,f,g,h) HH4x(e,f,g,h,HH4x(a,b,c,d,0))
#define HH9(a,b,c,d,e,f,g,h,i) HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0)))
#define HH10(a,b,c,d,e,f,g,h,i,j) HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0)))
#define HH11(a,b,c,d,e,f,g,h,i,j,k) HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0)))
#define HH12(a,b,c,d,e,f,g,h,i,j,k,l) HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0)))
#define HH13(a,b,c,d,e,f,g,h,i,j,k,l,m) HH4x(j,k,l,m,HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0))))
#define HH14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) HH4x(k,l,m,n,HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0))))
#define HH15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) HH4x(l,m,n,o,HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0))))
#define HH16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) HH4x(m,n,o,p,HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0))))
#define EIGHTEENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \
a11,a12,a13,a14,a15,a16,a17,a18, ...) a18
#define CONCAT(c,d) c ## d
#define CONCATI(a,b) CONCAT(a,b)
#define HASH_COMPILEZEIT(...) CONCATI(HH , EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0))(__VA_ARGS__)
//Lösungsansatz basierend auf: https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/preprocessor/macros/__VA_ARGS__/count-arguments
#define COUNT_ARGUMENTS(...) EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main(int argc, char *argv[]) {
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:Siehe:[https://benhoyt.com/writings/hash-table-in-c/ Hash Table in C]
== Label + Goto ==
=== Label ===
<code>Syntax: name:</code><br />
Labels dienen zur Kennzeichnung einer Anweisung, so dass die Programmausführung an dieser Stelle fortgesetzt, resp. mit einer GOTO-Anweisung angesprungen werden kann. Ein Label ist durch den folgenden Doppelpunkt gekennzeichnet. Dem Label muss eine Anweisung folgen, welches auch eine Leeranweisung (Semikolon) sein kann.
Folgendes gilt es bei der Nutzung von Labels zu beachten:
* Ein Label entspricht der Speicheradresse des der Label-Anweisung folgenden Anweisung
* Bei nicht genutzten Labels (mit goto nicht angesprungene Labels) gibt der Compiler eine Warning aus. Diese kann beim GCC-Compiler mit __attribute__((unused)) unterdrückt werden
* die Case- und die Default-Anweisung aus der Switch-Anweisung entspricht einem Label
<br />
Labels hat eine funktionsweite Sichtbarkeit (siehe Kap [[#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]). Dies bedeutet, dass das:
* Labels nur innerhalb einer Funktion gültig ist
* Labels einen von Variablen/Funktionen/Datentypen unabhängigen Namensraum haben
* Kein Prototyp für ein Label notwendig ist, wenn es bei Nutzung über goto noch nicht gesetzt worden ist, also nach vorne gesprungen wird
=== goto ===
<code>Syntax: goto label;</code><br />
Mit der Goto-Anweisung wird die Programmausführung an der mit <code>label</code> gekennzeichneten Stelle fortgesetzt.
Folgendes gilt es bei der Nutzung von goto zu beachten:
* Mit einer <code>goto</code> Anweisung kann an eine beliebige Steller innerhalb der '''identischen''' Funktion gesprungen werden. Es kann nicht zu einem Label in einer anderen Funktion gesprungen werden (hierzu ist <code>setjmp()</code> und <code>longjmp()</code> zu nutzen)
* Mit der Goto Anweisung kann gleichermaßen in einen Block hinein, als auch herausgesprungen werden:
:<syntaxhighlight lang="C">
goto first_time;
for(;;) {
if(a>10)
goto last_time:
first_time:
a++;
}
last_time: ;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0;
goto first_time;
for(;;) {
printf("a=%d\n",a);
if(a>10)
goto last_time;
first_time:
a++;
}
last_time: ; //Leeranweisung wäre hier nicht nötig
return 0; //da dem Label ein return folgt!
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Wird mit der <code>goto</code> Anweisung der Initialisierungsteil einer Variablen übersprungen, so ist zwar die Variable existent, beinhaltet aber nicht ihren Initialisierungswert
Beispiel:
<syntaxhighlight lang="C">
goto label1;
if(a==3) {
label2:
printf("True\n");
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=3;
goto label1;
if(a==3) {
label2:
printf("True\n");
a++;
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In Java gibt es das Schlüsselwort goto, welches aber ohne Funktion ist. Es gibt jedoch Labels, die mit "break label" angesprungen werden können
=== Anwendungsbeispiele ===
Prinzipiell sind Goto-Anweisungen zu vermeiden. In einigen Anwendungsfällen erweist sich goto als nützlich:
* Nutzung nur einer <code>return</code> Anweisung in einer Funktionen
:<syntaxhighlight lang="C">
#include <unistd.h>
int input(int hdl,size_t buflen) {
int rc=-1;
unsigned char packettype;
if(read(hdl,&packettype,1) != 1)
goto exit;
unsigned short packetlen;
if(read(hdl,&packetlen,2) != 2)
goto exit;
if((1+packetlen) > buflen) {
rc=-2;
goto exit;
}
rc=packetlen;
exit:
return rc;
}
</syntaxhighlight>
* Konstruktor mit mehreren Initialisierungsteilen
:<syntaxhighlight lang="C">
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Abbruch einer verschachtelten Schleife
:<syntaxhighlight lang="C">
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Sonstiges ==
=== ??-Trigraphs ===
Zeichenfolge bestehend aus 3 Zeichen beginnend mit 2 Fragezeichen.
Die beiden Fragezeichen entsprechen einem ESCAPE-Operator (siehe Kap [[#Char-Konstanten|Char-Konstanten]]), welcher das nachfolgende Zeichen durch ein anderes ASCII Zeichen ersetzt. Die Ersetzung findet auch innerhalb von Strings statt.<br />
Trigraphs wurden früher genutzt, als die ALTGR Taste noch nicht üblich war.
<syntaxhighlight>
??< → { ??> → }
??( → [ ??) → ]
??/ → \ ??! → |
??' → ^ ??- → ~
??= → #
</syntaxhighlight>
Bei neuer C Varianten muss zur Nutzung von Trigraphs der Compiler mittels -trigraphs aktiviert werden.
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
q4056zg9um8s1sc6fg7xdc1oc47wbmm
1090665
1090664
2026-09-10T13:13:50Z
D. Justen
102048
Formulierung geändert
1090665
wikitext
text/x-wiki
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
<!-- Falls du ein automatisch erstelltes Inhaltsverzeichnis nicht willst, ersetze das nachfolgende TOC durch NOTOC -->
<!-- Einklammerung mit noinclude, damit dieses nicht in der Druckversion erscheint -->
<noinclude>__TOC__</noinclude>
Die Programmiersprache C/C++ beinhaltet mehrere Sprachen/ Syntaxen:
* C-Syntax
* Präprozessor-Syntax
* Printf/Scanf Formatstring Syntax
* Terminal Emulation
* Compiler/Linker Anweisungen
Letztere beiden werden nur rudimentär in dieser Vorlesung/diesem Skript behandelt. Alle anderen sind Bestandteil dieser Vorlesung.
In diesem Kapitel sollen zunächst allgemeine Eigenschaften der Sprache, der grundlegende Syntax und die Kontrollstrukturen erklärt werden. Bei vielen Erklärungen sind Code-Beispiele vorhanden. Da man aus Fehlern am meisten lernt, sind zum Teil auch negative Beispiele enthalten. Für ein besseres Verständnis empfiehlt es sich, Code-Beispiele selbst nachzuvollziehen.<br />
Sofern sich die Eigenschaften auf eine bestimmte C-/C++- oder Compiler-Version beziehen, wird dies gesondert vermerkt.
== Zeichensatz ==
Der Syntax von C nutzt die unteren 128 Zeichen des ASCII Zeichensatzes. Da UTF-8 in den ersten 128 Zeichen deckungsgleich zu ASCII ist, kann auch dieser zur Erstellung des Source Codes genutzt werden.
Zeichen außerhalb dieses gültigen Zeichensatzes können folglich nur in Strings oder Kommentaren vorkommen. Werden Zeichen außerhalb der unteren 128 Zeichen in Strings genutzt, so gilt Folgendes zu berücksichtigen:
* Die String-Funktionalitäten der Standard-C Library gehen von dem regulären ASCII Zeichensatz aus, so dass z.B. die Suche, der Vergleich oder die Konvertierung fehlschlagen kann
* Strings werden oftmals in Verbindung mit printf() genutzt, d.h. auf der Standardausgabe ausgegeben. Der verwendete Zeichensatz sollte hier identisch zum verwendeten Zeichensatz der Terminal-Emulation sein!
== Kommentarzeichen ==
Kommentare dienen dazu, den Source Code mit zusätzlichen Hinweisen zu versehen, so dass die Intension der Anweisungen sichtbar wird. Kommentarzeichen werden durch den Compiler vor dem eigentlichen Übersetzungsdurchlauf entfernt und durch ein Leerzeichen ersetzt [C11 6.4.9]. Innerhalb von Strings wird nicht nach Kommentarzeichen gesucht.
<code>
Syntax: /* */
</code>
Blockkommentar zum Kommentieren eines Bereiches, auch über mehrere Zeilen hinweg. Dieses Kommentarzeichen kann nicht verschachtelt werden, d.h. '*/' beendet die Kommentierung, unabhängig von der Anzahl der zuvor geöffneten Kommentierungen!
<code>
Syntax: //
</code>
Zeilenkommentar zum Kommentieren bis zum Zeilenende (wurde in der Programmiersprache BCPL definiert, aber nicht von C, sondern erst von C++ übernommen).
Sollen größere Bereiche auskommentiert werden, so empfiehlt sich die Nutzung der Präprozessoranweisung #if 0 ... #endif.
Beispiele:
<syntaxhighlight lang="C">
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt
Compiler-Warning nur aufgrund des Compiler-Schalters -Wall! */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Namenskonventionen ==
Folgende Regeln gelten bzgl. der Benennung von Variablen und Funktionen:
* Variablen und Funktionsnamen können aus Buchstaben, Zahlen und dem Unterstrich bestehen. Sie müssen mit einem Buchstaben oder einem Unterstrich beginnen
* Seit C95 können weitere Zeichen aus dem Universal Coded Character Set (UCS) genutzt werden [C11 D.1]
* C ist Case sensitiv, d.h. es wird zwischen Groß- und Kleinbuchstaben unterschieden
* Schlüsselwörter können nicht für Variablen/Funktionsnamen/Datentypen genutzt werden
Namenskonventionen von Libraryfunktionen:
* In C (und C++) sind Schlüsselwörter und Standardlibraryfunktionen zumeist in Kleinbuchstaben geschrieben. In der C-Standardlibrary werden oftmals verkürzte Ausdrücke (z.B. isalnum() (zum Testen ob ein Zeichen ein Buchstaben oder ein Digit ist) und in C++ der Unterstrich als Worttrenner (z.b. out_of_range) genutzt
* Makros (siehe Kap.[[Programmieren in C/C++: Präprozessor | Präprozessor]]) werden per Konvention in GROSSBUCHSTABEN und ggf. mit Unterstrich als Worttrenner geschrieben.
* Namen beginnend mit doppelten Unterstrich oder beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (z.B. __LINE__ _Reserved) sind für den Compiler und der Standard-C-Library vorbehalten und sollten im eigenen Programm nicht benutzt werden.
== Zeilenfortsetzung ==
Mit dem Backslash Operator (gefolgt von einem Zeilenende) kann eine Zeile in der nächsten Zeile fortgesetzt werden. Der Compiler löscht das \-Zeichen mit anschließendem Zeilenende und ersetzt dies durch nichts. Dies ist insbesondere bei Anweisungen notwendig, die am Ende der Zeile abgeschlossen sein müssen (z.B. Strings, Makros).
Beispiele:
<syntaxhighlight lang="c">
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Innerhalb von Char-Literatoren und Strings wird '\' als Escape-Operator genutzt, welche das '\' und ein oder mehrere folgende Zeichen ersetzt (siehe Kap.[[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Grundlagen:Literale/Konstanten]]). Daher darf hinter Backslash als Zeilenfortsetzungszeichen kein weiteres Zeichen folgen.
== Gültigkeit/Sichtbarkeit von Variablen ==
Vorrangig in der objektorientierten Programmierung werden mit Namensräumen Objekte und deren Methoden/Attribute in einer Art Baumstruktur strukturiert. Dies ermöglicht eine eindeutige Ansprache von Variablen/Objekte, aber auch eine doppelte Verwendung von Methoden-/Attributnamen in unterschiedlichen Namensräumen. Ergänzend zu den Namensräumen kann mit public/private/proteced eine Zugriffsbeschränkung von Methoden/Attributen definiert werden.
Die Programmiersprache C unterstützt keinen Namensraum. Zugriffsmodifikatoren werden indirekt über Header-Dateien getätigt. Hinsichtlich der Gültigkeit/Sichtbarkeit unterscheidet C folgende Bereiche [C11 6.2.1]:
* Funktionen (Function Scope)
* Datei (File Scope)
* Block (Block Scope)
* Funktionsparameter in Prototypen (Function Prototype Scope)
Innerhalb eines Gültigkeitsbereiches dürfen Variablen-/Funktions-/Datentypnamen nicht doppelt genutzt werden.<br />
In der Programmiersprache C++ sind weitere Scope wie z.B. Class Scope, Enumationation Scope und ergänzend das Konzept von Namensräumen vorhanden (Beschreibung folgt).
=== Funktionsweite Sichtbarkeit ===
Eine Label-Definition (als Sprungmarke für die goto-Anweisungen) erfolgt immer mit funktionsweiter Sichtbarkeit/Gültigkeit. Die genaue Beschreibung dieses Sichtbarkeitstyps erfolgt im Rahmen des Kapitels [[Programmieren in C/C++: Grundlagen #Label + Goto|Grundlagen:Label+Goto]].
=== Dateiweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp-Definition außerhalb eines Block-Scopes oder von Funktionsparameter, so sind diese innerhalb der gesamten Datei und bei Funktionen/Variablen ergänzend Projektweit (für alle Objektdateien) sichtbar/gültig (= global) (In der C-Spec unter dem Stichwort 'Linkage' beschrieben, siehe Kapitel [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage| DatentypeSpecifier:Internal/External Linkage]]). Alle globalen Funktionen/Variablen können von allen Dateien aus genutzt/zugegriffen werden (sofern sie zuvor deklariert wurden).<br />
Beispiel:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Deklaration von global,
//welche in Datei1.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
printf("global=%d\n",global);
return 0;
} | datei2_c=#include <stdio.h>
//Deklaration von global,
//welche in example.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
printf("func() called\n");
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird das Schlüsselwort 'static' der Variablen/Funktionsdefinition vorangestellt, so wird die Sichtbarkeit/Gültigkeit auf Dateiweit eingeschränkt. Variablen/Funktionen können nur innerhalb der (Objekt-) Datei genutzt werden und sind für anderen (Objekt-)Dateien unsichtbar. (Siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage|DatentypeSpecifier:Internal/External Linkage]] Internal/External Linkage)
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
printf("example.c:var1=%d\n",var1);
void func(void); //Prototyp für func()
func();
return 0;
} | datei2_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
printf("datei2.c:var1=%d\n",var1);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Projektweite Gültigkeit bedeutet insbesondere, dass keine doppelten Benennung von Variablen/Funktionen/Datentypen innerhalb des gesamten Projektes erlaubt sind, d.h. alle Variablen/Funktionennamen über alle Dateien/Librarys eindeutig sein müssen.<br>
Beispiel 1:
{| class="wikitable"
|-
! Datei1.c !! Datei.2
|-
| <syntaxhighlight lang="C">
#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
}</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
} | datei2_c=#include <stdio.h>
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der Linker meldet beim Zusammenfügen der Objekt-Dateien, dass die Variable a bereits woanders definiert sei (multiple definition of `a';)!
Beispiel 2:
<syntaxhighlight lang="C">
#include <stdio.h> //fuer printf() size_t stderr
int printf=7;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int printf=7;
int main(int argc,char *argv[])
{
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hier meldet der Compiler eine Fehlermeldung, da das Symbol printf zu einen als Variable und zum anderen als Funktion (innerhalb der inkludierten Datei stdio.h beschrieben) genutzt wird ('printf' redeclared as different kind of symbol).
=== Blockweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp Definition innerhalb einer Funktion, als Funktionsparameter oder eines Blockes, so sind diese nur innerhalb des Blockes sichtbar/gültig (=Lokale Variable). Blöcke können verschachtelt sein, so dass das bei identischer Namensgebung innere Definitionen Vorrang haben. Ebenso haben Blockdefinitionen Vorrang vor Datei-/Projektdefinitionen (überdecken diese):
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
} | datei2_c=#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sichtbarkeit von Funktionsparameter in Protypen ===
Soll eine Funktion aufgerufen werden, die zuvor nicht definiert wurde, so ist ein Prototyp/(Forward)deklaration der Funktion notwendig (siehe nachfolgendes Kapitel). Die Parameterliste dieses Prototyps hat seinen eigenen Gültigkeitsbereich.<br/>
Beispiel:
<syntaxhighlight lang="C">
int a; //a im File Scope
int func(int a, int b); //a und b im Function Prototyp scope
</syntaxhighlight>
Hinweis:
* Bei Prototypen ist die Angabe von Variablenname nicht notwendig. Die alleinige Angabe des Datentyps ist ausreichend
=== Zuordnung der Gültigkeitsbereiche zu globalen/lokalen Variablen ===
Zum einfacheren Verständnis wird im Skript von folgenden Begrifflichkeiten gesprochen:
* '''Globale''' Variablen-/Funktionen-/Datentypdefinitionen → Projektweite Sichtbarkeit/Gültigkeit
* '''Statisch globale''' Variable/Funktionen → Dateiweite Sichtbarkeit/Gültigkeit
* '''Lokale''' Variablen/Funktionen/Funktionsparameter/Datentypen → Nur innerhalb des zugehörigen Blockes sichtbare/gültig
* '''Statisch lokale''' Variablen → Nur innerhalb der Funktion sichtbar/gültig, mit der Besonderheit, dass die Gültigkeit über der Laufzeit der Funktion gilt (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Static Storage Class Specifier|DatentypeSpecifier:Static Storage Class Specifier]])
=== Speicherzuweisung ===
Für die einzelnen Gültigkeitsbereiche werden im Speicher (und auch in der Objekt-Datei) unterschiedliche Speicherbereiche (Segmente) vorgehalten, d.h. der Compiler teilt den Speicher in unterschiedliche Bereiche auf und weist den Variablen/Funktionen in Abhängigkeit der Gültigkeit/Sichtbarkeit unterschiedliche Speicherbereiche zu!
[[File:Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten).png|thumb|Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten)]]
Zur Ermöglichung von Rekursion werden lokale Variable auf dem Stack gehandelt. Mit Aufruf einer Funktion oder öffnen eines neuen Block-Scopes wird Speicher auf dem Stack reserviert, der bei Beenden des Scopes wieder freigegeben wird. Die Speicheradresse von lokalen Variablen ist somit nicht Fix, sondern hängt von der Aufrufhierarchie ab!
Globale und statisch globale Variablen werden nicht auf dem Stack gehalten, sondern bekommen einen 'festen' Speicherbereich (hier DATA/BSS/RODATA) während der gesamten Laufzeit des Programms zugewiesen. Die Adresse dieser Variablen sind somit konstant. Das genutzte Speichersegment von globalen Variablen hängen von der Art der Variablen ab. Initialisierte Variablen werden im DATA-Segment gesammelt, welcher mit dem Initialisierungswert der Variablen initialisiert wird. Nicht initialisierte globale Variablen landen im BSS-Segment, so dass diese mit Programmstart durch Füllen dieses Blockes mit 0 auf 0 gesetzt werden.
Konstante globale Variablen werden im RODATA-Segment gehalten. Über das Betriebssystem kann dieser Speicherbereich auf nur Lesbar gesetzt werden.
Dynamische Speicheranforderungen, resp. Speicher, dessen Gültigkeit über die Laufzeit einer Funktion hinausgeht, wird im Heap gesammelt. Für die Verwaltung dieses Speichers ist der Programmierer zuständig.
Entsprechend globalen Variablen wird für Funktionen ebenfalls ein eigener Speicherbereich (TEXT Segment) vorgesehen. Im Gegensatz zu Variablen, wo im Speicher der dazugehörige Inhalt gespeichert ist, ist der Speicherinhalt von Funktionen die Maschinenanweisungen. Die Speicheradresse der Funktionen sind konstant.
Hinweis:
* Die Speicheradresse von sowohl globalen und statisch globalen Variablen als auch von Funktionen ist konstant und ändert sich während der Laufzeit des Programms nicht. Die Adressvergabe dieser Variablen und Funktionen erfolgt somit nicht zur Laufzeit sondern durch die Toolchain (hier der Linker).
* Dieses Konzept ist allgemeingültig, gilt nicht nur für die Programmiersprache C/C++
== Definition/Deklaration(Prototyp) ==
Der C-Compiler ist ein Single-Pass Compiler (siehe Kap [[Programmieren in C/C++: Einführung/Literatur#Arbeitsweise eines Compilers | Einführung/Literatur:Arbeitsweise eines Compilers ]]), d.h. für den Übersetzungsvorgang wird der Quellcode einmalig eingelesen und von vorne nach hinten abgearbeitet. Dies bedingt, dass keine Vorwärtsbezüge im Quelltext enthalten sein dürfen:
* keine Variable genutzt werden kann, die erst später definiert wird (da der Compiler in Abhängigkeit des Datentyps (den er dann noch nicht kennt) keine entsprechende Maschinensprachebefehle erzeugen kann)
* keine Funktion aufgerufen werden kann, die erst später definiert wird (da der Compiler nicht weiß, welcher Datentyp die Übergabewerte haben und folglich keine Maschinensprachebefehle zur Konvertierung und Übergabe der Variablen erzeugen kann)
* kein Datentyp genutzt werden kann (struct, union, enum, typedef), welcher erst später definiert wird (da der Compiler nicht weiß, wieviel Speicher er für die Variable reservieren muss)
Eine Lösungsvariante dieser Problematik ist, im Quellcode alle Variablen/Funktionen/Datentypen/Makros zu definieren, bevor diese erstmalig genutzt werden (Funktion main() steht dann folglich am Ende des Quellcodes):
<syntaxhighlight lang="C">
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
//Hier kein Zugriff auf var möglich!
//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(void) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
var++; //Hier kein Zugriff auf var möglich!
uchar xyz;//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(int argc, char *argv[]) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Sollen globale Funktionen/Variablen in Datei1.c genutzt werden, die in Datei2.c definiert sind, so schlägt diese Vorgehensweise fehl. Um auch dieses zu ermöglichen, bietet C die Möglichkeiten von Prototypen/Deklarationen an. Diese teilt dem Compiler mit, wie im späteren Ablauf die Variable, die Funktion definiert wird, bzw. dass es diesen Datentyp geben wird:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
} | datei2_c=#include <stdio.h>
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Innerhalb der C-Spezifikation werden für den Umgang mit dieser Problematik die Begriffe 'Declaration' und 'Definition' genutzt. Da diese Begriffe jedoch nicht klar abgegrenzt werden und auch für viele weitere Aspekte genutzt werden, sollen in diesem Skript in Anlehnung an den Wikipedia Artikel {{w|Deklaration (Programmierung)|Deklaration (Programmierung)}} (im Absatz zur Programmiersprache C/C++) die Begriffe Definition/Deklaration wie folgt genutzt werden:
;Definition: entspricht der Belegung/Reservierung von Speicherplatz
:* Bei der Definition einer Variablen wird hiermit Speicherplatz entsprechend dem Datentyp der Variable belegt:
:<syntaxhighlight lang="C">
int var1; //entsprechend der Größe des Datentyps int wird
//Speicherplatz für die Variable var1 reserviert
int var2=4711; //Dito, ergänzend wird dieser Speicherplatz mit dem
//Wert 4711 initialisiert
</syntaxhighlight>
:* Bei einer Funktion wird Speicherplatz zur Aufnahme der Maschinenbefehle belegt:
:<syntaxhighlight lang="C">
void foo(void) { //Die Anweisungen in den geschweiften Klammern
//werden in Maschinenbefehle übersetzt. D.h. die
//Funktion foo() belegt Speicher, dessen Inhalt
//die Maschinensprachebefehle sind
}
</syntaxhighlight>
:* Ergänzend wird der Begriff Definition auch in Verbindung mit der Definition von neuen Datentypen genutzt!
;Deklaration/Prototyp: ist die Mitteilung an den Compiler, wie diese Variable/Funktion an einer späteren Stelle im Source-Code oder in einer anderen Source-Datei definiert wird. Auf Grundlage dieser 'vorab' Information kann der Compiler die passenden Maschinensprachebefehle für den Zugriff/Aufruf auf die Variablen/Funktion einsetzen:
:<syntaxhighlight lang="C">
extern int var1; //Deklaration von var1
extern void foo(void); //Deklaration von foo()
void foo(void); //Deklaration von foo()
</syntaxhighlight><br />
Insbesondere bei dem Umgang mit der Deklaration gilt es Folgendes zu berücksichtigen:
* Deklarationen werden entweder:
:* am Anfang einer C-Datei geschrieben, so dass Funktionen/Variablen im Zugriff stehen, die erst später in der C-Datei definiert werden (entspricht dann der Private Anweisung in anderen Sprachen)
:* in Header-Dateien geschrieben, so dass diese Variable/Funktionen für alle sichtbar sind, welche diese Header-Datei einbinden (entspricht der Public Anweisung in anderen Sprachen)
* Deklarationen von Funktionen werden in der C-Spec als (function) Prototyp bezeichnet und sind dadurch gekennzeichnet, dass diese mit einem Semikolon abgeschlossen sind. Der Specifier 'extern' ist hier optional und sagt eigentlich aus, dass diese Funktion external Linkage besitzt (siehe [[Programmieren in C/C++:_DatentypeSpecifier#Internal/External Linkage | DatentypeSpecifier:Internal/External Linkage]]). Die Benennung der Parametervariablen sind gleichermaßen optional:
:<syntaxhighlight lang="C">
extern int foo(int var1, float var2); //Deklaration
extern int foo(int , float ); //Deklaration
int foo(int var1, float var2); //Deklaration + external Linkage
int foo(int , float ); //Deklaration + external Linkage
</syntaxhighlight>
* Für globale Variablen gibt es keine (Variablen) Prototype. Stattdessen muss zur Bekanntgabe des Datentyps der Specifier 'extern' vorangestellt werden, mit welchen ergänzend zum Ausdruck gebracht wird, das diese Variable external Linkage und damit globale Gültigkeit hat (siehe Kap [[Programmieren in C/C++: DatentypeSpecifier# Extern - Storage Class Specifier| DatentypeSpecifier:Extern - Storage Class Specifier]]). Da die Deklaration einzig zur Bestimmung der Zugriffsmethoden auf Maschinenspracheebene genutzt wird, können diese keine Initialisierungswerte enthalten:
:<syntaxhighlight lang="C">
extern int var1;
extern int var2=7; //KO Deklarationen können keine
//Initialisierungswerte haben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern int foo;
extern int foo=7;
int main(int argc, char *argv[]) {
return foo;
}
int foo=7;| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen von statisch globalen, lokalen und statisch lokalen Variablen nicht möglich sind:
:<syntaxhighlight lang="C">
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sich auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sicht auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen für identische Variablen/Funktionen können beliebig oft erfolgen, sofern der Datentyp identisch ist:
:<syntaxhighlight lang="C">
extern int var;
extern int var; //OK, doppelt Deklaration mit identischen Datentyp
extern unsigned int var; //KO, Doppelte Deklaration mit unterschiedlichen
// Datentyp
</syntaxhighlight>
* Sofern eine Deklaration und eine Definition in der identischen Datei erfolgen überprüft der Compiler, ob Deklaration und Definition identisch sind. Es empfiehlt sich, die eigene Header-Datei (in welcher die Deklaration normalerweise enthalten ist) zu inkludieren:
:{| class="wikitable"
|-
! Datei1.c !! Datei1.h
|-
| <syntaxhighlight lang="C">
//Include der eigenen Header-Datei
#include "datei1.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
</syntaxhighlight> ||
<syntaxhighlight lang="C">
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Include der eigenen Header-Datei
#include "example.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
int main(int argc, char *argv[]) {
return 0;
} | example_h=
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Datei kann eine Variable identischen Datentyps mehrmals definiert werden (bei identischen Initialisierungswert). Diese Definitionen werden vom Compiler als eine Definition angesehen. Wenn jedoch eine identische Variable in unterschiedlichen Dateien definiert wird, so legt jede Datei eine eigene unabhängige Variable an, welche dann beim Zusammenführen der Objektdateien durch den Linker zu Fehler führt. Da Header-Datei zumeist in mehrere C-Dateien inkludiert werden, sind Definitionen in Header-Dateien 'verboten'.
* Deklarationen innerhalb eines Block-Scopes oder eines Function Prototyp Scopes sind nur in diesen Bereich gültig.
== Grundlegende Datentypen und Typsicherheit ==
Die Programmiersprache C kennt folgende grundlegende Datentypen (siehe Kap. [[Programmieren in C/C++: Datentypen | Datentypen]]). Von jedem Datentyp kann ein Zeiger angelegt werden:
{| class="wikitable"
|-
! Datentyp !! Bsp. für Datentyp !! Bsp. für Zeiger auf Datentyp
|-
| Ganzzahl ||
<syntaxhighlight lang="C">
char var;
int var;
short int var;
long int var;
long long int var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
char *ptr;
int *ptr;
short int *ptr;
long int *ptr;
long long int *ptr;
</syntaxhighlight>
|-
| Gleitkommazahl ||
<syntaxhighlight lang="C">
double var;
float var;
long double var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
double *ptr;
float *ptr;
long double *ptr;
</syntaxhighlight>
|-
| Funktionen ||
<syntaxhighlight lang="C">
void func(void) {}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
void (*pfunc)(void);
</syntaxhighlight>
|-
| Arrays ||
<syntaxhighlight lang="C">
int arr[10];
float arr[3][3];
</syntaxhighlight>
||
<syntaxhighlight lang="C">
int (*parr);
float (*parr)[3];
void (*pfunc[5])(void);
</syntaxhighlight>
|-
| Strukturen/Unions ||
<syntaxhighlight lang="C">
struct xyz {int x,y,z};
union abc {int a,b,c};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
struct xyz *ptr;
union abc *ptr;
</syntaxhighlight>
|-
| Aufzählungstyp ||
<syntaxhighlight lang="C">
enum abc {A,B,C};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
enum abc *ptr;
</syntaxhighlight>
|-
| Boolescher Datentyp ||
<syntaxhighlight lang="C">
_Bool var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Bool *ptr;
</syntaxhighlight>
|-
| Komplexe Zahlen ||
<syntaxhighlight lang="C">
_Complex var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Complex *ptr;
</syntaxhighlight>
|}
C/C++ unterscheidet zwischen vorzeichenbehafteten <code>signed</code> und vorzeichenlosen <code>unsigned</code> ganzzahligen Datentypen. Vorzeichenlose Datentypen können nur positive Zahlen incl. der 0 aufnehmen (Anwendungsbereich bspw. Speicheradressen/Arrayindexe, welche nicht negativ sein können). Deren max. Zahlenwert ergibt sich aus der Datenbreite N des Datentyps 2<sup>N</sup>-1. Ein Vergleich eines vorzeichenlosen Datentyps mit ≥ 0 ist somit immer TRUE:
<syntaxhighlight lang="C">
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt"); //dieser ggf. vom Compiler wegoptimiert wird!
for(var=10; var>=0; var--); //Endlosschleife! 0 dekrementiert ergibt 255
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt\n"); //dieser ggf. vom Compiler wegoptimiert wird!
//Beim Öfffnen des Compiler-Fensters ist die IF-Anweisung nicht farblich
//hervorgehoben. Dies bedeutet, dass diese Zeile wegoptimiert wurde und folglich
//kein Maschinencode für diese Anweisung erzeugt wurde
for(var=10; var>=0; var--) //Endlosschleife! 0 dekrementiert ergibt 255
printf("%u ",var),fflush(stdout);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Vorzeichenlose Datentypen halbieren den verfügbaren Zahlenbereich und 'weisen' dem oberen Wertebereich den negativen Zahlen zu.<br>
Wird ein ganzzahliger Datentyp ohne Angabe des Vorzeichentyps (signedness) definiert, so ist diese vorzeichenbehaftet. Bei vorzeichenlosen Variablen muss explizit <code>unsigned</code> vorangestellt werden. Die Voranstellung von <code>signed</code> ist optional. Einzige Ausnahme stellt der Datentyp char dar. Hier gibt die Spezifikation keine default signedness vor, so dass bei Nutzung dieses Datentyps zur Aufnahme von Zahlen immer signed oder unsigned vorangestellt werden sollte!<br>
Innerhalb des Formatstrings bei den printf()/scanf() Anweisungen '''muss''' die signedness vom Programmierer händisch berücksichtigt werden. Die Formatanweisung %d und %i interpretieren die übergebenen Zahl als vorzeichenbehaftete Zahl. Soll eine vorzeichenlose Zahl ausgegeben werden, so muss %u verwendet werden:
<syntaxhighlight lang="C">
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%d varu=%u",vari,varu); //Korrekt
printf("vari=%u varu=%i",vari,varu); //Falsche Werteausgaben!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%12d varu=%12u\n",vari,varu); //Korrekt
printf("vari=%12u varu=%12i\n",vari,varu); //Falsche Werteausgaben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit der Definition (dem Anlegen) einer Variablen eines Datentyps wird Speicher entsprechend der Größe des Datentyps reserviert. Optional kann dieser Speicher initialisiert werden. Über den Datentyp wird ausgesagt, wie der Inhalt des Speichers zu interpretieren ist:
<syntaxhighlight lang="C">
char var1; //Speicherplatzreservierung von 1 Byte
//Inhalt der Speicherstelle wird als Zahl interpretiert
//(Hinweis: ASCII-Zeichen sind Zahlen)
double var2=47.11; //Speicherplatzreservierung von 8 Byte
//Inhalt der Speicherstellen wird als Gleitkommazahl
//interpretiert (bestehend aus je einer Ganzzahl für
//Mantisse und Exponent)
short arr[10]; //Speicherplatzreservierung von 10*2 Byte
//Inhalt der 10 Speicherstellen werden als Ganzzahl
//interpretiert
</syntaxhighlight>
Die Funktionalität der Operatoren hängt vom Datentyp der Operanden ab. Der Plus-Operator angewendet auf ganzzahlige Operanden führt eine Ganzzahl Addition aus, angewendet auf gleitkomma Operanden eine Gleitkomma Addition. Ist einer der Operanden ein Zeiger, so wird eine Zeigeraddition angewendet. Für andere Datentypen ist der Plus-Operator nicht definiert, so dass der Compiler einen Fehler wirft. '''Bei der Betrachtung eines Ausdruckes sollte dem genutzten Datentypen folglich eine besondere Aufmerksamkeit zuteil werden''':
<syntaxhighlight lang="C">
int vari=47;
vari+12; //(int) + (int) → Ganzzahladdition
float varf=12.3;
3.1415F+varf; //(float) + (float) → Gleitkommaaddition
int *ptr=&vari;
ptr+3; //(int *) + (int) → Zeigeraddition
int arr[3];
arr+3; //(int (*)) + (int) → Zeigeraddition
</syntaxhighlight>
Das Ergebnis einer Operation hat ebenfalls einen Datentyp. Eine Ganzzahl Addition gibt bspw. als Ergebnis einen Ganzahl Datentyp zurück, eine Gleitkomma Addtition einen Gleitkomma Datentyp und ein Vergleichsoperator den Datentyp _Bool:
<syntaxhighlight lang="C">
int vari1=47;
int vari2=11;
vari1 + 12 + vari2; //((int)+(int)+(int))→((int)+(int))→(int)
40 < vari1 < 50; //((int)<(int)<(int))→((_Bool=int)<(int))→(_Bool=int)
</syntaxhighlight>
Wie Operatoren haben auch Funktionen Operanden (in Form von Übergabeparameter). Das Ergebnis eines Funktionsaufrufes wird ebenfalls in Form eines Datentyps zurückgegeben:
<syntaxhighlight lang="C">
float add(int par1,par2) {return par1+par2;}
int vari1=47;
int vari2=11;
vari1 + add(var2,12); //(int)+((int),(int)→(float))→(int)+(float)→(float)
</syntaxhighlight>
Wird auf einen Operator gleichermaßen ein vorzeichenbehafteter und ein vorzeichenloser Operand angewendet, so kann es zu unerwarteten Konvertierungsproblemen führen:
<syntaxhighlight lang="C">
unsigned char varu=12;
signed char vars=-12;
float varf;
varf = varu + vars;
if(vars < varu)
</syntaxhighlight>
Sind die Datentypen der Operanden nicht 'kompatibel', so 'passt' der Compiler die Datentypen im Falle von Ganzahl und Gleitkomadatentypen per impliziter Regel an (siehe Kap. [[Programmieren in C/C++: Datentypen#Implizite Typumwandlung | Datentypen:Implizite Typumwandlung]]). Über explizite Typumwandlung (siehe Kap.[[Programmieren in C/C++: Datentypen# Explizite Typumwandlung|Datentypen:Explizite Typumwandlung]]) kann ein Datentyp z.T. in einen anderen Datentyp gewandelt werden.
In allen anderen Fällen ist C Typsicher, d.h. der Compiler gibt zumindest eine Warning aus, wenn die Datentypen nicht identisch sind und der Compiler keine implizite Regel anwenden kann.
Tipp:
* Compiler gibt bei Fehlermeldung oftmals die erwarteten und die vorhandenen Datentyp an. Wenn solch eine Fehlermeldung kommt, sollten sie sich a) überlegen, was wollten sie syntaktisch geschrieben haben und b) was haben sie in der Tat geschrieben. Ein Google nach einer Lösung des Compilerproblems löst zumeist nicht das Problem, sondern umgeht es!
Hinweis:
* Ein guter Programmierer sollte die Datentypen so wählen, dass:
:* die Datentypen zum Inhalt und zum Wertebereiches passen
:* keine Datentypkonvertierungen notwendig sind
: andernfalls besteht die Gefahr, dass hiermit Laufzeitfehler einprogrammiert werden.
* Wenn Datentypkonvertierungen notwendig sind, sollte die explizite Konvertierung genutzt werden
== Abhängigkeiten bzgl. Rechnerarchitektur ==
Kenngrößen von Prozessoren sind unter anderem die Anzahl der Bits für den Datentransport und für Arithmetisch-/Logische-Operationen (→ Datenbreite) und die Anzahl der Bits für die Adressierung des Speichers (→ Adressierungsbreite). Die Datenbreite sagt dabei aus, welche max. Datenbreite ein Maschinenbefehl (zumeist in einem Taktzyklus) transportieren/berechnen kann. Werden programmtechnisch größere Datenbreiten benötigt, bedingt dies, dass hierzu mehrere Maschinenbefehle notwendig sind. Wenn kleinere Datenbreiten notwendig sind, so wird oftmals das Ergebnis abgeschnitten (sofern der Prozessor keine Befehle für den Umgang mit kleineren Datentyp beherrscht):
{| class="wikitable"
|-
! 32-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 64-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 16-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
|-
| <syntaxhighlight lang="C">
int32_t a32,b32;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int64_t a64,b64;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int16_t a16,b16;
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=b32;
mov eax,b32
mov a32,eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=b64;
mov eax ,b64
mov edx ,b64+4
mov a64 ,eax
mov a64+4,edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
//a16=b16;
movz eax,b16
mov a16,ax
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=a32+b32;
mov edx, a32
mov eax, b32
add eax, edx
mov a32, eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=a64+b64;
mov ecx , a64
mov ebx , a64+4
mov eax , b64
mov edx , b64+4
add eax , ecx
adc edx , ebx
mov a64 , eax
mov a64+4, edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a16=16+b16;
movzx eax, a16
mov edx, eax
movzx eax, b16
add eax, edx
mov a16, ax
</syntaxhighlight>
|}
Die Adressierungsbreite gibt an, mit welcher Bitbreite der Speicher adressiert werden kann:
* Bei einem 32-Bit System können 2<sup>32</sup>=4.294.967.295=4Gi Bytes/Speicherstellen adressiert werden
* Bei einem 16-Bit System können 2<sup>16</sup>=65.536=64Ki Bytes/Speicherstellen adressiert werden
* Bei einem 64-Bit System können 2<sup>64</sup>=18.446.744.073.709.551.616 =16Ei ~18Exa Bytes/Speicherstellen adressiert werden
Waren die Datenbreite und die Adressierungsbreite bei den ersten Prozessoren noch unterschiedlich, so sind diese heutzutage zumeist identisch. Bei einem 32-Bit Prozessor bedeutet dies, dass dieser max. 4Gi Bytes Speicherstellenstellen adressieren kann und Maschinenbefehle für den Datentransport und die Berechnung von 32-Bit Datenworten beinhaltet.
Die Datenbreite und auch die Adressierungsbereite haben direkten Einfluss auf die Programmiersprache:
* Wird defaultmäßig mit größerer Datenbreite gerechnet, als der Prozessor 'von Hause' aus unterstützt, so werden die erzeugten Maschinenprogramme größer und langsamer (Umgedreht bedeutet dies jedoch nicht, dass die Maschinenprogramme kleiner und schneller werden)
* Die max. Größe von Verbunddatentypen und Arrays ergibt sich aus der Adressierungsbreite des Prozessors
Die Intention der Programmiersprache C/C++ ist, die Prozessorarchitektur optimal zu nutzen. Dementsprechend sind diverse Eigenschaften der Sprache nicht fest spezifiziert, sondern von der Rechnerarchitektur abhängig.
=== Integer Datentyp ===
Intention von C/C++ ist, dass der Umgang mit dem Grunddatentyp 'int' möglichst direkt in einen Maschinensprachebefehl umgesetzt werden kann.<br />
Bei einem 16-Bit Prozessor hat der Datentyp int daher eine Breite von 16-Bit und bei einem 32-Bit Prozessor eine Breite von 32-Bit (siehe Kap [[Programmieren in C/C++: Datentypen # Ganzzahlige Datentypen|Datentypen:Ganzahl Datentypen]]). Über vorangestellte Qualifier kann dieser Grunddatentyp verkleinert/vergrößert werden.
=== Integer Arithmetik ===
Ganzzahlen haben nur einen begrenzten Wertebereich. Wird dieser bspw. durch eine Addition überschritten (d.h. das Rechenergebnis benötigt zur Darstellung mehr Stellen, als der Datentyp 'hergibt'), so gibt es zwei Vorgehensweisen:
* Arithmetischer Überlauf (siehe {{w|arithmetischer Überlauf}}): Die nicht speicherfähigen Stellen werden verworfen, so dass i.d.R. ein falsches Ergebnis erzeugt wird!
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist (254+3)%256=1
c=a*b; //c ist (254*3)%256=250
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char a=254,b=3,c1,c2;
c1=a+b; //c ist (254+3)%256=1
c2=a*b; //c ist (254*3)%256=250
printf("c1=%hhu c2=%hhu\n",c1,c2);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Sättigungsarithmetik (siehe {{w|Sättigungsarithmetik}}): Alle Operationen laufen innerhalb eines festen Intervalls ab, so dass Überläufe und Unterläufe auf dieses Intervall begrenzt werden:
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist MAX((254+3),255)=255
c=a*b; //c ist MAX((254*3),255)=255
</syntaxhighlight>
Die Spezifikation von C macht bezüglich der zu nutzenden Methodik keine Vorgaben, so dass das Handling von der ALU des Prozessors abhängt. Aus Komplexitäts- und Geschwindigkeitsgründen ist dies zumeist der arithmetische Überlauf. Nur bei Spezialprozessoren (z.B. DSP Digital Signal Processor) kommt z.T. die Sättigungsarithmetik zum Einsatz.
=== Gleitkomma Datentyp und Arithmetik ===
Für den Umgang mit Gleitkommazahlen bieten einige Prozessoren spezielle Recheneinheiten ({{w|Gleitkommaeinheit}} Floating Point Units FPU) an. Sowohl die Darstellung von Gleitkommazahlen als auch das Verhalten bei Überlauf/Unterlauf ist damit Herstellerabhängig. Um auch diese Einheiten effektiv nutzen zu können, ist die C/C++ Spezifikation in diesem Bereich ebenfalls sehr offen.
=== Max. Speicherbedarf von Variablen ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C/C++ von der zugrundeliegenden Rechnerarchitektur abhängig:
<syntaxhighlight lang="C">
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Zur Darstellung bitte Compiler-Fenster öffnen
//und dort den CC65-Compiler für den 6502 Prozessor auswählen
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Im Falle von globalen Variablen erzeugt der Compiler/Linker eine Fehlermeldung. Werden von diesen Datentypen Variablen als lokale Variablen angelegt, so erzeugt dies zur Laufzeit einen Stackoverflow.
=== Zeigervariable ===
Eine Zeigervariable ist eine Variable, die eine Speicheradresse speichert. Die Größe dieses Datentyps hängt von der Adressierungsbreite des Prozessors ab. Unabhängig von dem Datentyp, auf den die Zeigervariable zeigt, ergibt sich folgende Breite:
* 4-Byte bei einer 32-Bit Rechnerarchitektur
* 8-Byte bei einer 64-Bit Rechnerarchitektur
* 2-Byte bei einer 16-Bit Rechnerarchitektur
=== Datentyp size_t ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C von der zugrundeliegenden Rechnerarchitektur abhängig. Sie ergibt sich aus der Adressierungsbreite. Da die Datenbreite des Datentyps int zumeist kleiner als die Adressierungsbreite ist, existiert in C/C++ der vorzeichenlose Datentyp size_t.<br />
Alle Funktionen, welche den Speicherbedarf übergeben bekommen, bzw. zurückgeben (bspw. strlen(), memcpy(), sizeof()) , nutzen den Datentyp size_t:
<syntaxhighlight lang="C">
//Prototypen
size_t strlen(char *str); //Die max. Stringlänge ist durch den
//adressierbaren Speicher vorgegeben
void *malloc(size_t size);
void *memcpy(void *dest, const void *src, size_t n);
</syntaxhighlight>
Der Datentyp size_t ist in der Header-Datei stddef.h der Standard-C-Library per typedef gesetzt. Im Normalfall muss diese Header-Datei nicht explizit inkludiert werden, da bei Nutzung von z.B. strlen() diese bereits durch die Header-Datei string.h inkludiert wird:
<syntaxhighlight lang="C">
typedef unsigned long long size_t; //Bei einer 64-Bit Rechnerarchitektur
</syntaxhighlight>
Hinweis:
* Der Datentyp size_t ist immer ein vorzeichenloser Datentyp (es gibt keine negativen Speicheradressen).
* Mit dem Datentype ssize_t wird eine vorzeichenbehaftete Variante zur Verfügung gestellt, welche hilfreich ist, wenn Speicheradresse subtrahiert werden sollen.
* Soll der Wert vom Datentyp size_t mittels printf() ausgegeben werden, so ist der 'Length Modifier' z und der 'Conversion Specifier' u zu nutzen:
:<syntaxhighlight lang="C">
size_t var=strlen("String");
printf("%zu",var);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]) {
size_t var=strlen("String");
printf("%zu",var);
printf("%d",var); //Hier sollte es eine Compiler-Warning geben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Boolescher-Datentype/Operatoren ==
Ursprünglich gab es den booleschen Datentyp in der Programmiersprache C nicht. Mit C99 wurde zwar der Datentyp <code>_Bool</code> eingeführt, dies änderte jedoch nicht den Umgang mit Anweisungen und Operatoren, die einen booleschen Datentyp erwarten/zurückgeben!
An allen Stellen, an denen ein boolescher Datentyp erwartet wird (z.B. IF-Abfrage, bei booleschen Operationen) wird der Datentyp Ganzzahl, Gleitkommazahl oder Zeiger erwartet (= Scalar-Type) und ausgewertet. Der hierin gespeicherte Zahlenwert sagt aus, ob diese Zahl als True oder False zu interpretieren ist:
* False, wenn Ganzzahl gleich 0 oder Gleitkommazahl gleich 0.0 oder Zeiger gleich NULL
* True, wenn Ganzzahl ungleich 0 oder Gleitkommazahl ungleich 0.0 oder Zeiger ungleich NULL
Beispiel:
<syntaxhighlight lang="C">
int a=3;
double b=0.0;
int *ptr=&a;
while(1);
if(a) {}
for( ; b && ptr ; );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
double b=0.0;
int *ptr=&a;
while(0);
if(a) {}
for( ; b && ptr ; ) {}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Operatoren, welchen einen booleschen Wert zurückliefern (Vergleichs-Operatoren und Boolesche-Operatoren), liefern ein Integer-Datentyp zurück:
* (int)0 für False
* (int)1 für True
Beispiel:
<syntaxhighlight lang="C">
int a=3;
int b= (a==3); //b=1
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
int b= (a==3); //b=1
printf("%d",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
In den if()/for()/while() Anweisungen ist folglich kein explizites Konvertieren eines Ganzzahl-/Gleitkomma-/Zeigerwertes mittels des Vergleichs-Operators in einen Booleschen Wert notwendig:
<syntaxhighlight lang="C">
int a;
double b;
if(a) //entspricht if(a!=0)
if(!b) //entspricht if(b==0.0)
while(1) //entspricht while(True)
for(int lauf=1; lauf ; lauf--);
</syntaxhighlight>
Umgedreht kann ein boolescher Wert oder auch das Ergebnis einer booleschen Operation direkt mit einer Ganzzahl- oder Gleitkommazahl verknüpft werden:
<syntaxhighlight lang="C">
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
if( a==1 & b==2)
if(3 < a < 9) //Vorsicht, die Schreibweise lässt ein
//anderes Verhalten erwarten!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
printf("%d\n",a);
if(a==1 & b==2)
printf("true\n");
else
printf("false\n");
if(3 < a < 9)
if( (a==1) & (b==2))
printf("true\n");
else
printf("false\n");
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit C99 wurde der Datentyp <code>_Bool</code> eingeführt. Dieser entspricht weiterhin einem Integerdatentyp mit der Besonderheit, dass beim Zuweisen eines Wertes dieses auf true oder false geprüft wird und Variablen dieses Datentyps nur die Werte 0 oder 1 annehmen können:
<syntaxhighlight lang="C">
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool! möglich
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool!
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für den einfacheren Umgang mit dem 'neuen' Datentyp wurde in der Header-Datei <code>stdbool.h</code> die Makros <code>true</code> (als Austauschwert für die Ganzzahl 1) und <code>false</code> (als Austauschwert für die Ganzahl 0) definiert. Ergänzend wird hier der Datentyp <code>bool</code> als Alias auf <code>_Bool</code> gesetzt.
<syntaxhighlight lang="C">
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
int main(int argc,char *argv[]) {
foo(4,3,6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In C++ gibt es anstatt des Datentypes <code>_Bool</code> den Datentyp <code>bool</code>. Auch sind die beiden Konstanten <code>true</code> und <code>false</code> ohne zusätzliches Einbinden der Header-Datei vorhanden. Der weitere Umgang ist jedoch identisch zu C.
== Literale/Konstanten ==
In Computerprogramm werden an diversen Stellen Konstanten in Source Code genutzt. Sei es als Initialisierungswert für Variablen, als Vergleichswert für Abfragen, zur Definition von Schleifendurchläufe oder als Strings für die Kommunikation. Der Syntax der Programmiersprache bietet dazu verschiedene Möglichkeiten, wie Zahlen zu beschreiben sind und wie der Datentyp vorgeben wird.</br>
Ungeachtet der Schreibweise werden im Computer alle Zahlen identisch als binäre Zalen gespeichert. Beispiele, wie die Zahlen intern gespeichert werden:
<syntaxhighlight lang="C">
int var=17; //0000 0000 0000 0000 0000 0000 0001 0001
short var=0x307;// 0000 0011 0000 0111
char var=017; // 0000 1111
int var=-1; //1111 1111 1111 1111 1111 1111 1111 1111
float var=0.0; //0000 0000 0000 0000 0000 0000 0000 0000
float var=1.0; //0011 1111 1000 0000 0000 0000 0000 0000
</syntaxhighlight>
=== Ganzzahl-Konstanten ===
Im Allgemeinen ordnet der Compiler einer numerischen, ganzzahligen Konstanten den kleinstmöglichen Datentyp beginnend vom Datentyp integer zu. Sobald der Wert der Konstanten den Wertebereich von integer übersteigt, wird der nächst größere passende Datentyp gewählt. Ergänzend gilt, dass alle Ganzzahl-Konstanten als vorzeichenbehaftete Ganzzahl-Konstanten angesehen werden!<br />
Beispiele für integer Konstanten:
<pre>
123
+123
-123 → Formal wird das Minus als Operator angesehen
und die positive Zahl 123 negiert
0x123 → Konstante ist in hexadezimaler Schreibweise notiert
0123 → Konstante ist in oktaler Schreibweise notiert
0b011 → Konstante ist in binärer Schreibweise notiert
nicht offizieller C-Syntax, wird aber von vielen Compiler unterstützt
ab C23-Spezifikation offiziell im C-Syntax enthalten!
6'432'108 → Tausendertrenner (ab C23 und in C++)
6'4'3'2'10 → Tausendertrenner
0x12'23'5 → Tausendertrenner
0b1001'001 → Tausendertrenner
5123123123 → Wertebereich größer als 2^31 so dass automatisch
zum nächst größeren Datentyp konvertiert wird
</pre>
Mit den Suffixen L/l und LL/ll kann der Datentyp long und long long erzwungen werden:
<pre>
12L → Konstante wird in eine long Integer Konstante konvertiert
4711LL → Konstante wird in eine Long Long Konstante konvertiert
</pre>
Mit dem Suffix U/u kann die Konstante explizit auf unsigned gesetzt werden:
<pre>
12U → Konstante wird als vorzeichenlose Zahl gesepeichert
4711ULL → Konstante wird in eine vorzeichenlose
Long Long Konstante konvertiert
</pre>
=== Char-Konstanten ===
In einfachen Anführungsstrichen geschriebene ASCII Zeichen werden entsprechend der {{w|American Standard Code for Information Interchange | ASCII-Tabelle}} als Zahlenwert (Datentyp int) dargestellt:
<pre>
'A' → Integerkonstante 65
'a' → Integerkonstante 97
…
</pre>
Über den {{w|Escape-Sequenz|Escape-Operator}} (Zeichen Backslash '\') wird das/die dem ESCAPE Operator folgende Zeichen gesondert interpretiert. Die im Source-Code erhaltene Zeichenfolge wird im Computerprogramm als ein Zahlenwert (Datentyp int) gespeichert. Dies ist u.A. zur Darstellung von ' und " aber auch zur Darstellung der unteren 32 Zeichen der ASCII Tabelle notwendig (Siehe auch {{w|Steuerzeichen}})
<pre>
ESCAPE Integer- → Bedeutung / (Terminal)funktionalität
Sequence konstante
'\0' = 0 → 0 Character = Stringendezeichen
'\a' = 7 → Bell (erzeugt auf dem Terminal einen Ton)
'\b' = 8 → Backspace (Bewegt den Cursor um eine Position nach links)
'\t' = 9 → Horizontal Tab (Bewegt den Curso auf die nächste horizontale
Tabulatorposition, Abstand ist Terminalspezifisch)
'\n' = 10 → NewLine (Zeilenvorschub)
'\v' = 11 → Vertial Tab
'\r' = 13 → Carriage Return (Wagenrücklauf, Bewegt den Cursor an den
Zeilenanfang)
'\"' = 34 → Double Quote
'\'' = 39 → Single Quote
'\?' = 63 → Question mark
'\\' = 92 → Backslash
'\f' = 12 → FormFeed (Erzeugt auf dem Terminal/Drucker
einen Seitenvorschub)
'\ooo' = 0ooo → Oktal, wobei o Digits von 0..7 sein müssen
'\xdd' = 0xdd → Hexadezimal, wobei d Digits von 0..9 A..F sein müssen
'\udddd' Unicode mit 4 Digits
'\Udddddddd' Unicode mit 8 Digits
</pre>
Beispiel
<syntaxhighlight lang="C">
'A' == 65 == '\101' == '\x41' == '\u0041' == '\U00000041'
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
//Programmiersprache wurde auf C++ gesetzt
if('A' == 65) printf("'A' == 65\n");
if('A' == '\101') printf("'A' == '\\101'\n");
if('A' == '\x41') printf("'A' == '\\x41'\n");
if('A' == '\u0041') printf("'A' == '\\u0041'\n");
if('A' == '\U00000041') printf("'A' == '\\U00000041'\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true|
lang=c++
}} Öffnen im Compiler Explorer] }}
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
u'b' → unicode 16 (nur C++)
U'b' → unicode 32 (nur C++)
L'b' → wchar_t
</pre>
Hinweis
* Die ASCII-Tabelle basiert auf einer 7-Bit Zeichenkodierung, so dass bspw. die Umlaute 'ä', 'ö' und 'ü' dort nicht kodiert sind. Sollen auch diese Zeichen genutzt werden, so empfiehlt sich der Datentyp wchar_t
=== Gleitkommakonstanten ===
Alle Gleitkommakonstanten sind ohne weitere Angaben vom Datentyp double!
<pre>
555.12
555. → 555.0
.1 → 0.1
4e2 → 400.0
1'234.678'9 → Tausendertrenner (ab C23 und in C++)
0x22.11p13 → Konstante in Hexadezimalen Schreibweise (ab C99)
</pre>
Über Suffixe kann ein alternativer Datentyp erzwungen werden:
<pre>
3.0F → Datentyp float
3.0l → Datentyp long double
</pre>
Hinweis:
* Aufgrund der unterschiedlichen Basis zwischen dem menschlichen Zehner-System und dem computerinternen Binär-System entstehen insbesondere bei den Nachkommastellen Rundungsfehler. Die Konstante 0.1f wird durch die Wandlung intern als 1.00000001490116119384765625e-1 dargestellt (siehe [[Programmieren in C/C++: Datentypen#Gleitkomma Datentypen | Datentypen:Gleitkomma Datentypen]])
* Die C-Spec verlangt, dass die binäre Repräsentation von Gleitkommazahlen zur Laufzeit (z.B. durch die Funktion atof() strtod() scanf("%f")) identisch zur der zur Compilezeit ist. Beispiel:
:<syntaxhighlight lang="C">
if(3.14==atof("3.14")) printf("muss erfüllt sein");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
if(3.14==atof("3.14")) printf("muss erfüllt sein\n");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
printf("Intern wird 3.14 wie folgt dargestellt %14.20f",3.14);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Konstanten Ausdrücke ===
Ergänzend zu den Zahlenwerten werden auch Ausdrücke durch den Compiler ausgewertet. Als Voraussetzung für die Ausdrücke gilt, dass alle Operatoren Literale/Konstante sein müssen, so dass der Compiler die Berechnung durchführen kann. Als Operatoren können alle im normalem Syntax erlaubten Operatoren (z.B.: +,-,*,/,&,&&,|,||,>>,<<,==,!=) genutzt werden.<br />
Beispiel:
<syntaxhighlight lang="C">
int var1=7*3+5; → wird vom Compiler durch 26 ersetzt
int var2=(4710+(8-1))&-8; → wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); → wird vom Compiler durch 16 * var1 + 154 ersetzt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int var1=7*3+5; //→ wird vom Compiler durch 26 ersetzt
int var2;
var2=(4710+(8-1))&-8; //→ wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); //→ wird vom Compiler durch var1 * 16 + 154 ersetzt
return 0;
} | execCompilerOptions=-Wall|
h=g|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Konstante Ausdrücke bieten sich an, um den Sourcecode lesbarer zu gestalten. Da der Compiler die Berechnung durchführt, wird zur Laufzeit keine Rechenleistung benötigt. Einzig die Compiledauer wird etwas erhöht:
<syntaxhighlight lang="C">
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180); //siehe nachfolgende Hinweise
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int ad_get(void) {
return 615; //614;
}
int main(int argc,char *argv[]) {
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180);
printf("%f\n%f\n",alpha1,alpha2);
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Ergänzend zu den oben aufgeführten Operatoren erlauben einige Compiler weitere Funktionen der Math.h Library in Konstantenausdrücken (z.B. sin(), cos(), ...)
* Konstanten Ausdrücke werden innerhalb des Compilers durch den Präprozessor ausgewertet, so dass dieser die Ergebnisse ebenfalls nutzen kann:
:<syntaxhighlight lang="C">
#define BUF_SIZE 512
#if (BUF_SIZE & (BUF_SIZE -1)) != 0
#endif
</syntaxhighlight>
=== String Konstanten ===
Stringkonstanten erzeugen ein Array von Characters. Mit dem abschließenden Hochkommata wird das Array um ein Stringendezeichen ergänzt:
<pre>
"abc" → (char []) {'a','b','c','\0'}
</pre>
Adjacent Strings Konstanten werden vom Compiler zu einer String-Kontante zusammengefasst, so dass nur ein Stringendezeichen vorhanden ist:
<pre>
"xxx" "yyy" → (char []) {'x','x','x','y','y','y','\0'}
</pre>
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
L"string" → (wchar_t[7]){L's',L't',L'r' …)
</pre>
Über Postfixes können in C++ Objekte erzeugt werden:
<pre>
"string"s → erzeugt einen String vom Datentyp std::string
"string"sw → Erzeugt einen String vom Datentyp std::string_view
</pre>
String Konstanten werden Compilerintern über unnamed Variablen realisiert, welche als globale Variable angelegt werden und per default const sind:
<syntaxhighlight lang="C">
printf("Wert=%d",4);
//entspricht
const char unnamed1[]="Wert=%d";
printf(unnamed1,4);
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
printf("Wert=%d\n",4);
//entspricht
const char unnamed1[]="Wert=%d\n";
printf(unnamed1,4);
fflush(stdout); //Zur Darstellung der Ausgabe, da nachfolgend
//das Programm abstürzt und die gepufferte Ausgabe
//nicht zur Anzeige gebracht wird
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für doppelte String Konstanten wird nur einmal Speicher reserviert:
<syntaxhighlight lang="C">
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2) printf("Identische Startadressen");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2)
printf("Identische Startadressen");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Initialisierungsliste / Compound Literal ==
Arrays, Strukturen und Unions bestehen zumeist aus mehreren Elementen. Zur Initialisierung solcher Variablen werden die Initialisierungswerte in geschweiften Klammern als Initialisierungsliste zusammengefasst.
<code>
Syntax: {Initialisierungsliste}
</code>
Für eine Initialisierungsliste wird kein Speicher vorgehalten. Vielmehr wird bei der Variablendefinition die Variable direkt mit dem Inhalt der Liste initialisiert. Der Datentyp der Initialisierungsliste ergibt sich aus dem Datentyp der zu initialisierenden Variable:
<syntaxhighlight lang="C">
int arr[5] = { 1,2,3,4,5 };
struct xyz { int x,y,z;}; //Definition einer Struktur
struct xyz var = { 1,2,3 };
</syntaxhighlight>
Wird der Initialisierungsliste ein Datentyp in runden Klammern vorangestellt, so wird hiermit eine 'unnamend' Variable/Objekt, ein Compound Literal erstellt:
<code>
Syntax: (type) {Initialisierungsliste}
</code>
Ein Compound Literal entspricht einer anonymen Variablen des angegebenen Datentyps. Wie bei einer normalen Variablendefinition wird hier ebenfalls eine Variable angelegt und diese mit den Initialisierungswerten initialisiert. Im Unterschied zu einer normalen Variable kann auf solch eine Variable im Nachgang nicht mehr zugegriffen werden. Der Rückgabewert eines Compound Literals entspricht somit dem einer Variablen.</br>
Compound Literale bieten sich überall dort an, wo Variablen nur für einen einmaligen Zweck angelegt werden (bspw. bei der Parameterübergabe von Funktionen):
<syntaxhighlight lang="C">
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawline(struct point start,struct point end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start.x,start.y,end.x,end.y);
}
void printarray(int arr[4]) {
printf("[ ");
for(size_t idx=0;idx<4;idx++)
printf("%d ",arr[idx]);
printf("]\n");
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Über den Adressoperator kann auch die Adresse der anonymen Variablen ermittelt werden. In diesem Falle ist dann der Gültigkeitsbereich/-dauer des Compound Literals zu berücksichtigen. Wird eine Compound Literals außerhalb eines Block-Scopes angelegt, so entspricht sie einer globalen Variable, andernfalls einer lokalen Variablen. Außerhalb des Gültigkeitsbereiches verliert die Adresse auf solch eine Variable ihre Gültigkeit:
<syntaxhighlight lang="C">
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawlinep(struct point *start,struct point *end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start->x,start->y,end->x,end->y);
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Compound-Literal sind per Default keine Konstanten, können also zur Laufzeit geändert werden (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Const Type Qualifier|DatentypeSpecifier:Const Type Qualifier]]):
:<syntaxhighlight lang="C">
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweiften Klammern <code>{ }</code> sind nicht mit dem Block-Operator (siehe [[Programmieren in C/C++: Grundlagen#Block / Compound-Statement | Block / Compound-Statement]]) zu verwechseln. Werden die geschweiften Klammern bei der Initialisierung von Variablen genutzt, dann beschreibt der Inhalt der geschweiften Klammern eine Initialisierungsliste. Wird diesen ein Datentyp vorangestellt, dann wird hiermit eine Compound Literal definiert.
== Variableninitialisierung ==
Mit der Definition einer Variable kann diese optional initialisiert werden. Der tatsächliche Zeitpunkt der Variableninitialisierung (zur Laufzeit oder zur Compilezeit) und damit die Ausführung der Initialisierung (Maschinensprachebefehle oder Speichervorbelegung) hängt von der Gültigkeit/Sichtbarkeit der Variablen ab(siehe [[Programmieren in C/C++: Grundlagen#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]).
=== Globale + Static lokale Variablen ===
Globale und statisch globale Variablen werden in einem während der Laufzeit des Programms festen Speicherbereich gehalten. Zum Startzeitpunkt des Programms ist der Speicherplatz solch einer Variable mit dem Initialisierungswert gefüllt, so das bei erstmaliger Nutzung dieser Variablen diese ihre Initialisierungswerte enthalten. Die Belegung des Speicherplatzes erfolgt durch den Compiler, so dass als Initialisierungswerte / Inhalt der Initialisierungsliste nur Konstanten oder Konstanten-Ausdrücke (siehe [[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Literale/Konstanten]]) erlaubt sind:
<syntaxhighlight lang="C">
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
double sin(double); //DJ: Include-Anweisung in wikibooks schlägt fehlt
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
int main(int argc,char *argv[]) {
printf("%hd %hd %hd\n",array[0],array[1],array[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Nicht initialisierte globale und static lokale Variablen werden mit 0 initialisiert! D.h. die Speicherstellen dieser Variablen werden mit dem Wert 0 vorbelegt::
<syntaxhighlight lang="C">
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
int main(int argc,char *argv[]) {
printf("f=%d\n",f);
printf("%f %f %f\n",arr[0],arr[1],arr[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Lokale Variable ===
Der Speicherplatz für lokale Variable wird auf dem Stack zur Verfügung gestellt. Mit jedem öffnenden Block-Scope wird Speicher für die innerhalb dies Block-Scopes vorhandenen Variablen vom Stack nach dem LIFO Prinzip reserviert und mit der Variablendefinition Maschinencode zur Initialisierung der Speicherstellen ausgeführt (sofern Variable einen Initialisierungswert hat):
<syntaxhighlight lang="C">
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für int) und 8 Bytes (für double)
int var1=12; //erzeugt Maschinencode zur Initialisierung
//der ersten 4 Byte mit dem Wert 12
double var2=sin(f); //erzeugte Maschinencode, welche zunächst
//die Funktion sin() mit dem Übergabewert f
//aufruft und dessen Rückgabewert in die
//nächsten 8 Byte des reservierten Speichers
//kopiert
...
{ //siehe zuvor
int var3=var1; //siehe zuvor
double var4=var2+var1;
} //siehe nachfolgenden
} //Freigabe des zuvor reservierten Speichers
</syntaxhighlight>
Dies gilt auch für Funktionsaufrufe. Mit der öffnenden geschweiften Funktionsklammer wird ebenfalls Speicher reserviert:
<syntaxhighlight lang="C">
void foo(int par)
{ //Öffnende Funktionsklammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für (Übergabe)Variable par und 4 Bytes für Variable var
int var; //Da keine Initialisierung vorhanden ist wird auch
//kein Maschinencode zur Initialisierung ausgeführt
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Byte für Variable x
int x;
...
</syntaxhighlight>
Aufgrund der mit der Initialisierung bedingten Erzeugung von Maschinencode können die Initialisierungswerte/Inhalte der Initialisierungsliste bei lokalen Variablen aus beliebigen Ausdrücken bestehen und müssen keine Konstanten oder Konstanten Ausdrücke sein:
<syntaxhighlight lang="C">
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sin(f)}; //werden zur Laufzeit berechnet
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h> //fuer sinf()
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sinf(f)}; //werden zur Laufzeit berechnet
printf("%f\n",(double)summe);
printf("%f %f %f\n",(double)arr[0],(double)arr[1],(double)arr[2]);
}
int main(int argc,char *argv[]) {
foo(3,4);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dieser Maschinencode wird jedes Mal ausgeführt, wenn die dazugehörige Anweisung abgearbeitet wird und bedingt dementsprechend Rechenzeit. Zehnmaliges Ausführen einer Funktion oder zehnmaliges Öffnen eines Block-Scopes innerhalb einer For-Schleife führt zur zehnmaligen Ausführung der oben genannten Sachverhalte:
<syntaxhighlight lang="C">
void foo(int);
void var(void) {
for(int lauf=10; lauf>0; lauf--)
{ //zehnmaliges Reservieren von Speicher
int var=lauf*2; //zehnmalige Initialisierung
foo(var);
} //Freigabe des Speichers
}
void foo(int par) { //zehnmaliges Reservieren von Speicher
int var=12; //zehnmalige Initialisierung
} //Freigabe des Speichers
</syntaxhighlight>
Nicht initialisierte lokale Variablen werden nicht initialisiert, d.h. keine zusätzlichen Maschinenbefehle zum Initialisieren erzeugt. Der Variablenwert entspricht dann einem 'Zufallswert' oder korrekter gesagt dem Inhalt der Variablen, welcher zuvor der Speicherstelle zugewiesen war:
<syntaxhighlight lang="C">
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//und damit auch dessen zuletzt gültigen Wert
}
int main(int argc, char *argv[]) {
int var1=first(); //var1 beinhaltet Wert 7
int var2=second(); //var2 beinhaltet Wert 7
printf("var_foo=%d\n",var1);
printf("var_far=%d\n",var2);
return 0;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//(und damit auch dessen zuletzt gültigen Wert)
}
int main(int argc, char *argv[]) {
printf("%d\n",second()); //Zufallswert (0, da Stack mit 0 initialisiert ist)
printf("%d\n",first()); //Stack belegen
printf("%d\n",second()); //Zufallswert (7, da Speicherstelle zuvor mit 7
return 0; //belegt wurde)
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird eine Variableninitialisierung mit einer switch oder goto Anweisung übersprungen, so wird zwar die Variable angelegt (Speicherplatz reserviert), jedoch die Maschinenbefehle zur Initialisierung dieser Variablen nicht ausgeführt (siehe auch [[Programmieren in C/C++: Grundlagen# Switch-Anweisung|Switch-Anweisung]] und [[Programmieren in C/C++: Grundlagen# Label + Goto|Label + Goto]]). Die Variable enthält dann einen Zufallswert:
<syntaxhighlight lang="C">
switch(value) {
case 0:
int lok=7;
printf("%d",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(int value) {
switch(value) {
case 0:
int lok=7;
printf("%d\n",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d\n",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
}
void far(void) {
int var1=4711;
int var2=1799;
printf("Marke: %d, Erscheinungsjahr: %d\n",var1,var2);
}
int main(int argc,char *argv[]) {
foo(2); //Zufallswert (0, da Stack mit 0 initialisiert ist)
foo(0); //Initialisierungswert
far(); //Stack belegen
foo(2); //Zufallswert
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei erstmaligem Funktionsaufruf kann eine nicht initialisierten lokale Variablen den Wert 0 beinhalten (Stackframe wird mit Programmstart auf 0 gesetzt). Beim nächsten Aufruf der Funktion ist zumeist die Speicherstelle der lokalen Variablen mit anderen Werten gefüllt worden, so dass nun ein anderer 'Zufallswert' als 'Initialisierungswert' enthalten ist
=== C++ ===
In C++ ist ergänzend die Initialisierung einer Variablen über () möglich. Bei Objekten wird hierüber der zugehörige Konstruktor aufgerufen. Bei primitiven Datentypen entspricht der Wert in den Klammern dem Initialisierungswert:
<syntaxhighlight lang="C++">
int variable(10); //Bei primitiven Datentype entspricht dies
//int variable=10;
struct test {
int a;
test(int par) {a=par;} //Konstruktor der Struktur test
};
struct test test(4); //Konstruktor test(int par) wird aufgerufen
struct test test(4,5); //KO, kein passender Konstruktor vorhanden
</syntaxhighlight>
=== Sonstiges ===
Folgende weitere Sachverhalten gilt es bzgl. Variableninitialisierung zu berücksichtigen:
* Nach C-Spezifikation ist eine Initialisierung von Variablen nicht notwendig. Es liegt folglich kein Fehler vor, wenn auf eine nicht initialisierte Variable lesend zugegriffen wird. Ungeachtet der C-Spezifikation überprüft der Compiler mit dem Schalter '-Wall' diesen Sachverhalt und gibt eine Warning aus
* Deklarationen/Prototypen können keinen Initialisierungswert enthalten
<syntaxhighlight lang="C++">
extern int var=7; //Fehlerhaft
</syntaxhighlight>
* Const und lokale Static Variablen sollten initialisiert werden, auch wenn C in diesem Fall keinen Fehler meldet!
<syntaxhighlight lang="C++">
const int konstante; //Syntaktisch OK, Initialisierungswert fraglich!
static int statisch;
</syntaxhighlight>
== Anweisung (Statement) & Expression ==
Eine Anweisung (Statement) stellt entsprechend dem Wikipedia Artikel {{w|Anweisung_(Programmierung) | Anweisung}} ''"ein in der Syntax einer Programmiersprache formulierte einzelne Vorschrift dar, die im Rahmen der Abarbeitung des Programms auszuführen ist"''.</br>
Aus der Statement Spezifikation ergibt sich folglich, welche Bestandteile ein Programm beinhaltet kann. In der C-Spezifikation [C11 6.8] sind folgende Anweisungen definiert:
: labeled-statement: Eine Sprungmarke für die Switch- und die Goto-Anweisung
: compound-statement: siehe nachfolgendes Kapitel
: expression-statement: siehe nachfolgendes Kapitel
: selection-statement: Eine if() oder switch() Anweisung
: iteration-statement: Eine while(), do while() oder eine for() Anweisung
: jump-statement: Eine goto, break, continue oder return Anweisung
so dass ein Programmablauf wie folgt aussehen könnte:
<syntaxhighlight lang="C">
int main(int argc, char argv[]) {
int var; //declaration innerhalb eines compound-statements
label: //labeled-statement
var=var*2+1; //expression-statement
for(var=0;var<100;var++); //iteration-statement
if(var<0) //selection-statement
printf("var<0"); //espression-statement
{ int lok=var; lok++; } //compound-statement
goto label; //jump-statement
return 0;
}
</syntaxhighlight>
=== Ausdruck (Expression) ===
Entsprechend der C-Spezifikation [C11 6.5] ist ein Ausdruck eine Folge von Operatoren und Operanden, die die Berechnung eines Werts angibt, ein Objekt oder eine Funktion bezeichnet, Nebenwirkungen erzeugt oder eine Kombination davon ausführt. Die Wertberechnungen der Operanden eines Operators werden vor der Wertberechnung des Ergebnisses des Operators ausgeführt (siehe auch {{w|lang=en|Expression_(computer_science)|Expression}}).
Beispiele:
<syntaxhighlight lang="C">
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöung der globalen Variable a)
int func(int par) { a++; return par*2;}
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int a=0;
int func(int par) {
a++;
return par*2;
}
int main(int argc,char *argv[]) {
int a=4,b=7;
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöhung der globalen Variable a)
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ausdrücke entsprechen somit Rechenvorschriften, die ausgewertet werden. Ausdrücke sind in C/C++ überall dort erlaubt, wo ein Operand erwartet wird:
<syntaxhighlight lang="C">
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func3(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf()]) {}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
//Ausdruck innerhalb eines Funktionskopfes
int func1(int par) {
return 1;
}
int func2(void) {
return 1;
}
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf("func() called\n")])
{
printf("func() body\n");
}
int main(int argc,char *argv[]) {
int a=1;
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func1(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
func3(1,arr);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dies ist unter anderen ein Grund dafür, dass C/C++ als unleserlich gilt. Zur besseren Lesbarkeit eines Codes sollte dieses 'Feature' nur dann genutzt werden, wenn es zwingend notwendig ist.
=== Discarded Value / null statement ===
Alle Ausdrücke und nicht void-Funktionen haben einen Rückgabewert, der weiter verwendet werden kann:
<syntaxhighlight lang="C">
a+7 //Rückgabewert ist das Ergebnis der Addtion
printf("hallo") //printf() Funktion ist vom Typ int und gibt die Anzahl
//der ausgegebenen Zeichen zurück
a //gibt den Inhalt der Variablen zurück
7 //gibt den 'Inhalt' der Konstanten zurück
b=(a=7) //der Zuweisungsoperator gibt den Zuweisungswert zurück
</syntaxhighlight>
Der letzte Rückgabewert eines fasst jeden Ausdruckes wird somit nicht genutzt. Dies wird Discarded Value bezeichnet:
<syntaxhighlight lang="C">
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der einfachste Fall eines Discarded Values ist ein Leeranweisung / null statement, d.h. die Anweisung besteht nur aus einem Semikolon. Dies stellt eine syntaktisch korrekte Anweisung dar, die keine Auswirkung hat:
<syntaxhighlight lang="C">
; //Leeranweisung
</syntaxhighlight >
Überall wo statements/Anweisungen erwartet werden (bspw. bei einer for-Schleife, bei einer if-Anweisungen) kann anstatt einer statements eine Leeranweisung stehen, welche dementsprechend nichts ausführt:
<syntaxhighlight lang="C">
for(size_t idx=0; str[idx]!=0; idx++)
; //Leeranweisung
while(a++ < 100)
; //Leeranweisungen
</syntaxhighlight>
An einige Stellen bietet sich die Nutzung dieser Sachverhalte als vorteilhaft an. Oft führen diese Sachverhalten jedoch zu Ausführungsfehlern, da sie aufgrund des korrekten Syntax vom Compiler nicht als Fehler gemeldet werden und beim Suchen dementsprechend nur schwer zu finden sind! Ggf. gibt der Compiler für einige Sachverhalte eine Warnung aus, so dass es vorteilhaft ist, Compiler-Warnings zu beachten!
Hinweise:
* Soll bewusst der Rückgabewert verworfen werden, so kann/sollte mit dem explizten Cast auf (void) der Rückgabewert explizit 'verworfen' werden. Dies ist u.A. hilfreiche bei Variablen, die (noch) nicht benutzt werden und der Compiler die Warning "unsued Variable" ausgibt:
:<syntaxhighlight lang="C">
(void)a; //Zur Vermeidung von Compiler-Warnings "Unused Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(void) {
return 4711;
}
int main(int argc,char *argv[]) {
int a;
(void)a; //Zur Vermeidung von Compiler-Warnings "Unsued Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Mit der Anweisung <nowiki>[[nodiscard]]</nowiki> (ab C++17, ab C23) wird der Compiler angewiesen, dass der Aufrufer einer Funktion mit Rückgabewert der Rückgabewert entgegenzunehmen ist. Wird der Rückgabewert verworfen, so gibt der Compiler eine Fehlermeldung aus:
:<syntaxhighlight lang="C">
[[nodiscard]] int Client(int socket);
Client(5); ////Fehlermeldung, da Rückgabewert nicht verwendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
[[nodiscard]] int Client(int socket) {
return socket+1;
}
int Server(int socket) {
return socket+1;
}
int main(int argc,char *argv[]) {
Server(5); //keine Fehlermeldung
Client(5); //Fehlermeldung, da Rückgabewert nicht verwendet wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sequence Point ===
Ein Sequenzpunkt (u.A. das abschließende Semikolon am Ende der Anweisung) ist nach dem Wikipedia Artikel {{w|lang=en|Sequence_point|Sequence Point}} definiert als der Punkt in der Ausführung eines Computerprogramms, an dem garantiert ist, dass alle Nebenwirkungen früherer Bewertungen durchgeführt wurden und noch keine Nebenwirkungen von nachfolgenden Bewertungen durchgeführt wurden.</br>
Sequenzpunkte führen somit zur Trennung der Abarbeitungsreihenfolge innerhalb von Ausdrücken. Das abschließende Semikolon am Ende eines Ausdruckes sorgt somit dafür, dass zunächst der vorangegangene Ausdruck abgearbeitet wird, bevor der nächste Ausdruck beachtet wird.</br>
Beschreibt das Semikolon explizit einen Sequenzpunkt, so gibt es auch andere Operatoren, die einen Sequenzpunkt beinhalten. Bei solchen Operatoren wird somit zunächst vollständig der erste Teilausdruck ausgewertet, bevor der nächste folgt. Zwei Beispiele für Operatoren mit Sequenzpunkt sind das logische Und <code>&&</code> und der <code>?</code>-Operator:
<syntaxhighlight lang="C">
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(int par) {
return printf("func(%d) called\n",par);
}
int main(int argc,char *argv[]) {
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein weiteres Beispiel ist der Komma-Operator. Hier teilt das Komma den Gesamtausdruck in mehrere Teilausdrücke auf, die nacheinander abgearbeitet werden (siehe
[[Programmieren in C/C++: Grundlagen#Komma-Operator | Komma-Operator]]).
=== Abarbeitungsreihenfolge ===
Die Abarbeitungsreihenfolge der Operatoren innerhalb eines Ausdruckes wird durch die Prioritätenliste/Rangfolge (siehe [[C-Programmierung: _Liste_der_Operatoren_nach_Priorität| C-Programmierung:Liste der Operatoren nach Priorität]]) vorgegeben. Operatoren mit höherer Priorität werden vor Operatoren mit niedriger Priorität ausgeführt. Die ()-Klammer hat die höchste Priorität:
<syntaxhighlight lang="C">
//Der Ausdruck
c = sizeof(x) + ++a / 3;
//wird aufgrund der Prioritäten wie folgt ausgewertet:
c= (sizeof(x)) + ( (++a) / 3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=2;
int c;
int x=0;
c = sizeof(x) + ++a / 3;
printf("a=%d c=%d\n",a,c);
//Wird aufgrund der Prioritäten wie folgt ausgewertet:
a=2;
c= (sizeof(x)) + ( (++a) / 3);
printf("a=%d c=%d\n",a,c);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei identischer Priorität ergibt sich die Abarbeitungsreihenfolge aus der Assoziativität (L-R oder R-L):
<syntaxhighlight lang="C">
a=33 / 5 / 2;
//Wird aufgrund der L-R Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2;
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
a = b = c = d*2; //→ a=(b=(c=(d*2)));
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a;
a=33 / 5 / 2;
printf("a=%d\n",a);
//Wird aufgrund der Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2
printf("a=%d\n",a);
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
int b,c,d=8;
a = b = c = d*2; //→ a=(b=(c=(d*2)));
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
An einigen Stellen gibt die C/C++ Spezifikation die Abarbeitungsreihenfolge nicht vor (indeterminately-sequenced), überlässt diese somit dem Compiler:
* Bei Funktionsaufrufen ist die Abarbeitungsreihenfolge der Parameter nicht spezifiziert:
:<syntaxhighlight lang="C">
//Quelle: C-Spec Kap. 6.5.2.2
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int f1(void) {
printf("f1 called\n");
return 1;
}
int f2(void) {
printf("f2 called\n");
return 2;
}
int f3(void) {
printf("f3 called\n");
return 3;
}
int f4(void) {
printf("f4 called\n");
return 4;
}
void func1(int par1,int par2) {
printf("func1(%d,%d) called\n",par1,par2);
}
void func2(int par1,int par2) {
printf("func2(%d,%d) called\n",par1,par2);
}
int main(int argc,char *argv[]) {
//Quelle: C-Spec Kap. 6.5.2.2
void (*pf[2])(int,int)={func1,func2};
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Per Postinkrement/-dekrement Operator sagt aus, dass für die eigentliche Operation der Wert der Variablen genutzt wird und im Anschluss die Variable erhöht / erniedrigt werden soll. Nach C-Spezifikation [C11 6.5.2.4] muss dies spätestens vor dem nächsten Sequence Point erfolgt sein. Der genaue Zeitpunkt innerhalb des Sequence Points ist jedoch nicht vorgegeben:
:<syntaxhighlight lang="C">
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
printf("a=%d b=%d\n",a,b);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Initialisierungliste ist Abarbeitungsreihenfolge nicht spezifiziert:
<syntaxhighlight lang="C">
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
printf("var={a=%d b=%d c=%d}\n",var.a,var.b,var.c);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Compound-Statement ===
Ein Compound-Statement ist innerhalb der C-Spezifikation ein alternativer Ausdruck für ein block-scope. Dieser fasst mehrere Statements und Deklarationen zu einem Statement zusammen:
<code>
Syntax: {Declaration-or-statement-list/textsuperscript<sub>OPT</sub>}
</code>
Ein Block wird nicht wie bei einer Anweisung mit einem Semikolon abgeschlossen (Das angehängte Semikolon wäre dann eine separate leere Anweisung!).
Ein Block hat blockweite Sichtbarkeit (siehe [[Programmieren in C/C++: Grundlagen#Blockweite Sichtbarkeit | Blockweite Sichtbarkeit]]), , so dass hier definierte Variablen nur hier gültig sind. Deklarationen sind ebenfalls nur in dem Block gültig:
<syntaxhighlight lang="C">
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Verwendung findet das Compound-Statement a) als Strukturierungsmöglichkeit innerhalb von Funktionen (zur Darstellung, dass dieser Bereich 'zusammengehörig' ist) und b) an den Stellen, an denen C/C++ nur eine Anweisung erwartet. Dies sind bspw. die If- und die For-Anweisungen:
<syntaxhighlight lang="C">
for(..) Anweisung; //For-Schleife führt nur diese eine Anweisung aus
for(…) {Block} //For-Schleife führt Block (als eine Anweisung) aus
if(..) Anweisung; else Anweisung; //IF-Anweisung führt nur 'eine'
//Anweisung aus
if(..) {Block} else {Block} //IF-Anweisung führt Block aus
if( ) {Block}; else {Block}; //Semikolon ist eine separate
//Leer-Anweisung, so dass else
//nicht zur IF-Anweisung zugeordnet
//werden kann (2 Anweisungen vor Else)</syntaxhighlight>
=== Embedded Statement ===
Embedded Statements sind eine GNU-C Erweiterung (siehe [https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html GNU-C-Manual 3.18]). Da diese vom Autor als sehr nützlich angesehen und auch von diversen Compilern und auch in C++ unterstützt werden, werden diese nachfolgend beschrieben.
Ein Compound-Statement fasst mehrere Anweisungen zu einer Anweisung zusammen, hat jedoch kein Rückgabewert. Ein Embedded-Statement entspricht einem Compound-Statement mit der Ergänzung, dass dieser einen Rückgabewert hat, so dass ein Embedded-Statement überall dort eingesetzt werden kann, wo eine Operand erwartet wird.
<code>
Syntax: ({Declaration-or-statement-list<sub>OPT</sub>})
</code>
Der Rückgabewert (und Datentyp) wird nicht über eine return-Anweisung angegeben, sondern entstammt aus dem Rückgabewert der letzten Anweisung innerhalb der Liste:
<syntaxhighlight lang="C">
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
printf("var=%d\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein Embedded-Statement ähnelt folglich einem Funktionsaufruf mit dem Unterschied, dass a) in der Tat kein Funktionsaufruf stattfindet und b) der Rückgabewert nicht mit return, sondern über die letzte Anweisung zurückgegeben wird. Der Anwendungsfall ist dort zu finden, wo eine Operand erwartet wird und mehrere Anweisungen zum Ermitteln des Operanden notwendig sind:
<syntaxhighlight lang="C">
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
printf("Bedingung erfüllt");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Ein Embedded-Statement ist insbesondere bei Nutzung von Makros (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]) hilfreich
* Mittels eines Embedded-Statement kann eine anonyme Funktion/Lambdafunktion dargestellt werden:
<syntaxhighlight lang="C">
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {return a%2?a:0;} ; func;})
,arr);
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {printf("Called:%d\n",a);return a%2?a:0;} ; func;})
,arr);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Funktionen / Prozeduren ==
Funktionen/Prozeduren sind ein Strukturierungsmerkmal, so dass Teile der Funktionalität des Programmes wiederverwendbar sind. C/C++ unterscheidet nicht zwischen Funktionen (haben einen Rückgabewert, können damit als Operand in Ausdrücken verwendet werden) und Prozeduren (haben keine Rückgabewert, resp. Rückgabetyp void). <br/>
Mit jedem Aufruf einer Funktion wird für den zugehörigen Block ein eigener Stack-Kontext angelegt, so dass Funktionen sich selbst aufrufen können (Rekursion). Jeder Funktionsinstanz hat somit seinen eigenen lokalen Variablenbereich, teilen sich jedoch die globalen und die statisch lokalen Variablen.<br />
Mit dem Aufruf einer Funktion können Parameter übergeben werden, wobei die Übergabeparameter vom Aufrufer (Caller) durch den Aufruf in die lokalen Variablen des Aufgerufenen (Callee) kopiert/zugewiesen werden (Call by Value). Wird ein Zeiger übergeben, hat der Callee über die Dereferenzierung des Zeigers die Möglichkeit, die Variablen des Caller zu verändern (Call by Reference) (siehe Kap. [[Programmieren in C/C++: Zeiger #Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen).]]).
Hinweise:
* Die Klammerung hinter dem Funktionsnamen (<code>foo()</code>) zeigt an, dass es sich um einen Funktionsaufruf (Verzweigung der Programmausführung zu der Startadresse der Funktion) handelt:
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
foo(); //Klammern hinter dem Funktionsnamen bedeuten Aufruf der Funktion
</syntaxhighlight>
* Die Nutzung des Funktionsnamens ohne Klammerung (<code>foo</code>) gibt die Startadresse der Funktion zurück. Die Startadresse kann in einem Zeiger auf Funktionen gespeichert werden (siehe Kap. [[Programmieren in C/C++: Zeiger#Zeiger auf Funktionen | Zeiger:Zeiger auf Funktionen]]):
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
printf("foo called");
};
int main(int argc, char *argv[]) {
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
fptr(); //Aufruf der Funktion
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklaration/Definition vor dem ersten Aufruf der Funktion 'notwendig', damit Compiler die Übergabeparameter entsprechend bereitstellt und ggf. eine implizite Typkonvertierung durchführt (dito Rückgabewert). Die Angabe der Variablennamen können bei der Deklaration entfallen
* Die fehlende Angabe der Übergabeparameter bedeutet in C (bis einschl. C18), dass diese Funktion mit beliebigen Übergabeparametern aufgerufen werden kann und der Compiler keine Typprüfung durchführt:
:<syntaxhighlight lang="C">
int func(/*Keine Übergabeparameter angegeben*/) {...}
//kann wie folgt aufgerufen werden
func();
func(4);
func("hallo Welt",4.7);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func() {
printf("foo called\n");
};
int main(int argc, char *argv[]) {
func();
func(4);
func("hallo Welt",4.7);
//Ab C23 hat sich die Bedeutung geändert.
//Zum Testen C-Versionsvorgabe -sdc=xxx unter Compiler-options aendern
return 0;
} | execCompilerOptions=-Wall -std=c17|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:→ unbedingt vermeiden<br />
:Hat die Funktion keinen Übergabewert, so wird dies in C mit void gekennzeichnet
* In C++ bedeutet die Schreibweise ohne Datentypbeschreibung, dass keine Parameter erwartet werden
* In der Parameterliste von Funktionen dient in der GNU-C Spezifikation das Semikolon zum Trennen zwischen Deklaration von Übergabeparameter und den Übergabeparametern. Alle Übergabewerte links vom Semikolon sind (Forward)deklarationen:
:<syntaxhighlight lang="C">
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Aufruf
test1(3,7); //a=7 b=3
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim);
//Aufruf
test2("hallo",6);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim) {
printf("dim=%d\n",dim);
}
int main(int argc, char *argv[]) {
//Aufrufe
test1(3,7); //a=7 b=3
test2("hallo",6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Return-Anweisung ===
Mit der Return-Anweisung wird eine Funktion (vorzeitig) beendet. Der optionale Parameter dient der Angabe des Rückgabewertes der Funktion an den Aufrufer. Der Datentyp des Parameters ergibt sich aus dem Rückgabedatentyp der Funktion.
<code>
Syntax: return expression<sub>OPT</sub>
</code>
Der Rückgabewert expresion sagt aus, dass hier nicht nur Konstanten oder Variablen stehen können, sondern ein komplexer Ausdrücke erlaubt ist. Der resultierende Datentyp des Ausdruckes sollte dem Rückgabedatentyp der Funktion entsprechen, andernfalls wird eine implizite Typkonvertierung vollzogen (sofern möglich):<syntaxhighlight lang="C">
int foo(double a, double b) {
return (int)(a*a+b*b);
}
</syntaxhighlight>
Hinweise:
* Bei nicht void-Funktionen ist eine return-Anweisung mit einer Expression entsprechend dem Datentyp der Funktion zwingend notwendig:
:<syntaxhighlight lang="C">
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
double a=func(); //int wird in double konvertiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
int main(int argc, char *argv[]) {
double a=func(); //int wird in double konvertiert
printf("a=%f\n",a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei einer void-Funktion ist die return-Anweisung ohne Expression optional. Hier entspricht der schließende Block der Return-Anweisung
:<syntaxhighlight lang="C">
void func(char *str) {
if(str==NULL)
return;
printf("%s",str);
}
</syntaxhighlight>
Sollen mehr als ein Rückgabewert an den Aufrufer zurückgegeben werden so empfiehlt sich:
* die Rückgabewerte in einer Struktur zu packen (siehe [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++) |Datentypen:Verbundtyp Struktur/Klasse (nur C++)]])
* die Rückgabewerte über die Aufrufparameter als Call-by-Reference zu übergeben (siehe [[Programmieren in C/C++: Zeiger#Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen]])
==== Rückgabewert aus Datentypsicht ====
Aus Datentypsicht kann der Funktionsname inkl. den Parameter(n) in einem Ausdruck mit dem Datentyp des Rückgabewertes der Funktion ausgetauscht werden:
<syntaxhighlight lang="C">
int foo(void) {return 4711;}
int var;
var=1+foo(); //Aus Datentypsicht (int)=(int)+(int)
</syntaxhighlight>
Daraus ergibt sich, dass bei Arrays/Strukturen/Unions direkt auf einzelne Komponenten zugegriffen werden kann, ohne diese zuvor einer Variablen zuzuweisen:
<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
if(foo(12).x == 12) printf("Identisch\n");
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
if(far(3)[2] == 2) printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <stdlib.h>
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
int main(int argc, char *argv[]) {
if(foo(12).x == 12)
printf("Identisch\n");
if(far(3)[2] == 2)
printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
==== Fehlerrückgabe ====
Viele Funktionen können unter gewissen Umständen nicht korrekt ausgeführt werden. Z.B. aufgrund dessen, dass:
* der benötigter Speicher vom Heap nicht bereitgestellt werden kann
* Übergabeparameter außerhalb des zulässigen Wertebereiches liegen
* angeforderte Ressource (Datei, Geräte, …) nicht vorhanden/verfügbar sind
Solche Fälle gilt es dem Aufrufer mitzuteilen, da in diesen Fällen die vom Aufrufer geforderte Funktionalität nicht erfüllt ist und der Aufrufer ggf. nicht weiterarbeiten kann. Zur Mitteilung des Fehlers sollte vorrangig der Rückgabewerte genutzt werden. (auch wenn in C++ mit Exception eine Alternative hierzu bereitsteht)
<syntaxhighlight lang="C">
char *strdup(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup1(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
int main(int argc, char *argv[]) {
char *dup=strdup1("hallo");
if(dup == NULL)
printf("Fehler\n");
else
printf("dup='%s'\n",dup);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Standard-C Library-Funktionen geben in diesem Fall zumeist ein -1 (Rückgabewert Ganzzahl) oder einen NULL-Zeiger (Rückgabewert Zeiger) zurück. Der genaue Fehlergrund ist dann ergänzend in der globalen Variablen errno gespeichert. Mittels der Standard-C Funktion strerror() kann die Zahl in einen für den Anwender/Programmierer lesbaren String umgewandelt werden (die GNU-C Library Funktion printf() bietet ergänzend den Conversion Spezifier %m als alternative Ausgabemöglichkeit an):
<syntaxhighlight lang="C">
#include <errno.h>
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY|O_CREAT|O_EXCL,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY{{!}}O_CREAT{{!}}O_EXCL,
S_IRUSR{{!}}S_IWUSR{{!}}S_IRGRP{{!}}S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'''Für eine sauber Programmierung sollte diese Methodik generell angewendet werden.''' Jede Funktion, welche Fehlschlagen kann, teilt dies per Rückgabewert dem Aufrufer mit. Der Rückgabewert einer jeden Funktion wird vom Aufrufer kontrolliert.
=== Main-Funktion ===
Mit Start der Anwendung übergibt das Betriebssystem die Kontrolle an die Anwendung und führt dort die Funktion main aus. Als Übergabe- und Rückgabeparameter sind folgende Varianten erlaubt:
<syntaxhighlight lang="C">
int main(void) { }
int main(int argc, char *argv[]) { }
</syntaxhighlight>
Mit dem Start der Anwendung kann, wie bei jedem Funktionsaufruf, Parameter an den startenden Prozess übergeben werden. Die Parameter werden als Array von Strings übergeben. Im Parameter argc ist die Anzahl der Strings enthalten. Im Parameter argv[0..argc-1] sind die einzelnen Strings enthalten. Sofern vorhanden ist im ersten String der Programmname/Aufrufname der Anwendung enthalten:
<syntaxhighlight lang="C">
int main(int argc, char *argv[]) {
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++)
printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int max_width=0;
int ret;
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++) {
ret=printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
max_width=ret>max_width ? ret : max_width;
}
//Trennzeichen drucken
char term[max_width];
memset(term,'-',max_width);
printf("%.*s\n",max_width-1,term);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Im Compiler-Explorer können die Parameter im Executor unter 'Execution Arguments', getrennt mit Leerzeichen eingegeben werden.
Wird die Funktion main beendet, entweder über die return Anweisung oder den Aufruf der exit() Funktion, wird die Kontrolle zurück an den startenden Prozess (zumeist Shell) gegeben. Über den Rückgabewert wird im Allgemeinen dem Aufrufer der Fehlerstatus mitgeteilt (EXIT_SUCCESS oder 0 bedeutet fehlerfreie , EXIT_FAILURE oder Werte ungleich 0 fehlerhafte Ausführung).
Hinweise:
* Der Return-Wert der main-Funktion kann mit >>echo $? in der Bash abgefragt werden
* Mittels <code>exit(int status)</code> kann das Programm an jeder Stelle innerhalb des Programms beendet werden. <code>status</code> entspricht dann der expression der return Anweisung von main()
* Ungeachtet des Rückgabedatentyps int bei der Defintion der main() Funktion beträgt der zulässige Wertebereich für Linux Anwendungen 0..255. Der korrekte Rückgabedatentyp der main() Funktion müsste somit 'unsigned char' lauten
=== Inline Funktion ===
Wie der Name inline andeutet, ist die Intention von Inline, dass die aufgerufen Funktion Bestandteil der aufrufenden Funktion ist. Die aufgerufene Funktion soll somit im Kontext des Aufrufers ausgeführt werden, so dass kein eigener Stack bereitgestellt werden muss. Der Start der Funktion kann somit schneller erfolgen:
<code>
inline int foo(void) { }
</code>
Das Funktionseinbindung/zusammenführung erfolgt durch den Compiler (und nicht durch den Linker). Damit das inline vom Compiler ausgeführt werden kann, muss die zu inlinende Funktion vor dem Aufruf definiert sein, d.h. sie muss in derselben C-Datei oder in einer der einzubindenden Header-Dateien enthalten sein [C11 6.7.4].
Hinweis:
* Das 'inlinen' von Funktionen über die eigene Objektdatei hinweg erfolgt in C/C++ über Link Time Optimization (LTO). Hierzu fügt der Compiler den Zwischencode mit in die Objektdatei, so dass der Linker das 'inlinen' vollziehen kann (siehe {{w|lang=en|Interprocedural_optimization| Interprocedural Optimization}})
=== Variadic Function / Ellipsis Punctuator ===
Mit dem Ellipsis Puncturator '…' kann in Funktionsdefinitionen angegebenen werden, dass an dieser Stelle beliebig viele Parameter/Argumente übergeben werden können. Dies wird unter anderen in der printf() Anweisung genutzt:
<syntaxhighlight lang="C">
int printf(const char *fmt, ... );
</syntaxhighlight>
Die wie folgt aufgerufen werden kann:
<syntaxhighlight lang="C">
printf("Hello World"); //es folgt kein Parameter
printf("%d",100); //es folgt ein Parameter vom Datentyp int
printf("%f",1.1); //es folgt ein Parameter vom Datentyp double
printf(conststr,1,2,3,"xyz") //Ohne Worte
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n"); //es folgt kein Parameter
printf("%d\n",100); //es folgt ein Parameter vom Datentyp int
printf("%f\n",1.1); //es folgt ein Parameter vom Datentyp double
const char *conststr="%d %x %c '%s'\n";
printf(conststr,1,2,33,"xyz"); //Ohne Worte
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei der Parameterübergabe wird der Datentyp nicht mit übergeben, so dass die aufgerufene Funktion keine Möglichkeit hat, den Datentype der Parameter zur Laufzeit zu ermitteln. Einzig werden bei Aufruf der variadischen Funktion so viel Bytes auf den Stack gelegt, wie der Datentyp der einzelnen Übergabeparameter groß ist:
:<code>int --> 4 Byte</code>
:<code>double --> 8 Bytes</code>
:<code>Zeiger --> 4/8 Byte</code>
Damit die aufgerufene Funktion die fehlende Datentypinformation dennoch mitgeteilt bekommt, erfolgt dies am Beispiel der printf Funktion über den Format-String:
<syntaxhighlight lang="C">
int vari;
printf("%d",vari); //%d erwartet einen Integer Übergabeparameter (4-Byte)
size_t vars;
printf(" %zu %d ", vars, vari); // %zu zur Mitteilung, dass anstatt
//integer nun size_t als Datentyp übergeben wird
//und somit anstatt 4 Bytes 8 Bytes vom Stack genommen werden
</syntaxhighlight>
<code>printf()</code> entnimmt entsprechend der Datentypbeschreibung im Formatstring die passende Anzahl an Bytes vom Stack.
Da der Compiler für die optionalen Parameter nicht den Zieldatentyp kennt, erlaubt die C-Spezifikation als Übergabedatentypen hier nur die Grunddatentypen <code>signed int, unsigned int, long, long long, double</code> und <code>Zeiger</code>. Entspricht der übergebene Parameter nicht einen dieser Datentypen, so wird er mittels implizit Cast entsprechend nachfolgender Tabelle gewandelt [C11 6.5.2.2 Default Argument Promotions]:
{| class="wikitable"
|-
! Ausgangstyp !! Umwandlungstyp
|-
| char, signed char, short || int
|-
| unsigned char, unsigned short || unsigned int
|-
| float || double
|-
| Alle anderen Datentypen || bleiben erhalten
|}
Bspw.:
<syntaxhighlight lang="C">
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Über den Length-Modifier Parameter im Formatstring kann printf mitgeteilt
//werden, dass von dem übergebenem Integerwert weniger Bytes zu
//interpretieren sind
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
Zum Umgang mit dem variadischen Parameter stellt C die Funktionen <code>va_start(), va_arg(), va_copy()</code> und <code>va_end()</code> bereit. Auf Grundlage des dazugehörigen Datentyps <code>va_list</code> können variadische Parameter auch an Unterfunktionen weitergereicht werden (bspw vprintf()). Dieses Thema bedingt jedoch genaue Kenntnisse vom Umgang mit dem Stack und ist nicht Bestandteil dieser Vorlesung.
=== Funktion in Funktion ===
Die GNU-C Reference (nicht C++) erlaubt es, Funktionen innerhalb von Blöcken (und damit innerhalb von Funktionen) zu definieren. Diese innere Funktion steht dann nur in diesem Block zur Verfügung und kann von außerhalb des Blockes nicht aufgerufen werden. Als Gimmick können Funktionen in Funktionen auf die zuvor definierten lokalen Variablen der inkludierenden Funktion zugreifen:
<syntaxhighlight lang="C">
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Variable Length Array (VLA) ==
Im Normalfall ergibt sich die Anzahl der Elemente eines Arrays aus einer Konstanten, so dass der Compiler zur Compilezeit passend Speicher reserviert (siehe Kap. [[Programmieren in C/C++: Array | Array]]):
<syntaxhighlight lang="C">
int arr[4]; //Compiler reserviert für Variable arr
//4*sizeof(int) Speicherplatz
</syntaxhighlight>
Bei Variable Lenght Array wird die Arraydimension nicht über eine Konstante, sondern über eine Variable oder einen Ausdruck angegeben. D.h. die tatsächliche Dimension des Arrays ergibt sich erst zum Ausführungszeitpunkt der Definition:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //Arraydimension ergibt sich zum Ausführungszeitpunkt
n++; //Nachträgliches Ändern von n ändert nicht
//die Größe des Arrays!
}
</syntaxhighlight>
Ein Variable Length Array kann nur als lokale Variable oder als Übergabeparameter definiert werden (wobei im letzteren Fall kein Speicher hiermit reserviert wird). Eine Initialisierung eines VLA's mit der Definition ist nicht möglich, d.h. nach der Definition beinhaltet das Array 'zufällige' Werte. Es empfiehlt sich daher, diese bspw. mit memset händisch zu initialisieren (siehe auch Kap [[Programmieren in C/C++: Array#Initialisierung | Array:Initialisierung]]):
<syntaxhighlight lang="C">
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
for(size_t lauf=0;lauf<n;lauf++)
printf("str[%zu]=%d\n",lauf,str[lauf]);
}
int main(int argc, char *argv[]) {
foo(4);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mittels sizeof kann weiterhin der Speicherbedarf ermittelt werden, wobei sizeof mit einem VLA als Argument kein Konstantenausdruck ist. Stattdessen wird die Größe zur Laufzeit ermittelt:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
printf("size=%zu\n",size);
}
int main(int argc, char *argv[]) {
foo(5);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
VLA wurden erstmals in C mit C99 eingeführt. In C11 wurden VLA's als optional eingestuft und mit C23 zurück auf notwendig gesetzt. In C++ sind VLA's nicht definiert, werden jedoch vom GCC Compiler unterstützt. Als alternativen Datentyp wird hier std::array empfohlen.
Hinweis:
* VLA sind nicht direkt in einem Switch-Case Block definierbar. Wird hier ein VLA benötigt, so muss hierzu ein Block erzeugt werden:
:<syntaxhighlight lang="C">
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int value=argc;
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Operatoren ==
In der Programmiersprache C sind folgende Punctuators [C11 6.4.6] definiert:
<syntaxhighlight>
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |= , # ##
<: :> <% %> %: %:%:
</syntaxhighlight>
Die Funktionalitäten sind identisch zu Java. Aufgrund des Datentyps Zeiger gibt es in C ergänzend den Punctuator <code>-></code> (siehe Kap [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++)|Datentypen:Verbundtyp Struktur/Klasse (nur C++)]]). Der Präprozessor bedingt die beiden Punctuatoren <code>#</code> und <code>##</code> (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]).
Die letzten 6 Punctuators <code><: :> <% %> %: %:%:</code> werden zu <code>[ ] { } # ##</code> ersetzt. Sie sind für Computersysteme gedacht, welche keine ALTGR-Taste besitzen.<br />
Java kennt ergänzend den <code>>>></code> Operatoren, welcher in C über den normalen Schiebebefehl und den zugrundeliegenden Datentyp gesteuert wird.
Wie in Java sind einige Punctuators vom Kontext abhängig und haben damit unterschiedliche Funktionalitäten:
<syntaxhighlight>
++ → (Postfix) ++ vs. ++(Präfix)
-- → (Postfix) -- vs. --(Präfix)
+/- → Vorzeichen vs. Addition/Subtraktion
() → Funktionsaufruf() vs. Befehlsbestandteil if() vs. Priorisierung
</syntaxhighlight>
Für den Umgang mit dem Datentyp Zeiger besitzen einige Punctuatoren ergänzende Funktionalitäten (siehe Kap [[Programmieren in C/C++: Zeiger| Zeiger]]):
<syntaxhighlight>
& → Bitweises UND:
Anwendung: Ganzahlausdruck & Ganzahlausdruck
& → Adressoperator:
Anwendung: &Variable
* → Multiplikation
Anwendung: Ganzahl-/Gleitkommaausdruck * Ganzahl-/Gleitkommaausdruck
* → Datentyp Zeiger
Anwendung: Datentyp * Variablenname;
* → Dereferenzierung:
Anwendung: * Zeiger
</syntaxhighlight>
Punctuatoren, welche von Java abweichende / ergänzende Funktionalitäten haben, werden nachfolgend gesondert beschrieben.
Sind in einer Anweisung mehrere Operatoren enthalten, so hängt die Abarbeitungsreihenfolge von der Rangfolge/Priorität der Operatoren ab (siehe [[Programmieren in C/C++: Grundlagen#Abarbeitungsreihenfolge | Abarbeitungsreihenfolge]]).<br />
Die Rangfolge ist identisch zu Java, wobei C mehr Operatoren kennt. Generell empfiehlt sich, lieber eine Klammer zu viel als zu wenig zusetzen. Klammern haben die höchste Priorität.
=== Zuweisungs-Operator ===
Die Zuweisung ('='-Operator, assignment expression) weist dem L-Value den R-Value zu.
Der Zuweisungs-Operator gibt den L-Value als Rückgabewert der Zuweisung zurück, so dass mehrere Zuweisungen in einem Ausdruck möglich sind. Die Abarbeitungsreihenfolge ist von rechts nach links (R-L Assoziativität). Wird der 'letzte' Rückgabewert nicht verwendet, so wird dieser verworfen (siehe Kap. [[Programmieren in C/C++: Grundlagen#Discarded Value / null statement | Discarded Value / null statement]]).<br />
Beispiel:
<syntaxhighlight lang="C">
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
//der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
//Compilerfehler geworfen wird
x*=y=z //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a,b,c=3,d=4;
int x,y,z;
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
; //der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
; //Compilerfehler geworfen wird
x*=y=z; //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen return 0;
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Auf beiden Seiten der Zuweisung muss der identische Datentyp stehen. Wenn andernfalls eine implizite Typkonvertierung nicht möglich ist, gibt der Compiler einen Fehler aus:
:<syntaxhighlight lang="C">
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
(void)b;
(void)c;
(void)d;
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
* Bei der Parameterübergabe beim Funktionsaufruf wird ebenfalls indirekt der Zuweisungs-Operator angewendet. Die Parameter des Aufrufers werden per Zuweisung den lokalen Variablen der aufgerufenen Funktion zugewiesen
:<syntaxhighlight lang="C">
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int main(int argc, char *argv[]) {
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
=== Komma-Operator ===
Der Komma-Operator erlaubt es, zwei Ausdrücke auszuführen, wo nur einer erlaubt wäre. Die Ergebnisse/Rückgabewerte aller durch diesen Operator verknüpften Ausdrücke, außer dem letzten werden verworfen. Der letzte Ausdruck dient als Rückgabewert.
Folgendes gilt es bei der Nutzung des Komma-Operators zu beachten:
* Der Komma-Operator wird von links nach rechts ausgewertet (L-R Assoziativität)
* Das Komma selbst stellt eine Sequence Point dar (siehe Kap [[Programmieren in C/C++: Grundlagen#Sequence Point|Sequence Point]])
* An Stellen, wo das Komma zum Syntax gehört (z.B. Trennung der Übergabeparameter bei der Funktionsdefinition und beim Funktionsaufruf, Trennung von Variablen bei der Variablendefinition/-deklaration, Trennung der enum Konstanten) muss der Ausdruck ergänzend geklammert werden, wenn der Komma-Operator gefordert ist
* Der Komma-Operator hat von allen Operatoren die niedrigste Priorität/Rangfolge, so dass dieser Operator als letztes 'ausgewertet' wird
Beispiel:
<syntaxhighlight lang="C">
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
int c=1,d=2,e=3;
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
void func(int value){}
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int value){
printf("func called with %d\n",value);
}
int main(int argc, char *argv[]) {
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
printf("a=%d\n",a);
int c=1,d=2,e=3;
printf("c=%d,d=%d,e=%d\n",c,d,e);
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
printf("c=%d,f=%d\n",c,f);
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'Sinnvolle' Anwendungsbeispiele:
* Bei For-Schleifen, so dass mehrere Variablen initialisiert und mehrere Variablen mit jedem Schleifendurchlauf geändert werden können:
:<syntaxhighlight lang="C">
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf]);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf])
printf("sum=%d lauf=%d\n",sum,lauf);
printf("sum=%d\n",sum);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der Return-Anweisung, bei welcher zur Darstellung der Zusammengehörigkeit mehrere Aktionen ausgeführt werden sollen:
:<syntaxhighlight lang="C">
return errno=EINVAL,-1;
return printf("Fehler"),-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <errno.h>
int foo(void) {
return errno=EINVAL,-1;
}
int far(void) {
return printf("Fehler\n"),-1;
}
int main(int argc, char *argv[]) {
printf("foo()=%d\n",foo());
printf("far()=%d\n",far());
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* An Stellen, wo nur eine Anweisung erlaubt ist (und man zu faul ist, einen Block zu öffnen)
:<syntaxhighlight lang="C">
if(…) y=2,z=3;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int y=0,z=0;
if(1) y=2,z=3;
printf("y=%d z=%d\n",y,z);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In vielen Ländern wird das Komma zur Darstellung von Gleitkommazahlen genutzt. Wird versehentlicher Weise dies in C/C++ übernommen, so führt dies zu einem unerwarteten Verhalten:
:<syntaxhighlight lang="C">
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
printf("var=%f\n",var);
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
printf("var=%f\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== ?-Operator / Conditional-Operator ===
Operator mit 3 Operanden, welcher in Abhängigkeit des ersten Ausdruckes den zweiten oder dritten Ausdruck ausführt und dessen Rückgabewert zurückgibt.
<code>
Syntax: Logical-OR-expression ? expression : condition-expression
</code>
Entspricht der if()-Anweisung, wobei der ?-Operator als solches einen Wert zurückgibt! <code>Expression</code> wird nur ausgeführt, wenn <code>Logical-OR-Expression</code> zu true ausgewertet wird. Andernfalls wird <code>condition-expression</code> ausgeführt. Der zurückgegebene Datentyp ergibt sich aus der <code>expression</code> resp. <code>condition-expression</code>. '''Beide Ausdrücke sollten somit einen identischen resultierenden Datentyp besitzen!'''
Folgendes gilt es bei der Nutzung des ?-Operators zu beachten:
* Der Datentyp <code>expression</code> und <code>condition-expression</code> sollte identisch sein:
<syntaxhighlight lang="C">
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Nach der GNU-C Reference kann der mittlere Ausdruck fehlen. In diesem Fall wird stattdessen das Ergebnis des linken Operanden dort eingesetzt (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)
<syntaxhighlight lang="C">
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
printf("b=%d\n",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* In der Abarbeitungsreihenfolge liegt der ?-Operator oberhalb der Komma- und des Zuweisungsoperators. Soll im <code>condition-expresion</code> Ausdruck der Komma- oder Zuweisung-Operator genutzt werden, so ist <code>condition-expression</code> zu klammern. Andernfalls bedingt die niedrige Priorität des Komma-Operators ein anders Verhalten, als erwartet:
<syntaxhighlight lang="C">
int a=7,max=5,var;
max=a>max ? a : max; //Alles bestens
var= a>5 ? a++,5:6; //Alles bestens
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=7;
int max=5;
max=a>max ? a : max; //Alles bestens
printf("max=%d\n",max);
int var;
var= a>5 ? a++,5:6; //Alles bestens
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
printf("var=%d a=%d\n",var,a);
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
printf("var=%d a=%d\n",var,a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Nutzung des ?-Operators empfiehlt sich an diversen Stellen:
* Bei Makros:
:<syntaxhighlight lang="C">
#define MAX(a,b) (a>b?a:b)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
int main(int argc, char *argv[]) {
printf("MAX(4,5)=%d\n",MAX(4,5));
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Beim Fehlerhandling:
:<syntaxhighlight lang="C">
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion ausgeführt wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn ret==0 ist
//andernfalls wird ret zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 0;
}
int init2(void) {
printf("init2() called\n");
return 0;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn Ret==0 ist
//andernfalls wird Ret zurückgegeben
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Logische Verknüpfungen ===
Alle logischen Operationen nutzen als Operanden Ganzzahlen ,Gleitkommazahlen oder Zeiger. Der Operand wird als false angesehen, wenn der Operand 0, 0.0 oder NULL ist. Andernfalls als true. Das Ergebnis ist immer vom Datentyp int und hat den Wert von 0 oder 1.
<code>Syntax: Expression && Expression</code><br />
<code>Syntax: Expression || Expression</code><br />
<code>Syntax: ! Expression</code><br/>
Bei der logischen UND und ODER Verknüpfung wird zuerst der linke Ausdruck ausgewertet (Operator ist ein Sequence Point). Der rechte Ausdruck wird nur ausgeführt, wenn:
* bei der logischen UND Verknüpfung der linke Ausdruck TRUE ergab
* bei der logische OR Verknüpfung der linke Ausdruck FALSE ergab
Andernfalls steht das Ergebnis schon mit der Auswertung des linken Operanden fest.<br />
In der theoretischen Informatik wird dies 'Non-strict-evaluation' genannt, bei welcher der Rückgabewert feststeht, bevor alle Ausdrücke bearbeitet worden sind.
Beispiel für das Verhalten des Ausbleibens der Auswertung des zweiten Operators:
<syntaxhighlight lang="C">
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a || ++a)
b=1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a {{!}}{{!}} ++a)
b=1;
printf("a=%d b=%d\n",a,b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Diese Funktionalität ist insbesondere beim Umgang mit Fehlern vorteilhaft:
* Prüfen, ob eine Variable einen gültigen Wert hat, bevor sie weiterverwendet wird
<syntaxhighlight lang="C">
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
else
printf("Kein Substring im String gefunden\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion aufgerufen wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 1;
}
int init2(void) {
printf("init1() called\n");
return 1;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Bitweise Verknüpfungen ===
Alle bitweisen Operationen nutzen als Operanden Ganzzahlen. Bei vorzeichenbehafteten Zahlen ist das Ergebnis nach [C11 6.5] Implementierungsabhängig, wobei das Vorzeichenbit zumeist als eigenständiges Bit angesehen wird und bei UND/ODER/EXOR als normales BIT betrachtet wird.
<code>Syntax: Ganzzahl & Ganzzahl → Bitweise UND Operation</code><br />
<code>Syntax: Ganzzahl | Ganzzahl → Bitweise ODER Operation</code><br />
<code>Syntax: Ganzzahl ^ Ganzzahl → Bitweise EXOR Operation</code><br />
<code>Syntax: ~ Ganzzahl → Bitweise Negierung</code><br />
<code>Syntax: Ganzzahl >> additive-expression</code><br />
<code>Syntax: Ganzzahl << additive-expression</code><br />
Mittels des Schiebeoperators können '''Ganzzahlen''' um <code>additive-expression</code> bitweise nach Links <code><<</code> oder Rechts <code>>></code> verschoben werden. Der resultierende Datentyp ergibt sich aus dem linken Operanden. Der rechte Operand muss positiv und der Wert kleiner gleich der Bitbreite des linken Operanden sein. Andernfalls ist das Ergebnis implementierungsspezifisch.
Nach [C11 6.5.7] ist das Ergebnis der Schiebeoperation implementierungsspezifisch, wenn der linke Operand eine negative vorzeichenbehaftete Zahl ist. In der Regel wendet der Compiler jedoch folgende Schiebeoperation an:
* Logisches Schieben (zu füllende Bit-Stellen werden mit 0 aufgefüllt), wenn der linke Operand einen vorzeichenlosen Datentyp hat
* Arithmetisches Schieben (zu füllende Bit-Stelle beim Rechtsschieben wird mit dem Vorzeichenbit aufgefüllt), wenn der linke Operand ein vorzeichenbehaftete Datentyp ist. Hiermit wird das Vorzeichen beibehalten, so dass eine negative Zahl nach dem Schieben weiterhin negativ ist (In Java erfolgt dies durch den >>> - Operator)
Hinweis:
* Ein Schieben um eine Stelle nach rechts entspricht einer Division durch 2
* Ein Schieben um eine Stelle nach links entspricht einer Multiplikation mit 2
=== sizeof-Operator ===
Der sizeof-Operator dient zur Ermittlung des Speicherbedarfs (in Bytes) einer Variablen/eines Datentyps.
<code>Syntax: sizeof (type-name)</code><br />
<code>Syntax: sizeof unary-expression</code><br />
Als Argument für den Sizeof-Operator kann wahlweise ein Datentyp, eine Variable oder ein Ausdruck genutzt werden. Sizeof gilt als Konstantenausdruck, d.h. seine Berechnung erfolgt durch den Compiler, sodass:
* sizeof zur Initialisierung von globalen Variablen genutzt werden
:<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz); //3*sizeof(int)=12
int main(int argc, char *argv[]) {
printf("size=%zu\n",size);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* bei einem Ausdruck dieser nicht ausgeführt wird, sondern nur der resultierende Datentyp bestimmt wird und dessen Größe zurückgegeben
:<syntaxhighlight lang="C">
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der resultierende Datentyp des Rückgabewertes ist <code>size_t</code>.
Es empfiehlt sich, den sizeof-Operator mit Klammern zu nutzen, andernfalls gibt sizeof bei Anwendung auf einen Ausdruck die Größe des linken Operators zurück:
<syntaxhighlight lang="C">
size_t size;
short var;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
size_t size;
short var=0;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
printf("size=%zu var=%d\n",size,var);
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* sizeof angewendet auf char gibt immer den Wert 1 zurück.
* sizeof ist nicht auf Operanden vom Typ Funktion, void, Felder ohne Größenangabe und Bitfelder anwendbar
* wird sizeof auf ein VLA angewendet, so entspricht sizeof nicht mehr einen Konstantenausdruck, sondern einem Funktionsaufruf
:<syntaxhighlight lang="C">
void foo(int n) {
int arr[n];
size_t size=sizeof(arr); //Speicherbedarf ist kein Konstantenausdruck
//sondern wird zur Laufzeit berechnet
</syntaxhighlight>
* Sizeof entspricht nicht strlen(), da sizeof die Größe des für die Variable reservierten Speicherbereich zurückgibt und nicht wie strlen() den Inhalt des Speicher hinsichtlich des Stringendezeichens auswertet:
:<syntaxhighlight lang="C">
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Anweisungen ==
=== If-Anweisung ===
<code>Syntax: if (expression) statement</code><br />
<code>Syntax: if (expression) statement else statement</code><br />
Das Ergebnis des Ausdruckes (Ganzzahl, Gleitkommazahl oder Zeiger) wird auf ungleich 0, 0.0 oder NULL getestet. Trifft dies zu, so wird <code>statement</code> ausgeführt. Andernfalls wird das <code>else statement</code> ausgeführt, sofern vorhanden. Sollen mehrere Anweisungen ausgeführt werden, so sind diese mittels Block zusammenzufassen (diesen dann bitte nicht mit ; abschließen).
Beispiel:
<syntaxhighlight lang="C">
if(a==1)
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
if(a) //entspricht a!=0
if(printf("hallo")<0) //prüfen, ob printf() fehlschlägt
if( ({int dummy=a;a=b;b=dummy;})==6)
if(a=7) //Zuweisung!
if(7=a) //KO, Eine Konstante kann kein L-Value sein
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1,b=2;
if(a==1)
printf("a==1\n");
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
printf("a=1\n");
if(a) //entspricht a!=0
printf("a\n");
if(printf("hallo\n")<0) //prüfen, ob printf() fehlschlägt
printf("printf()\n");
if( ({int dummy=a;a=b;b=dummy;})==6)
printf("({...})\n");
if(a=7) //Zuweisung!
printf("a=7\n");
if(7=a) //KO, Eine Konstante kann kein L-Value sein
;
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei der Anweisung <code>if(a==7)</code> finden aus syntaktischer Sicht zwei Aktionen statt. Zunächst wird geprüft, ob a gleich 7 ist. Dieser Vergleich liefert true(=1) oder false(=0) zurück. Die If-Anweisung prüft im Anschluss, ob das Argument true oder false ist.
=== For-Anweisung ===
<code>Syntax: for(Initialisierungsteil<sub>OPT</sub> ; Test<sub>OPT</sub> ; Fortsetzung<sub>OPT</sub>) Statement</code>
Die For-Anweisung wird vom Compiler wie folgt umgesetzt:
<poem> '''Initialisierungsteil'''<sub>OPT</sub>
Goto Next
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
'''Statement'''
Continue:
'''Fortsetzung'''<sub>OPT</sub>
Next:
if('''Test'''<sub>OPT</sub>) goto Goon
Break:
</poem>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
for(summe=lauf=0;lauf<20;lauf++)
summe+=lauf;
printf("summe=%d\n",summe);
//Initialisierungsteil
summe=lauf=0;
goto Next;
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
//Statement
summe+=lauf;
Continue: __attribute__((unused))
//Fortsetzung
lauf++;
Next:
//if(TestOPT) goto Goon
if(lauf<20) goto Goon;
Break: __attribute__((unused))
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die einzelne Elemente haben folgende Bedeutung/Besonderheiten:
;Initialisierungsteil: Zum Initialisieren von Schleifenvariablen, wird einmalig mit Beginn der FOR-Anweisung ausgeführt.
:* kann Leer sein, dann erfolgt keine Initialisierung
:* Ab C99: Hier kann eine (lokale) Variable definiert werden, welche nur innerhalb dieser For-Anweisung gültig ist
;Testteil: Hierin wird vor jedem Schleifendurchlauf geprüft, ob die Schleifenbedingung erfüllt ist. Wenn die Bedingung nicht erfüllt ist (Ganzzahl, Gleitkommazahl oder Zeiger gleich 0,0.0 oder NULL), wird die For-Schleife beendet.
:* Kann leer sein, dann wird dieser Teil als true angesehen
;Fortsetzungsteil: Wird nach jeden Schleifendurchlauf ausgeführt. In der Regel sollte hier die Schleifenvariable aktualisiert werden
:* Kann leer sein
;Statement: In der Schleife auszuführender Ausdruck
:* Sollen mehrere Ausdrücke ausgeführt werden, so sind diese in einem Block zusammen zu fassen.
Ergänzende Anweisungen innerhalb des Statements/Block
* <code>continue</code> zum Fortsetzen des Schleifendurchlaufes, d.h. Sprung zum Fortsetzungs-Teil
* <code>break</code>, zum Beenden des Schleifendurchlaufes
Beispiele:
* For-Schleife mit lokaler Schleifenvariable
:<syntaxhighlight lang="C">
char string[]="hallo";
for(size_t lauf=0; lauf < strlen(string); lauf++)
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife mit Break-Anweisung
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
printf("lauf=%zu\n",lauf);
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife, bei welcher die gesamte Aktion innerhalb der For-Anweisung ausgeführt wird
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;
src[l]!=0 && l <sizeof(dest);
printf("l=%zu\n",l),dest[l]=src[l],l++);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;src[l]!=0 && l <sizeof(dest); printf("l=%zu\n",l),dest[l]=src[l],l++);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleifenvariable muss keine Zählvariable sein
:<syntaxhighlight lang="C">
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
printf("Anzahl Einsen in %b = %d\n",zahl,bits);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zeiger als Schleifenvariable
:<syntaxhighlight lang="C">
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
printf("src='%s' dst='%s'\n",src,dst);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Auch wenn einige Compiler bei eingeschalteter Optimierung die Fähigkeit besitzen, Funktionsaufrufe innerhalb des Test- und Fortsetzungsteil vor die Schleife zu verschieben (siehe: [https://xania.org/202512/13-licking-licm Loop-Invariant Code Motion]), so sollten Funktionsaufrufe an diesen Stellen vermieden werden. Einerseits zeugt dies von schlechten Programmierstiel und andererseits führt dies bei ausgeschalteter Optimierung zu Performanceeinbußen:
:<syntaxhighlight lang="C">
for(size_t lauf=0;lauf<strlen("hallo");lauf++)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zur Geschwindigkeitssteigerung sollte im Testteil auf 0 abgefragt werden, d.h. die Schleifenvariable dekrementiert werden:
:<syntaxhighlight lang="C">
for(int lauf=700000;lauf;lauf--)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(ssize_t lauf=700000000;lauf;lauf--)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
for(ssize_t lauf=0;lauf<700000000;lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Alternativ zu einer Laufvariablen empfiehlt sich die Nutzung von Pointer als Schleifenvariable:
:<syntaxhighlight lang="C">
for(char *ptr=str; *ptr; ptr++);
</syntaxhighlight>
* Verzweigungsbefehle sind einige der langsamsten Maschinenbefehl. Zur Vermeidung von diesen Maschinenbefehle 'entrollen' die Compiler bei eingeschalter Optimierungen und bekannter kleiner Anzahl von Schleifendurchläufe die For-Schleife (siehe: [https://xania.org/202512/10-loop-unrolling Unrolling Loops])
:<syntaxhighlight lang="C">
for(int lauf=4;lauf;lauf--)
sum+=arr[lauf];
//wird aufgrund bekannter Anzahl der Schleifendurchläufe wie folgt entrollt
sum+=arr[4];
sum+=arr[3];
sum+=arr[2];
sum+=arr[1];
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <string.h>
int arr[5];
void arr_init(void) {
memcpy(arr,(int []){1,2,3,4,6},sizeof(arr));
}
int main(int argc, char *argv[]) {
arr_init();
int sum;
sum=0;
for(int lauf=4;lauf;lauf--)
sum+=arr[lauf];
printf("sum=%d\n",sum);
//wird aufgrund bekannter Anzahl der Schleifendurchläufe wie folgt entrollt
sum=0;
sum+=arr[4];
sum+=arr[3];
sum+=arr[2];
sum+=arr[1];
printf("sum=%d\n",sum);
//Zur Darstellung von Loop-Runling Compiler-Option -O0 auf -O1 ändern
return 0;
} | execCompilerOptions=-Wall -O0|
h=c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== While-Anweisung ===
<code>Syntax: while(expression) Statement </code><br />
<code>Syntax: do Statement while(expression);</code><br />
Die While-Anweisungen werden vom Compiler wie folgt umgesetzt:
{| class="wikitable"
! while()-Anweisung !! do while()-Anweisung
|-
| <poem>
Continue:
if(!'''expression''')
goto Break
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
'''Statement'''
goto Continue
Break:
</poem> ||
<poem>
GoOn:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
'''Statement'''
Continue:
if('''expression''')
goto GoOn
Break:
</poem>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
lauf=summe=0;
while(lauf<10) {
if(lauf>=5)
break;
lauf++;
if(lauf<3)
continue;
summe+=lauf;
}
printf("summe=%d\n",summe);
lauf=summe=0;
Continue1:
if(!(lauf<10))
goto Break1;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
//Statement
if(lauf>=5) {
goto Break1;
}
lauf++;
if(lauf<3)
goto Continue1;
summe+=lauf;
goto Continue1;
Break1:
printf("summe=%d\n",summe);
lauf=summe=0;
do {
lauf++;
if(lauf>5)
break;
if(lauf<3)
continue;
summe+=lauf;
} while(lauf<10);
printf("summe=%d\n",summe);
lauf=summe=0;
GoOn2:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
//Statement
lauf++;
if(lauf>5)
goto Break2;
if(lauf<3)
goto Continue2;
summe+=lauf;
Continue2:
if(lauf<10)
goto GoOn2;
Break2: __attribute__((unused));
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Folgendes gilt es bei der Nutzung der While-Anweisung zu beachten:
* Soll mehr als ein Statement innerhalb der While-Schleife ausgeführt werden, so sind diese in einem Block zu schreiben
* Statement kann eine Leeranweisung (gekennzeichnet durch ein Semikolon) sein
:<syntaxhighlight lang="C">
while(1);
do ; while(1);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf1=1000;
while(lauf1--);
int lauf2=1000;
do ; while(lauf2--);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der do-While-Schleife ist das abschließende Semikolon Bestandteil des Befehls
* expression muss eine Ganzzahl, Gleitkommazahl oder Zeiger zurückgeben, der bei False (0, 0.0 oder NULL) die Schleife beendet.
Beispiele:
* Endlosschleife
:<syntaxhighlight lang="C">
while(1) {}
</syntaxhighlight>
* Schleife zum Durchlaufen eines String
:<syntaxhighlight lang="C">
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
printf("Stringlänge=%zu\n",len);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Switch-Anweisung ===
<code>Syntax: switch(expression) statement</code><br />
<code>Syntax: statement:= case constant-expression: statement<sub>opt</sub> default: statement<sub>opt</sub></code><br />
Die Switch-Anweisung entspricht einer verschachtelten If-Anweisung, mit der Besonderheit, dass der auszuführende Code nicht im If-Zweig stattfindet, sondern dort ein goto zum eigentlichen Code enthalten ist:
{| class="wikitable"
! Switch-Anweisung !! Compilerumsetzung
|-
|<syntaxhighlight lang="C">
switch(a) {
case 1:
int a=7;
//Code
break;
case 2:
printf("%d",a);
case 3: {
int a;
//Code
}
case 4 ... 8:
default:
//Code
}
</syntaxhighlight>
||<poem>
if(a==1)
goto label1;
else if(a==2)
goto label2;
else
goto label_default;
//-------------------
label1:
//Code
goto label_break;
label2:
//Code
label_default:
goto label_break;
label_break:
</poem>
|}
Folgendes gilt es bei der Nutzung der Switch-Anweisung zu beachten:
* <code>Expression</code> muss zu einer Ganzzahl (int, short, char, long, long long) oder enum (entspricht einer Ganzzahl) ausgewertet werden
* <code>constant-expression</code> muss eine Ganzzahl-Konstante oder ein Enumelement sein. Sie darf nicht doppelt im Block vorkommen. Der genaue Datentyp ergibt sich aus dem Datentyp der <code>expression</code>
* Lt. Spezifikation ist ein nur <code>statement</code> hinter der switch-Anweisung erlaubt, so dass nur ein <code>case</code> Fall oder der <code>default</code> Fall bedient werden kann::<syntaxhighlight lang="C">
int var=1;
switch(var) case 1: printf("hallo");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) case 1: printf("hallo");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweifte Klammer der <code>switch</code>-Anweisung erzeugt einen Block, so dass a) hier mehrere <code>case</code>-Fälle und b) hierin definierte Variablen innerhalb des gesamten Blocks zur Verfügung stehen (sind somit nicht <code>case</code> abhängig). Die <code>case</code> Anweisung ist nichts anderes als eine Sprungmarken (welche durch die switch-Anweisung angesprungen wird) so dass der Initialisierungsteil der lokalen Variablen übersprungen / nicht ausgeführt werden kann:
:<syntaxhighlight lang="C">
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("%d %d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
break;
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1;
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("a=%d b=%d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
(void)a;
break;
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* GNU-C (siehe [https://www.gnu.org/software/c-intro-and-ref/manual/html_node/switch-Statement.html Switch-Statement]) erlaubt ergänzend zur Angabe einer Konstante die Angabe eines Wertebereiches:
:<syntaxhighlight lang="C">
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=2;
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
printf("a im Bereich von 1 bis 8\n");
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* <code>break</code> ist optional. Mittels <code>break</code> wird an das Ende der Switch-Anweisung gesprungen. Wenn <code>break</code> weggelassen wird, wird die nachfolgende Anweisungen ausgeführt. Ggf. gibt der Compiler eine Warning aus. Mittels der GCC-Compiler-Anweisung __attribute__((fallthrough)); kann diese Warning unterdrückt werden:
:<syntaxhighlight lang="C">
switch(a) {
case 0: //ggf. Compiler-Warning
__attribute__((fallthrough)); case 1:
case 2:
break;
}
</syntaxhighlight>
* Ein Variable Length Array ist als Variable im Switch-Block direkt nicht erlaubt. Ist dies notwendig, so ist das VLA in einem inneren Block zu kapseln:
:<syntaxhighlight lang="C">
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Case - Anweisungen sind nichts anderes als Sprungmarken (Labels), so dass CASE-Anweisungen überall innerhalb des Switch-Blockes stehen können:
:<syntaxhighlight lang="C">
int prime(int value) {return value+1;}
void hallo(int var) {
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int prime(int value) {
return value+1;
}
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:oder anderen Anweisungen innerhalb des Switch-Blockes enthalten sein können:
:<syntaxhighlight lang="C">
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++;
case 7: *dst = *src++;
case 6: *dst = *src++;
case 5: *dst = *src++;
case 4: *dst = *src++;
case 3: *dst = *src++;
case 2: *dst = *src++;
case 1: *dst = *src++;
}while(--n>0);
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h> //fuer uintptr_t
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++; printf("%02hhx ",*dst);
case 7: *dst = *src++; printf("%02hhx ",*dst);
case 6: *dst = *src++; printf("%02hhx ",*dst);
case 5: *dst = *src++; printf("%02hhx ",*dst);
case 4: *dst = *src++; printf("%02hhx ",*dst);
case 3: *dst = *src++; printf("%02hhx ",*dst);
case 2: *dst = *src++; printf("%02hhx ",*dst);
case 1: *dst = *src++; printf("%02hhx ",*dst);
}while(--n>0);
}
}
int main(int argc, char *argv[])
{
char src[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char dst;
send(&dst,src,20);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Eine Switch-Case Anweisung über Strings sind in C/C++ nicht möglich:
:<syntaxhighlight lang="C">
switch(str) {
case "hallo":
return 1;
case "du da":
return 2;
case "xyz":
return 3;
default:
rReturn -1;
}
</syntaxhighlight>
:Ein direkte Lösungsansatz ist die Nutzung von strcmp() zum Vergleichen von String. Da strcmp zeichenweise den String vergleicht, ist dieser Ansatz langsam. Alternativ bietet sich an, von allen String einen Hash-Wert zu berechnen und zunächst diesen Hash-Wert zu kontrollieren. Da der Hash-Wert nicht eindeutig ist, muss ergänzend ein strcmp() erfolgen:
:<syntaxhighlight lang="C">
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h>
//Lösungsansatz von: https://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
#define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
#define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
#define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
#define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
#define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
#define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
#define HASH_LAUFZEIT(s) (H256(s,0,0))
//Eigener Lösungsatz zur Umsetzung des vorherigen HASH-Algorithmus
//so dass dieser zur Compilezeit berechnet werden kann
//Was fehlt ist die abschließende EXOR berechnung!
//Problem war, dass die Array-Dereferenzierung nicht zur Compilezeit
//aufelöst werden kann
#define HH0(a,x) (x*65599u+a)
#define HH1(a) HH0(a,HH0(0,HH0(0,HH0(0,0))))
#define HH2(a,b) HH0(b,HH0(a,HH0(0,HH0(0,0))))
#define HH3(a,b,c) HH0(c,HH0(b,HH0(a,HH0(0,0))))
#define HH4(a,b,c,d) HH0(d,HH0(c,HH0(b,HH0(a,0))))
#define HH4x(a,b,c,d,x) HH0(d,HH0(c,HH0(b,HH0(a,x))))
#define HH5(a,b,c,d,e) HH4x(b,c,d,e,HH4x(0,0,0,a,0))
#define HH6(a,b,c,d,e,f) HH4x(c,d,e,f,HH4x(0,0,a,b,0))
#define HH7(a,b,c,d,e,f,g) HH4x(d,e,f,g,HH4x(0,a,b,c,0))
#define HH8(a,b,c,d,e,f,g,h) HH4x(e,f,g,h,HH4x(a,b,c,d,0))
#define HH9(a,b,c,d,e,f,g,h,i) HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0)))
#define HH10(a,b,c,d,e,f,g,h,i,j) HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0)))
#define HH11(a,b,c,d,e,f,g,h,i,j,k) HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0)))
#define HH12(a,b,c,d,e,f,g,h,i,j,k,l) HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0)))
#define HH13(a,b,c,d,e,f,g,h,i,j,k,l,m) HH4x(j,k,l,m,HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0))))
#define HH14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) HH4x(k,l,m,n,HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0))))
#define HH15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) HH4x(l,m,n,o,HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0))))
#define HH16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) HH4x(m,n,o,p,HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0))))
#define EIGHTEENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \
a11,a12,a13,a14,a15,a16,a17,a18, ...) a18
#define CONCAT(c,d) c ## d
#define CONCATI(a,b) CONCAT(a,b)
#define HASH_COMPILEZEIT(...) CONCATI(HH , EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0))(__VA_ARGS__)
//Lösungsansatz basierend auf: https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/preprocessor/macros/__VA_ARGS__/count-arguments
#define COUNT_ARGUMENTS(...) EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main(int argc, char *argv[]) {
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:Siehe:[https://benhoyt.com/writings/hash-table-in-c/ Hash Table in C]
== Label + Goto ==
=== Label ===
<code>Syntax: name:</code><br />
Labels dienen zur Kennzeichnung einer Anweisung, so dass die Programmausführung an dieser Stelle fortgesetzt, resp. mit einer GOTO-Anweisung angesprungen werden kann. Ein Label ist durch den folgenden Doppelpunkt gekennzeichnet. Dem Label muss eine Anweisung folgen, welches auch eine Leeranweisung (Semikolon) sein kann.
Folgendes gilt es bei der Nutzung von Labels zu beachten:
* Ein Label entspricht der Speicheradresse des der Label-Anweisung folgenden Anweisung
* Bei nicht genutzten Labels (mit goto nicht angesprungene Labels) gibt der Compiler eine Warning aus. Diese kann beim GCC-Compiler mit __attribute__((unused)) unterdrückt werden
* die Case- und die Default-Anweisung aus der Switch-Anweisung entspricht einem Label
<br />
Labels hat eine funktionsweite Sichtbarkeit (siehe Kap [[#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]). Dies bedeutet, dass das:
* Labels nur innerhalb einer Funktion gültig ist
* Labels einen von Variablen/Funktionen/Datentypen unabhängigen Namensraum haben
* Kein Prototyp für ein Label notwendig ist, wenn es bei Nutzung über goto noch nicht gesetzt worden ist, also nach vorne gesprungen wird
=== goto ===
<code>Syntax: goto label;</code><br />
Mit der Goto-Anweisung wird die Programmausführung an der mit <code>label</code> gekennzeichneten Stelle fortgesetzt.
Folgendes gilt es bei der Nutzung von goto zu beachten:
* Mit einer <code>goto</code> Anweisung kann an eine beliebige Steller innerhalb der '''identischen''' Funktion gesprungen werden. Es kann nicht zu einem Label in einer anderen Funktion gesprungen werden (hierzu ist <code>setjmp()</code> und <code>longjmp()</code> zu nutzen)
* Mit der Goto Anweisung kann gleichermaßen in einen Block hinein, als auch herausgesprungen werden:
:<syntaxhighlight lang="C">
goto first_time;
for(;;) {
if(a>10)
goto last_time:
first_time:
a++;
}
last_time: ;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0;
goto first_time;
for(;;) {
printf("a=%d\n",a);
if(a>10)
goto last_time;
first_time:
a++;
}
last_time: ; //Leeranweisung wäre hier nicht nötig
return 0; //da dem Label ein return folgt!
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Wird mit der <code>goto</code> Anweisung der Initialisierungsteil einer Variablen übersprungen, so ist zwar die Variable existent, beinhaltet aber nicht ihren Initialisierungswert
Beispiel:
<syntaxhighlight lang="C">
goto label1;
if(a==3) {
label2:
printf("True\n");
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=3;
goto label1;
if(a==3) {
label2:
printf("True\n");
a++;
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In Java gibt es das Schlüsselwort goto, welches aber ohne Funktion ist. Es gibt jedoch Labels, die mit "break label" angesprungen werden können
=== Anwendungsbeispiele ===
Prinzipiell sind Goto-Anweisungen zu vermeiden. In einigen Anwendungsfällen erweist sich goto als nützlich:
* Nutzung nur einer <code>return</code> Anweisung in einer Funktionen
:<syntaxhighlight lang="C">
#include <unistd.h>
int input(int hdl,size_t buflen) {
int rc=-1;
unsigned char packettype;
if(read(hdl,&packettype,1) != 1)
goto exit;
unsigned short packetlen;
if(read(hdl,&packetlen,2) != 2)
goto exit;
if((1+packetlen) > buflen) {
rc=-2;
goto exit;
}
rc=packetlen;
exit:
return rc;
}
</syntaxhighlight>
* Konstruktor mit mehreren Initialisierungsteilen
:<syntaxhighlight lang="C">
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Abbruch einer verschachtelten Schleife
:<syntaxhighlight lang="C">
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Sonstiges ==
=== ??-Trigraphs ===
Zeichenfolge bestehend aus 3 Zeichen beginnend mit 2 Fragezeichen.
Die beiden Fragezeichen entsprechen einem ESCAPE-Operator (siehe Kap [[#Char-Konstanten|Char-Konstanten]]), welcher das nachfolgende Zeichen durch ein anderes ASCII Zeichen ersetzt. Die Ersetzung findet auch innerhalb von Strings statt.<br />
Trigraphs wurden früher genutzt, als die ALTGR Taste noch nicht üblich war.
<syntaxhighlight>
??< → { ??> → }
??( → [ ??) → ]
??/ → \ ??! → |
??' → ^ ??- → ~
??= → #
</syntaxhighlight>
Bei neuer C Varianten muss zur Nutzung von Trigraphs der Compiler mittels -trigraphs aktiviert werden.
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
7dwibisyh3g9f51lh5kzyfsuuxmtr6q
1090666
1090665
2026-09-10T15:30:07Z
D. Justen
102048
Komma entfernt
1090666
wikitext
text/x-wiki
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
<!-- Falls du ein automatisch erstelltes Inhaltsverzeichnis nicht willst, ersetze das nachfolgende TOC durch NOTOC -->
<!-- Einklammerung mit noinclude, damit dieses nicht in der Druckversion erscheint -->
<noinclude>__TOC__</noinclude>
Die Programmiersprache C/C++ beinhaltet mehrere Sprachen/ Syntaxen:
* C-Syntax
* Präprozessor-Syntax
* Printf/Scanf Formatstring Syntax
* Terminal Emulation
* Compiler/Linker Anweisungen
Letztere beiden werden nur rudimentär in dieser Vorlesung/diesem Skript behandelt. Alle anderen sind Bestandteil dieser Vorlesung.
In diesem Kapitel sollen zunächst allgemeine Eigenschaften der Sprache, der grundlegende Syntax und die Kontrollstrukturen erklärt werden. Bei vielen Erklärungen sind Code-Beispiele vorhanden. Da man aus Fehlern am meisten lernt, sind zum Teil auch negative Beispiele enthalten. Für ein besseres Verständnis empfiehlt es sich, Code-Beispiele selbst nachzuvollziehen.<br />
Sofern sich die Eigenschaften auf eine bestimmte C-/C++- oder Compiler-Version beziehen, wird dies gesondert vermerkt.
== Zeichensatz ==
Der Syntax von C nutzt die unteren 128 Zeichen des ASCII Zeichensatzes. Da UTF-8 in den ersten 128 Zeichen deckungsgleich zu ASCII ist, kann auch dieser zur Erstellung des Source Codes genutzt werden.
Zeichen außerhalb dieses gültigen Zeichensatzes können folglich nur in Strings oder Kommentaren vorkommen. Werden Zeichen außerhalb der unteren 128 Zeichen in Strings genutzt, so gilt Folgendes zu berücksichtigen:
* Die String-Funktionalitäten der Standard-C Library gehen von dem regulären ASCII Zeichensatz aus, so dass z.B. die Suche, der Vergleich oder die Konvertierung fehlschlagen kann
* Strings werden oftmals in Verbindung mit printf() genutzt, d.h. auf der Standardausgabe ausgegeben. Der verwendete Zeichensatz sollte hier identisch zum verwendeten Zeichensatz der Terminal-Emulation sein!
== Kommentarzeichen ==
Kommentare dienen dazu, den Source Code mit zusätzlichen Hinweisen zu versehen, so dass die Intension der Anweisungen sichtbar wird. Kommentarzeichen werden durch den Compiler vor dem eigentlichen Übersetzungsdurchlauf entfernt und durch ein Leerzeichen ersetzt [C11 6.4.9]. Innerhalb von Strings wird nicht nach Kommentarzeichen gesucht.
<code>
Syntax: /* */
</code>
Blockkommentar zum Kommentieren eines Bereiches, auch über mehrere Zeilen hinweg. Dieses Kommentarzeichen kann nicht verschachtelt werden, d.h. '*/' beendet die Kommentierung, unabhängig von der Anzahl der zuvor geöffneten Kommentierungen!
<code>
Syntax: //
</code>
Zeilenkommentar zum Kommentieren bis zum Zeilenende (wurde in der Programmiersprache BCPL definiert, aber nicht von C, sondern erst von C++ übernommen).
Sollen größere Bereiche auskommentiert werden, so empfiehlt sich die Nutzung der Präprozessoranweisung #if 0 ... #endif.
Beispiele:
<syntaxhighlight lang="C">
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt
Compiler-Warning nur aufgrund des Compiler-Schalters -Wall! */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Namenskonventionen ==
Folgende Regeln gelten bzgl. der Benennung von Variablen und Funktionen:
* Variablen und Funktionsnamen können aus Buchstaben, Zahlen und dem Unterstrich bestehen. Sie müssen mit einem Buchstaben oder einem Unterstrich beginnen
* Seit C95 können weitere Zeichen aus dem Universal Coded Character Set (UCS) genutzt werden [C11 D.1]
* C ist Case sensitiv, d.h. es wird zwischen Groß- und Kleinbuchstaben unterschieden
* Schlüsselwörter können nicht für Variablen/Funktionsnamen/Datentypen genutzt werden
Namenskonventionen von Libraryfunktionen:
* In C (und C++) sind Schlüsselwörter und Standardlibraryfunktionen zumeist in Kleinbuchstaben geschrieben. In der C-Standardlibrary werden oftmals verkürzte Ausdrücke (z.B. isalnum() (zum Testen ob ein Zeichen ein Buchstaben oder ein Digit ist) und in C++ der Unterstrich als Worttrenner (z.b. out_of_range) genutzt
* Makros (siehe Kap.[[Programmieren in C/C++: Präprozessor | Präprozessor]]) werden per Konvention in GROSSBUCHSTABEN und ggf. mit Unterstrich als Worttrenner geschrieben.
* Namen beginnend mit doppelten Unterstrich oder beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (z.B. __LINE__ _Reserved) sind für den Compiler und der Standard-C-Library vorbehalten und sollten im eigenen Programm nicht benutzt werden.
== Zeilenfortsetzung ==
Mit dem Backslash Operator (gefolgt von einem Zeilenende) kann eine Zeile in der nächsten Zeile fortgesetzt werden. Der Compiler löscht das \-Zeichen mit anschließendem Zeilenende und ersetzt dies durch nichts. Dies ist insbesondere bei Anweisungen notwendig, die am Ende der Zeile abgeschlossen sein müssen (z.B. Strings, Makros).
Beispiele:
<syntaxhighlight lang="c">
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Innerhalb von Char-Literatoren und Strings wird '\' als Escape-Operator genutzt, welche das '\' und ein oder mehrere folgende Zeichen ersetzt (siehe Kap.[[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Grundlagen:Literale/Konstanten]]). Daher darf hinter Backslash als Zeilenfortsetzungszeichen kein weiteres Zeichen folgen.
== Gültigkeit/Sichtbarkeit von Variablen ==
Vorrangig in der objektorientierten Programmierung werden mit Namensräumen Objekte und deren Methoden/Attribute in einer Art Baumstruktur strukturiert. Dies ermöglicht eine eindeutige Ansprache von Variablen/Objekte, aber auch eine doppelte Verwendung von Methoden-/Attributnamen in unterschiedlichen Namensräumen. Ergänzend zu den Namensräumen kann mit public/private/proteced eine Zugriffsbeschränkung von Methoden/Attributen definiert werden.
Die Programmiersprache C unterstützt keinen Namensraum. Zugriffsmodifikatoren werden indirekt über Header-Dateien getätigt. Hinsichtlich der Gültigkeit/Sichtbarkeit unterscheidet C folgende Bereiche [C11 6.2.1]:
* Funktionen (Function Scope)
* Datei (File Scope)
* Block (Block Scope)
* Funktionsparameter in Prototypen (Function Prototype Scope)
Innerhalb eines Gültigkeitsbereiches dürfen Variablen-/Funktions-/Datentypnamen nicht doppelt genutzt werden.<br />
In der Programmiersprache C++ sind weitere Scope wie z.B. Class Scope, Enumationation Scope und ergänzend das Konzept von Namensräumen vorhanden (Beschreibung folgt).
=== Funktionsweite Sichtbarkeit ===
Eine Label-Definition (als Sprungmarke für die goto-Anweisungen) erfolgt immer mit funktionsweiter Sichtbarkeit/Gültigkeit. Die genaue Beschreibung dieses Sichtbarkeitstyps erfolgt im Rahmen des Kapitels [[Programmieren in C/C++: Grundlagen #Label + Goto|Grundlagen:Label+Goto]].
=== Dateiweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp-Definition außerhalb eines Block-Scopes oder von Funktionsparameter, so sind diese innerhalb der gesamten Datei und bei Funktionen/Variablen ergänzend Projektweit (für alle Objektdateien) sichtbar/gültig (= global) (In der C-Spec unter dem Stichwort 'Linkage' beschrieben, siehe Kapitel [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage| DatentypeSpecifier:Internal/External Linkage]]). Alle globalen Funktionen/Variablen können von allen Dateien aus genutzt/zugegriffen werden (sofern sie zuvor deklariert wurden).<br />
Beispiel:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Deklaration von global,
//welche in Datei1.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
printf("global=%d\n",global);
return 0;
} | datei2_c=#include <stdio.h>
//Deklaration von global,
//welche in example.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
printf("func() called\n");
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird das Schlüsselwort 'static' der Variablen/Funktionsdefinition vorangestellt, so wird die Sichtbarkeit/Gültigkeit auf Dateiweit eingeschränkt. Variablen/Funktionen können nur innerhalb der (Objekt-) Datei genutzt werden und sind für anderen (Objekt-)Dateien unsichtbar. (Siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage|DatentypeSpecifier:Internal/External Linkage]] Internal/External Linkage)
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
printf("example.c:var1=%d\n",var1);
void func(void); //Prototyp für func()
func();
return 0;
} | datei2_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
printf("datei2.c:var1=%d\n",var1);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Projektweite Gültigkeit bedeutet insbesondere, dass keine doppelten Benennung von Variablen/Funktionen/Datentypen innerhalb des gesamten Projektes erlaubt sind, d.h. alle Variablen/Funktionennamen über alle Dateien/Librarys eindeutig sein müssen.<br>
Beispiel 1:
{| class="wikitable"
|-
! Datei1.c !! Datei.2
|-
| <syntaxhighlight lang="C">
#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
}</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
} | datei2_c=#include <stdio.h>
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der Linker meldet beim Zusammenfügen der Objekt-Dateien, dass die Variable a bereits woanders definiert sei (multiple definition of `a';)!
Beispiel 2:
<syntaxhighlight lang="C">
#include <stdio.h> //fuer printf() size_t stderr
int printf=7;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int printf=7;
int main(int argc,char *argv[])
{
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hier meldet der Compiler eine Fehlermeldung, da das Symbol printf zu einen als Variable und zum anderen als Funktion (innerhalb der inkludierten Datei stdio.h beschrieben) genutzt wird ('printf' redeclared as different kind of symbol).
=== Blockweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp Definition innerhalb einer Funktion, als Funktionsparameter oder eines Blockes, so sind diese nur innerhalb des Blockes sichtbar/gültig (=Lokale Variable). Blöcke können verschachtelt sein, so dass das bei identischer Namensgebung innere Definitionen Vorrang haben. Ebenso haben Blockdefinitionen Vorrang vor Datei-/Projektdefinitionen (überdecken diese):
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
} | datei2_c=#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sichtbarkeit von Funktionsparameter in Protypen ===
Soll eine Funktion aufgerufen werden, die zuvor nicht definiert wurde, so ist ein Prototyp/(Forward)deklaration der Funktion notwendig (siehe nachfolgendes Kapitel). Die Parameterliste dieses Prototyps hat seinen eigenen Gültigkeitsbereich.<br/>
Beispiel:
<syntaxhighlight lang="C">
int a; //a im File Scope
int func(int a, int b); //a und b im Function Prototyp scope
</syntaxhighlight>
Hinweis:
* Bei Prototypen ist die Angabe von Variablenname nicht notwendig. Die alleinige Angabe des Datentyps ist ausreichend
=== Zuordnung der Gültigkeitsbereiche zu globalen/lokalen Variablen ===
Zum einfacheren Verständnis wird im Skript von folgenden Begrifflichkeiten gesprochen:
* '''Globale''' Variablen-/Funktionen-/Datentypdefinitionen → Projektweite Sichtbarkeit/Gültigkeit
* '''Statisch globale''' Variable/Funktionen → Dateiweite Sichtbarkeit/Gültigkeit
* '''Lokale''' Variablen/Funktionen/Funktionsparameter/Datentypen → Nur innerhalb des zugehörigen Blockes sichtbare/gültig
* '''Statisch lokale''' Variablen → Nur innerhalb der Funktion sichtbar/gültig, mit der Besonderheit, dass die Gültigkeit über der Laufzeit der Funktion gilt (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Static Storage Class Specifier|DatentypeSpecifier:Static Storage Class Specifier]])
=== Speicherzuweisung ===
Für die einzelnen Gültigkeitsbereiche werden im Speicher (und auch in der Objekt-Datei) unterschiedliche Speicherbereiche (Segmente) vorgehalten, d.h. der Compiler teilt den Speicher in unterschiedliche Bereiche auf und weist den Variablen/Funktionen in Abhängigkeit der Gültigkeit/Sichtbarkeit unterschiedliche Speicherbereiche zu!
[[File:Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten).png|thumb|Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten)]]
Zur Ermöglichung von Rekursion werden lokale Variable auf dem Stack gehandelt. Mit Aufruf einer Funktion oder öffnen eines neuen Block-Scopes wird Speicher auf dem Stack reserviert, der bei Beenden des Scopes wieder freigegeben wird. Die Speicheradresse von lokalen Variablen ist somit nicht Fix, sondern hängt von der Aufrufhierarchie ab!
Globale und statisch globale Variablen werden nicht auf dem Stack gehalten, sondern bekommen einen 'festen' Speicherbereich (hier DATA/BSS/RODATA) während der gesamten Laufzeit des Programms zugewiesen. Die Adresse dieser Variablen sind somit konstant. Das genutzte Speichersegment von globalen Variablen hängen von der Art der Variablen ab. Initialisierte Variablen werden im DATA-Segment gesammelt, welcher mit dem Initialisierungswert der Variablen initialisiert wird. Nicht initialisierte globale Variablen landen im BSS-Segment, so dass diese mit Programmstart durch Füllen dieses Blockes mit 0 auf 0 gesetzt werden.
Konstante globale Variablen werden im RODATA-Segment gehalten. Über das Betriebssystem kann dieser Speicherbereich auf nur Lesbar gesetzt werden.
Dynamische Speicheranforderungen, resp. Speicher, dessen Gültigkeit über die Laufzeit einer Funktion hinausgeht, wird im Heap gesammelt. Für die Verwaltung dieses Speichers ist der Programmierer zuständig.
Entsprechend globalen Variablen wird für Funktionen ebenfalls ein eigener Speicherbereich (TEXT Segment) vorgesehen. Im Gegensatz zu Variablen, wo im Speicher der dazugehörige Inhalt gespeichert ist, ist der Speicherinhalt von Funktionen die Maschinenanweisungen. Die Speicheradresse der Funktionen sind konstant.
Hinweis:
* Die Speicheradresse von sowohl globalen und statisch globalen Variablen als auch von Funktionen ist konstant und ändert sich während der Laufzeit des Programms nicht. Die Adressvergabe dieser Variablen und Funktionen erfolgt somit nicht zur Laufzeit sondern durch die Toolchain (hier der Linker).
* Dieses Konzept ist allgemeingültig, gilt nicht nur für die Programmiersprache C/C++
== Definition/Deklaration(Prototyp) ==
Der C-Compiler ist ein Single-Pass Compiler (siehe Kap [[Programmieren in C/C++: Einführung/Literatur#Arbeitsweise eines Compilers | Einführung/Literatur:Arbeitsweise eines Compilers ]]), d.h. für den Übersetzungsvorgang wird der Quellcode einmalig eingelesen und von vorne nach hinten abgearbeitet. Dies bedingt, dass keine Vorwärtsbezüge im Quelltext enthalten sein dürfen:
* keine Variable genutzt werden kann, die erst später definiert wird (da der Compiler in Abhängigkeit des Datentyps (den er dann noch nicht kennt) keine entsprechende Maschinensprachebefehle erzeugen kann)
* keine Funktion aufgerufen werden kann, die erst später definiert wird (da der Compiler nicht weiß, welcher Datentyp die Übergabewerte haben und folglich keine Maschinensprachebefehle zur Konvertierung und Übergabe der Variablen erzeugen kann)
* kein Datentyp genutzt werden kann (struct, union, enum, typedef), welcher erst später definiert wird (da der Compiler nicht weiß, wieviel Speicher er für die Variable reservieren muss)
Eine Lösungsvariante dieser Problematik ist, im Quellcode alle Variablen/Funktionen/Datentypen/Makros zu definieren, bevor diese erstmalig genutzt werden (Funktion main() steht dann folglich am Ende des Quellcodes):
<syntaxhighlight lang="C">
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
//Hier kein Zugriff auf var möglich!
//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(void) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
var++; //Hier kein Zugriff auf var möglich!
uchar xyz;//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(int argc, char *argv[]) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Sollen globale Funktionen/Variablen in Datei1.c genutzt werden, die in Datei2.c definiert sind, so schlägt diese Vorgehensweise fehl. Um auch dieses zu ermöglichen, bietet C die Möglichkeiten von Prototypen/Deklarationen an. Diese teilt dem Compiler mit, wie im späteren Ablauf die Variable, die Funktion definiert wird, bzw. dass es diesen Datentyp geben wird:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
} | datei2_c=#include <stdio.h>
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Innerhalb der C-Spezifikation werden für den Umgang mit dieser Problematik die Begriffe 'Declaration' und 'Definition' genutzt. Da diese Begriffe jedoch nicht klar abgegrenzt werden und auch für viele weitere Aspekte genutzt werden, sollen in diesem Skript in Anlehnung an den Wikipedia Artikel {{w|Deklaration (Programmierung)|Deklaration (Programmierung)}} (im Absatz zur Programmiersprache C/C++) die Begriffe Definition/Deklaration wie folgt genutzt werden:
;Definition: entspricht der Belegung/Reservierung von Speicherplatz
:* Bei der Definition einer Variablen wird hiermit Speicherplatz entsprechend dem Datentyp der Variable belegt:
:<syntaxhighlight lang="C">
int var1; //entsprechend der Größe des Datentyps int wird
//Speicherplatz für die Variable var1 reserviert
int var2=4711; //Dito, ergänzend wird dieser Speicherplatz mit dem
//Wert 4711 initialisiert
</syntaxhighlight>
:* Bei einer Funktion wird Speicherplatz zur Aufnahme der Maschinenbefehle belegt:
:<syntaxhighlight lang="C">
void foo(void) { //Die Anweisungen in den geschweiften Klammern
//werden in Maschinenbefehle übersetzt. D.h. die
//Funktion foo() belegt Speicher, dessen Inhalt
//die Maschinensprachebefehle sind
}
</syntaxhighlight>
:* Ergänzend wird der Begriff Definition auch in Verbindung mit der Definition von neuen Datentypen genutzt!
;Deklaration/Prototyp: ist die Mitteilung an den Compiler, wie diese Variable/Funktion an einer späteren Stelle im Source-Code oder in einer anderen Source-Datei definiert wird. Auf Grundlage dieser 'vorab' Information kann der Compiler die passenden Maschinensprachebefehle für den Zugriff/Aufruf auf die Variablen/Funktion einsetzen:
:<syntaxhighlight lang="C">
extern int var1; //Deklaration von var1
extern void foo(void); //Deklaration von foo()
void foo(void); //Deklaration von foo()
</syntaxhighlight><br />
Insbesondere bei dem Umgang mit der Deklaration gilt es Folgendes zu berücksichtigen:
* Deklarationen werden entweder:
:* am Anfang einer C-Datei geschrieben, so dass Funktionen/Variablen im Zugriff stehen, die erst später in der C-Datei definiert werden (entspricht dann der Private Anweisung in anderen Sprachen)
:* in Header-Dateien geschrieben, so dass diese Variable/Funktionen für alle sichtbar sind, welche diese Header-Datei einbinden (entspricht der Public Anweisung in anderen Sprachen)
* Deklarationen von Funktionen werden in der C-Spec als (function) Prototyp bezeichnet und sind dadurch gekennzeichnet, dass diese mit einem Semikolon abgeschlossen sind. Der Specifier 'extern' ist hier optional und sagt eigentlich aus, dass diese Funktion external Linkage besitzt (siehe [[Programmieren in C/C++:_DatentypeSpecifier#Internal/External Linkage | DatentypeSpecifier:Internal/External Linkage]]). Die Benennung der Parametervariablen sind gleichermaßen optional:
:<syntaxhighlight lang="C">
extern int foo(int var1, float var2); //Deklaration
extern int foo(int , float ); //Deklaration
int foo(int var1, float var2); //Deklaration + external Linkage
int foo(int , float ); //Deklaration + external Linkage
</syntaxhighlight>
* Für globale Variablen gibt es keine (Variablen) Prototype. Stattdessen muss zur Bekanntgabe des Datentyps der Specifier 'extern' vorangestellt werden, mit welchen ergänzend zum Ausdruck gebracht wird, das diese Variable external Linkage und damit globale Gültigkeit hat (siehe Kap [[Programmieren in C/C++: DatentypeSpecifier# Extern - Storage Class Specifier| DatentypeSpecifier:Extern - Storage Class Specifier]]). Da die Deklaration einzig zur Bestimmung der Zugriffsmethoden auf Maschinenspracheebene genutzt wird, können diese keine Initialisierungswerte enthalten:
:<syntaxhighlight lang="C">
extern int var1;
extern int var2=7; //KO Deklarationen können keine
//Initialisierungswerte haben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern int foo;
extern int foo=7;
int main(int argc, char *argv[]) {
return foo;
}
int foo=7;| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen von statisch globalen, lokalen und statisch lokalen Variablen nicht möglich sind:
:<syntaxhighlight lang="C">
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sich auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sicht auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen für identische Variablen/Funktionen können beliebig oft erfolgen, sofern der Datentyp identisch ist:
:<syntaxhighlight lang="C">
extern int var;
extern int var; //OK, doppelt Deklaration mit identischen Datentyp
extern unsigned int var; //KO, Doppelte Deklaration mit unterschiedlichen
// Datentyp
</syntaxhighlight>
* Sofern eine Deklaration und eine Definition in der identischen Datei erfolgen überprüft der Compiler, ob Deklaration und Definition identisch sind. Es empfiehlt sich, die eigene Header-Datei (in welcher die Deklaration normalerweise enthalten ist) zu inkludieren:
:{| class="wikitable"
|-
! Datei1.c !! Datei1.h
|-
| <syntaxhighlight lang="C">
//Include der eigenen Header-Datei
#include "datei1.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
</syntaxhighlight> ||
<syntaxhighlight lang="C">
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Include der eigenen Header-Datei
#include "example.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
int main(int argc, char *argv[]) {
return 0;
} | example_h=
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Datei kann eine Variable identischen Datentyps mehrmals definiert werden (bei identischen Initialisierungswert). Diese Definitionen werden vom Compiler als eine Definition angesehen. Wenn jedoch eine identische Variable in unterschiedlichen Dateien definiert wird, so legt jede Datei eine eigene unabhängige Variable an, welche dann beim Zusammenführen der Objektdateien durch den Linker zu Fehler führt. Da Header-Datei zumeist in mehrere C-Dateien inkludiert werden, sind Definitionen in Header-Dateien 'verboten'.
* Deklarationen innerhalb eines Block-Scopes oder eines Function Prototyp Scopes sind nur in diesen Bereich gültig.
== Grundlegende Datentypen und Typsicherheit ==
Die Programmiersprache C kennt folgende grundlegende Datentypen (siehe Kap. [[Programmieren in C/C++: Datentypen | Datentypen]]). Von jedem Datentyp kann ein Zeiger angelegt werden:
{| class="wikitable"
|-
! Datentyp !! Bsp. für Datentyp !! Bsp. für Zeiger auf Datentyp
|-
| Ganzzahl ||
<syntaxhighlight lang="C">
char var;
int var;
short int var;
long int var;
long long int var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
char *ptr;
int *ptr;
short int *ptr;
long int *ptr;
long long int *ptr;
</syntaxhighlight>
|-
| Gleitkommazahl ||
<syntaxhighlight lang="C">
double var;
float var;
long double var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
double *ptr;
float *ptr;
long double *ptr;
</syntaxhighlight>
|-
| Funktionen ||
<syntaxhighlight lang="C">
void func(void) {}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
void (*pfunc)(void);
</syntaxhighlight>
|-
| Arrays ||
<syntaxhighlight lang="C">
int arr[10];
float arr[3][3];
</syntaxhighlight>
||
<syntaxhighlight lang="C">
int (*parr);
float (*parr)[3];
void (*pfunc[5])(void);
</syntaxhighlight>
|-
| Strukturen/Unions ||
<syntaxhighlight lang="C">
struct xyz {int x,y,z};
union abc {int a,b,c};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
struct xyz *ptr;
union abc *ptr;
</syntaxhighlight>
|-
| Aufzählungstyp ||
<syntaxhighlight lang="C">
enum abc {A,B,C};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
enum abc *ptr;
</syntaxhighlight>
|-
| Boolescher Datentyp ||
<syntaxhighlight lang="C">
_Bool var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Bool *ptr;
</syntaxhighlight>
|-
| Komplexe Zahlen ||
<syntaxhighlight lang="C">
_Complex var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Complex *ptr;
</syntaxhighlight>
|}
C/C++ unterscheidet zwischen vorzeichenbehafteten <code>signed</code> und vorzeichenlosen <code>unsigned</code> ganzzahligen Datentypen. Vorzeichenlose Datentypen können nur positive Zahlen incl. der 0 aufnehmen (Anwendungsbereich bspw. Speicheradressen/Arrayindexe, welche nicht negativ sein können). Deren max. Zahlenwert ergibt sich aus der Datenbreite N des Datentyps 2<sup>N</sup>-1. Ein Vergleich eines vorzeichenlosen Datentyps mit ≥ 0 ist somit immer TRUE:
<syntaxhighlight lang="C">
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt"); //dieser ggf. vom Compiler wegoptimiert wird!
for(var=10; var>=0; var--); //Endlosschleife! 0 dekrementiert ergibt 255
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt\n"); //dieser ggf. vom Compiler wegoptimiert wird!
//Beim Öfffnen des Compiler-Fensters ist die IF-Anweisung nicht farblich
//hervorgehoben. Dies bedeutet, dass diese Zeile wegoptimiert wurde und folglich
//kein Maschinencode für diese Anweisung erzeugt wurde
for(var=10; var>=0; var--) //Endlosschleife! 0 dekrementiert ergibt 255
printf("%u ",var),fflush(stdout);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Vorzeichenlose Datentypen halbieren den verfügbaren Zahlenbereich und 'weisen' dem oberen Wertebereich den negativen Zahlen zu.<br>
Wird ein ganzzahliger Datentyp ohne Angabe des Vorzeichentyps (signedness) definiert, so ist diese vorzeichenbehaftet. Bei vorzeichenlosen Variablen muss explizit <code>unsigned</code> vorangestellt werden. Die Voranstellung von <code>signed</code> ist optional. Einzige Ausnahme stellt der Datentyp char dar. Hier gibt die Spezifikation keine default signedness vor, so dass bei Nutzung dieses Datentyps zur Aufnahme von Zahlen immer signed oder unsigned vorangestellt werden sollte!<br>
Innerhalb des Formatstrings bei den printf()/scanf() Anweisungen '''muss''' die signedness vom Programmierer händisch berücksichtigt werden. Die Formatanweisung %d und %i interpretieren die übergebenen Zahl als vorzeichenbehaftete Zahl. Soll eine vorzeichenlose Zahl ausgegeben werden, so muss %u verwendet werden:
<syntaxhighlight lang="C">
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%d varu=%u",vari,varu); //Korrekt
printf("vari=%u varu=%i",vari,varu); //Falsche Werteausgaben!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%12d varu=%12u\n",vari,varu); //Korrekt
printf("vari=%12u varu=%12i\n",vari,varu); //Falsche Werteausgaben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit der Definition (dem Anlegen) einer Variablen eines Datentyps wird Speicher entsprechend der Größe des Datentyps reserviert. Optional kann dieser Speicher initialisiert werden. Über den Datentyp wird ausgesagt, wie der Inhalt des Speichers zu interpretieren ist:
<syntaxhighlight lang="C">
char var1; //Speicherplatzreservierung von 1 Byte
//Inhalt der Speicherstelle wird als Zahl interpretiert
//(Hinweis: ASCII-Zeichen sind Zahlen)
double var2=47.11; //Speicherplatzreservierung von 8 Byte
//Inhalt der Speicherstellen wird als Gleitkommazahl
//interpretiert (bestehend aus je einer Ganzzahl für
//Mantisse und Exponent)
short arr[10]; //Speicherplatzreservierung von 10*2 Byte
//Inhalt der 10 Speicherstellen werden als Ganzzahl
//interpretiert
</syntaxhighlight>
Die Funktionalität der Operatoren hängt vom Datentyp der Operanden ab. Der Plus-Operator angewendet auf ganzzahlige Operanden führt eine Ganzzahl Addition aus, angewendet auf gleitkomma Operanden eine Gleitkomma Addition. Ist einer der Operanden ein Zeiger, so wird eine Zeigeraddition angewendet. Für andere Datentypen ist der Plus-Operator nicht definiert, so dass der Compiler einen Fehler wirft. '''Bei der Betrachtung eines Ausdruckes sollte dem genutzten Datentypen folglich eine besondere Aufmerksamkeit zuteil werden''':
<syntaxhighlight lang="C">
int vari=47;
vari+12; //(int) + (int) → Ganzzahladdition
float varf=12.3;
3.1415F+varf; //(float) + (float) → Gleitkommaaddition
int *ptr=&vari;
ptr+3; //(int *) + (int) → Zeigeraddition
int arr[3];
arr+3; //(int (*)) + (int) → Zeigeraddition
</syntaxhighlight>
Das Ergebnis einer Operation hat ebenfalls einen Datentyp. Eine Ganzzahl Addition gibt bspw. als Ergebnis einen Ganzahl Datentyp zurück, eine Gleitkomma Addtition einen Gleitkomma Datentyp und ein Vergleichsoperator den Datentyp _Bool:
<syntaxhighlight lang="C">
int vari1=47;
int vari2=11;
vari1 + 12 + vari2; //((int)+(int)+(int))→((int)+(int))→(int)
40 < vari1 < 50; //((int)<(int)<(int))→((_Bool=int)<(int))→(_Bool=int)
</syntaxhighlight>
Wie Operatoren haben auch Funktionen Operanden (in Form von Übergabeparameter). Das Ergebnis eines Funktionsaufrufes wird ebenfalls in Form eines Datentyps zurückgegeben:
<syntaxhighlight lang="C">
float add(int par1,par2) {return par1+par2;}
int vari1=47;
int vari2=11;
vari1 + add(var2,12); //(int)+((int),(int)→(float))→(int)+(float)→(float)
</syntaxhighlight>
Wird auf einen Operator gleichermaßen ein vorzeichenbehafteter und ein vorzeichenloser Operand angewendet, so kann es zu unerwarteten Konvertierungsproblemen führen:
<syntaxhighlight lang="C">
unsigned char varu=12;
signed char vars=-12;
float varf;
varf = varu + vars;
if(vars < varu)
</syntaxhighlight>
Sind die Datentypen der Operanden nicht 'kompatibel', so 'passt' der Compiler die Datentypen im Falle von Ganzahl und Gleitkomadatentypen per impliziter Regel an (siehe Kap. [[Programmieren in C/C++: Datentypen#Implizite Typumwandlung | Datentypen:Implizite Typumwandlung]]). Über explizite Typumwandlung (siehe Kap.[[Programmieren in C/C++: Datentypen# Explizite Typumwandlung|Datentypen:Explizite Typumwandlung]]) kann ein Datentyp z.T. in einen anderen Datentyp gewandelt werden.
In allen anderen Fällen ist C Typsicher, d.h. der Compiler gibt zumindest eine Warning aus, wenn die Datentypen nicht identisch sind und der Compiler keine implizite Regel anwenden kann.
Tipp:
* Compiler gibt bei Fehlermeldung oftmals die erwarteten und die vorhandenen Datentyp an. Wenn solch eine Fehlermeldung kommt, sollten sie sich a) überlegen, was wollten sie syntaktisch geschrieben haben und b) was haben sie in der Tat geschrieben. Ein Google nach einer Lösung des Compilerproblems löst zumeist nicht das Problem, sondern umgeht es!
Hinweis:
* Ein guter Programmierer sollte die Datentypen so wählen, dass:
:* die Datentypen zum Inhalt und zum Wertebereiches passen
:* keine Datentypkonvertierungen notwendig sind
: andernfalls besteht die Gefahr, dass hiermit Laufzeitfehler einprogrammiert werden.
* Wenn Datentypkonvertierungen notwendig sind, sollte die explizite Konvertierung genutzt werden
== Abhängigkeiten bzgl. Rechnerarchitektur ==
Kenngrößen von Prozessoren sind unter anderem die Anzahl der Bits für den Datentransport und für Arithmetisch-/Logische-Operationen (→ Datenbreite) und die Anzahl der Bits für die Adressierung des Speichers (→ Adressierungsbreite). Die Datenbreite sagt dabei aus, welche max. Datenbreite ein Maschinenbefehl (zumeist in einem Taktzyklus) transportieren/berechnen kann. Werden programmtechnisch größere Datenbreiten benötigt, bedingt dies, dass hierzu mehrere Maschinenbefehle notwendig sind. Wenn kleinere Datenbreiten notwendig sind, so wird oftmals das Ergebnis abgeschnitten (sofern der Prozessor keine Befehle für den Umgang mit kleineren Datentyp beherrscht):
{| class="wikitable"
|-
! 32-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 64-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 16-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
|-
| <syntaxhighlight lang="C">
int32_t a32,b32;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int64_t a64,b64;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int16_t a16,b16;
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=b32;
mov eax,b32
mov a32,eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=b64;
mov eax ,b64
mov edx ,b64+4
mov a64 ,eax
mov a64+4,edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
//a16=b16;
movz eax,b16
mov a16,ax
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=a32+b32;
mov edx, a32
mov eax, b32
add eax, edx
mov a32, eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=a64+b64;
mov ecx , a64
mov ebx , a64+4
mov eax , b64
mov edx , b64+4
add eax , ecx
adc edx , ebx
mov a64 , eax
mov a64+4, edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a16=16+b16;
movzx eax, a16
mov edx, eax
movzx eax, b16
add eax, edx
mov a16, ax
</syntaxhighlight>
|}
Die Adressierungsbreite gibt an, mit welcher Bitbreite der Speicher adressiert werden kann:
* Bei einem 32-Bit System können 2<sup>32</sup>=4.294.967.295=4Gi Bytes/Speicherstellen adressiert werden
* Bei einem 16-Bit System können 2<sup>16</sup>=65.536=64Ki Bytes/Speicherstellen adressiert werden
* Bei einem 64-Bit System können 2<sup>64</sup>=18.446.744.073.709.551.616 =16Ei ~18Exa Bytes/Speicherstellen adressiert werden
Waren die Datenbreite und die Adressierungsbreite bei den ersten Prozessoren noch unterschiedlich, so sind diese heutzutage zumeist identisch. Bei einem 32-Bit Prozessor bedeutet dies, dass dieser max. 4Gi Bytes Speicherstellenstellen adressieren kann und Maschinenbefehle für den Datentransport und die Berechnung von 32-Bit Datenworten beinhaltet.
Die Datenbreite und auch die Adressierungsbereite haben direkten Einfluss auf die Programmiersprache:
* Wird defaultmäßig mit größerer Datenbreite gerechnet, als der Prozessor 'von Hause' aus unterstützt, so werden die erzeugten Maschinenprogramme größer und langsamer (Umgedreht bedeutet dies jedoch nicht, dass die Maschinenprogramme kleiner und schneller werden)
* Die max. Größe von Verbunddatentypen und Arrays ergibt sich aus der Adressierungsbreite des Prozessors
Die Intention der Programmiersprache C/C++ ist, die Prozessorarchitektur optimal zu nutzen. Dementsprechend sind diverse Eigenschaften der Sprache nicht fest spezifiziert, sondern von der Rechnerarchitektur abhängig.
=== Integer Datentyp ===
Intention von C/C++ ist, dass der Umgang mit dem Grunddatentyp 'int' möglichst direkt in einen Maschinensprachebefehl umgesetzt werden kann.<br />
Bei einem 16-Bit Prozessor hat der Datentyp int daher eine Breite von 16-Bit und bei einem 32-Bit Prozessor eine Breite von 32-Bit (siehe Kap [[Programmieren in C/C++: Datentypen # Ganzzahlige Datentypen|Datentypen:Ganzahl Datentypen]]). Über vorangestellte Qualifier kann dieser Grunddatentyp verkleinert/vergrößert werden.
=== Integer Arithmetik ===
Ganzzahlen haben nur einen begrenzten Wertebereich. Wird dieser bspw. durch eine Addition überschritten (d.h. das Rechenergebnis benötigt zur Darstellung mehr Stellen, als der Datentyp 'hergibt'), so gibt es zwei Vorgehensweisen:
* Arithmetischer Überlauf (siehe {{w|arithmetischer Überlauf}}): Die nicht speicherfähigen Stellen werden verworfen, so dass i.d.R. ein falsches Ergebnis erzeugt wird!
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist (254+3)%256=1
c=a*b; //c ist (254*3)%256=250
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char a=254,b=3,c1,c2;
c1=a+b; //c ist (254+3)%256=1
c2=a*b; //c ist (254*3)%256=250
printf("c1=%hhu c2=%hhu\n",c1,c2);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Sättigungsarithmetik (siehe {{w|Sättigungsarithmetik}}): Alle Operationen laufen innerhalb eines festen Intervalls ab, so dass Überläufe und Unterläufe auf dieses Intervall begrenzt werden:
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist MAX((254+3),255)=255
c=a*b; //c ist MAX((254*3),255)=255
</syntaxhighlight>
Die Spezifikation von C macht bezüglich der zu nutzenden Methodik keine Vorgaben, so dass das Handling von der ALU des Prozessors abhängt. Aus Komplexitäts- und Geschwindigkeitsgründen ist dies zumeist der arithmetische Überlauf. Nur bei Spezialprozessoren (z.B. DSP Digital Signal Processor) kommt z.T. die Sättigungsarithmetik zum Einsatz.
=== Gleitkomma Datentyp und Arithmetik ===
Für den Umgang mit Gleitkommazahlen bieten einige Prozessoren spezielle Recheneinheiten ({{w|Gleitkommaeinheit}} Floating Point Units FPU) an. Sowohl die Darstellung von Gleitkommazahlen als auch das Verhalten bei Überlauf/Unterlauf ist damit Herstellerabhängig. Um auch diese Einheiten effektiv nutzen zu können, ist die C/C++ Spezifikation in diesem Bereich ebenfalls sehr offen.
=== Max. Speicherbedarf von Variablen ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C/C++ von der zugrundeliegenden Rechnerarchitektur abhängig:
<syntaxhighlight lang="C">
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Zur Darstellung bitte Compiler-Fenster öffnen
//und dort den CC65-Compiler für den 6502 Prozessor auswählen
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Im Falle von globalen Variablen erzeugt der Compiler/Linker eine Fehlermeldung. Werden von diesen Datentypen Variablen als lokale Variablen angelegt, so erzeugt dies zur Laufzeit einen Stackoverflow.
=== Zeigervariable ===
Eine Zeigervariable ist eine Variable, die eine Speicheradresse speichert. Die Größe dieses Datentyps hängt von der Adressierungsbreite des Prozessors ab. Unabhängig von dem Datentyp, auf den die Zeigervariable zeigt, ergibt sich folgende Breite:
* 4-Byte bei einer 32-Bit Rechnerarchitektur
* 8-Byte bei einer 64-Bit Rechnerarchitektur
* 2-Byte bei einer 16-Bit Rechnerarchitektur
=== Datentyp size_t ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C von der zugrundeliegenden Rechnerarchitektur abhängig. Sie ergibt sich aus der Adressierungsbreite. Da die Datenbreite des Datentyps int zumeist kleiner als die Adressierungsbreite ist, existiert in C/C++ der vorzeichenlose Datentyp size_t.<br />
Alle Funktionen, welche den Speicherbedarf übergeben bekommen, bzw. zurückgeben (bspw. strlen(), memcpy(), sizeof()) , nutzen den Datentyp size_t:
<syntaxhighlight lang="C">
//Prototypen
size_t strlen(char *str); //Die max. Stringlänge ist durch den
//adressierbaren Speicher vorgegeben
void *malloc(size_t size);
void *memcpy(void *dest, const void *src, size_t n);
</syntaxhighlight>
Der Datentyp size_t ist in der Header-Datei stddef.h der Standard-C-Library per typedef gesetzt. Im Normalfall muss diese Header-Datei nicht explizit inkludiert werden, da bei Nutzung von z.B. strlen() diese bereits durch die Header-Datei string.h inkludiert wird:
<syntaxhighlight lang="C">
typedef unsigned long long size_t; //Bei einer 64-Bit Rechnerarchitektur
</syntaxhighlight>
Hinweis:
* Der Datentyp size_t ist immer ein vorzeichenloser Datentyp (es gibt keine negativen Speicheradressen).
* Mit dem Datentype ssize_t wird eine vorzeichenbehaftete Variante zur Verfügung gestellt, welche hilfreich ist, wenn Speicheradresse subtrahiert werden sollen.
* Soll der Wert vom Datentyp size_t mittels printf() ausgegeben werden, so ist der 'Length Modifier' z und der 'Conversion Specifier' u zu nutzen:
:<syntaxhighlight lang="C">
size_t var=strlen("String");
printf("%zu",var);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]) {
size_t var=strlen("String");
printf("%zu",var);
printf("%d",var); //Hier sollte es eine Compiler-Warning geben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Boolescher-Datentype/Operatoren ==
Ursprünglich gab es den booleschen Datentyp in der Programmiersprache C nicht. Mit C99 wurde zwar der Datentyp <code>_Bool</code> eingeführt, dies änderte jedoch nicht den Umgang mit Anweisungen und Operatoren, die einen booleschen Datentyp erwarten/zurückgeben!
An allen Stellen, an denen ein boolescher Datentyp erwartet wird (z.B. IF-Abfrage, bei booleschen Operationen) wird der Datentyp Ganzzahl, Gleitkommazahl oder Zeiger erwartet (= Scalar-Type) und ausgewertet. Der hierin gespeicherte Zahlenwert sagt aus, ob diese Zahl als True oder False zu interpretieren ist:
* False, wenn Ganzzahl gleich 0 oder Gleitkommazahl gleich 0.0 oder Zeiger gleich NULL
* True, wenn Ganzzahl ungleich 0 oder Gleitkommazahl ungleich 0.0 oder Zeiger ungleich NULL
Beispiel:
<syntaxhighlight lang="C">
int a=3;
double b=0.0;
int *ptr=&a;
while(1);
if(a) {}
for( ; b && ptr ; );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
double b=0.0;
int *ptr=&a;
while(0);
if(a) {}
for( ; b && ptr ; ) {}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Operatoren, welchen einen booleschen Wert zurückliefern (Vergleichs-Operatoren und Boolesche-Operatoren), liefern ein Integer-Datentyp zurück:
* (int)0 für False
* (int)1 für True
Beispiel:
<syntaxhighlight lang="C">
int a=3;
int b= (a==3); //b=1
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
int b= (a==3); //b=1
printf("%d",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
In den if()/for()/while() Anweisungen ist folglich kein explizites Konvertieren eines Ganzzahl-/Gleitkomma-/Zeigerwertes mittels des Vergleichs-Operators in einen Booleschen Wert notwendig:
<syntaxhighlight lang="C">
int a;
double b;
if(a) //entspricht if(a!=0)
if(!b) //entspricht if(b==0.0)
while(1) //entspricht while(True)
for(int lauf=1; lauf ; lauf--);
</syntaxhighlight>
Umgedreht kann ein boolescher Wert oder auch das Ergebnis einer booleschen Operation direkt mit einer Ganzzahl- oder Gleitkommazahl verknüpft werden:
<syntaxhighlight lang="C">
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
if( a==1 & b==2)
if(3 < a < 9) //Vorsicht, die Schreibweise lässt ein
//anderes Verhalten erwarten!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
printf("%d\n",a);
if(a==1 & b==2)
printf("true\n");
else
printf("false\n");
if(3 < a < 9)
if( (a==1) & (b==2))
printf("true\n");
else
printf("false\n");
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit C99 wurde der Datentyp <code>_Bool</code> eingeführt. Dieser entspricht weiterhin einem Integerdatentyp mit der Besonderheit, dass beim Zuweisen eines Wertes dieses auf true oder false geprüft wird und Variablen dieses Datentyps nur die Werte 0 oder 1 annehmen können:
<syntaxhighlight lang="C">
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool! möglich
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool!
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für den einfacheren Umgang mit dem 'neuen' Datentyp wurde in der Header-Datei <code>stdbool.h</code> die Makros <code>true</code> (als Austauschwert für die Ganzzahl 1) und <code>false</code> (als Austauschwert für die Ganzahl 0) definiert. Ergänzend wird hier der Datentyp <code>bool</code> als Alias auf <code>_Bool</code> gesetzt.
<syntaxhighlight lang="C">
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
int main(int argc,char *argv[]) {
foo(4,3,6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In C++ gibt es anstatt des Datentypes <code>_Bool</code> den Datentyp <code>bool</code>. Auch sind die beiden Konstanten <code>true</code> und <code>false</code> ohne zusätzliches Einbinden der Header-Datei vorhanden. Der weitere Umgang ist jedoch identisch zu C.
== Literale/Konstanten ==
In Computerprogramm werden an diversen Stellen Konstanten in Source Code genutzt. Sei es als Initialisierungswert für Variablen, als Vergleichswert für Abfragen, zur Definition von Schleifendurchläufe oder als Strings für die Kommunikation. Der Syntax der Programmiersprache bietet dazu verschiedene Möglichkeiten, wie Zahlen zu beschreiben sind und wie der Datentyp vorgeben wird.</br>
Ungeachtet der Schreibweise werden im Computer alle Zahlen identisch als binäre Zalen gespeichert. Beispiele, wie die Zahlen intern gespeichert werden:
<syntaxhighlight lang="C">
int var=17; //0000 0000 0000 0000 0000 0000 0001 0001
short var=0x307;// 0000 0011 0000 0111
char var=017; // 0000 1111
int var=-1; //1111 1111 1111 1111 1111 1111 1111 1111
float var=0.0; //0000 0000 0000 0000 0000 0000 0000 0000
float var=1.0; //0011 1111 1000 0000 0000 0000 0000 0000
</syntaxhighlight>
=== Ganzzahl-Konstanten ===
Im Allgemeinen ordnet der Compiler einer numerischen, ganzzahligen Konstanten den kleinstmöglichen Datentyp beginnend vom Datentyp integer zu. Sobald der Wert der Konstanten den Wertebereich von integer übersteigt, wird der nächst größere passende Datentyp gewählt. Ergänzend gilt, dass alle Ganzzahl-Konstanten als vorzeichenbehaftete Ganzzahl-Konstanten angesehen werden!<br />
Beispiele für integer Konstanten:
<pre>
123
+123
-123 → Formal wird das Minus als Operator angesehen
und die positive Zahl 123 negiert
0x123 → Konstante ist in hexadezimaler Schreibweise notiert
0123 → Konstante ist in oktaler Schreibweise notiert
0b011 → Konstante ist in binärer Schreibweise notiert
nicht offizieller C-Syntax, wird aber von vielen Compiler unterstützt
ab C23-Spezifikation offiziell im C-Syntax enthalten!
6'432'108 → Tausendertrenner (ab C23 und in C++)
6'4'3'2'10 → Tausendertrenner
0x12'23'5 → Tausendertrenner
0b1001'001 → Tausendertrenner
5123123123 → Wertebereich größer als 2^31 so dass automatisch
zum nächst größeren Datentyp konvertiert wird
</pre>
Mit den Suffixen L/l und LL/ll kann der Datentyp long und long long erzwungen werden:
<pre>
12L → Konstante wird in eine long Integer Konstante konvertiert
4711LL → Konstante wird in eine Long Long Konstante konvertiert
</pre>
Mit dem Suffix U/u kann die Konstante explizit auf unsigned gesetzt werden:
<pre>
12U → Konstante wird als vorzeichenlose Zahl gesepeichert
4711ULL → Konstante wird in eine vorzeichenlose
Long Long Konstante konvertiert
</pre>
=== Char-Konstanten ===
In einfachen Anführungsstrichen geschriebene ASCII Zeichen werden entsprechend der {{w|American Standard Code for Information Interchange | ASCII-Tabelle}} als Zahlenwert (Datentyp int) dargestellt:
<pre>
'A' → Integerkonstante 65
'a' → Integerkonstante 97
…
</pre>
Über den {{w|Escape-Sequenz|Escape-Operator}} (Zeichen Backslash '\') wird das/die dem ESCAPE Operator folgende Zeichen gesondert interpretiert. Die im Source-Code erhaltene Zeichenfolge wird im Computerprogramm als ein Zahlenwert (Datentyp int) gespeichert. Dies ist u.A. zur Darstellung von ' und " aber auch zur Darstellung der unteren 32 Zeichen der ASCII Tabelle notwendig (Siehe auch {{w|Steuerzeichen}})
<pre>
ESCAPE Integer- → Bedeutung / (Terminal)funktionalität
Sequence konstante
'\0' = 0 → 0 Character = Stringendezeichen
'\a' = 7 → Bell (erzeugt auf dem Terminal einen Ton)
'\b' = 8 → Backspace (Bewegt den Cursor um eine Position nach links)
'\t' = 9 → Horizontal Tab (Bewegt den Curso auf die nächste horizontale
Tabulatorposition, Abstand ist Terminalspezifisch)
'\n' = 10 → NewLine (Zeilenvorschub)
'\v' = 11 → Vertial Tab
'\r' = 13 → Carriage Return (Wagenrücklauf, Bewegt den Cursor an den
Zeilenanfang)
'\"' = 34 → Double Quote
'\'' = 39 → Single Quote
'\?' = 63 → Question mark
'\\' = 92 → Backslash
'\f' = 12 → FormFeed (Erzeugt auf dem Terminal/Drucker
einen Seitenvorschub)
'\ooo' = 0ooo → Oktal, wobei o Digits von 0..7 sein müssen
'\xdd' = 0xdd → Hexadezimal, wobei d Digits von 0..9 A..F sein müssen
'\udddd' Unicode mit 4 Digits
'\Udddddddd' Unicode mit 8 Digits
</pre>
Beispiel
<syntaxhighlight lang="C">
'A' == 65 == '\101' == '\x41' == '\u0041' == '\U00000041'
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
//Programmiersprache wurde auf C++ gesetzt
if('A' == 65) printf("'A' == 65\n");
if('A' == '\101') printf("'A' == '\\101'\n");
if('A' == '\x41') printf("'A' == '\\x41'\n");
if('A' == '\u0041') printf("'A' == '\\u0041'\n");
if('A' == '\U00000041') printf("'A' == '\\U00000041'\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true|
lang=c++
}} Öffnen im Compiler Explorer] }}
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
u'b' → unicode 16 (nur C++)
U'b' → unicode 32 (nur C++)
L'b' → wchar_t
</pre>
Hinweis
* Die ASCII-Tabelle basiert auf einer 7-Bit Zeichenkodierung, so dass bspw. die Umlaute 'ä', 'ö' und 'ü' dort nicht kodiert sind. Sollen auch diese Zeichen genutzt werden, so empfiehlt sich der Datentyp wchar_t
=== Gleitkommakonstanten ===
Alle Gleitkommakonstanten sind ohne weitere Angaben vom Datentyp double!
<pre>
555.12
555. → 555.0
.1 → 0.1
4e2 → 400.0
1'234.678'9 → Tausendertrenner (ab C23 und in C++)
0x22.11p13 → Konstante in Hexadezimalen Schreibweise (ab C99)
</pre>
Über Suffixe kann ein alternativer Datentyp erzwungen werden:
<pre>
3.0F → Datentyp float
3.0l → Datentyp long double
</pre>
Hinweis:
* Aufgrund der unterschiedlichen Basis zwischen dem menschlichen Zehner-System und dem computerinternen Binär-System entstehen insbesondere bei den Nachkommastellen Rundungsfehler. Die Konstante 0.1f wird durch die Wandlung intern als 1.00000001490116119384765625e-1 dargestellt (siehe [[Programmieren in C/C++: Datentypen#Gleitkomma Datentypen | Datentypen:Gleitkomma Datentypen]])
* Die C-Spec verlangt, dass die binäre Repräsentation von Gleitkommazahlen zur Laufzeit (z.B. durch die Funktion atof() strtod() scanf("%f")) identisch zur der zur Compilezeit ist. Beispiel:
:<syntaxhighlight lang="C">
if(3.14==atof("3.14")) printf("muss erfüllt sein");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
if(3.14==atof("3.14")) printf("muss erfüllt sein\n");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
printf("Intern wird 3.14 wie folgt dargestellt %14.20f",3.14);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Konstanten Ausdrücke ===
Ergänzend zu den Zahlenwerten werden auch Ausdrücke durch den Compiler ausgewertet. Als Voraussetzung für die Ausdrücke gilt, dass alle Operatoren Literale/Konstante sein müssen, so dass der Compiler die Berechnung durchführen kann. Als Operatoren können alle im normalem Syntax erlaubten Operatoren (z.B.: +,-,*,/,&,&&,|,||,>>,<<,==,!=) genutzt werden.<br />
Beispiel:
<syntaxhighlight lang="C">
int var1=7*3+5; → wird vom Compiler durch 26 ersetzt
int var2=(4710+(8-1))&-8; → wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); → wird vom Compiler durch 16 * var1 + 154 ersetzt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int var1=7*3+5; //→ wird vom Compiler durch 26 ersetzt
int var2;
var2=(4710+(8-1))&-8; //→ wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); //→ wird vom Compiler durch var1 * 16 + 154 ersetzt
return 0;
} | execCompilerOptions=-Wall|
h=g|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Konstante Ausdrücke bieten sich an, um den Sourcecode lesbarer zu gestalten. Da der Compiler die Berechnung durchführt, wird zur Laufzeit keine Rechenleistung benötigt. Einzig die Compiledauer wird etwas erhöht:
<syntaxhighlight lang="C">
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180); //siehe nachfolgende Hinweise
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int ad_get(void) {
return 615; //614;
}
int main(int argc,char *argv[]) {
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180);
printf("%f\n%f\n",alpha1,alpha2);
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Ergänzend zu den oben aufgeführten Operatoren erlauben einige Compiler weitere Funktionen der Math.h Library in Konstantenausdrücken (z.B. sin(), cos(), ...)
* Konstanten Ausdrücke werden innerhalb des Compilers durch den Präprozessor ausgewertet, so dass dieser die Ergebnisse ebenfalls nutzen kann:
:<syntaxhighlight lang="C">
#define BUF_SIZE 512
#if (BUF_SIZE & (BUF_SIZE -1)) != 0
#endif
</syntaxhighlight>
=== String Konstanten ===
Stringkonstanten erzeugen ein Array von Characters. Mit dem abschließenden Hochkommata wird das Array um ein Stringendezeichen ergänzt:
<pre>
"abc" → (char []) {'a','b','c','\0'}
</pre>
Adjacent Strings Konstanten werden vom Compiler zu einer String-Kontante zusammengefasst, so dass nur ein Stringendezeichen vorhanden ist:
<pre>
"xxx" "yyy" → (char []) {'x','x','x','y','y','y','\0'}
</pre>
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
L"string" → (wchar_t[7]){L's',L't',L'r' …)
</pre>
Über Postfixes können in C++ Objekte erzeugt werden:
<pre>
"string"s → erzeugt einen String vom Datentyp std::string
"string"sw → Erzeugt einen String vom Datentyp std::string_view
</pre>
String Konstanten werden Compilerintern über unnamed Variablen realisiert, welche als globale Variable angelegt werden und per default const sind:
<syntaxhighlight lang="C">
printf("Wert=%d",4);
//entspricht
const char unnamed1[]="Wert=%d";
printf(unnamed1,4);
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
printf("Wert=%d\n",4);
//entspricht
const char unnamed1[]="Wert=%d\n";
printf(unnamed1,4);
fflush(stdout); //Zur Darstellung der Ausgabe, da nachfolgend
//das Programm abstürzt und die gepufferte Ausgabe
//nicht zur Anzeige gebracht wird
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für doppelte String Konstanten wird nur einmal Speicher reserviert:
<syntaxhighlight lang="C">
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2) printf("Identische Startadressen");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2)
printf("Identische Startadressen");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Initialisierungsliste / Compound Literal ==
Arrays, Strukturen und Unions bestehen zumeist aus mehreren Elementen. Zur Initialisierung solcher Variablen werden die Initialisierungswerte in geschweiften Klammern als Initialisierungsliste zusammengefasst.
<code>
Syntax: {Initialisierungsliste}
</code>
Für eine Initialisierungsliste wird kein Speicher vorgehalten. Vielmehr wird bei der Variablendefinition die Variable direkt mit dem Inhalt der Liste initialisiert. Der Datentyp der Initialisierungsliste ergibt sich aus dem Datentyp der zu initialisierenden Variable:
<syntaxhighlight lang="C">
int arr[5] = { 1,2,3,4,5 };
struct xyz { int x,y,z;}; //Definition einer Struktur
struct xyz var = { 1,2,3 };
</syntaxhighlight>
Wird der Initialisierungsliste ein Datentyp in runden Klammern vorangestellt, so wird hiermit eine 'unnamend' Variable/Objekt, ein Compound Literal erstellt:
<code>
Syntax: (type) {Initialisierungsliste}
</code>
Ein Compound Literal entspricht einer anonymen Variablen des angegebenen Datentyps. Wie bei einer normalen Variablendefinition wird hier ebenfalls eine Variable angelegt und diese mit den Initialisierungswerten initialisiert. Im Unterschied zu einer normalen Variable kann auf solch eine Variable im Nachgang nicht mehr zugegriffen werden. Der Rückgabewert eines Compound Literals entspricht somit dem einer Variablen.</br>
Compound Literale bieten sich überall dort an, wo Variablen nur für einen einmaligen Zweck angelegt werden (bspw. bei der Parameterübergabe von Funktionen):
<syntaxhighlight lang="C">
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawline(struct point start,struct point end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start.x,start.y,end.x,end.y);
}
void printarray(int arr[4]) {
printf("[ ");
for(size_t idx=0;idx<4;idx++)
printf("%d ",arr[idx]);
printf("]\n");
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Über den Adressoperator kann auch die Adresse der anonymen Variablen ermittelt werden. In diesem Falle ist dann der Gültigkeitsbereich/-dauer des Compound Literals zu berücksichtigen. Wird eine Compound Literals außerhalb eines Block-Scopes angelegt, so entspricht sie einer globalen Variable, andernfalls einer lokalen Variablen. Außerhalb des Gültigkeitsbereiches verliert die Adresse auf solch eine Variable ihre Gültigkeit:
<syntaxhighlight lang="C">
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawlinep(struct point *start,struct point *end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start->x,start->y,end->x,end->y);
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Compound-Literal sind per Default keine Konstanten, können also zur Laufzeit geändert werden (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Const Type Qualifier|DatentypeSpecifier:Const Type Qualifier]]):
:<syntaxhighlight lang="C">
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweiften Klammern <code>{ }</code> sind nicht mit dem Block-Operator (siehe [[Programmieren in C/C++: Grundlagen#Block / Compound-Statement | Block / Compound-Statement]]) zu verwechseln. Werden die geschweiften Klammern bei der Initialisierung von Variablen genutzt, dann beschreibt der Inhalt der geschweiften Klammern eine Initialisierungsliste. Wird diesen ein Datentyp vorangestellt, dann wird hiermit eine Compound Literal definiert.
== Variableninitialisierung ==
Mit der Definition einer Variable kann diese optional initialisiert werden. Der tatsächliche Zeitpunkt der Variableninitialisierung (zur Laufzeit oder zur Compilezeit) und damit die Ausführung der Initialisierung (Maschinensprachebefehle oder Speichervorbelegung) hängt von der Gültigkeit/Sichtbarkeit der Variablen ab(siehe [[Programmieren in C/C++: Grundlagen#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]).
=== Globale + Static lokale Variablen ===
Globale und statisch globale Variablen werden in einem während der Laufzeit des Programms festen Speicherbereich gehalten. Zum Startzeitpunkt des Programms ist der Speicherplatz solch einer Variable mit dem Initialisierungswert gefüllt, so das bei erstmaliger Nutzung dieser Variablen diese ihre Initialisierungswerte enthalten. Die Belegung des Speicherplatzes erfolgt durch den Compiler, so dass als Initialisierungswerte / Inhalt der Initialisierungsliste nur Konstanten oder Konstanten-Ausdrücke (siehe [[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Literale/Konstanten]]) erlaubt sind:
<syntaxhighlight lang="C">
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
double sin(double); //DJ: Include-Anweisung in wikibooks schlägt fehlt
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
int main(int argc,char *argv[]) {
printf("%hd %hd %hd\n",array[0],array[1],array[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Nicht initialisierte globale und static lokale Variablen werden mit 0 initialisiert! D.h. die Speicherstellen dieser Variablen werden mit dem Wert 0 vorbelegt::
<syntaxhighlight lang="C">
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
int main(int argc,char *argv[]) {
printf("f=%d\n",f);
printf("%f %f %f\n",arr[0],arr[1],arr[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Lokale Variable ===
Der Speicherplatz für lokale Variable wird auf dem Stack zur Verfügung gestellt. Mit jedem öffnenden Block-Scope wird Speicher für die innerhalb dies Block-Scopes vorhandenen Variablen vom Stack nach dem LIFO Prinzip reserviert und mit der Variablendefinition Maschinencode zur Initialisierung der Speicherstellen ausgeführt (sofern Variable einen Initialisierungswert hat):
<syntaxhighlight lang="C">
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für int) und 8 Bytes (für double)
int var1=12; //erzeugt Maschinencode zur Initialisierung
//der ersten 4 Byte mit dem Wert 12
double var2=sin(f); //erzeugte Maschinencode, welche zunächst
//die Funktion sin() mit dem Übergabewert f
//aufruft und dessen Rückgabewert in die
//nächsten 8 Byte des reservierten Speichers
//kopiert
...
{ //siehe zuvor
int var3=var1; //siehe zuvor
double var4=var2+var1;
} //siehe nachfolgenden
} //Freigabe des zuvor reservierten Speichers
</syntaxhighlight>
Dies gilt auch für Funktionsaufrufe. Mit der öffnenden geschweiften Funktionsklammer wird ebenfalls Speicher reserviert:
<syntaxhighlight lang="C">
void foo(int par)
{ //Öffnende Funktionsklammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für (Übergabe)Variable par und 4 Bytes für Variable var
int var; //Da keine Initialisierung vorhanden ist wird auch
//kein Maschinencode zur Initialisierung ausgeführt
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Byte für Variable x
int x;
...
</syntaxhighlight>
Aufgrund der mit der Initialisierung bedingten Erzeugung von Maschinencode können die Initialisierungswerte/Inhalte der Initialisierungsliste bei lokalen Variablen aus beliebigen Ausdrücken bestehen und müssen keine Konstanten oder Konstanten Ausdrücke sein:
<syntaxhighlight lang="C">
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sin(f)}; //werden zur Laufzeit berechnet
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h> //fuer sinf()
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sinf(f)}; //werden zur Laufzeit berechnet
printf("%f\n",(double)summe);
printf("%f %f %f\n",(double)arr[0],(double)arr[1],(double)arr[2]);
}
int main(int argc,char *argv[]) {
foo(3,4);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dieser Maschinencode wird jedes Mal ausgeführt, wenn die dazugehörige Anweisung abgearbeitet wird und bedingt dementsprechend Rechenzeit. Zehnmaliges Ausführen einer Funktion oder zehnmaliges Öffnen eines Block-Scopes innerhalb einer For-Schleife führt zur zehnmaligen Ausführung der oben genannten Sachverhalte:
<syntaxhighlight lang="C">
void foo(int);
void var(void) {
for(int lauf=10; lauf>0; lauf--)
{ //zehnmaliges Reservieren von Speicher
int var=lauf*2; //zehnmalige Initialisierung
foo(var);
} //Freigabe des Speichers
}
void foo(int par) { //zehnmaliges Reservieren von Speicher
int var=12; //zehnmalige Initialisierung
} //Freigabe des Speichers
</syntaxhighlight>
Nicht initialisierte lokale Variablen werden nicht initialisiert, d.h. keine zusätzlichen Maschinenbefehle zum Initialisieren erzeugt. Der Variablenwert entspricht dann einem 'Zufallswert' oder korrekter gesagt dem Inhalt der Variablen, welcher zuvor der Speicherstelle zugewiesen war:
<syntaxhighlight lang="C">
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//und damit auch dessen zuletzt gültigen Wert
}
int main(int argc, char *argv[]) {
int var1=first(); //var1 beinhaltet Wert 7
int var2=second(); //var2 beinhaltet Wert 7
printf("var_foo=%d\n",var1);
printf("var_far=%d\n",var2);
return 0;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//(und damit auch dessen zuletzt gültigen Wert)
}
int main(int argc, char *argv[]) {
printf("%d\n",second()); //Zufallswert (0, da Stack mit 0 initialisiert ist)
printf("%d\n",first()); //Stack belegen
printf("%d\n",second()); //Zufallswert (7, da Speicherstelle zuvor mit 7
return 0; //belegt wurde)
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird eine Variableninitialisierung mit einer switch oder goto Anweisung übersprungen, so wird zwar die Variable angelegt (Speicherplatz reserviert), jedoch die Maschinenbefehle zur Initialisierung dieser Variablen nicht ausgeführt (siehe auch [[Programmieren in C/C++: Grundlagen# Switch-Anweisung|Switch-Anweisung]] und [[Programmieren in C/C++: Grundlagen# Label + Goto|Label + Goto]]). Die Variable enthält dann einen Zufallswert:
<syntaxhighlight lang="C">
switch(value) {
case 0:
int lok=7;
printf("%d",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(int value) {
switch(value) {
case 0:
int lok=7;
printf("%d\n",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d\n",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
}
void far(void) {
int var1=4711;
int var2=1799;
printf("Marke: %d, Erscheinungsjahr: %d\n",var1,var2);
}
int main(int argc,char *argv[]) {
foo(2); //Zufallswert (0, da Stack mit 0 initialisiert ist)
foo(0); //Initialisierungswert
far(); //Stack belegen
foo(2); //Zufallswert
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei erstmaligem Funktionsaufruf kann eine nicht initialisierten lokale Variablen den Wert 0 beinhalten (Stackframe wird mit Programmstart auf 0 gesetzt). Beim nächsten Aufruf der Funktion ist zumeist die Speicherstelle der lokalen Variablen mit anderen Werten gefüllt worden, so dass nun ein anderer 'Zufallswert' als 'Initialisierungswert' enthalten ist
=== C++ ===
In C++ ist ergänzend die Initialisierung einer Variablen über () möglich. Bei Objekten wird hierüber der zugehörige Konstruktor aufgerufen. Bei primitiven Datentypen entspricht der Wert in den Klammern dem Initialisierungswert:
<syntaxhighlight lang="C++">
int variable(10); //Bei primitiven Datentype entspricht dies
//int variable=10;
struct test {
int a;
test(int par) {a=par;} //Konstruktor der Struktur test
};
struct test test(4); //Konstruktor test(int par) wird aufgerufen
struct test test(4,5); //KO, kein passender Konstruktor vorhanden
</syntaxhighlight>
=== Sonstiges ===
Folgende weitere Sachverhalten gilt es bzgl. Variableninitialisierung zu berücksichtigen:
* Nach C-Spezifikation ist eine Initialisierung von Variablen nicht notwendig. Es liegt folglich kein Fehler vor, wenn auf eine nicht initialisierte Variable lesend zugegriffen wird. Ungeachtet der C-Spezifikation überprüft der Compiler mit dem Schalter '-Wall' diesen Sachverhalt und gibt eine Warning aus
* Deklarationen/Prototypen können keinen Initialisierungswert enthalten
<syntaxhighlight lang="C++">
extern int var=7; //Fehlerhaft
</syntaxhighlight>
* Const und lokale Static Variablen sollten initialisiert werden, auch wenn C in diesem Fall keinen Fehler meldet!
<syntaxhighlight lang="C++">
const int konstante; //Syntaktisch OK, Initialisierungswert fraglich!
static int statisch;
</syntaxhighlight>
== Anweisung (Statement) & Expression ==
Eine Anweisung (Statement) stellt entsprechend dem Wikipedia Artikel {{w|Anweisung_(Programmierung) | Anweisung}} ''"ein in der Syntax einer Programmiersprache formulierte einzelne Vorschrift dar, die im Rahmen der Abarbeitung des Programms auszuführen ist"''.</br>
Aus der Statement Spezifikation ergibt sich folglich, welche Bestandteile ein Programm beinhaltet kann. In der C-Spezifikation [C11 6.8] sind folgende Anweisungen definiert:
: labeled-statement: Eine Sprungmarke für die Switch- und die Goto-Anweisung
: compound-statement: siehe nachfolgendes Kapitel
: expression-statement: siehe nachfolgendes Kapitel
: selection-statement: Eine if() oder switch() Anweisung
: iteration-statement: Eine while(), do while() oder eine for() Anweisung
: jump-statement: Eine goto, break, continue oder return Anweisung
so dass ein Programmablauf wie folgt aussehen könnte:
<syntaxhighlight lang="C">
int main(int argc, char argv[]) {
int var; //declaration innerhalb eines compound-statements
label: //labeled-statement
var=var*2+1; //expression-statement
for(var=0;var<100;var++); //iteration-statement
if(var<0) //selection-statement
printf("var<0"); //espression-statement
{ int lok=var; lok++; } //compound-statement
goto label; //jump-statement
return 0;
}
</syntaxhighlight>
=== Ausdruck (Expression) ===
Entsprechend der C-Spezifikation [C11 6.5] ist ein Ausdruck eine Folge von Operatoren und Operanden, die die Berechnung eines Werts angibt, ein Objekt oder eine Funktion bezeichnet, Nebenwirkungen erzeugt oder eine Kombination davon ausführt. Die Wertberechnungen der Operanden eines Operators werden vor der Wertberechnung des Ergebnisses des Operators ausgeführt (siehe auch {{w|lang=en|Expression_(computer_science)|Expression}}).
Beispiele:
<syntaxhighlight lang="C">
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöung der globalen Variable a)
int func(int par) { a++; return par*2;}
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int a=0;
int func(int par) {
a++;
return par*2;
}
int main(int argc,char *argv[]) {
int a=4,b=7;
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöhung der globalen Variable a)
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ausdrücke entsprechen somit Rechenvorschriften, die ausgewertet werden. Ausdrücke sind in C/C++ überall dort erlaubt, wo ein Operand erwartet wird:
<syntaxhighlight lang="C">
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func3(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf()]) {}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
//Ausdruck innerhalb eines Funktionskopfes
int func1(int par) {
return 1;
}
int func2(void) {
return 1;
}
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf("func() called\n")])
{
printf("func() body\n");
}
int main(int argc,char *argv[]) {
int a=1;
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func1(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
func3(1,arr);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dies ist unter anderen ein Grund dafür, dass C/C++ als unleserlich gilt. Zur besseren Lesbarkeit eines Codes sollte dieses 'Feature' nur dann genutzt werden, wenn es zwingend notwendig ist.
=== Discarded Value / null statement ===
Alle Ausdrücke und nicht void-Funktionen haben einen Rückgabewert, der weiter verwendet werden kann:
<syntaxhighlight lang="C">
a+7 //Rückgabewert ist das Ergebnis der Addtion
printf("hallo") //printf() Funktion ist vom Typ int und gibt die Anzahl
//der ausgegebenen Zeichen zurück
a //gibt den Inhalt der Variablen zurück
7 //gibt den 'Inhalt' der Konstanten zurück
b=(a=7) //der Zuweisungsoperator gibt den Zuweisungswert zurück
</syntaxhighlight>
Der letzte Rückgabewert eines fasst jeden Ausdruckes wird somit nicht genutzt. Dies wird Discarded Value bezeichnet:
<syntaxhighlight lang="C">
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der einfachste Fall eines Discarded Values ist ein Leeranweisung / null statement, d.h. die Anweisung besteht nur aus einem Semikolon. Dies stellt eine syntaktisch korrekte Anweisung dar, die keine Auswirkung hat:
<syntaxhighlight lang="C">
; //Leeranweisung
</syntaxhighlight >
Überall wo statements/Anweisungen erwartet werden (bspw. bei einer for-Schleife, bei einer if-Anweisungen) kann anstatt einer statements eine Leeranweisung stehen, welche dementsprechend nichts ausführt:
<syntaxhighlight lang="C">
for(size_t idx=0; str[idx]!=0; idx++)
; //Leeranweisung
while(a++ < 100)
; //Leeranweisungen
</syntaxhighlight>
An einige Stellen bietet sich die Nutzung dieser Sachverhalte als vorteilhaft an. Oft führen diese Sachverhalten jedoch zu Ausführungsfehlern, da sie aufgrund des korrekten Syntax vom Compiler nicht als Fehler gemeldet werden und beim Suchen dementsprechend nur schwer zu finden sind! Ggf. gibt der Compiler für einige Sachverhalte eine Warnung aus, so dass es vorteilhaft ist, Compiler-Warnings zu beachten!
Hinweise:
* Soll bewusst der Rückgabewert verworfen werden, so kann/sollte mit dem explizten Cast auf (void) der Rückgabewert explizit 'verworfen' werden. Dies ist u.A. hilfreiche bei Variablen, die (noch) nicht benutzt werden und der Compiler die Warning "unsued Variable" ausgibt:
:<syntaxhighlight lang="C">
(void)a; //Zur Vermeidung von Compiler-Warnings "Unused Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(void) {
return 4711;
}
int main(int argc,char *argv[]) {
int a;
(void)a; //Zur Vermeidung von Compiler-Warnings "Unsued Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Mit der Anweisung <nowiki>[[nodiscard]]</nowiki> (ab C++17, ab C23) wird der Compiler angewiesen, dass der Aufrufer einer Funktion mit Rückgabewert der Rückgabewert entgegenzunehmen ist. Wird der Rückgabewert verworfen, so gibt der Compiler eine Fehlermeldung aus:
:<syntaxhighlight lang="C">
[[nodiscard]] int Client(int socket);
Client(5); ////Fehlermeldung, da Rückgabewert nicht verwendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
[[nodiscard]] int Client(int socket) {
return socket+1;
}
int Server(int socket) {
return socket+1;
}
int main(int argc,char *argv[]) {
Server(5); //keine Fehlermeldung
Client(5); //Fehlermeldung, da Rückgabewert nicht verwendet wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sequence Point ===
Ein Sequenzpunkt (u.A. das abschließende Semikolon am Ende der Anweisung) ist nach dem Wikipedia Artikel {{w|lang=en|Sequence_point|Sequence Point}} definiert als der Punkt in der Ausführung eines Computerprogramms, an dem garantiert ist, dass alle Nebenwirkungen früherer Bewertungen durchgeführt wurden und noch keine Nebenwirkungen von nachfolgenden Bewertungen durchgeführt wurden.</br>
Sequenzpunkte führen somit zur Trennung der Abarbeitungsreihenfolge innerhalb von Ausdrücken. Das abschließende Semikolon am Ende eines Ausdruckes sorgt somit dafür, dass zunächst der vorangegangene Ausdruck abgearbeitet wird, bevor der nächste Ausdruck beachtet wird.</br>
Beschreibt das Semikolon explizit einen Sequenzpunkt, so gibt es auch andere Operatoren, die einen Sequenzpunkt beinhalten. Bei solchen Operatoren wird somit zunächst vollständig der erste Teilausdruck ausgewertet, bevor der nächste folgt. Zwei Beispiele für Operatoren mit Sequenzpunkt sind das logische Und <code>&&</code> und der <code>?</code>-Operator:
<syntaxhighlight lang="C">
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(int par) {
return printf("func(%d) called\n",par);
}
int main(int argc,char *argv[]) {
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein weiteres Beispiel ist der Komma-Operator. Hier teilt das Komma den Gesamtausdruck in mehrere Teilausdrücke auf, die nacheinander abgearbeitet werden (siehe
[[Programmieren in C/C++: Grundlagen#Komma-Operator | Komma-Operator]]).
=== Abarbeitungsreihenfolge ===
Die Abarbeitungsreihenfolge der Operatoren innerhalb eines Ausdruckes wird durch die Prioritätenliste/Rangfolge (siehe [[C-Programmierung: _Liste_der_Operatoren_nach_Priorität| C-Programmierung:Liste der Operatoren nach Priorität]]) vorgegeben. Operatoren mit höherer Priorität werden vor Operatoren mit niedriger Priorität ausgeführt. Die ()-Klammer hat die höchste Priorität:
<syntaxhighlight lang="C">
//Der Ausdruck
c = sizeof(x) + ++a / 3;
//wird aufgrund der Prioritäten wie folgt ausgewertet:
c= (sizeof(x)) + ( (++a) / 3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=2;
int c;
int x=0;
c = sizeof(x) + ++a / 3;
printf("a=%d c=%d\n",a,c);
//Wird aufgrund der Prioritäten wie folgt ausgewertet:
a=2;
c= (sizeof(x)) + ( (++a) / 3);
printf("a=%d c=%d\n",a,c);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei identischer Priorität ergibt sich die Abarbeitungsreihenfolge aus der Assoziativität (L-R oder R-L):
<syntaxhighlight lang="C">
a=33 / 5 / 2;
//Wird aufgrund der L-R Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2;
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
a = b = c = d*2; //→ a=(b=(c=(d*2)));
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a;
a=33 / 5 / 2;
printf("a=%d\n",a);
//Wird aufgrund der Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2
printf("a=%d\n",a);
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
int b,c,d=8;
a = b = c = d*2; //→ a=(b=(c=(d*2)));
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
An einigen Stellen gibt die C/C++ Spezifikation die Abarbeitungsreihenfolge nicht vor (indeterminately-sequenced), überlässt diese somit dem Compiler:
* Bei Funktionsaufrufen ist die Abarbeitungsreihenfolge der Parameter nicht spezifiziert:
:<syntaxhighlight lang="C">
//Quelle: C-Spec Kap. 6.5.2.2
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int f1(void) {
printf("f1 called\n");
return 1;
}
int f2(void) {
printf("f2 called\n");
return 2;
}
int f3(void) {
printf("f3 called\n");
return 3;
}
int f4(void) {
printf("f4 called\n");
return 4;
}
void func1(int par1,int par2) {
printf("func1(%d,%d) called\n",par1,par2);
}
void func2(int par1,int par2) {
printf("func2(%d,%d) called\n",par1,par2);
}
int main(int argc,char *argv[]) {
//Quelle: C-Spec Kap. 6.5.2.2
void (*pf[2])(int,int)={func1,func2};
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Per Postinkrement/-dekrement Operator sagt aus, dass für die eigentliche Operation der Wert der Variablen genutzt wird und im Anschluss die Variable erhöht / erniedrigt werden soll. Nach C-Spezifikation [C11 6.5.2.4] muss dies spätestens vor dem nächsten Sequence Point erfolgt sein. Der genaue Zeitpunkt innerhalb des Sequence Points ist jedoch nicht vorgegeben:
:<syntaxhighlight lang="C">
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
printf("a=%d b=%d\n",a,b);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Initialisierungliste ist Abarbeitungsreihenfolge nicht spezifiziert:
<syntaxhighlight lang="C">
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
printf("var={a=%d b=%d c=%d}\n",var.a,var.b,var.c);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Compound-Statement ===
Ein Compound-Statement ist innerhalb der C-Spezifikation ein alternativer Ausdruck für ein block-scope. Dieser fasst mehrere Statements und Deklarationen zu einem Statement zusammen:
<code>
Syntax: {Declaration-or-statement-list/textsuperscript<sub>OPT</sub>}
</code>
Ein Block wird nicht wie bei einer Anweisung mit einem Semikolon abgeschlossen (Das angehängte Semikolon wäre dann eine separate leere Anweisung!).
Ein Block hat blockweite Sichtbarkeit (siehe [[Programmieren in C/C++: Grundlagen#Blockweite Sichtbarkeit | Blockweite Sichtbarkeit]]), , so dass hier definierte Variablen nur hier gültig sind. Deklarationen sind ebenfalls nur in dem Block gültig:
<syntaxhighlight lang="C">
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Verwendung findet das Compound-Statement a) als Strukturierungsmöglichkeit innerhalb von Funktionen (zur Darstellung, dass dieser Bereich 'zusammengehörig' ist) und b) an den Stellen, an denen C/C++ nur eine Anweisung erwartet. Dies sind bspw. die If- und die For-Anweisungen:
<syntaxhighlight lang="C">
for(..) Anweisung; //For-Schleife führt nur diese eine Anweisung aus
for(…) {Block} //For-Schleife führt Block (als eine Anweisung) aus
if(..) Anweisung; else Anweisung; //IF-Anweisung führt nur 'eine'
//Anweisung aus
if(..) {Block} else {Block} //IF-Anweisung führt Block aus
if( ) {Block}; else {Block}; //Semikolon ist eine separate
//Leer-Anweisung, so dass else
//nicht zur IF-Anweisung zugeordnet
//werden kann (2 Anweisungen vor Else)</syntaxhighlight>
=== Embedded Statement ===
Embedded Statements sind eine GNU-C Erweiterung (siehe [https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html GNU-C-Manual 3.18]). Da diese vom Autor als sehr nützlich angesehen und auch von diversen Compilern und auch in C++ unterstützt werden, werden diese nachfolgend beschrieben.
Ein Compound-Statement fasst mehrere Anweisungen zu einer Anweisung zusammen, hat jedoch kein Rückgabewert. Ein Embedded-Statement entspricht einem Compound-Statement mit der Ergänzung, dass dieser einen Rückgabewert hat, so dass ein Embedded-Statement überall dort eingesetzt werden kann, wo eine Operand erwartet wird.
<code>
Syntax: ({Declaration-or-statement-list<sub>OPT</sub>})
</code>
Der Rückgabewert (und Datentyp) wird nicht über eine return-Anweisung angegeben, sondern entstammt aus dem Rückgabewert der letzten Anweisung innerhalb der Liste:
<syntaxhighlight lang="C">
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
printf("var=%d\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein Embedded-Statement ähnelt folglich einem Funktionsaufruf mit dem Unterschied, dass a) in der Tat kein Funktionsaufruf stattfindet und b) der Rückgabewert nicht mit return, sondern über die letzte Anweisung zurückgegeben wird. Der Anwendungsfall ist dort zu finden, wo eine Operand erwartet wird und mehrere Anweisungen zum Ermitteln des Operanden notwendig sind:
<syntaxhighlight lang="C">
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
printf("Bedingung erfüllt");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Ein Embedded-Statement ist insbesondere bei Nutzung von Makros (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]) hilfreich
* Mittels eines Embedded-Statement kann eine anonyme Funktion/Lambdafunktion dargestellt werden:
<syntaxhighlight lang="C">
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {return a%2?a:0;} ; func;})
,arr);
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {printf("Called:%d\n",a);return a%2?a:0;} ; func;})
,arr);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Funktionen / Prozeduren ==
Funktionen/Prozeduren sind ein Strukturierungsmerkmal, so dass Teile der Funktionalität des Programmes wiederverwendbar sind. C/C++ unterscheidet nicht zwischen Funktionen (haben einen Rückgabewert, können damit als Operand in Ausdrücken verwendet werden) und Prozeduren (haben keine Rückgabewert, resp. Rückgabetyp void). <br/>
Mit jedem Aufruf einer Funktion wird für den zugehörigen Block ein eigener Stack-Kontext angelegt, so dass Funktionen sich selbst aufrufen können (Rekursion). Jeder Funktionsinstanz hat somit seinen eigenen lokalen Variablenbereich, teilen sich jedoch die globalen und die statisch lokalen Variablen.<br />
Mit dem Aufruf einer Funktion können Parameter übergeben werden, wobei die Übergabeparameter vom Aufrufer (Caller) durch den Aufruf in die lokalen Variablen des Aufgerufenen (Callee) kopiert/zugewiesen werden (Call by Value). Wird ein Zeiger übergeben, hat der Callee über die Dereferenzierung des Zeigers die Möglichkeit, die Variablen des Caller zu verändern (Call by Reference) (siehe Kap. [[Programmieren in C/C++: Zeiger #Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen).]]).
Hinweise:
* Die Klammerung hinter dem Funktionsnamen (<code>foo()</code>) zeigt an, dass es sich um einen Funktionsaufruf (Verzweigung der Programmausführung zu der Startadresse der Funktion) handelt:
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
foo(); //Klammern hinter dem Funktionsnamen bedeuten Aufruf der Funktion
</syntaxhighlight>
* Die Nutzung des Funktionsnamens ohne Klammerung (<code>foo</code>) gibt die Startadresse der Funktion zurück. Die Startadresse kann in einem Zeiger auf Funktionen gespeichert werden (siehe Kap. [[Programmieren in C/C++: Zeiger#Zeiger auf Funktionen | Zeiger:Zeiger auf Funktionen]]):
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
printf("foo called");
};
int main(int argc, char *argv[]) {
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
fptr(); //Aufruf der Funktion
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklaration/Definition vor dem ersten Aufruf der Funktion 'notwendig', damit Compiler die Übergabeparameter entsprechend bereitstellt und ggf. eine implizite Typkonvertierung durchführt (dito Rückgabewert). Die Angabe der Variablennamen können bei der Deklaration entfallen
* Die fehlende Angabe der Übergabeparameter bedeutet in C (bis einschl. C18), dass diese Funktion mit beliebigen Übergabeparametern aufgerufen werden kann und der Compiler keine Typprüfung durchführt:
:<syntaxhighlight lang="C">
int func(/*Keine Übergabeparameter angegeben*/) {...}
//kann wie folgt aufgerufen werden
func();
func(4);
func("hallo Welt",4.7);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func() {
printf("foo called\n");
};
int main(int argc, char *argv[]) {
func();
func(4);
func("hallo Welt",4.7);
//Ab C23 hat sich die Bedeutung geändert.
//Zum Testen C-Versionsvorgabe -sdc=xxx unter Compiler-options aendern
return 0;
} | execCompilerOptions=-Wall -std=c17|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:→ unbedingt vermeiden<br />
:Hat die Funktion keinen Übergabewert, so wird dies in C mit void gekennzeichnet
* In C++ bedeutet die Schreibweise ohne Datentypbeschreibung, dass keine Parameter erwartet werden
* In der Parameterliste von Funktionen dient in der GNU-C Spezifikation das Semikolon zum Trennen zwischen Deklaration von Übergabeparameter und den Übergabeparametern. Alle Übergabewerte links vom Semikolon sind (Forward)deklarationen:
:<syntaxhighlight lang="C">
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Aufruf
test1(3,7); //a=7 b=3
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim);
//Aufruf
test2("hallo",6);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim) {
printf("dim=%d\n",dim);
}
int main(int argc, char *argv[]) {
//Aufrufe
test1(3,7); //a=7 b=3
test2("hallo",6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Return-Anweisung ===
Mit der Return-Anweisung wird eine Funktion (vorzeitig) beendet. Der optionale Parameter dient der Angabe des Rückgabewertes der Funktion an den Aufrufer. Der Datentyp des Parameters ergibt sich aus dem Rückgabedatentyp der Funktion.
<code>
Syntax: return expression<sub>OPT</sub>
</code>
Der Rückgabewert expresion sagt aus, dass hier nicht nur Konstanten oder Variablen stehen können, sondern ein komplexer Ausdrücke erlaubt ist. Der resultierende Datentyp des Ausdruckes sollte dem Rückgabedatentyp der Funktion entsprechen, andernfalls wird eine implizite Typkonvertierung vollzogen (sofern möglich):<syntaxhighlight lang="C">
int foo(double a, double b) {
return (int)(a*a+b*b);
}
</syntaxhighlight>
Hinweise:
* Bei nicht void-Funktionen ist eine return-Anweisung mit einer Expression entsprechend dem Datentyp der Funktion zwingend notwendig:
:<syntaxhighlight lang="C">
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
double a=func(); //int wird in double konvertiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
int main(int argc, char *argv[]) {
double a=func(); //int wird in double konvertiert
printf("a=%f\n",a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei einer void-Funktion ist die return-Anweisung ohne Expression optional. Hier entspricht der schließende Block der Return-Anweisung
:<syntaxhighlight lang="C">
void func(char *str) {
if(str==NULL)
return;
printf("%s",str);
}
</syntaxhighlight>
Sollen mehr als ein Rückgabewert an den Aufrufer zurückgegeben werden so empfiehlt sich:
* die Rückgabewerte in einer Struktur zu packen (siehe [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++) |Datentypen:Verbundtyp Struktur/Klasse (nur C++)]])
* die Rückgabewerte über die Aufrufparameter als Call-by-Reference zu übergeben (siehe [[Programmieren in C/C++: Zeiger#Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen]])
==== Rückgabewert aus Datentypsicht ====
Aus Datentypsicht kann der Funktionsname inkl. den Parameter(n) in einem Ausdruck mit dem Datentyp des Rückgabewertes der Funktion ausgetauscht werden:
<syntaxhighlight lang="C">
int foo(void) {return 4711;}
int var;
var=1+foo(); //Aus Datentypsicht (int)=(int)+(int)
</syntaxhighlight>
Daraus ergibt sich, dass bei Arrays/Strukturen/Unions direkt auf einzelne Komponenten zugegriffen werden kann, ohne diese zuvor einer Variablen zuzuweisen:
<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
if(foo(12).x == 12) printf("Identisch\n");
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
if(far(3)[2] == 2) printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <stdlib.h>
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
int main(int argc, char *argv[]) {
if(foo(12).x == 12)
printf("Identisch\n");
if(far(3)[2] == 2)
printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
==== Fehlerrückgabe ====
Viele Funktionen können unter gewissen Umständen nicht korrekt ausgeführt werden. Z.B. aufgrund dessen, dass:
* der benötigter Speicher vom Heap nicht bereitgestellt werden kann
* Übergabeparameter außerhalb des zulässigen Wertebereiches liegen
* angeforderte Ressource (Datei, Geräte, …) nicht vorhanden/verfügbar sind
Solche Fälle gilt es dem Aufrufer mitzuteilen, da in diesen Fällen die vom Aufrufer geforderte Funktionalität nicht erfüllt ist und der Aufrufer ggf. nicht weiterarbeiten kann. Zur Mitteilung des Fehlers sollte vorrangig der Rückgabewerte genutzt werden. (auch wenn in C++ mit Exception eine Alternative hierzu bereitsteht)
<syntaxhighlight lang="C">
char *strdup(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup1(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
int main(int argc, char *argv[]) {
char *dup=strdup1("hallo");
if(dup == NULL)
printf("Fehler\n");
else
printf("dup='%s'\n",dup);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Standard-C Library-Funktionen geben in diesem Fall zumeist ein -1 (Rückgabewert Ganzzahl) oder einen NULL-Zeiger (Rückgabewert Zeiger) zurück. Der genaue Fehlergrund ist dann ergänzend in der globalen Variablen errno gespeichert. Mittels der Standard-C Funktion strerror() kann die Zahl in einen für den Anwender/Programmierer lesbaren String umgewandelt werden (die GNU-C Library Funktion printf() bietet ergänzend den Conversion Spezifier %m als alternative Ausgabemöglichkeit an):
<syntaxhighlight lang="C">
#include <errno.h>
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY|O_CREAT|O_EXCL,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY{{!}}O_CREAT{{!}}O_EXCL,
S_IRUSR{{!}}S_IWUSR{{!}}S_IRGRP{{!}}S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'''Für eine sauber Programmierung sollte diese Methodik generell angewendet werden.''' Jede Funktion, welche Fehlschlagen kann, teilt dies per Rückgabewert dem Aufrufer mit. Der Rückgabewert einer jeden Funktion wird vom Aufrufer kontrolliert.
=== Main-Funktion ===
Mit Start der Anwendung übergibt das Betriebssystem die Kontrolle an die Anwendung und führt dort die Funktion main aus. Als Übergabe- und Rückgabeparameter sind folgende Varianten erlaubt:
<syntaxhighlight lang="C">
int main(void) { }
int main(int argc, char *argv[]) { }
</syntaxhighlight>
Mit dem Start der Anwendung kann, wie bei jedem Funktionsaufruf, Parameter an den startenden Prozess übergeben werden. Die Parameter werden als Array von Strings übergeben. Im Parameter argc ist die Anzahl der Strings enthalten. Im Parameter argv[0..argc-1] sind die einzelnen Strings enthalten. Sofern vorhanden ist im ersten String der Programmname/Aufrufname der Anwendung enthalten:
<syntaxhighlight lang="C">
int main(int argc, char *argv[]) {
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++)
printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int max_width=0;
int ret;
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++) {
ret=printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
max_width=ret>max_width ? ret : max_width;
}
//Trennzeichen drucken
char term[max_width];
memset(term,'-',max_width);
printf("%.*s\n",max_width-1,term);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Im Compiler-Explorer können die Parameter im Executor unter 'Execution Arguments', getrennt mit Leerzeichen eingegeben werden.
Wird die Funktion main beendet, entweder über die return Anweisung oder den Aufruf der exit() Funktion, wird die Kontrolle zurück an den startenden Prozess (zumeist Shell) gegeben. Über den Rückgabewert wird im Allgemeinen dem Aufrufer der Fehlerstatus mitgeteilt (EXIT_SUCCESS oder 0 bedeutet fehlerfreie , EXIT_FAILURE oder Werte ungleich 0 fehlerhafte Ausführung).
Hinweise:
* Der Return-Wert der main-Funktion kann mit >>echo $? in der Bash abgefragt werden
* Mittels <code>exit(int status)</code> kann das Programm an jeder Stelle innerhalb des Programms beendet werden. <code>status</code> entspricht dann der expression der return Anweisung von main()
* Ungeachtet des Rückgabedatentyps int bei der Defintion der main() Funktion beträgt der zulässige Wertebereich für Linux Anwendungen 0..255. Der korrekte Rückgabedatentyp der main() Funktion müsste somit 'unsigned char' lauten
=== Inline Funktion ===
Wie der Name inline andeutet, ist die Intention von Inline, dass die aufgerufen Funktion Bestandteil der aufrufenden Funktion ist. Die aufgerufene Funktion soll somit im Kontext des Aufrufers ausgeführt werden, so dass kein eigener Stack bereitgestellt werden muss. Der Start der Funktion kann somit schneller erfolgen:
<code>
inline int foo(void) { }
</code>
Das Funktionseinbindung/zusammenführung erfolgt durch den Compiler (und nicht durch den Linker). Damit das inline vom Compiler ausgeführt werden kann, muss die zu inlinende Funktion vor dem Aufruf definiert sein, d.h. sie muss in derselben C-Datei oder in einer der einzubindenden Header-Dateien enthalten sein [C11 6.7.4].
Hinweis:
* Das 'inlinen' von Funktionen über die eigene Objektdatei hinweg erfolgt in C/C++ über Link Time Optimization (LTO). Hierzu fügt der Compiler den Zwischencode mit in die Objektdatei, so dass der Linker das 'inlinen' vollziehen kann (siehe {{w|lang=en|Interprocedural_optimization| Interprocedural Optimization}})
=== Variadic Function / Ellipsis Punctuator ===
Mit dem Ellipsis Puncturator '…' kann in Funktionsdefinitionen angegebenen werden, dass an dieser Stelle beliebig viele Parameter/Argumente übergeben werden können. Dies wird unter anderen in der printf() Anweisung genutzt:
<syntaxhighlight lang="C">
int printf(const char *fmt, ... );
</syntaxhighlight>
Die wie folgt aufgerufen werden kann:
<syntaxhighlight lang="C">
printf("Hello World"); //es folgt kein Parameter
printf("%d",100); //es folgt ein Parameter vom Datentyp int
printf("%f",1.1); //es folgt ein Parameter vom Datentyp double
printf(conststr,1,2,3,"xyz") //Ohne Worte
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n"); //es folgt kein Parameter
printf("%d\n",100); //es folgt ein Parameter vom Datentyp int
printf("%f\n",1.1); //es folgt ein Parameter vom Datentyp double
const char *conststr="%d %x %c '%s'\n";
printf(conststr,1,2,33,"xyz"); //Ohne Worte
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei der Parameterübergabe wird der Datentyp nicht mit übergeben, so dass die aufgerufene Funktion keine Möglichkeit hat, den Datentype der Parameter zur Laufzeit zu ermitteln. Einzig werden bei Aufruf der variadischen Funktion so viel Bytes auf den Stack gelegt, wie der Datentyp der einzelnen Übergabeparameter groß ist:
:<code>int --> 4 Byte</code>
:<code>double --> 8 Bytes</code>
:<code>Zeiger --> 4/8 Byte</code>
Damit die aufgerufene Funktion die fehlende Datentypinformation dennoch mitgeteilt bekommt, erfolgt dies am Beispiel der printf Funktion über den Format-String:
<syntaxhighlight lang="C">
int vari;
printf("%d",vari); //%d erwartet einen Integer Übergabeparameter (4-Byte)
size_t vars;
printf(" %zu %d ", vars, vari); // %zu zur Mitteilung, dass anstatt
//integer nun size_t als Datentyp übergeben wird
//und somit anstatt 4 Bytes 8 Bytes vom Stack genommen werden
</syntaxhighlight>
<code>printf()</code> entnimmt entsprechend der Datentypbeschreibung im Formatstring die passende Anzahl an Bytes vom Stack.
Da der Compiler für die optionalen Parameter nicht den Zieldatentyp kennt, erlaubt die C-Spezifikation als Übergabedatentypen hier nur die Grunddatentypen <code>signed int, unsigned int, long, long long, double</code> und <code>Zeiger</code>. Entspricht der übergebene Parameter nicht einen dieser Datentypen, so wird er mittels implizit Cast entsprechend nachfolgender Tabelle gewandelt [C11 6.5.2.2 Default Argument Promotions]:
{| class="wikitable"
|-
! Ausgangstyp !! Umwandlungstyp
|-
| char, signed char, short || int
|-
| unsigned char, unsigned short || unsigned int
|-
| float || double
|-
| Alle anderen Datentypen || bleiben erhalten
|}
Bspw.:
<syntaxhighlight lang="C">
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Über den Length-Modifier Parameter im Formatstring kann printf mitgeteilt
//werden, dass von dem übergebenem Integerwert weniger Bytes zu
//interpretieren sind
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
Zum Umgang mit dem variadischen Parameter stellt C die Funktionen <code>va_start(), va_arg(), va_copy()</code> und <code>va_end()</code> bereit. Auf Grundlage des dazugehörigen Datentyps <code>va_list</code> können variadische Parameter auch an Unterfunktionen weitergereicht werden (bspw vprintf()). Dieses Thema bedingt jedoch genaue Kenntnisse vom Umgang mit dem Stack und ist nicht Bestandteil dieser Vorlesung.
=== Funktion in Funktion ===
Die GNU-C Reference (nicht C++) erlaubt es, Funktionen innerhalb von Blöcken (und damit innerhalb von Funktionen) zu definieren. Diese innere Funktion steht dann nur in diesem Block zur Verfügung und kann von außerhalb des Blockes nicht aufgerufen werden. Als Gimmick können Funktionen in Funktionen auf die zuvor definierten lokalen Variablen der inkludierenden Funktion zugreifen:
<syntaxhighlight lang="C">
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Variable Length Array (VLA) ==
Im Normalfall ergibt sich die Anzahl der Elemente eines Arrays aus einer Konstanten, so dass der Compiler zur Compilezeit passend Speicher reserviert (siehe Kap. [[Programmieren in C/C++: Array | Array]]):
<syntaxhighlight lang="C">
int arr[4]; //Compiler reserviert für Variable arr
//4*sizeof(int) Speicherplatz
</syntaxhighlight>
Bei Variable Lenght Array wird die Arraydimension nicht über eine Konstante, sondern über eine Variable oder einen Ausdruck angegeben. D.h. die tatsächliche Dimension des Arrays ergibt sich erst zum Ausführungszeitpunkt der Definition:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //Arraydimension ergibt sich zum Ausführungszeitpunkt
n++; //Nachträgliches Ändern von n ändert nicht
//die Größe des Arrays!
}
</syntaxhighlight>
Ein Variable Length Array kann nur als lokale Variable oder als Übergabeparameter definiert werden (wobei im letzteren Fall kein Speicher hiermit reserviert wird). Eine Initialisierung eines VLA's mit der Definition ist nicht möglich, d.h. nach der Definition beinhaltet das Array 'zufällige' Werte. Es empfiehlt sich daher, diese bspw. mit memset händisch zu initialisieren (siehe auch Kap [[Programmieren in C/C++: Array#Initialisierung | Array:Initialisierung]]):
<syntaxhighlight lang="C">
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
for(size_t lauf=0;lauf<n;lauf++)
printf("str[%zu]=%d\n",lauf,str[lauf]);
}
int main(int argc, char *argv[]) {
foo(4);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mittels sizeof kann weiterhin der Speicherbedarf ermittelt werden, wobei sizeof mit einem VLA als Argument kein Konstantenausdruck ist. Stattdessen wird die Größe zur Laufzeit ermittelt:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
printf("size=%zu\n",size);
}
int main(int argc, char *argv[]) {
foo(5);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
VLA wurden erstmals in C mit C99 eingeführt. In C11 wurden VLA's als optional eingestuft und mit C23 zurück auf notwendig gesetzt. In C++ sind VLA's nicht definiert, werden jedoch vom GCC Compiler unterstützt. Als alternativen Datentyp wird hier std::array empfohlen.
Hinweis:
* VLA sind nicht direkt in einem Switch-Case Block definierbar. Wird hier ein VLA benötigt, so muss hierzu ein Block erzeugt werden:
:<syntaxhighlight lang="C">
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int value=argc;
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Operatoren ==
In der Programmiersprache C sind folgende Punctuators [C11 6.4.6] definiert:
<syntaxhighlight>
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |= , # ##
<: :> <% %> %: %:%:
</syntaxhighlight>
Die Funktionalitäten sind identisch zu Java. Aufgrund des Datentyps Zeiger gibt es in C ergänzend den Punctuator <code>-></code> (siehe Kap [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++)|Datentypen:Verbundtyp Struktur/Klasse (nur C++)]]). Der Präprozessor bedingt die beiden Punctuatoren <code>#</code> und <code>##</code> (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]).
Die letzten 6 Punctuators <code><: :> <% %> %: %:%:</code> werden zu <code>[ ] { } # ##</code> ersetzt. Sie sind für Computersysteme gedacht, welche keine ALTGR-Taste besitzen.<br />
Java kennt ergänzend den <code>>>></code> Operatoren, welcher in C über den normalen Schiebebefehl und den zugrundeliegenden Datentyp gesteuert wird.
Wie in Java sind einige Punctuators vom Kontext abhängig und haben damit unterschiedliche Funktionalitäten:
<syntaxhighlight>
++ → (Postfix) ++ vs. ++(Präfix)
-- → (Postfix) -- vs. --(Präfix)
+/- → Vorzeichen vs. Addition/Subtraktion
() → Funktionsaufruf() vs. Befehlsbestandteil if() vs. Priorisierung
</syntaxhighlight>
Für den Umgang mit dem Datentyp Zeiger besitzen einige Punctuatoren ergänzende Funktionalitäten (siehe Kap [[Programmieren in C/C++: Zeiger| Zeiger]]):
<syntaxhighlight>
& → Bitweises UND:
Anwendung: Ganzahlausdruck & Ganzahlausdruck
& → Adressoperator:
Anwendung: &Variable
* → Multiplikation
Anwendung: Ganzahl-/Gleitkommaausdruck * Ganzahl-/Gleitkommaausdruck
* → Datentyp Zeiger
Anwendung: Datentyp * Variablenname;
* → Dereferenzierung:
Anwendung: * Zeiger
</syntaxhighlight>
Punctuatoren, welche von Java abweichende / ergänzende Funktionalitäten haben, werden nachfolgend gesondert beschrieben.
Sind in einer Anweisung mehrere Operatoren enthalten, so hängt die Abarbeitungsreihenfolge von der Rangfolge/Priorität der Operatoren ab (siehe [[Programmieren in C/C++: Grundlagen#Abarbeitungsreihenfolge | Abarbeitungsreihenfolge]]).<br />
Die Rangfolge ist identisch zu Java, wobei C mehr Operatoren kennt. Generell empfiehlt sich, lieber eine Klammer zu viel als zu wenig zusetzen. Klammern haben die höchste Priorität.
=== Zuweisungs-Operator ===
Die Zuweisung ('='-Operator, assignment expression) weist dem L-Value den R-Value zu.
Der Zuweisungs-Operator gibt den L-Value als Rückgabewert der Zuweisung zurück, so dass mehrere Zuweisungen in einem Ausdruck möglich sind. Die Abarbeitungsreihenfolge ist von rechts nach links (R-L Assoziativität). Wird der 'letzte' Rückgabewert nicht verwendet, so wird dieser verworfen (siehe Kap. [[Programmieren in C/C++: Grundlagen#Discarded Value / null statement | Discarded Value / null statement]]).<br />
Beispiel:
<syntaxhighlight lang="C">
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
//der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
//Compilerfehler geworfen wird
x*=y=z //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a,b,c=3,d=4;
int x,y,z;
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
; //der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
; //Compilerfehler geworfen wird
x*=y=z; //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen return 0;
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Auf beiden Seiten der Zuweisung muss der identische Datentyp stehen. Wenn andernfalls eine implizite Typkonvertierung nicht möglich ist, gibt der Compiler einen Fehler aus:
:<syntaxhighlight lang="C">
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
(void)b;
(void)c;
(void)d;
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
* Bei der Parameterübergabe beim Funktionsaufruf wird ebenfalls indirekt der Zuweisungs-Operator angewendet. Die Parameter des Aufrufers werden per Zuweisung den lokalen Variablen der aufgerufenen Funktion zugewiesen
:<syntaxhighlight lang="C">
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int main(int argc, char *argv[]) {
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
=== Komma-Operator ===
Der Komma-Operator erlaubt es, zwei Ausdrücke auszuführen, wo nur einer erlaubt wäre. Die Ergebnisse/Rückgabewerte aller durch diesen Operator verknüpften Ausdrücke, außer dem letzten werden verworfen. Der letzte Ausdruck dient als Rückgabewert.
Folgendes gilt es bei der Nutzung des Komma-Operators zu beachten:
* Der Komma-Operator wird von links nach rechts ausgewertet (L-R Assoziativität)
* Das Komma selbst stellt eine Sequence Point dar (siehe Kap [[Programmieren in C/C++: Grundlagen#Sequence Point|Sequence Point]])
* An Stellen, wo das Komma zum Syntax gehört (z.B. Trennung der Übergabeparameter bei der Funktionsdefinition und beim Funktionsaufruf, Trennung von Variablen bei der Variablendefinition/-deklaration, Trennung der enum Konstanten) muss der Ausdruck ergänzend geklammert werden, wenn der Komma-Operator gefordert ist
* Der Komma-Operator hat von allen Operatoren die niedrigste Priorität/Rangfolge, so dass dieser Operator als letztes 'ausgewertet' wird
Beispiel:
<syntaxhighlight lang="C">
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
int c=1,d=2,e=3;
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
void func(int value){}
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int value){
printf("func called with %d\n",value);
}
int main(int argc, char *argv[]) {
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
printf("a=%d\n",a);
int c=1,d=2,e=3;
printf("c=%d,d=%d,e=%d\n",c,d,e);
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
printf("c=%d,f=%d\n",c,f);
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'Sinnvolle' Anwendungsbeispiele:
* Bei For-Schleifen, so dass mehrere Variablen initialisiert und mehrere Variablen mit jedem Schleifendurchlauf geändert werden können:
:<syntaxhighlight lang="C">
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf]);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf])
printf("sum=%d lauf=%d\n",sum,lauf);
printf("sum=%d\n",sum);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der Return-Anweisung, bei welcher zur Darstellung der Zusammengehörigkeit mehrere Aktionen ausgeführt werden sollen:
:<syntaxhighlight lang="C">
return errno=EINVAL,-1;
return printf("Fehler"),-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <errno.h>
int foo(void) {
return errno=EINVAL,-1;
}
int far(void) {
return printf("Fehler\n"),-1;
}
int main(int argc, char *argv[]) {
printf("foo()=%d\n",foo());
printf("far()=%d\n",far());
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* An Stellen, wo nur eine Anweisung erlaubt ist (und man zu faul ist, einen Block zu öffnen)
:<syntaxhighlight lang="C">
if(…) y=2,z=3;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int y=0,z=0;
if(1) y=2,z=3;
printf("y=%d z=%d\n",y,z);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In vielen Ländern wird das Komma zur Darstellung von Gleitkommazahlen genutzt. Wird versehentlicher Weise dies in C/C++ übernommen, so führt dies zu einem unerwarteten Verhalten:
:<syntaxhighlight lang="C">
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
printf("var=%f\n",var);
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
printf("var=%f\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== ?-Operator / Conditional-Operator ===
Operator mit 3 Operanden, welcher in Abhängigkeit des ersten Ausdruckes den zweiten oder dritten Ausdruck ausführt und dessen Rückgabewert zurückgibt.
<code>
Syntax: Logical-OR-expression ? expression : condition-expression
</code>
Entspricht der if()-Anweisung, wobei der ?-Operator als solches einen Wert zurückgibt! <code>Expression</code> wird nur ausgeführt, wenn <code>Logical-OR-Expression</code> zu true ausgewertet wird. Andernfalls wird <code>condition-expression</code> ausgeführt. Der zurückgegebene Datentyp ergibt sich aus der <code>expression</code> resp. <code>condition-expression</code>. '''Beide Ausdrücke sollten somit einen identischen resultierenden Datentyp besitzen!'''
Folgendes gilt es bei der Nutzung des ?-Operators zu beachten:
* Der Datentyp <code>expression</code> und <code>condition-expression</code> sollte identisch sein:
<syntaxhighlight lang="C">
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Nach der GNU-C Reference kann der mittlere Ausdruck fehlen. In diesem Fall wird stattdessen das Ergebnis des linken Operanden dort eingesetzt (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)
<syntaxhighlight lang="C">
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
printf("b=%d\n",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* In der Abarbeitungsreihenfolge liegt der ?-Operator oberhalb der Komma- und des Zuweisungsoperators. Soll im <code>condition-expresion</code> Ausdruck der Komma- oder Zuweisung-Operator genutzt werden, so ist <code>condition-expression</code> zu klammern. Andernfalls bedingt die niedrige Priorität des Komma-Operators ein anders Verhalten, als erwartet:
<syntaxhighlight lang="C">
int a=7,max=5,var;
max=a>max ? a : max; //Alles bestens
var= a>5 ? a++,5:6; //Alles bestens
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=7;
int max=5;
max=a>max ? a : max; //Alles bestens
printf("max=%d\n",max);
int var;
var= a>5 ? a++,5:6; //Alles bestens
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
printf("var=%d a=%d\n",var,a);
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
printf("var=%d a=%d\n",var,a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Nutzung des ?-Operators empfiehlt sich an diversen Stellen:
* Bei Makros:
:<syntaxhighlight lang="C">
#define MAX(a,b) (a>b?a:b)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
int main(int argc, char *argv[]) {
printf("MAX(4,5)=%d\n",MAX(4,5));
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Beim Fehlerhandling:
:<syntaxhighlight lang="C">
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion ausgeführt wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn ret==0 ist
//andernfalls wird ret zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 0;
}
int init2(void) {
printf("init2() called\n");
return 0;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn Ret==0 ist
//andernfalls wird Ret zurückgegeben
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Logische Verknüpfungen ===
Alle logischen Operationen nutzen als Operanden Ganzzahlen ,Gleitkommazahlen oder Zeiger. Der Operand wird als false angesehen, wenn der Operand 0, 0.0 oder NULL ist. Andernfalls als true. Das Ergebnis ist immer vom Datentyp int und hat den Wert von 0 oder 1.
<code>Syntax: Expression && Expression</code><br />
<code>Syntax: Expression || Expression</code><br />
<code>Syntax: ! Expression</code><br/>
Bei der logischen UND und ODER Verknüpfung wird zuerst der linke Ausdruck ausgewertet (Operator ist ein Sequence Point). Der rechte Ausdruck wird nur ausgeführt, wenn:
* bei der logischen UND Verknüpfung der linke Ausdruck TRUE ergab
* bei der logische OR Verknüpfung der linke Ausdruck FALSE ergab
Andernfalls steht das Ergebnis schon mit der Auswertung des linken Operanden fest.<br />
In der theoretischen Informatik wird dies 'Non-strict-evaluation' genannt, bei welcher der Rückgabewert feststeht, bevor alle Ausdrücke bearbeitet worden sind.
Beispiel für das Verhalten des Ausbleibens der Auswertung des zweiten Operators:
<syntaxhighlight lang="C">
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a || ++a)
b=1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a {{!}}{{!}} ++a)
b=1;
printf("a=%d b=%d\n",a,b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Diese Funktionalität ist insbesondere beim Umgang mit Fehlern vorteilhaft:
* Prüfen, ob eine Variable einen gültigen Wert hat, bevor sie weiterverwendet wird
<syntaxhighlight lang="C">
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
else
printf("Kein Substring im String gefunden\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion aufgerufen wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 1;
}
int init2(void) {
printf("init1() called\n");
return 1;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Bitweise Verknüpfungen ===
Alle bitweisen Operationen nutzen als Operanden Ganzzahlen. Bei vorzeichenbehafteten Zahlen ist das Ergebnis nach [C11 6.5] Implementierungsabhängig, wobei das Vorzeichenbit zumeist als eigenständiges Bit angesehen wird und bei UND/ODER/EXOR als normales BIT betrachtet wird.
<code>Syntax: Ganzzahl & Ganzzahl → Bitweise UND Operation</code><br />
<code>Syntax: Ganzzahl | Ganzzahl → Bitweise ODER Operation</code><br />
<code>Syntax: Ganzzahl ^ Ganzzahl → Bitweise EXOR Operation</code><br />
<code>Syntax: ~ Ganzzahl → Bitweise Negierung</code><br />
<code>Syntax: Ganzzahl >> additive-expression</code><br />
<code>Syntax: Ganzzahl << additive-expression</code><br />
Mittels des Schiebeoperators können '''Ganzzahlen''' um <code>additive-expression</code> bitweise nach Links <code><<</code> oder Rechts <code>>></code> verschoben werden. Der resultierende Datentyp ergibt sich aus dem linken Operanden. Der rechte Operand muss positiv und der Wert kleiner gleich der Bitbreite des linken Operanden sein. Andernfalls ist das Ergebnis implementierungsspezifisch.
Nach [C11 6.5.7] ist das Ergebnis der Schiebeoperation implementierungsspezifisch, wenn der linke Operand eine negative vorzeichenbehaftete Zahl ist. In der Regel wendet der Compiler jedoch folgende Schiebeoperation an:
* Logisches Schieben (zu füllende Bit-Stellen werden mit 0 aufgefüllt), wenn der linke Operand einen vorzeichenlosen Datentyp hat
* Arithmetisches Schieben (zu füllende Bit-Stelle beim Rechtsschieben wird mit dem Vorzeichenbit aufgefüllt), wenn der linke Operand ein vorzeichenbehaftete Datentyp ist. Hiermit wird das Vorzeichen beibehalten, so dass eine negative Zahl nach dem Schieben weiterhin negativ ist (In Java erfolgt dies durch den >>> - Operator)
Hinweis:
* Ein Schieben um eine Stelle nach rechts entspricht einer Division durch 2
* Ein Schieben um eine Stelle nach links entspricht einer Multiplikation mit 2
=== sizeof-Operator ===
Der sizeof-Operator dient zur Ermittlung des Speicherbedarfs (in Bytes) einer Variablen/eines Datentyps.
<code>Syntax: sizeof (type-name)</code><br />
<code>Syntax: sizeof unary-expression</code><br />
Als Argument für den Sizeof-Operator kann wahlweise ein Datentyp, eine Variable oder ein Ausdruck genutzt werden. Sizeof gilt als Konstantenausdruck, d.h. seine Berechnung erfolgt durch den Compiler, sodass:
* sizeof zur Initialisierung von globalen Variablen genutzt werden
:<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz); //3*sizeof(int)=12
int main(int argc, char *argv[]) {
printf("size=%zu\n",size);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* bei einem Ausdruck dieser nicht ausgeführt wird, sondern nur der resultierende Datentyp bestimmt wird und dessen Größe zurückgegeben
:<syntaxhighlight lang="C">
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der resultierende Datentyp des Rückgabewertes ist <code>size_t</code>.
Es empfiehlt sich, den sizeof-Operator mit Klammern zu nutzen, andernfalls gibt sizeof bei Anwendung auf einen Ausdruck die Größe des linken Operators zurück:
<syntaxhighlight lang="C">
size_t size;
short var;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
size_t size;
short var=0;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
printf("size=%zu var=%d\n",size,var);
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* sizeof angewendet auf char gibt immer den Wert 1 zurück.
* sizeof ist nicht auf Operanden vom Typ Funktion, void, Felder ohne Größenangabe und Bitfelder anwendbar
* wird sizeof auf ein VLA angewendet, so entspricht sizeof nicht mehr einen Konstantenausdruck, sondern einem Funktionsaufruf
:<syntaxhighlight lang="C">
void foo(int n) {
int arr[n];
size_t size=sizeof(arr); //Speicherbedarf ist kein Konstantenausdruck
//sondern wird zur Laufzeit berechnet
</syntaxhighlight>
* Sizeof entspricht nicht strlen(), da sizeof die Größe des für die Variable reservierten Speicherbereich zurückgibt und nicht wie strlen() den Inhalt des Speicher hinsichtlich des Stringendezeichens auswertet:
:<syntaxhighlight lang="C">
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Anweisungen ==
=== If-Anweisung ===
<code>Syntax: if (expression) statement</code><br />
<code>Syntax: if (expression) statement else statement</code><br />
Das Ergebnis des Ausdruckes (Ganzzahl, Gleitkommazahl oder Zeiger) wird auf ungleich 0, 0.0 oder NULL getestet. Trifft dies zu, so wird <code>statement</code> ausgeführt. Andernfalls wird das <code>else statement</code> ausgeführt, sofern vorhanden. Sollen mehrere Anweisungen ausgeführt werden, so sind diese mittels Block zusammenzufassen (diesen dann bitte nicht mit ; abschließen).
Beispiel:
<syntaxhighlight lang="C">
if(a==1)
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
if(a) //entspricht a!=0
if(printf("hallo")<0) //prüfen, ob printf() fehlschlägt
if( ({int dummy=a;a=b;b=dummy;})==6)
if(a=7) //Zuweisung!
if(7=a) //KO, Eine Konstante kann kein L-Value sein
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1,b=2;
if(a==1)
printf("a==1\n");
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
printf("a=1\n");
if(a) //entspricht a!=0
printf("a\n");
if(printf("hallo\n")<0) //prüfen, ob printf() fehlschlägt
printf("printf()\n");
if( ({int dummy=a;a=b;b=dummy;})==6)
printf("({...})\n");
if(a=7) //Zuweisung!
printf("a=7\n");
if(7=a) //KO, Eine Konstante kann kein L-Value sein
;
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei der Anweisung <code>if(a==7)</code> finden aus syntaktischer Sicht zwei Aktionen statt. Zunächst wird geprüft, ob a gleich 7 ist. Dieser Vergleich liefert true(=1) oder false(=0) zurück. Die If-Anweisung prüft im Anschluss, ob das Argument true oder false ist.
=== For-Anweisung ===
<code>Syntax: for(Initialisierungsteil<sub>OPT</sub> ; Test<sub>OPT</sub> ; Fortsetzung<sub>OPT</sub>) Statement</code>
Die For-Anweisung wird vom Compiler wie folgt umgesetzt:
<poem> '''Initialisierungsteil'''<sub>OPT</sub>
Goto Next
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
'''Statement'''
Continue:
'''Fortsetzung'''<sub>OPT</sub>
Next:
if('''Test'''<sub>OPT</sub>) goto Goon
Break:
</poem>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
for(summe=lauf=0;lauf<20;lauf++)
summe+=lauf;
printf("summe=%d\n",summe);
//Initialisierungsteil
summe=lauf=0;
goto Next;
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
//Statement
summe+=lauf;
Continue: __attribute__((unused))
//Fortsetzung
lauf++;
Next:
//if(TestOPT) goto Goon
if(lauf<20) goto Goon;
Break: __attribute__((unused))
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die einzelne Elemente haben folgende Bedeutung/Besonderheiten:
;Initialisierungsteil: Zum Initialisieren von Schleifenvariablen, wird einmalig mit Beginn der FOR-Anweisung ausgeführt.
:* kann Leer sein, dann erfolgt keine Initialisierung
:* Ab C99: Hier kann eine (lokale) Variable definiert werden, welche nur innerhalb dieser For-Anweisung gültig ist
;Testteil: Hierin wird vor jedem Schleifendurchlauf geprüft, ob die Schleifenbedingung erfüllt ist. Wenn die Bedingung nicht erfüllt ist (Ganzzahl, Gleitkommazahl oder Zeiger gleich 0,0.0 oder NULL), wird die For-Schleife beendet.
:* Kann leer sein, dann wird dieser Teil als true angesehen
;Fortsetzungsteil: Wird nach jeden Schleifendurchlauf ausgeführt. In der Regel sollte hier die Schleifenvariable aktualisiert werden
:* Kann leer sein
;Statement: In der Schleife auszuführender Ausdruck
:* Sollen mehrere Ausdrücke ausgeführt werden, so sind diese in einem Block zusammen zu fassen.
Ergänzende Anweisungen innerhalb des Statements/Block
* <code>continue</code> zum Fortsetzen des Schleifendurchlaufes, d.h. Sprung zum Fortsetzungs-Teil
* <code>break</code> zum Beenden des Schleifendurchlaufes
Beispiele:
* For-Schleife mit lokaler Schleifenvariable
:<syntaxhighlight lang="C">
char string[]="hallo";
for(size_t lauf=0; lauf < strlen(string); lauf++)
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife mit Break-Anweisung
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
printf("lauf=%zu\n",lauf);
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife, bei welcher die gesamte Aktion innerhalb der For-Anweisung ausgeführt wird
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;
src[l]!=0 && l <sizeof(dest);
printf("l=%zu\n",l),dest[l]=src[l],l++);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;src[l]!=0 && l <sizeof(dest); printf("l=%zu\n",l),dest[l]=src[l],l++);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleifenvariable muss keine Zählvariable sein
:<syntaxhighlight lang="C">
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
printf("Anzahl Einsen in %b = %d\n",zahl,bits);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zeiger als Schleifenvariable
:<syntaxhighlight lang="C">
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
printf("src='%s' dst='%s'\n",src,dst);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Auch wenn einige Compiler bei eingeschalteter Optimierung die Fähigkeit besitzen, Funktionsaufrufe innerhalb des Test- und Fortsetzungsteil vor die Schleife zu verschieben (siehe: [https://xania.org/202512/13-licking-licm Loop-Invariant Code Motion]), so sollten Funktionsaufrufe an diesen Stellen vermieden werden. Einerseits zeugt dies von schlechten Programmierstiel und andererseits führt dies bei ausgeschalteter Optimierung zu Performanceeinbußen:
:<syntaxhighlight lang="C">
for(size_t lauf=0;lauf<strlen("hallo");lauf++)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zur Geschwindigkeitssteigerung sollte im Testteil auf 0 abgefragt werden, d.h. die Schleifenvariable dekrementiert werden:
:<syntaxhighlight lang="C">
for(int lauf=700000;lauf;lauf--)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(ssize_t lauf=700000000;lauf;lauf--)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
for(ssize_t lauf=0;lauf<700000000;lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Alternativ zu einer Laufvariablen empfiehlt sich die Nutzung von Pointer als Schleifenvariable:
:<syntaxhighlight lang="C">
for(char *ptr=str; *ptr; ptr++);
</syntaxhighlight>
* Verzweigungsbefehle sind einige der langsamsten Maschinenbefehl. Zur Vermeidung von diesen Maschinenbefehle 'entrollen' die Compiler bei eingeschalter Optimierungen und bekannter kleiner Anzahl von Schleifendurchläufe die For-Schleife (siehe: [https://xania.org/202512/10-loop-unrolling Unrolling Loops])
:<syntaxhighlight lang="C">
for(int lauf=4;lauf;lauf--)
sum+=arr[lauf];
//wird aufgrund bekannter Anzahl der Schleifendurchläufe wie folgt entrollt
sum+=arr[4];
sum+=arr[3];
sum+=arr[2];
sum+=arr[1];
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <string.h>
int arr[5];
void arr_init(void) {
memcpy(arr,(int []){1,2,3,4,6},sizeof(arr));
}
int main(int argc, char *argv[]) {
arr_init();
int sum;
sum=0;
for(int lauf=4;lauf;lauf--)
sum+=arr[lauf];
printf("sum=%d\n",sum);
//wird aufgrund bekannter Anzahl der Schleifendurchläufe wie folgt entrollt
sum=0;
sum+=arr[4];
sum+=arr[3];
sum+=arr[2];
sum+=arr[1];
printf("sum=%d\n",sum);
//Zur Darstellung von Loop-Runling Compiler-Option -O0 auf -O1 ändern
return 0;
} | execCompilerOptions=-Wall -O0|
h=c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== While-Anweisung ===
<code>Syntax: while(expression) Statement </code><br />
<code>Syntax: do Statement while(expression);</code><br />
Die While-Anweisungen werden vom Compiler wie folgt umgesetzt:
{| class="wikitable"
! while()-Anweisung !! do while()-Anweisung
|-
| <poem>
Continue:
if(!'''expression''')
goto Break
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
'''Statement'''
goto Continue
Break:
</poem> ||
<poem>
GoOn:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
'''Statement'''
Continue:
if('''expression''')
goto GoOn
Break:
</poem>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
lauf=summe=0;
while(lauf<10) {
if(lauf>=5)
break;
lauf++;
if(lauf<3)
continue;
summe+=lauf;
}
printf("summe=%d\n",summe);
lauf=summe=0;
Continue1:
if(!(lauf<10))
goto Break1;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
//Statement
if(lauf>=5) {
goto Break1;
}
lauf++;
if(lauf<3)
goto Continue1;
summe+=lauf;
goto Continue1;
Break1:
printf("summe=%d\n",summe);
lauf=summe=0;
do {
lauf++;
if(lauf>5)
break;
if(lauf<3)
continue;
summe+=lauf;
} while(lauf<10);
printf("summe=%d\n",summe);
lauf=summe=0;
GoOn2:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
//Statement
lauf++;
if(lauf>5)
goto Break2;
if(lauf<3)
goto Continue2;
summe+=lauf;
Continue2:
if(lauf<10)
goto GoOn2;
Break2: __attribute__((unused));
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Folgendes gilt es bei der Nutzung der While-Anweisung zu beachten:
* Soll mehr als ein Statement innerhalb der While-Schleife ausgeführt werden, so sind diese in einem Block zu schreiben
* Statement kann eine Leeranweisung (gekennzeichnet durch ein Semikolon) sein
:<syntaxhighlight lang="C">
while(1);
do ; while(1);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf1=1000;
while(lauf1--);
int lauf2=1000;
do ; while(lauf2--);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der do-While-Schleife ist das abschließende Semikolon Bestandteil des Befehls
* expression muss eine Ganzzahl, Gleitkommazahl oder Zeiger zurückgeben, der bei False (0, 0.0 oder NULL) die Schleife beendet.
Beispiele:
* Endlosschleife
:<syntaxhighlight lang="C">
while(1) {}
</syntaxhighlight>
* Schleife zum Durchlaufen eines String
:<syntaxhighlight lang="C">
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
printf("Stringlänge=%zu\n",len);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Switch-Anweisung ===
<code>Syntax: switch(expression) statement</code><br />
<code>Syntax: statement:= case constant-expression: statement<sub>opt</sub> default: statement<sub>opt</sub></code><br />
Die Switch-Anweisung entspricht einer verschachtelten If-Anweisung, mit der Besonderheit, dass der auszuführende Code nicht im If-Zweig stattfindet, sondern dort ein goto zum eigentlichen Code enthalten ist:
{| class="wikitable"
! Switch-Anweisung !! Compilerumsetzung
|-
|<syntaxhighlight lang="C">
switch(a) {
case 1:
int a=7;
//Code
break;
case 2:
printf("%d",a);
case 3: {
int a;
//Code
}
case 4 ... 8:
default:
//Code
}
</syntaxhighlight>
||<poem>
if(a==1)
goto label1;
else if(a==2)
goto label2;
else
goto label_default;
//-------------------
label1:
//Code
goto label_break;
label2:
//Code
label_default:
goto label_break;
label_break:
</poem>
|}
Folgendes gilt es bei der Nutzung der Switch-Anweisung zu beachten:
* <code>Expression</code> muss zu einer Ganzzahl (int, short, char, long, long long) oder enum (entspricht einer Ganzzahl) ausgewertet werden
* <code>constant-expression</code> muss eine Ganzzahl-Konstante oder ein Enumelement sein. Sie darf nicht doppelt im Block vorkommen. Der genaue Datentyp ergibt sich aus dem Datentyp der <code>expression</code>
* Lt. Spezifikation ist ein nur <code>statement</code> hinter der switch-Anweisung erlaubt, so dass nur ein <code>case</code> Fall oder der <code>default</code> Fall bedient werden kann::<syntaxhighlight lang="C">
int var=1;
switch(var) case 1: printf("hallo");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) case 1: printf("hallo");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweifte Klammer der <code>switch</code>-Anweisung erzeugt einen Block, so dass a) hier mehrere <code>case</code>-Fälle und b) hierin definierte Variablen innerhalb des gesamten Blocks zur Verfügung stehen (sind somit nicht <code>case</code> abhängig). Die <code>case</code> Anweisung ist nichts anderes als eine Sprungmarken (welche durch die switch-Anweisung angesprungen wird) so dass der Initialisierungsteil der lokalen Variablen übersprungen / nicht ausgeführt werden kann:
:<syntaxhighlight lang="C">
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("%d %d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
break;
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1;
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("a=%d b=%d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
(void)a;
break;
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* GNU-C (siehe [https://www.gnu.org/software/c-intro-and-ref/manual/html_node/switch-Statement.html Switch-Statement]) erlaubt ergänzend zur Angabe einer Konstante die Angabe eines Wertebereiches:
:<syntaxhighlight lang="C">
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=2;
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
printf("a im Bereich von 1 bis 8\n");
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* <code>break</code> ist optional. Mittels <code>break</code> wird an das Ende der Switch-Anweisung gesprungen. Wenn <code>break</code> weggelassen wird, wird die nachfolgende Anweisungen ausgeführt. Ggf. gibt der Compiler eine Warning aus. Mittels der GCC-Compiler-Anweisung __attribute__((fallthrough)); kann diese Warning unterdrückt werden:
:<syntaxhighlight lang="C">
switch(a) {
case 0: //ggf. Compiler-Warning
__attribute__((fallthrough)); case 1:
case 2:
break;
}
</syntaxhighlight>
* Ein Variable Length Array ist als Variable im Switch-Block direkt nicht erlaubt. Ist dies notwendig, so ist das VLA in einem inneren Block zu kapseln:
:<syntaxhighlight lang="C">
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Case - Anweisungen sind nichts anderes als Sprungmarken (Labels), so dass CASE-Anweisungen überall innerhalb des Switch-Blockes stehen können:
:<syntaxhighlight lang="C">
int prime(int value) {return value+1;}
void hallo(int var) {
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int prime(int value) {
return value+1;
}
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:oder anderen Anweisungen innerhalb des Switch-Blockes enthalten sein können:
:<syntaxhighlight lang="C">
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++;
case 7: *dst = *src++;
case 6: *dst = *src++;
case 5: *dst = *src++;
case 4: *dst = *src++;
case 3: *dst = *src++;
case 2: *dst = *src++;
case 1: *dst = *src++;
}while(--n>0);
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h> //fuer uintptr_t
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++; printf("%02hhx ",*dst);
case 7: *dst = *src++; printf("%02hhx ",*dst);
case 6: *dst = *src++; printf("%02hhx ",*dst);
case 5: *dst = *src++; printf("%02hhx ",*dst);
case 4: *dst = *src++; printf("%02hhx ",*dst);
case 3: *dst = *src++; printf("%02hhx ",*dst);
case 2: *dst = *src++; printf("%02hhx ",*dst);
case 1: *dst = *src++; printf("%02hhx ",*dst);
}while(--n>0);
}
}
int main(int argc, char *argv[])
{
char src[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char dst;
send(&dst,src,20);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Eine Switch-Case Anweisung über Strings sind in C/C++ nicht möglich:
:<syntaxhighlight lang="C">
switch(str) {
case "hallo":
return 1;
case "du da":
return 2;
case "xyz":
return 3;
default:
rReturn -1;
}
</syntaxhighlight>
:Ein direkte Lösungsansatz ist die Nutzung von strcmp() zum Vergleichen von String. Da strcmp zeichenweise den String vergleicht, ist dieser Ansatz langsam. Alternativ bietet sich an, von allen String einen Hash-Wert zu berechnen und zunächst diesen Hash-Wert zu kontrollieren. Da der Hash-Wert nicht eindeutig ist, muss ergänzend ein strcmp() erfolgen:
:<syntaxhighlight lang="C">
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h>
//Lösungsansatz von: https://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
#define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
#define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
#define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
#define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
#define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
#define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
#define HASH_LAUFZEIT(s) (H256(s,0,0))
//Eigener Lösungsatz zur Umsetzung des vorherigen HASH-Algorithmus
//so dass dieser zur Compilezeit berechnet werden kann
//Was fehlt ist die abschließende EXOR berechnung!
//Problem war, dass die Array-Dereferenzierung nicht zur Compilezeit
//aufelöst werden kann
#define HH0(a,x) (x*65599u+a)
#define HH1(a) HH0(a,HH0(0,HH0(0,HH0(0,0))))
#define HH2(a,b) HH0(b,HH0(a,HH0(0,HH0(0,0))))
#define HH3(a,b,c) HH0(c,HH0(b,HH0(a,HH0(0,0))))
#define HH4(a,b,c,d) HH0(d,HH0(c,HH0(b,HH0(a,0))))
#define HH4x(a,b,c,d,x) HH0(d,HH0(c,HH0(b,HH0(a,x))))
#define HH5(a,b,c,d,e) HH4x(b,c,d,e,HH4x(0,0,0,a,0))
#define HH6(a,b,c,d,e,f) HH4x(c,d,e,f,HH4x(0,0,a,b,0))
#define HH7(a,b,c,d,e,f,g) HH4x(d,e,f,g,HH4x(0,a,b,c,0))
#define HH8(a,b,c,d,e,f,g,h) HH4x(e,f,g,h,HH4x(a,b,c,d,0))
#define HH9(a,b,c,d,e,f,g,h,i) HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0)))
#define HH10(a,b,c,d,e,f,g,h,i,j) HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0)))
#define HH11(a,b,c,d,e,f,g,h,i,j,k) HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0)))
#define HH12(a,b,c,d,e,f,g,h,i,j,k,l) HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0)))
#define HH13(a,b,c,d,e,f,g,h,i,j,k,l,m) HH4x(j,k,l,m,HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0))))
#define HH14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) HH4x(k,l,m,n,HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0))))
#define HH15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) HH4x(l,m,n,o,HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0))))
#define HH16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) HH4x(m,n,o,p,HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0))))
#define EIGHTEENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \
a11,a12,a13,a14,a15,a16,a17,a18, ...) a18
#define CONCAT(c,d) c ## d
#define CONCATI(a,b) CONCAT(a,b)
#define HASH_COMPILEZEIT(...) CONCATI(HH , EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0))(__VA_ARGS__)
//Lösungsansatz basierend auf: https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/preprocessor/macros/__VA_ARGS__/count-arguments
#define COUNT_ARGUMENTS(...) EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main(int argc, char *argv[]) {
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:Siehe:[https://benhoyt.com/writings/hash-table-in-c/ Hash Table in C]
== Label + Goto ==
=== Label ===
<code>Syntax: name:</code><br />
Labels dienen zur Kennzeichnung einer Anweisung, so dass die Programmausführung an dieser Stelle fortgesetzt, resp. mit einer GOTO-Anweisung angesprungen werden kann. Ein Label ist durch den folgenden Doppelpunkt gekennzeichnet. Dem Label muss eine Anweisung folgen, welches auch eine Leeranweisung (Semikolon) sein kann.
Folgendes gilt es bei der Nutzung von Labels zu beachten:
* Ein Label entspricht der Speicheradresse des der Label-Anweisung folgenden Anweisung
* Bei nicht genutzten Labels (mit goto nicht angesprungene Labels) gibt der Compiler eine Warning aus. Diese kann beim GCC-Compiler mit __attribute__((unused)) unterdrückt werden
* die Case- und die Default-Anweisung aus der Switch-Anweisung entspricht einem Label
<br />
Labels hat eine funktionsweite Sichtbarkeit (siehe Kap [[#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]). Dies bedeutet, dass das:
* Labels nur innerhalb einer Funktion gültig ist
* Labels einen von Variablen/Funktionen/Datentypen unabhängigen Namensraum haben
* Kein Prototyp für ein Label notwendig ist, wenn es bei Nutzung über goto noch nicht gesetzt worden ist, also nach vorne gesprungen wird
=== goto ===
<code>Syntax: goto label;</code><br />
Mit der Goto-Anweisung wird die Programmausführung an der mit <code>label</code> gekennzeichneten Stelle fortgesetzt.
Folgendes gilt es bei der Nutzung von goto zu beachten:
* Mit einer <code>goto</code> Anweisung kann an eine beliebige Steller innerhalb der '''identischen''' Funktion gesprungen werden. Es kann nicht zu einem Label in einer anderen Funktion gesprungen werden (hierzu ist <code>setjmp()</code> und <code>longjmp()</code> zu nutzen)
* Mit der Goto Anweisung kann gleichermaßen in einen Block hinein, als auch herausgesprungen werden:
:<syntaxhighlight lang="C">
goto first_time;
for(;;) {
if(a>10)
goto last_time:
first_time:
a++;
}
last_time: ;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0;
goto first_time;
for(;;) {
printf("a=%d\n",a);
if(a>10)
goto last_time;
first_time:
a++;
}
last_time: ; //Leeranweisung wäre hier nicht nötig
return 0; //da dem Label ein return folgt!
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Wird mit der <code>goto</code> Anweisung der Initialisierungsteil einer Variablen übersprungen, so ist zwar die Variable existent, beinhaltet aber nicht ihren Initialisierungswert
Beispiel:
<syntaxhighlight lang="C">
goto label1;
if(a==3) {
label2:
printf("True\n");
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=3;
goto label1;
if(a==3) {
label2:
printf("True\n");
a++;
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In Java gibt es das Schlüsselwort goto, welches aber ohne Funktion ist. Es gibt jedoch Labels, die mit "break label" angesprungen werden können
=== Anwendungsbeispiele ===
Prinzipiell sind Goto-Anweisungen zu vermeiden. In einigen Anwendungsfällen erweist sich goto als nützlich:
* Nutzung nur einer <code>return</code> Anweisung in einer Funktionen
:<syntaxhighlight lang="C">
#include <unistd.h>
int input(int hdl,size_t buflen) {
int rc=-1;
unsigned char packettype;
if(read(hdl,&packettype,1) != 1)
goto exit;
unsigned short packetlen;
if(read(hdl,&packetlen,2) != 2)
goto exit;
if((1+packetlen) > buflen) {
rc=-2;
goto exit;
}
rc=packetlen;
exit:
return rc;
}
</syntaxhighlight>
* Konstruktor mit mehreren Initialisierungsteilen
:<syntaxhighlight lang="C">
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Abbruch einer verschachtelten Schleife
:<syntaxhighlight lang="C">
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Sonstiges ==
=== ??-Trigraphs ===
Zeichenfolge bestehend aus 3 Zeichen beginnend mit 2 Fragezeichen.
Die beiden Fragezeichen entsprechen einem ESCAPE-Operator (siehe Kap [[#Char-Konstanten|Char-Konstanten]]), welcher das nachfolgende Zeichen durch ein anderes ASCII Zeichen ersetzt. Die Ersetzung findet auch innerhalb von Strings statt.<br />
Trigraphs wurden früher genutzt, als die ALTGR Taste noch nicht üblich war.
<syntaxhighlight>
??< → { ??> → }
??( → [ ??) → ]
??/ → \ ??! → |
??' → ^ ??- → ~
??= → #
</syntaxhighlight>
Bei neuer C Varianten muss zur Nutzung von Trigraphs der Compiler mittels -trigraphs aktiviert werden.
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
ml0hb2kq7wbvn6ijr4n0b6lc3n3q949
1090667
1090666
2026-09-10T15:36:47Z
D. Justen
102048
Semikolon ergänzt
1090667
wikitext
text/x-wiki
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
<!-- Falls du ein automatisch erstelltes Inhaltsverzeichnis nicht willst, ersetze das nachfolgende TOC durch NOTOC -->
<!-- Einklammerung mit noinclude, damit dieses nicht in der Druckversion erscheint -->
<noinclude>__TOC__</noinclude>
Die Programmiersprache C/C++ beinhaltet mehrere Sprachen/ Syntaxen:
* C-Syntax
* Präprozessor-Syntax
* Printf/Scanf Formatstring Syntax
* Terminal Emulation
* Compiler/Linker Anweisungen
Letztere beiden werden nur rudimentär in dieser Vorlesung/diesem Skript behandelt. Alle anderen sind Bestandteil dieser Vorlesung.
In diesem Kapitel sollen zunächst allgemeine Eigenschaften der Sprache, der grundlegende Syntax und die Kontrollstrukturen erklärt werden. Bei vielen Erklärungen sind Code-Beispiele vorhanden. Da man aus Fehlern am meisten lernt, sind zum Teil auch negative Beispiele enthalten. Für ein besseres Verständnis empfiehlt es sich, Code-Beispiele selbst nachzuvollziehen.<br />
Sofern sich die Eigenschaften auf eine bestimmte C-/C++- oder Compiler-Version beziehen, wird dies gesondert vermerkt.
== Zeichensatz ==
Der Syntax von C nutzt die unteren 128 Zeichen des ASCII Zeichensatzes. Da UTF-8 in den ersten 128 Zeichen deckungsgleich zu ASCII ist, kann auch dieser zur Erstellung des Source Codes genutzt werden.
Zeichen außerhalb dieses gültigen Zeichensatzes können folglich nur in Strings oder Kommentaren vorkommen. Werden Zeichen außerhalb der unteren 128 Zeichen in Strings genutzt, so gilt Folgendes zu berücksichtigen:
* Die String-Funktionalitäten der Standard-C Library gehen von dem regulären ASCII Zeichensatz aus, so dass z.B. die Suche, der Vergleich oder die Konvertierung fehlschlagen kann
* Strings werden oftmals in Verbindung mit printf() genutzt, d.h. auf der Standardausgabe ausgegeben. Der verwendete Zeichensatz sollte hier identisch zum verwendeten Zeichensatz der Terminal-Emulation sein!
== Kommentarzeichen ==
Kommentare dienen dazu, den Source Code mit zusätzlichen Hinweisen zu versehen, so dass die Intension der Anweisungen sichtbar wird. Kommentarzeichen werden durch den Compiler vor dem eigentlichen Übersetzungsdurchlauf entfernt und durch ein Leerzeichen ersetzt [C11 6.4.9]. Innerhalb von Strings wird nicht nach Kommentarzeichen gesucht.
<code>
Syntax: /* */
</code>
Blockkommentar zum Kommentieren eines Bereiches, auch über mehrere Zeilen hinweg. Dieses Kommentarzeichen kann nicht verschachtelt werden, d.h. '*/' beendet die Kommentierung, unabhängig von der Anzahl der zuvor geöffneten Kommentierungen!
<code>
Syntax: //
</code>
Zeilenkommentar zum Kommentieren bis zum Zeilenende (wurde in der Programmiersprache BCPL definiert, aber nicht von C, sondern erst von C++ übernommen).
Sollen größere Bereiche auskommentiert werden, so empfiehlt sich die Nutzung der Präprozessoranweisung #if 0 ... #endif.
Beispiele:
<syntaxhighlight lang="C">
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt
Compiler-Warning nur aufgrund des Compiler-Schalters -Wall! */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Namenskonventionen ==
Folgende Regeln gelten bzgl. der Benennung von Variablen und Funktionen:
* Variablen und Funktionsnamen können aus Buchstaben, Zahlen und dem Unterstrich bestehen. Sie müssen mit einem Buchstaben oder einem Unterstrich beginnen
* Seit C95 können weitere Zeichen aus dem Universal Coded Character Set (UCS) genutzt werden [C11 D.1]
* C ist Case sensitiv, d.h. es wird zwischen Groß- und Kleinbuchstaben unterschieden
* Schlüsselwörter können nicht für Variablen/Funktionsnamen/Datentypen genutzt werden
Namenskonventionen von Libraryfunktionen:
* In C (und C++) sind Schlüsselwörter und Standardlibraryfunktionen zumeist in Kleinbuchstaben geschrieben. In der C-Standardlibrary werden oftmals verkürzte Ausdrücke (z.B. isalnum() (zum Testen ob ein Zeichen ein Buchstaben oder ein Digit ist) und in C++ der Unterstrich als Worttrenner (z.b. out_of_range) genutzt
* Makros (siehe Kap.[[Programmieren in C/C++: Präprozessor | Präprozessor]]) werden per Konvention in GROSSBUCHSTABEN und ggf. mit Unterstrich als Worttrenner geschrieben.
* Namen beginnend mit doppelten Unterstrich oder beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (z.B. __LINE__ _Reserved) sind für den Compiler und der Standard-C-Library vorbehalten und sollten im eigenen Programm nicht benutzt werden.
== Zeilenfortsetzung ==
Mit dem Backslash Operator (gefolgt von einem Zeilenende) kann eine Zeile in der nächsten Zeile fortgesetzt werden. Der Compiler löscht das \-Zeichen mit anschließendem Zeilenende und ersetzt dies durch nichts. Dies ist insbesondere bei Anweisungen notwendig, die am Ende der Zeile abgeschlossen sein müssen (z.B. Strings, Makros).
Beispiele:
<syntaxhighlight lang="c">
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Innerhalb von Char-Literatoren und Strings wird '\' als Escape-Operator genutzt, welche das '\' und ein oder mehrere folgende Zeichen ersetzt (siehe Kap.[[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Grundlagen:Literale/Konstanten]]). Daher darf hinter Backslash als Zeilenfortsetzungszeichen kein weiteres Zeichen folgen.
== Gültigkeit/Sichtbarkeit von Variablen ==
Vorrangig in der objektorientierten Programmierung werden mit Namensräumen Objekte und deren Methoden/Attribute in einer Art Baumstruktur strukturiert. Dies ermöglicht eine eindeutige Ansprache von Variablen/Objekte, aber auch eine doppelte Verwendung von Methoden-/Attributnamen in unterschiedlichen Namensräumen. Ergänzend zu den Namensräumen kann mit public/private/proteced eine Zugriffsbeschränkung von Methoden/Attributen definiert werden.
Die Programmiersprache C unterstützt keinen Namensraum. Zugriffsmodifikatoren werden indirekt über Header-Dateien getätigt. Hinsichtlich der Gültigkeit/Sichtbarkeit unterscheidet C folgende Bereiche [C11 6.2.1]:
* Funktionen (Function Scope)
* Datei (File Scope)
* Block (Block Scope)
* Funktionsparameter in Prototypen (Function Prototype Scope)
Innerhalb eines Gültigkeitsbereiches dürfen Variablen-/Funktions-/Datentypnamen nicht doppelt genutzt werden.<br />
In der Programmiersprache C++ sind weitere Scope wie z.B. Class Scope, Enumationation Scope und ergänzend das Konzept von Namensräumen vorhanden (Beschreibung folgt).
=== Funktionsweite Sichtbarkeit ===
Eine Label-Definition (als Sprungmarke für die goto-Anweisungen) erfolgt immer mit funktionsweiter Sichtbarkeit/Gültigkeit. Die genaue Beschreibung dieses Sichtbarkeitstyps erfolgt im Rahmen des Kapitels [[Programmieren in C/C++: Grundlagen #Label + Goto|Grundlagen:Label+Goto]].
=== Dateiweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp-Definition außerhalb eines Block-Scopes oder von Funktionsparameter, so sind diese innerhalb der gesamten Datei und bei Funktionen/Variablen ergänzend Projektweit (für alle Objektdateien) sichtbar/gültig (= global) (In der C-Spec unter dem Stichwort 'Linkage' beschrieben, siehe Kapitel [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage| DatentypeSpecifier:Internal/External Linkage]]). Alle globalen Funktionen/Variablen können von allen Dateien aus genutzt/zugegriffen werden (sofern sie zuvor deklariert wurden).<br />
Beispiel:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Deklaration von global,
//welche in Datei1.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
printf("global=%d\n",global);
return 0;
} | datei2_c=#include <stdio.h>
//Deklaration von global,
//welche in example.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
printf("func() called\n");
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird das Schlüsselwort 'static' der Variablen/Funktionsdefinition vorangestellt, so wird die Sichtbarkeit/Gültigkeit auf Dateiweit eingeschränkt. Variablen/Funktionen können nur innerhalb der (Objekt-) Datei genutzt werden und sind für anderen (Objekt-)Dateien unsichtbar. (Siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage|DatentypeSpecifier:Internal/External Linkage]] Internal/External Linkage)
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
printf("example.c:var1=%d\n",var1);
void func(void); //Prototyp für func()
func();
return 0;
} | datei2_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
printf("datei2.c:var1=%d\n",var1);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Projektweite Gültigkeit bedeutet insbesondere, dass keine doppelten Benennung von Variablen/Funktionen/Datentypen innerhalb des gesamten Projektes erlaubt sind, d.h. alle Variablen/Funktionennamen über alle Dateien/Librarys eindeutig sein müssen.<br>
Beispiel 1:
{| class="wikitable"
|-
! Datei1.c !! Datei.2
|-
| <syntaxhighlight lang="C">
#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
}</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
} | datei2_c=#include <stdio.h>
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der Linker meldet beim Zusammenfügen der Objekt-Dateien, dass die Variable a bereits woanders definiert sei (multiple definition of `a';)!
Beispiel 2:
<syntaxhighlight lang="C">
#include <stdio.h> //fuer printf() size_t stderr
int printf=7;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int printf=7;
int main(int argc,char *argv[])
{
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hier meldet der Compiler eine Fehlermeldung, da das Symbol printf zu einen als Variable und zum anderen als Funktion (innerhalb der inkludierten Datei stdio.h beschrieben) genutzt wird ('printf' redeclared as different kind of symbol).
=== Blockweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp Definition innerhalb einer Funktion, als Funktionsparameter oder eines Blockes, so sind diese nur innerhalb des Blockes sichtbar/gültig (=Lokale Variable). Blöcke können verschachtelt sein, so dass das bei identischer Namensgebung innere Definitionen Vorrang haben. Ebenso haben Blockdefinitionen Vorrang vor Datei-/Projektdefinitionen (überdecken diese):
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
} | datei2_c=#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sichtbarkeit von Funktionsparameter in Protypen ===
Soll eine Funktion aufgerufen werden, die zuvor nicht definiert wurde, so ist ein Prototyp/(Forward)deklaration der Funktion notwendig (siehe nachfolgendes Kapitel). Die Parameterliste dieses Prototyps hat seinen eigenen Gültigkeitsbereich.<br/>
Beispiel:
<syntaxhighlight lang="C">
int a; //a im File Scope
int func(int a, int b); //a und b im Function Prototyp scope
</syntaxhighlight>
Hinweis:
* Bei Prototypen ist die Angabe von Variablenname nicht notwendig. Die alleinige Angabe des Datentyps ist ausreichend
=== Zuordnung der Gültigkeitsbereiche zu globalen/lokalen Variablen ===
Zum einfacheren Verständnis wird im Skript von folgenden Begrifflichkeiten gesprochen:
* '''Globale''' Variablen-/Funktionen-/Datentypdefinitionen → Projektweite Sichtbarkeit/Gültigkeit
* '''Statisch globale''' Variable/Funktionen → Dateiweite Sichtbarkeit/Gültigkeit
* '''Lokale''' Variablen/Funktionen/Funktionsparameter/Datentypen → Nur innerhalb des zugehörigen Blockes sichtbare/gültig
* '''Statisch lokale''' Variablen → Nur innerhalb der Funktion sichtbar/gültig, mit der Besonderheit, dass die Gültigkeit über der Laufzeit der Funktion gilt (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Static Storage Class Specifier|DatentypeSpecifier:Static Storage Class Specifier]])
=== Speicherzuweisung ===
Für die einzelnen Gültigkeitsbereiche werden im Speicher (und auch in der Objekt-Datei) unterschiedliche Speicherbereiche (Segmente) vorgehalten, d.h. der Compiler teilt den Speicher in unterschiedliche Bereiche auf und weist den Variablen/Funktionen in Abhängigkeit der Gültigkeit/Sichtbarkeit unterschiedliche Speicherbereiche zu!
[[File:Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten).png|thumb|Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten)]]
Zur Ermöglichung von Rekursion werden lokale Variable auf dem Stack gehandelt. Mit Aufruf einer Funktion oder öffnen eines neuen Block-Scopes wird Speicher auf dem Stack reserviert, der bei Beenden des Scopes wieder freigegeben wird. Die Speicheradresse von lokalen Variablen ist somit nicht Fix, sondern hängt von der Aufrufhierarchie ab!
Globale und statisch globale Variablen werden nicht auf dem Stack gehalten, sondern bekommen einen 'festen' Speicherbereich (hier DATA/BSS/RODATA) während der gesamten Laufzeit des Programms zugewiesen. Die Adresse dieser Variablen sind somit konstant. Das genutzte Speichersegment von globalen Variablen hängen von der Art der Variablen ab. Initialisierte Variablen werden im DATA-Segment gesammelt, welcher mit dem Initialisierungswert der Variablen initialisiert wird. Nicht initialisierte globale Variablen landen im BSS-Segment, so dass diese mit Programmstart durch Füllen dieses Blockes mit 0 auf 0 gesetzt werden.
Konstante globale Variablen werden im RODATA-Segment gehalten. Über das Betriebssystem kann dieser Speicherbereich auf nur Lesbar gesetzt werden.
Dynamische Speicheranforderungen, resp. Speicher, dessen Gültigkeit über die Laufzeit einer Funktion hinausgeht, wird im Heap gesammelt. Für die Verwaltung dieses Speichers ist der Programmierer zuständig.
Entsprechend globalen Variablen wird für Funktionen ebenfalls ein eigener Speicherbereich (TEXT Segment) vorgesehen. Im Gegensatz zu Variablen, wo im Speicher der dazugehörige Inhalt gespeichert ist, ist der Speicherinhalt von Funktionen die Maschinenanweisungen. Die Speicheradresse der Funktionen sind konstant.
Hinweis:
* Die Speicheradresse von sowohl globalen und statisch globalen Variablen als auch von Funktionen ist konstant und ändert sich während der Laufzeit des Programms nicht. Die Adressvergabe dieser Variablen und Funktionen erfolgt somit nicht zur Laufzeit sondern durch die Toolchain (hier der Linker).
* Dieses Konzept ist allgemeingültig, gilt nicht nur für die Programmiersprache C/C++
== Definition/Deklaration(Prototyp) ==
Der C-Compiler ist ein Single-Pass Compiler (siehe Kap [[Programmieren in C/C++: Einführung/Literatur#Arbeitsweise eines Compilers | Einführung/Literatur:Arbeitsweise eines Compilers ]]), d.h. für den Übersetzungsvorgang wird der Quellcode einmalig eingelesen und von vorne nach hinten abgearbeitet. Dies bedingt, dass keine Vorwärtsbezüge im Quelltext enthalten sein dürfen:
* keine Variable genutzt werden kann, die erst später definiert wird (da der Compiler in Abhängigkeit des Datentyps (den er dann noch nicht kennt) keine entsprechende Maschinensprachebefehle erzeugen kann)
* keine Funktion aufgerufen werden kann, die erst später definiert wird (da der Compiler nicht weiß, welcher Datentyp die Übergabewerte haben und folglich keine Maschinensprachebefehle zur Konvertierung und Übergabe der Variablen erzeugen kann)
* kein Datentyp genutzt werden kann (struct, union, enum, typedef), welcher erst später definiert wird (da der Compiler nicht weiß, wieviel Speicher er für die Variable reservieren muss)
Eine Lösungsvariante dieser Problematik ist, im Quellcode alle Variablen/Funktionen/Datentypen/Makros zu definieren, bevor diese erstmalig genutzt werden (Funktion main() steht dann folglich am Ende des Quellcodes):
<syntaxhighlight lang="C">
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
//Hier kein Zugriff auf var möglich!
//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(void) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
var++; //Hier kein Zugriff auf var möglich!
uchar xyz;//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(int argc, char *argv[]) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Sollen globale Funktionen/Variablen in Datei1.c genutzt werden, die in Datei2.c definiert sind, so schlägt diese Vorgehensweise fehl. Um auch dieses zu ermöglichen, bietet C die Möglichkeiten von Prototypen/Deklarationen an. Diese teilt dem Compiler mit, wie im späteren Ablauf die Variable, die Funktion definiert wird, bzw. dass es diesen Datentyp geben wird:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
} | datei2_c=#include <stdio.h>
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Innerhalb der C-Spezifikation werden für den Umgang mit dieser Problematik die Begriffe 'Declaration' und 'Definition' genutzt. Da diese Begriffe jedoch nicht klar abgegrenzt werden und auch für viele weitere Aspekte genutzt werden, sollen in diesem Skript in Anlehnung an den Wikipedia Artikel {{w|Deklaration (Programmierung)|Deklaration (Programmierung)}} (im Absatz zur Programmiersprache C/C++) die Begriffe Definition/Deklaration wie folgt genutzt werden:
;Definition: entspricht der Belegung/Reservierung von Speicherplatz
:* Bei der Definition einer Variablen wird hiermit Speicherplatz entsprechend dem Datentyp der Variable belegt:
:<syntaxhighlight lang="C">
int var1; //entsprechend der Größe des Datentyps int wird
//Speicherplatz für die Variable var1 reserviert
int var2=4711; //Dito, ergänzend wird dieser Speicherplatz mit dem
//Wert 4711 initialisiert
</syntaxhighlight>
:* Bei einer Funktion wird Speicherplatz zur Aufnahme der Maschinenbefehle belegt:
:<syntaxhighlight lang="C">
void foo(void) { //Die Anweisungen in den geschweiften Klammern
//werden in Maschinenbefehle übersetzt. D.h. die
//Funktion foo() belegt Speicher, dessen Inhalt
//die Maschinensprachebefehle sind
}
</syntaxhighlight>
:* Ergänzend wird der Begriff Definition auch in Verbindung mit der Definition von neuen Datentypen genutzt!
;Deklaration/Prototyp: ist die Mitteilung an den Compiler, wie diese Variable/Funktion an einer späteren Stelle im Source-Code oder in einer anderen Source-Datei definiert wird. Auf Grundlage dieser 'vorab' Information kann der Compiler die passenden Maschinensprachebefehle für den Zugriff/Aufruf auf die Variablen/Funktion einsetzen:
:<syntaxhighlight lang="C">
extern int var1; //Deklaration von var1
extern void foo(void); //Deklaration von foo()
void foo(void); //Deklaration von foo()
</syntaxhighlight><br />
Insbesondere bei dem Umgang mit der Deklaration gilt es Folgendes zu berücksichtigen:
* Deklarationen werden entweder:
:* am Anfang einer C-Datei geschrieben, so dass Funktionen/Variablen im Zugriff stehen, die erst später in der C-Datei definiert werden (entspricht dann der Private Anweisung in anderen Sprachen)
:* in Header-Dateien geschrieben, so dass diese Variable/Funktionen für alle sichtbar sind, welche diese Header-Datei einbinden (entspricht der Public Anweisung in anderen Sprachen)
* Deklarationen von Funktionen werden in der C-Spec als (function) Prototyp bezeichnet und sind dadurch gekennzeichnet, dass diese mit einem Semikolon abgeschlossen sind. Der Specifier 'extern' ist hier optional und sagt eigentlich aus, dass diese Funktion external Linkage besitzt (siehe [[Programmieren in C/C++:_DatentypeSpecifier#Internal/External Linkage | DatentypeSpecifier:Internal/External Linkage]]). Die Benennung der Parametervariablen sind gleichermaßen optional:
:<syntaxhighlight lang="C">
extern int foo(int var1, float var2); //Deklaration
extern int foo(int , float ); //Deklaration
int foo(int var1, float var2); //Deklaration + external Linkage
int foo(int , float ); //Deklaration + external Linkage
</syntaxhighlight>
* Für globale Variablen gibt es keine (Variablen) Prototype. Stattdessen muss zur Bekanntgabe des Datentyps der Specifier 'extern' vorangestellt werden, mit welchen ergänzend zum Ausdruck gebracht wird, das diese Variable external Linkage und damit globale Gültigkeit hat (siehe Kap [[Programmieren in C/C++: DatentypeSpecifier# Extern - Storage Class Specifier| DatentypeSpecifier:Extern - Storage Class Specifier]]). Da die Deklaration einzig zur Bestimmung der Zugriffsmethoden auf Maschinenspracheebene genutzt wird, können diese keine Initialisierungswerte enthalten:
:<syntaxhighlight lang="C">
extern int var1;
extern int var2=7; //KO Deklarationen können keine
//Initialisierungswerte haben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern int foo;
extern int foo=7;
int main(int argc, char *argv[]) {
return foo;
}
int foo=7;| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen von statisch globalen, lokalen und statisch lokalen Variablen nicht möglich sind:
:<syntaxhighlight lang="C">
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sich auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sicht auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen für identische Variablen/Funktionen können beliebig oft erfolgen, sofern der Datentyp identisch ist:
:<syntaxhighlight lang="C">
extern int var;
extern int var; //OK, doppelt Deklaration mit identischen Datentyp
extern unsigned int var; //KO, Doppelte Deklaration mit unterschiedlichen
// Datentyp
</syntaxhighlight>
* Sofern eine Deklaration und eine Definition in der identischen Datei erfolgen überprüft der Compiler, ob Deklaration und Definition identisch sind. Es empfiehlt sich, die eigene Header-Datei (in welcher die Deklaration normalerweise enthalten ist) zu inkludieren:
:{| class="wikitable"
|-
! Datei1.c !! Datei1.h
|-
| <syntaxhighlight lang="C">
//Include der eigenen Header-Datei
#include "datei1.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
</syntaxhighlight> ||
<syntaxhighlight lang="C">
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Include der eigenen Header-Datei
#include "example.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
int main(int argc, char *argv[]) {
return 0;
} | example_h=
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Datei kann eine Variable identischen Datentyps mehrmals definiert werden (bei identischen Initialisierungswert). Diese Definitionen werden vom Compiler als eine Definition angesehen. Wenn jedoch eine identische Variable in unterschiedlichen Dateien definiert wird, so legt jede Datei eine eigene unabhängige Variable an, welche dann beim Zusammenführen der Objektdateien durch den Linker zu Fehler führt. Da Header-Datei zumeist in mehrere C-Dateien inkludiert werden, sind Definitionen in Header-Dateien 'verboten'.
* Deklarationen innerhalb eines Block-Scopes oder eines Function Prototyp Scopes sind nur in diesen Bereich gültig.
== Grundlegende Datentypen und Typsicherheit ==
Die Programmiersprache C kennt folgende grundlegende Datentypen (siehe Kap. [[Programmieren in C/C++: Datentypen | Datentypen]]). Von jedem Datentyp kann ein Zeiger angelegt werden:
{| class="wikitable"
|-
! Datentyp !! Bsp. für Datentyp !! Bsp. für Zeiger auf Datentyp
|-
| Ganzzahl ||
<syntaxhighlight lang="C">
char var;
int var;
short int var;
long int var;
long long int var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
char *ptr;
int *ptr;
short int *ptr;
long int *ptr;
long long int *ptr;
</syntaxhighlight>
|-
| Gleitkommazahl ||
<syntaxhighlight lang="C">
double var;
float var;
long double var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
double *ptr;
float *ptr;
long double *ptr;
</syntaxhighlight>
|-
| Funktionen ||
<syntaxhighlight lang="C">
void func(void) {}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
void (*pfunc)(void);
</syntaxhighlight>
|-
| Arrays ||
<syntaxhighlight lang="C">
int arr[10];
float arr[3][3];
</syntaxhighlight>
||
<syntaxhighlight lang="C">
int (*parr);
float (*parr)[3];
void (*pfunc[5])(void);
</syntaxhighlight>
|-
| Strukturen/Unions ||
<syntaxhighlight lang="C">
struct xyz {int x,y,z};
union abc {int a,b,c};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
struct xyz *ptr;
union abc *ptr;
</syntaxhighlight>
|-
| Aufzählungstyp ||
<syntaxhighlight lang="C">
enum abc {A,B,C};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
enum abc *ptr;
</syntaxhighlight>
|-
| Boolescher Datentyp ||
<syntaxhighlight lang="C">
_Bool var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Bool *ptr;
</syntaxhighlight>
|-
| Komplexe Zahlen ||
<syntaxhighlight lang="C">
_Complex var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Complex *ptr;
</syntaxhighlight>
|}
C/C++ unterscheidet zwischen vorzeichenbehafteten <code>signed</code> und vorzeichenlosen <code>unsigned</code> ganzzahligen Datentypen. Vorzeichenlose Datentypen können nur positive Zahlen incl. der 0 aufnehmen (Anwendungsbereich bspw. Speicheradressen/Arrayindexe, welche nicht negativ sein können). Deren max. Zahlenwert ergibt sich aus der Datenbreite N des Datentyps 2<sup>N</sup>-1. Ein Vergleich eines vorzeichenlosen Datentyps mit ≥ 0 ist somit immer TRUE:
<syntaxhighlight lang="C">
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt"); //dieser ggf. vom Compiler wegoptimiert wird!
for(var=10; var>=0; var--); //Endlosschleife! 0 dekrementiert ergibt 255
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt\n"); //dieser ggf. vom Compiler wegoptimiert wird!
//Beim Öfffnen des Compiler-Fensters ist die IF-Anweisung nicht farblich
//hervorgehoben. Dies bedeutet, dass diese Zeile wegoptimiert wurde und folglich
//kein Maschinencode für diese Anweisung erzeugt wurde
for(var=10; var>=0; var--) //Endlosschleife! 0 dekrementiert ergibt 255
printf("%u ",var),fflush(stdout);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Vorzeichenlose Datentypen halbieren den verfügbaren Zahlenbereich und 'weisen' dem oberen Wertebereich den negativen Zahlen zu.<br>
Wird ein ganzzahliger Datentyp ohne Angabe des Vorzeichentyps (signedness) definiert, so ist diese vorzeichenbehaftet. Bei vorzeichenlosen Variablen muss explizit <code>unsigned</code> vorangestellt werden. Die Voranstellung von <code>signed</code> ist optional. Einzige Ausnahme stellt der Datentyp char dar. Hier gibt die Spezifikation keine default signedness vor, so dass bei Nutzung dieses Datentyps zur Aufnahme von Zahlen immer signed oder unsigned vorangestellt werden sollte!<br>
Innerhalb des Formatstrings bei den printf()/scanf() Anweisungen '''muss''' die signedness vom Programmierer händisch berücksichtigt werden. Die Formatanweisung %d und %i interpretieren die übergebenen Zahl als vorzeichenbehaftete Zahl. Soll eine vorzeichenlose Zahl ausgegeben werden, so muss %u verwendet werden:
<syntaxhighlight lang="C">
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%d varu=%u",vari,varu); //Korrekt
printf("vari=%u varu=%i",vari,varu); //Falsche Werteausgaben!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%12d varu=%12u\n",vari,varu); //Korrekt
printf("vari=%12u varu=%12i\n",vari,varu); //Falsche Werteausgaben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit der Definition (dem Anlegen) einer Variablen eines Datentyps wird Speicher entsprechend der Größe des Datentyps reserviert. Optional kann dieser Speicher initialisiert werden. Über den Datentyp wird ausgesagt, wie der Inhalt des Speichers zu interpretieren ist:
<syntaxhighlight lang="C">
char var1; //Speicherplatzreservierung von 1 Byte
//Inhalt der Speicherstelle wird als Zahl interpretiert
//(Hinweis: ASCII-Zeichen sind Zahlen)
double var2=47.11; //Speicherplatzreservierung von 8 Byte
//Inhalt der Speicherstellen wird als Gleitkommazahl
//interpretiert (bestehend aus je einer Ganzzahl für
//Mantisse und Exponent)
short arr[10]; //Speicherplatzreservierung von 10*2 Byte
//Inhalt der 10 Speicherstellen werden als Ganzzahl
//interpretiert
</syntaxhighlight>
Die Funktionalität der Operatoren hängt vom Datentyp der Operanden ab. Der Plus-Operator angewendet auf ganzzahlige Operanden führt eine Ganzzahl Addition aus, angewendet auf gleitkomma Operanden eine Gleitkomma Addition. Ist einer der Operanden ein Zeiger, so wird eine Zeigeraddition angewendet. Für andere Datentypen ist der Plus-Operator nicht definiert, so dass der Compiler einen Fehler wirft. '''Bei der Betrachtung eines Ausdruckes sollte dem genutzten Datentypen folglich eine besondere Aufmerksamkeit zuteil werden''':
<syntaxhighlight lang="C">
int vari=47;
vari+12; //(int) + (int) → Ganzzahladdition
float varf=12.3;
3.1415F+varf; //(float) + (float) → Gleitkommaaddition
int *ptr=&vari;
ptr+3; //(int *) + (int) → Zeigeraddition
int arr[3];
arr+3; //(int (*)) + (int) → Zeigeraddition
</syntaxhighlight>
Das Ergebnis einer Operation hat ebenfalls einen Datentyp. Eine Ganzzahl Addition gibt bspw. als Ergebnis einen Ganzahl Datentyp zurück, eine Gleitkomma Addtition einen Gleitkomma Datentyp und ein Vergleichsoperator den Datentyp _Bool:
<syntaxhighlight lang="C">
int vari1=47;
int vari2=11;
vari1 + 12 + vari2; //((int)+(int)+(int))→((int)+(int))→(int)
40 < vari1 < 50; //((int)<(int)<(int))→((_Bool=int)<(int))→(_Bool=int)
</syntaxhighlight>
Wie Operatoren haben auch Funktionen Operanden (in Form von Übergabeparameter). Das Ergebnis eines Funktionsaufrufes wird ebenfalls in Form eines Datentyps zurückgegeben:
<syntaxhighlight lang="C">
float add(int par1,par2) {return par1+par2;}
int vari1=47;
int vari2=11;
vari1 + add(var2,12); //(int)+((int),(int)→(float))→(int)+(float)→(float)
</syntaxhighlight>
Wird auf einen Operator gleichermaßen ein vorzeichenbehafteter und ein vorzeichenloser Operand angewendet, so kann es zu unerwarteten Konvertierungsproblemen führen:
<syntaxhighlight lang="C">
unsigned char varu=12;
signed char vars=-12;
float varf;
varf = varu + vars;
if(vars < varu)
</syntaxhighlight>
Sind die Datentypen der Operanden nicht 'kompatibel', so 'passt' der Compiler die Datentypen im Falle von Ganzahl und Gleitkomadatentypen per impliziter Regel an (siehe Kap. [[Programmieren in C/C++: Datentypen#Implizite Typumwandlung | Datentypen:Implizite Typumwandlung]]). Über explizite Typumwandlung (siehe Kap.[[Programmieren in C/C++: Datentypen# Explizite Typumwandlung|Datentypen:Explizite Typumwandlung]]) kann ein Datentyp z.T. in einen anderen Datentyp gewandelt werden.
In allen anderen Fällen ist C Typsicher, d.h. der Compiler gibt zumindest eine Warning aus, wenn die Datentypen nicht identisch sind und der Compiler keine implizite Regel anwenden kann.
Tipp:
* Compiler gibt bei Fehlermeldung oftmals die erwarteten und die vorhandenen Datentyp an. Wenn solch eine Fehlermeldung kommt, sollten sie sich a) überlegen, was wollten sie syntaktisch geschrieben haben und b) was haben sie in der Tat geschrieben. Ein Google nach einer Lösung des Compilerproblems löst zumeist nicht das Problem, sondern umgeht es!
Hinweis:
* Ein guter Programmierer sollte die Datentypen so wählen, dass:
:* die Datentypen zum Inhalt und zum Wertebereiches passen
:* keine Datentypkonvertierungen notwendig sind
: andernfalls besteht die Gefahr, dass hiermit Laufzeitfehler einprogrammiert werden.
* Wenn Datentypkonvertierungen notwendig sind, sollte die explizite Konvertierung genutzt werden
== Abhängigkeiten bzgl. Rechnerarchitektur ==
Kenngrößen von Prozessoren sind unter anderem die Anzahl der Bits für den Datentransport und für Arithmetisch-/Logische-Operationen (→ Datenbreite) und die Anzahl der Bits für die Adressierung des Speichers (→ Adressierungsbreite). Die Datenbreite sagt dabei aus, welche max. Datenbreite ein Maschinenbefehl (zumeist in einem Taktzyklus) transportieren/berechnen kann. Werden programmtechnisch größere Datenbreiten benötigt, bedingt dies, dass hierzu mehrere Maschinenbefehle notwendig sind. Wenn kleinere Datenbreiten notwendig sind, so wird oftmals das Ergebnis abgeschnitten (sofern der Prozessor keine Befehle für den Umgang mit kleineren Datentyp beherrscht):
{| class="wikitable"
|-
! 32-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 64-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 16-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
|-
| <syntaxhighlight lang="C">
int32_t a32,b32;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int64_t a64,b64;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int16_t a16,b16;
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=b32;
mov eax,b32
mov a32,eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=b64;
mov eax ,b64
mov edx ,b64+4
mov a64 ,eax
mov a64+4,edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
//a16=b16;
movz eax,b16
mov a16,ax
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=a32+b32;
mov edx, a32
mov eax, b32
add eax, edx
mov a32, eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=a64+b64;
mov ecx , a64
mov ebx , a64+4
mov eax , b64
mov edx , b64+4
add eax , ecx
adc edx , ebx
mov a64 , eax
mov a64+4, edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a16=16+b16;
movzx eax, a16
mov edx, eax
movzx eax, b16
add eax, edx
mov a16, ax
</syntaxhighlight>
|}
Die Adressierungsbreite gibt an, mit welcher Bitbreite der Speicher adressiert werden kann:
* Bei einem 32-Bit System können 2<sup>32</sup>=4.294.967.295=4Gi Bytes/Speicherstellen adressiert werden
* Bei einem 16-Bit System können 2<sup>16</sup>=65.536=64Ki Bytes/Speicherstellen adressiert werden
* Bei einem 64-Bit System können 2<sup>64</sup>=18.446.744.073.709.551.616 =16Ei ~18Exa Bytes/Speicherstellen adressiert werden
Waren die Datenbreite und die Adressierungsbreite bei den ersten Prozessoren noch unterschiedlich, so sind diese heutzutage zumeist identisch. Bei einem 32-Bit Prozessor bedeutet dies, dass dieser max. 4Gi Bytes Speicherstellenstellen adressieren kann und Maschinenbefehle für den Datentransport und die Berechnung von 32-Bit Datenworten beinhaltet.
Die Datenbreite und auch die Adressierungsbereite haben direkten Einfluss auf die Programmiersprache:
* Wird defaultmäßig mit größerer Datenbreite gerechnet, als der Prozessor 'von Hause' aus unterstützt, so werden die erzeugten Maschinenprogramme größer und langsamer (Umgedreht bedeutet dies jedoch nicht, dass die Maschinenprogramme kleiner und schneller werden)
* Die max. Größe von Verbunddatentypen und Arrays ergibt sich aus der Adressierungsbreite des Prozessors
Die Intention der Programmiersprache C/C++ ist, die Prozessorarchitektur optimal zu nutzen. Dementsprechend sind diverse Eigenschaften der Sprache nicht fest spezifiziert, sondern von der Rechnerarchitektur abhängig.
=== Integer Datentyp ===
Intention von C/C++ ist, dass der Umgang mit dem Grunddatentyp 'int' möglichst direkt in einen Maschinensprachebefehl umgesetzt werden kann.<br />
Bei einem 16-Bit Prozessor hat der Datentyp int daher eine Breite von 16-Bit und bei einem 32-Bit Prozessor eine Breite von 32-Bit (siehe Kap [[Programmieren in C/C++: Datentypen # Ganzzahlige Datentypen|Datentypen:Ganzahl Datentypen]]). Über vorangestellte Qualifier kann dieser Grunddatentyp verkleinert/vergrößert werden.
=== Integer Arithmetik ===
Ganzzahlen haben nur einen begrenzten Wertebereich. Wird dieser bspw. durch eine Addition überschritten (d.h. das Rechenergebnis benötigt zur Darstellung mehr Stellen, als der Datentyp 'hergibt'), so gibt es zwei Vorgehensweisen:
* Arithmetischer Überlauf (siehe {{w|arithmetischer Überlauf}}): Die nicht speicherfähigen Stellen werden verworfen, so dass i.d.R. ein falsches Ergebnis erzeugt wird!
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist (254+3)%256=1
c=a*b; //c ist (254*3)%256=250
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char a=254,b=3,c1,c2;
c1=a+b; //c ist (254+3)%256=1
c2=a*b; //c ist (254*3)%256=250
printf("c1=%hhu c2=%hhu\n",c1,c2);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Sättigungsarithmetik (siehe {{w|Sättigungsarithmetik}}): Alle Operationen laufen innerhalb eines festen Intervalls ab, so dass Überläufe und Unterläufe auf dieses Intervall begrenzt werden:
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist MAX((254+3),255)=255
c=a*b; //c ist MAX((254*3),255)=255
</syntaxhighlight>
Die Spezifikation von C macht bezüglich der zu nutzenden Methodik keine Vorgaben, so dass das Handling von der ALU des Prozessors abhängt. Aus Komplexitäts- und Geschwindigkeitsgründen ist dies zumeist der arithmetische Überlauf. Nur bei Spezialprozessoren (z.B. DSP Digital Signal Processor) kommt z.T. die Sättigungsarithmetik zum Einsatz.
=== Gleitkomma Datentyp und Arithmetik ===
Für den Umgang mit Gleitkommazahlen bieten einige Prozessoren spezielle Recheneinheiten ({{w|Gleitkommaeinheit}} Floating Point Units FPU) an. Sowohl die Darstellung von Gleitkommazahlen als auch das Verhalten bei Überlauf/Unterlauf ist damit Herstellerabhängig. Um auch diese Einheiten effektiv nutzen zu können, ist die C/C++ Spezifikation in diesem Bereich ebenfalls sehr offen.
=== Max. Speicherbedarf von Variablen ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C/C++ von der zugrundeliegenden Rechnerarchitektur abhängig:
<syntaxhighlight lang="C">
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Zur Darstellung bitte Compiler-Fenster öffnen
//und dort den CC65-Compiler für den 6502 Prozessor auswählen
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Im Falle von globalen Variablen erzeugt der Compiler/Linker eine Fehlermeldung. Werden von diesen Datentypen Variablen als lokale Variablen angelegt, so erzeugt dies zur Laufzeit einen Stackoverflow.
=== Zeigervariable ===
Eine Zeigervariable ist eine Variable, die eine Speicheradresse speichert. Die Größe dieses Datentyps hängt von der Adressierungsbreite des Prozessors ab. Unabhängig von dem Datentyp, auf den die Zeigervariable zeigt, ergibt sich folgende Breite:
* 4-Byte bei einer 32-Bit Rechnerarchitektur
* 8-Byte bei einer 64-Bit Rechnerarchitektur
* 2-Byte bei einer 16-Bit Rechnerarchitektur
=== Datentyp size_t ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C von der zugrundeliegenden Rechnerarchitektur abhängig. Sie ergibt sich aus der Adressierungsbreite. Da die Datenbreite des Datentyps int zumeist kleiner als die Adressierungsbreite ist, existiert in C/C++ der vorzeichenlose Datentyp size_t.<br />
Alle Funktionen, welche den Speicherbedarf übergeben bekommen, bzw. zurückgeben (bspw. strlen(), memcpy(), sizeof()) , nutzen den Datentyp size_t:
<syntaxhighlight lang="C">
//Prototypen
size_t strlen(char *str); //Die max. Stringlänge ist durch den
//adressierbaren Speicher vorgegeben
void *malloc(size_t size);
void *memcpy(void *dest, const void *src, size_t n);
</syntaxhighlight>
Der Datentyp size_t ist in der Header-Datei stddef.h der Standard-C-Library per typedef gesetzt. Im Normalfall muss diese Header-Datei nicht explizit inkludiert werden, da bei Nutzung von z.B. strlen() diese bereits durch die Header-Datei string.h inkludiert wird:
<syntaxhighlight lang="C">
typedef unsigned long long size_t; //Bei einer 64-Bit Rechnerarchitektur
</syntaxhighlight>
Hinweis:
* Der Datentyp size_t ist immer ein vorzeichenloser Datentyp (es gibt keine negativen Speicheradressen).
* Mit dem Datentype ssize_t wird eine vorzeichenbehaftete Variante zur Verfügung gestellt, welche hilfreich ist, wenn Speicheradresse subtrahiert werden sollen.
* Soll der Wert vom Datentyp size_t mittels printf() ausgegeben werden, so ist der 'Length Modifier' z und der 'Conversion Specifier' u zu nutzen:
:<syntaxhighlight lang="C">
size_t var=strlen("String");
printf("%zu",var);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]) {
size_t var=strlen("String");
printf("%zu",var);
printf("%d",var); //Hier sollte es eine Compiler-Warning geben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Boolescher-Datentype/Operatoren ==
Ursprünglich gab es den booleschen Datentyp in der Programmiersprache C nicht. Mit C99 wurde zwar der Datentyp <code>_Bool</code> eingeführt, dies änderte jedoch nicht den Umgang mit Anweisungen und Operatoren, die einen booleschen Datentyp erwarten/zurückgeben!
An allen Stellen, an denen ein boolescher Datentyp erwartet wird (z.B. IF-Abfrage, bei booleschen Operationen) wird der Datentyp Ganzzahl, Gleitkommazahl oder Zeiger erwartet (= Scalar-Type) und ausgewertet. Der hierin gespeicherte Zahlenwert sagt aus, ob diese Zahl als True oder False zu interpretieren ist:
* False, wenn Ganzzahl gleich 0 oder Gleitkommazahl gleich 0.0 oder Zeiger gleich NULL
* True, wenn Ganzzahl ungleich 0 oder Gleitkommazahl ungleich 0.0 oder Zeiger ungleich NULL
Beispiel:
<syntaxhighlight lang="C">
int a=3;
double b=0.0;
int *ptr=&a;
while(1);
if(a) {}
for( ; b && ptr ; );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
double b=0.0;
int *ptr=&a;
while(0);
if(a) {}
for( ; b && ptr ; ) {}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Operatoren, welchen einen booleschen Wert zurückliefern (Vergleichs-Operatoren und Boolesche-Operatoren), liefern ein Integer-Datentyp zurück:
* (int)0 für False
* (int)1 für True
Beispiel:
<syntaxhighlight lang="C">
int a=3;
int b= (a==3); //b=1
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
int b= (a==3); //b=1
printf("%d",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
In den if()/for()/while() Anweisungen ist folglich kein explizites Konvertieren eines Ganzzahl-/Gleitkomma-/Zeigerwertes mittels des Vergleichs-Operators in einen Booleschen Wert notwendig:
<syntaxhighlight lang="C">
int a;
double b;
if(a) //entspricht if(a!=0)
if(!b) //entspricht if(b==0.0)
while(1) //entspricht while(True)
for(int lauf=1; lauf ; lauf--);
</syntaxhighlight>
Umgedreht kann ein boolescher Wert oder auch das Ergebnis einer booleschen Operation direkt mit einer Ganzzahl- oder Gleitkommazahl verknüpft werden:
<syntaxhighlight lang="C">
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
if( a==1 & b==2)
if(3 < a < 9) //Vorsicht, die Schreibweise lässt ein
//anderes Verhalten erwarten!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
printf("%d\n",a);
if(a==1 & b==2)
printf("true\n");
else
printf("false\n");
if(3 < a < 9)
if( (a==1) & (b==2))
printf("true\n");
else
printf("false\n");
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit C99 wurde der Datentyp <code>_Bool</code> eingeführt. Dieser entspricht weiterhin einem Integerdatentyp mit der Besonderheit, dass beim Zuweisen eines Wertes dieses auf true oder false geprüft wird und Variablen dieses Datentyps nur die Werte 0 oder 1 annehmen können:
<syntaxhighlight lang="C">
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool! möglich
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool!
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für den einfacheren Umgang mit dem 'neuen' Datentyp wurde in der Header-Datei <code>stdbool.h</code> die Makros <code>true</code> (als Austauschwert für die Ganzzahl 1) und <code>false</code> (als Austauschwert für die Ganzahl 0) definiert. Ergänzend wird hier der Datentyp <code>bool</code> als Alias auf <code>_Bool</code> gesetzt.
<syntaxhighlight lang="C">
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
int main(int argc,char *argv[]) {
foo(4,3,6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In C++ gibt es anstatt des Datentypes <code>_Bool</code> den Datentyp <code>bool</code>. Auch sind die beiden Konstanten <code>true</code> und <code>false</code> ohne zusätzliches Einbinden der Header-Datei vorhanden. Der weitere Umgang ist jedoch identisch zu C.
== Literale/Konstanten ==
In Computerprogramm werden an diversen Stellen Konstanten in Source Code genutzt. Sei es als Initialisierungswert für Variablen, als Vergleichswert für Abfragen, zur Definition von Schleifendurchläufe oder als Strings für die Kommunikation. Der Syntax der Programmiersprache bietet dazu verschiedene Möglichkeiten, wie Zahlen zu beschreiben sind und wie der Datentyp vorgeben wird.</br>
Ungeachtet der Schreibweise werden im Computer alle Zahlen identisch als binäre Zalen gespeichert. Beispiele, wie die Zahlen intern gespeichert werden:
<syntaxhighlight lang="C">
int var=17; //0000 0000 0000 0000 0000 0000 0001 0001
short var=0x307;// 0000 0011 0000 0111
char var=017; // 0000 1111
int var=-1; //1111 1111 1111 1111 1111 1111 1111 1111
float var=0.0; //0000 0000 0000 0000 0000 0000 0000 0000
float var=1.0; //0011 1111 1000 0000 0000 0000 0000 0000
</syntaxhighlight>
=== Ganzzahl-Konstanten ===
Im Allgemeinen ordnet der Compiler einer numerischen, ganzzahligen Konstanten den kleinstmöglichen Datentyp beginnend vom Datentyp integer zu. Sobald der Wert der Konstanten den Wertebereich von integer übersteigt, wird der nächst größere passende Datentyp gewählt. Ergänzend gilt, dass alle Ganzzahl-Konstanten als vorzeichenbehaftete Ganzzahl-Konstanten angesehen werden!<br />
Beispiele für integer Konstanten:
<pre>
123
+123
-123 → Formal wird das Minus als Operator angesehen
und die positive Zahl 123 negiert
0x123 → Konstante ist in hexadezimaler Schreibweise notiert
0123 → Konstante ist in oktaler Schreibweise notiert
0b011 → Konstante ist in binärer Schreibweise notiert
nicht offizieller C-Syntax, wird aber von vielen Compiler unterstützt
ab C23-Spezifikation offiziell im C-Syntax enthalten!
6'432'108 → Tausendertrenner (ab C23 und in C++)
6'4'3'2'10 → Tausendertrenner
0x12'23'5 → Tausendertrenner
0b1001'001 → Tausendertrenner
5123123123 → Wertebereich größer als 2^31 so dass automatisch
zum nächst größeren Datentyp konvertiert wird
</pre>
Mit den Suffixen L/l und LL/ll kann der Datentyp long und long long erzwungen werden:
<pre>
12L → Konstante wird in eine long Integer Konstante konvertiert
4711LL → Konstante wird in eine Long Long Konstante konvertiert
</pre>
Mit dem Suffix U/u kann die Konstante explizit auf unsigned gesetzt werden:
<pre>
12U → Konstante wird als vorzeichenlose Zahl gesepeichert
4711ULL → Konstante wird in eine vorzeichenlose
Long Long Konstante konvertiert
</pre>
=== Char-Konstanten ===
In einfachen Anführungsstrichen geschriebene ASCII Zeichen werden entsprechend der {{w|American Standard Code for Information Interchange | ASCII-Tabelle}} als Zahlenwert (Datentyp int) dargestellt:
<pre>
'A' → Integerkonstante 65
'a' → Integerkonstante 97
…
</pre>
Über den {{w|Escape-Sequenz|Escape-Operator}} (Zeichen Backslash '\') wird das/die dem ESCAPE Operator folgende Zeichen gesondert interpretiert. Die im Source-Code erhaltene Zeichenfolge wird im Computerprogramm als ein Zahlenwert (Datentyp int) gespeichert. Dies ist u.A. zur Darstellung von ' und " aber auch zur Darstellung der unteren 32 Zeichen der ASCII Tabelle notwendig (Siehe auch {{w|Steuerzeichen}})
<pre>
ESCAPE Integer- → Bedeutung / (Terminal)funktionalität
Sequence konstante
'\0' = 0 → 0 Character = Stringendezeichen
'\a' = 7 → Bell (erzeugt auf dem Terminal einen Ton)
'\b' = 8 → Backspace (Bewegt den Cursor um eine Position nach links)
'\t' = 9 → Horizontal Tab (Bewegt den Curso auf die nächste horizontale
Tabulatorposition, Abstand ist Terminalspezifisch)
'\n' = 10 → NewLine (Zeilenvorschub)
'\v' = 11 → Vertial Tab
'\r' = 13 → Carriage Return (Wagenrücklauf, Bewegt den Cursor an den
Zeilenanfang)
'\"' = 34 → Double Quote
'\'' = 39 → Single Quote
'\?' = 63 → Question mark
'\\' = 92 → Backslash
'\f' = 12 → FormFeed (Erzeugt auf dem Terminal/Drucker
einen Seitenvorschub)
'\ooo' = 0ooo → Oktal, wobei o Digits von 0..7 sein müssen
'\xdd' = 0xdd → Hexadezimal, wobei d Digits von 0..9 A..F sein müssen
'\udddd' Unicode mit 4 Digits
'\Udddddddd' Unicode mit 8 Digits
</pre>
Beispiel
<syntaxhighlight lang="C">
'A' == 65 == '\101' == '\x41' == '\u0041' == '\U00000041'
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
//Programmiersprache wurde auf C++ gesetzt
if('A' == 65) printf("'A' == 65\n");
if('A' == '\101') printf("'A' == '\\101'\n");
if('A' == '\x41') printf("'A' == '\\x41'\n");
if('A' == '\u0041') printf("'A' == '\\u0041'\n");
if('A' == '\U00000041') printf("'A' == '\\U00000041'\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true|
lang=c++
}} Öffnen im Compiler Explorer] }}
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
u'b' → unicode 16 (nur C++)
U'b' → unicode 32 (nur C++)
L'b' → wchar_t
</pre>
Hinweis
* Die ASCII-Tabelle basiert auf einer 7-Bit Zeichenkodierung, so dass bspw. die Umlaute 'ä', 'ö' und 'ü' dort nicht kodiert sind. Sollen auch diese Zeichen genutzt werden, so empfiehlt sich der Datentyp wchar_t
=== Gleitkommakonstanten ===
Alle Gleitkommakonstanten sind ohne weitere Angaben vom Datentyp double!
<pre>
555.12
555. → 555.0
.1 → 0.1
4e2 → 400.0
1'234.678'9 → Tausendertrenner (ab C23 und in C++)
0x22.11p13 → Konstante in Hexadezimalen Schreibweise (ab C99)
</pre>
Über Suffixe kann ein alternativer Datentyp erzwungen werden:
<pre>
3.0F → Datentyp float
3.0l → Datentyp long double
</pre>
Hinweis:
* Aufgrund der unterschiedlichen Basis zwischen dem menschlichen Zehner-System und dem computerinternen Binär-System entstehen insbesondere bei den Nachkommastellen Rundungsfehler. Die Konstante 0.1f wird durch die Wandlung intern als 1.00000001490116119384765625e-1 dargestellt (siehe [[Programmieren in C/C++: Datentypen#Gleitkomma Datentypen | Datentypen:Gleitkomma Datentypen]])
* Die C-Spec verlangt, dass die binäre Repräsentation von Gleitkommazahlen zur Laufzeit (z.B. durch die Funktion atof() strtod() scanf("%f")) identisch zur der zur Compilezeit ist. Beispiel:
:<syntaxhighlight lang="C">
if(3.14==atof("3.14")) printf("muss erfüllt sein");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
if(3.14==atof("3.14")) printf("muss erfüllt sein\n");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
printf("Intern wird 3.14 wie folgt dargestellt %14.20f",3.14);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Konstanten Ausdrücke ===
Ergänzend zu den Zahlenwerten werden auch Ausdrücke durch den Compiler ausgewertet. Als Voraussetzung für die Ausdrücke gilt, dass alle Operatoren Literale/Konstante sein müssen, so dass der Compiler die Berechnung durchführen kann. Als Operatoren können alle im normalem Syntax erlaubten Operatoren (z.B.: +,-,*,/,&,&&,|,||,>>,<<,==,!=) genutzt werden.<br />
Beispiel:
<syntaxhighlight lang="C">
int var1=7*3+5; → wird vom Compiler durch 26 ersetzt
int var2=(4710+(8-1))&-8; → wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); → wird vom Compiler durch 16 * var1 + 154 ersetzt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int var1=7*3+5; //→ wird vom Compiler durch 26 ersetzt
int var2;
var2=(4710+(8-1))&-8; //→ wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); //→ wird vom Compiler durch var1 * 16 + 154 ersetzt
return 0;
} | execCompilerOptions=-Wall|
h=g|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Konstante Ausdrücke bieten sich an, um den Sourcecode lesbarer zu gestalten. Da der Compiler die Berechnung durchführt, wird zur Laufzeit keine Rechenleistung benötigt. Einzig die Compiledauer wird etwas erhöht:
<syntaxhighlight lang="C">
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180); //siehe nachfolgende Hinweise
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int ad_get(void) {
return 615; //614;
}
int main(int argc,char *argv[]) {
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180);
printf("%f\n%f\n",alpha1,alpha2);
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Ergänzend zu den oben aufgeführten Operatoren erlauben einige Compiler weitere Funktionen der Math.h Library in Konstantenausdrücken (z.B. sin(), cos(), ...)
* Konstanten Ausdrücke werden innerhalb des Compilers durch den Präprozessor ausgewertet, so dass dieser die Ergebnisse ebenfalls nutzen kann:
:<syntaxhighlight lang="C">
#define BUF_SIZE 512
#if (BUF_SIZE & (BUF_SIZE -1)) != 0
#endif
</syntaxhighlight>
=== String Konstanten ===
Stringkonstanten erzeugen ein Array von Characters. Mit dem abschließenden Hochkommata wird das Array um ein Stringendezeichen ergänzt:
<pre>
"abc" → (char []) {'a','b','c','\0'}
</pre>
Adjacent Strings Konstanten werden vom Compiler zu einer String-Kontante zusammengefasst, so dass nur ein Stringendezeichen vorhanden ist:
<pre>
"xxx" "yyy" → (char []) {'x','x','x','y','y','y','\0'}
</pre>
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
L"string" → (wchar_t[7]){L's',L't',L'r' …)
</pre>
Über Postfixes können in C++ Objekte erzeugt werden:
<pre>
"string"s → erzeugt einen String vom Datentyp std::string
"string"sw → Erzeugt einen String vom Datentyp std::string_view
</pre>
String Konstanten werden Compilerintern über unnamed Variablen realisiert, welche als globale Variable angelegt werden und per default const sind:
<syntaxhighlight lang="C">
printf("Wert=%d",4);
//entspricht
const char unnamed1[]="Wert=%d";
printf(unnamed1,4);
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
printf("Wert=%d\n",4);
//entspricht
const char unnamed1[]="Wert=%d\n";
printf(unnamed1,4);
fflush(stdout); //Zur Darstellung der Ausgabe, da nachfolgend
//das Programm abstürzt und die gepufferte Ausgabe
//nicht zur Anzeige gebracht wird
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für doppelte String Konstanten wird nur einmal Speicher reserviert:
<syntaxhighlight lang="C">
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2) printf("Identische Startadressen");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2)
printf("Identische Startadressen");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Initialisierungsliste / Compound Literal ==
Arrays, Strukturen und Unions bestehen zumeist aus mehreren Elementen. Zur Initialisierung solcher Variablen werden die Initialisierungswerte in geschweiften Klammern als Initialisierungsliste zusammengefasst.
<code>
Syntax: {Initialisierungsliste}
</code>
Für eine Initialisierungsliste wird kein Speicher vorgehalten. Vielmehr wird bei der Variablendefinition die Variable direkt mit dem Inhalt der Liste initialisiert. Der Datentyp der Initialisierungsliste ergibt sich aus dem Datentyp der zu initialisierenden Variable:
<syntaxhighlight lang="C">
int arr[5] = { 1,2,3,4,5 };
struct xyz { int x,y,z;}; //Definition einer Struktur
struct xyz var = { 1,2,3 };
</syntaxhighlight>
Wird der Initialisierungsliste ein Datentyp in runden Klammern vorangestellt, so wird hiermit eine 'unnamend' Variable/Objekt, ein Compound Literal erstellt:
<code>
Syntax: (type) {Initialisierungsliste}
</code>
Ein Compound Literal entspricht einer anonymen Variablen des angegebenen Datentyps. Wie bei einer normalen Variablendefinition wird hier ebenfalls eine Variable angelegt und diese mit den Initialisierungswerten initialisiert. Im Unterschied zu einer normalen Variable kann auf solch eine Variable im Nachgang nicht mehr zugegriffen werden. Der Rückgabewert eines Compound Literals entspricht somit dem einer Variablen.</br>
Compound Literale bieten sich überall dort an, wo Variablen nur für einen einmaligen Zweck angelegt werden (bspw. bei der Parameterübergabe von Funktionen):
<syntaxhighlight lang="C">
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawline(struct point start,struct point end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start.x,start.y,end.x,end.y);
}
void printarray(int arr[4]) {
printf("[ ");
for(size_t idx=0;idx<4;idx++)
printf("%d ",arr[idx]);
printf("]\n");
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Über den Adressoperator kann auch die Adresse der anonymen Variablen ermittelt werden. In diesem Falle ist dann der Gültigkeitsbereich/-dauer des Compound Literals zu berücksichtigen. Wird eine Compound Literals außerhalb eines Block-Scopes angelegt, so entspricht sie einer globalen Variable, andernfalls einer lokalen Variablen. Außerhalb des Gültigkeitsbereiches verliert die Adresse auf solch eine Variable ihre Gültigkeit:
<syntaxhighlight lang="C">
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawlinep(struct point *start,struct point *end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start->x,start->y,end->x,end->y);
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Compound-Literal sind per Default keine Konstanten, können also zur Laufzeit geändert werden (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Const Type Qualifier|DatentypeSpecifier:Const Type Qualifier]]):
:<syntaxhighlight lang="C">
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweiften Klammern <code>{ }</code> sind nicht mit dem Block-Operator (siehe [[Programmieren in C/C++: Grundlagen#Block / Compound-Statement | Block / Compound-Statement]]) zu verwechseln. Werden die geschweiften Klammern bei der Initialisierung von Variablen genutzt, dann beschreibt der Inhalt der geschweiften Klammern eine Initialisierungsliste. Wird diesen ein Datentyp vorangestellt, dann wird hiermit eine Compound Literal definiert.
== Variableninitialisierung ==
Mit der Definition einer Variable kann diese optional initialisiert werden. Der tatsächliche Zeitpunkt der Variableninitialisierung (zur Laufzeit oder zur Compilezeit) und damit die Ausführung der Initialisierung (Maschinensprachebefehle oder Speichervorbelegung) hängt von der Gültigkeit/Sichtbarkeit der Variablen ab(siehe [[Programmieren in C/C++: Grundlagen#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]).
=== Globale + Static lokale Variablen ===
Globale und statisch globale Variablen werden in einem während der Laufzeit des Programms festen Speicherbereich gehalten. Zum Startzeitpunkt des Programms ist der Speicherplatz solch einer Variable mit dem Initialisierungswert gefüllt, so das bei erstmaliger Nutzung dieser Variablen diese ihre Initialisierungswerte enthalten. Die Belegung des Speicherplatzes erfolgt durch den Compiler, so dass als Initialisierungswerte / Inhalt der Initialisierungsliste nur Konstanten oder Konstanten-Ausdrücke (siehe [[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Literale/Konstanten]]) erlaubt sind:
<syntaxhighlight lang="C">
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
double sin(double); //DJ: Include-Anweisung in wikibooks schlägt fehlt
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
int main(int argc,char *argv[]) {
printf("%hd %hd %hd\n",array[0],array[1],array[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Nicht initialisierte globale und static lokale Variablen werden mit 0 initialisiert! D.h. die Speicherstellen dieser Variablen werden mit dem Wert 0 vorbelegt::
<syntaxhighlight lang="C">
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
int main(int argc,char *argv[]) {
printf("f=%d\n",f);
printf("%f %f %f\n",arr[0],arr[1],arr[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Lokale Variable ===
Der Speicherplatz für lokale Variable wird auf dem Stack zur Verfügung gestellt. Mit jedem öffnenden Block-Scope wird Speicher für die innerhalb dies Block-Scopes vorhandenen Variablen vom Stack nach dem LIFO Prinzip reserviert und mit der Variablendefinition Maschinencode zur Initialisierung der Speicherstellen ausgeführt (sofern Variable einen Initialisierungswert hat):
<syntaxhighlight lang="C">
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für int) und 8 Bytes (für double)
int var1=12; //erzeugt Maschinencode zur Initialisierung
//der ersten 4 Byte mit dem Wert 12
double var2=sin(f); //erzeugte Maschinencode, welche zunächst
//die Funktion sin() mit dem Übergabewert f
//aufruft und dessen Rückgabewert in die
//nächsten 8 Byte des reservierten Speichers
//kopiert
...
{ //siehe zuvor
int var3=var1; //siehe zuvor
double var4=var2+var1;
} //siehe nachfolgenden
} //Freigabe des zuvor reservierten Speichers
</syntaxhighlight>
Dies gilt auch für Funktionsaufrufe. Mit der öffnenden geschweiften Funktionsklammer wird ebenfalls Speicher reserviert:
<syntaxhighlight lang="C">
void foo(int par)
{ //Öffnende Funktionsklammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für (Übergabe)Variable par und 4 Bytes für Variable var
int var; //Da keine Initialisierung vorhanden ist wird auch
//kein Maschinencode zur Initialisierung ausgeführt
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Byte für Variable x
int x;
...
</syntaxhighlight>
Aufgrund der mit der Initialisierung bedingten Erzeugung von Maschinencode können die Initialisierungswerte/Inhalte der Initialisierungsliste bei lokalen Variablen aus beliebigen Ausdrücken bestehen und müssen keine Konstanten oder Konstanten Ausdrücke sein:
<syntaxhighlight lang="C">
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sin(f)}; //werden zur Laufzeit berechnet
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h> //fuer sinf()
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sinf(f)}; //werden zur Laufzeit berechnet
printf("%f\n",(double)summe);
printf("%f %f %f\n",(double)arr[0],(double)arr[1],(double)arr[2]);
}
int main(int argc,char *argv[]) {
foo(3,4);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dieser Maschinencode wird jedes Mal ausgeführt, wenn die dazugehörige Anweisung abgearbeitet wird und bedingt dementsprechend Rechenzeit. Zehnmaliges Ausführen einer Funktion oder zehnmaliges Öffnen eines Block-Scopes innerhalb einer For-Schleife führt zur zehnmaligen Ausführung der oben genannten Sachverhalte:
<syntaxhighlight lang="C">
void foo(int);
void var(void) {
for(int lauf=10; lauf>0; lauf--)
{ //zehnmaliges Reservieren von Speicher
int var=lauf*2; //zehnmalige Initialisierung
foo(var);
} //Freigabe des Speichers
}
void foo(int par) { //zehnmaliges Reservieren von Speicher
int var=12; //zehnmalige Initialisierung
} //Freigabe des Speichers
</syntaxhighlight>
Nicht initialisierte lokale Variablen werden nicht initialisiert, d.h. keine zusätzlichen Maschinenbefehle zum Initialisieren erzeugt. Der Variablenwert entspricht dann einem 'Zufallswert' oder korrekter gesagt dem Inhalt der Variablen, welcher zuvor der Speicherstelle zugewiesen war:
<syntaxhighlight lang="C">
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//und damit auch dessen zuletzt gültigen Wert
}
int main(int argc, char *argv[]) {
int var1=first(); //var1 beinhaltet Wert 7
int var2=second(); //var2 beinhaltet Wert 7
printf("var_foo=%d\n",var1);
printf("var_far=%d\n",var2);
return 0;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//(und damit auch dessen zuletzt gültigen Wert)
}
int main(int argc, char *argv[]) {
printf("%d\n",second()); //Zufallswert (0, da Stack mit 0 initialisiert ist)
printf("%d\n",first()); //Stack belegen
printf("%d\n",second()); //Zufallswert (7, da Speicherstelle zuvor mit 7
return 0; //belegt wurde)
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird eine Variableninitialisierung mit einer switch oder goto Anweisung übersprungen, so wird zwar die Variable angelegt (Speicherplatz reserviert), jedoch die Maschinenbefehle zur Initialisierung dieser Variablen nicht ausgeführt (siehe auch [[Programmieren in C/C++: Grundlagen# Switch-Anweisung|Switch-Anweisung]] und [[Programmieren in C/C++: Grundlagen# Label + Goto|Label + Goto]]). Die Variable enthält dann einen Zufallswert:
<syntaxhighlight lang="C">
switch(value) {
case 0:
int lok=7;
printf("%d",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(int value) {
switch(value) {
case 0:
int lok=7;
printf("%d\n",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d\n",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
}
void far(void) {
int var1=4711;
int var2=1799;
printf("Marke: %d, Erscheinungsjahr: %d\n",var1,var2);
}
int main(int argc,char *argv[]) {
foo(2); //Zufallswert (0, da Stack mit 0 initialisiert ist)
foo(0); //Initialisierungswert
far(); //Stack belegen
foo(2); //Zufallswert
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei erstmaligem Funktionsaufruf kann eine nicht initialisierten lokale Variablen den Wert 0 beinhalten (Stackframe wird mit Programmstart auf 0 gesetzt). Beim nächsten Aufruf der Funktion ist zumeist die Speicherstelle der lokalen Variablen mit anderen Werten gefüllt worden, so dass nun ein anderer 'Zufallswert' als 'Initialisierungswert' enthalten ist
=== C++ ===
In C++ ist ergänzend die Initialisierung einer Variablen über () möglich. Bei Objekten wird hierüber der zugehörige Konstruktor aufgerufen. Bei primitiven Datentypen entspricht der Wert in den Klammern dem Initialisierungswert:
<syntaxhighlight lang="C++">
int variable(10); //Bei primitiven Datentype entspricht dies
//int variable=10;
struct test {
int a;
test(int par) {a=par;} //Konstruktor der Struktur test
};
struct test test(4); //Konstruktor test(int par) wird aufgerufen
struct test test(4,5); //KO, kein passender Konstruktor vorhanden
</syntaxhighlight>
=== Sonstiges ===
Folgende weitere Sachverhalten gilt es bzgl. Variableninitialisierung zu berücksichtigen:
* Nach C-Spezifikation ist eine Initialisierung von Variablen nicht notwendig. Es liegt folglich kein Fehler vor, wenn auf eine nicht initialisierte Variable lesend zugegriffen wird. Ungeachtet der C-Spezifikation überprüft der Compiler mit dem Schalter '-Wall' diesen Sachverhalt und gibt eine Warning aus
* Deklarationen/Prototypen können keinen Initialisierungswert enthalten
<syntaxhighlight lang="C++">
extern int var=7; //Fehlerhaft
</syntaxhighlight>
* Const und lokale Static Variablen sollten initialisiert werden, auch wenn C in diesem Fall keinen Fehler meldet!
<syntaxhighlight lang="C++">
const int konstante; //Syntaktisch OK, Initialisierungswert fraglich!
static int statisch;
</syntaxhighlight>
== Anweisung (Statement) & Expression ==
Eine Anweisung (Statement) stellt entsprechend dem Wikipedia Artikel {{w|Anweisung_(Programmierung) | Anweisung}} ''"ein in der Syntax einer Programmiersprache formulierte einzelne Vorschrift dar, die im Rahmen der Abarbeitung des Programms auszuführen ist"''.</br>
Aus der Statement Spezifikation ergibt sich folglich, welche Bestandteile ein Programm beinhaltet kann. In der C-Spezifikation [C11 6.8] sind folgende Anweisungen definiert:
: labeled-statement: Eine Sprungmarke für die Switch- und die Goto-Anweisung
: compound-statement: siehe nachfolgendes Kapitel
: expression-statement: siehe nachfolgendes Kapitel
: selection-statement: Eine if() oder switch() Anweisung
: iteration-statement: Eine while(), do while() oder eine for() Anweisung
: jump-statement: Eine goto, break, continue oder return Anweisung
so dass ein Programmablauf wie folgt aussehen könnte:
<syntaxhighlight lang="C">
int main(int argc, char argv[]) {
int var; //declaration innerhalb eines compound-statements
label: //labeled-statement
var=var*2+1; //expression-statement
for(var=0;var<100;var++); //iteration-statement
if(var<0) //selection-statement
printf("var<0"); //espression-statement
{ int lok=var; lok++; } //compound-statement
goto label; //jump-statement
return 0;
}
</syntaxhighlight>
=== Ausdruck (Expression) ===
Entsprechend der C-Spezifikation [C11 6.5] ist ein Ausdruck eine Folge von Operatoren und Operanden, die die Berechnung eines Werts angibt, ein Objekt oder eine Funktion bezeichnet, Nebenwirkungen erzeugt oder eine Kombination davon ausführt. Die Wertberechnungen der Operanden eines Operators werden vor der Wertberechnung des Ergebnisses des Operators ausgeführt (siehe auch {{w|lang=en|Expression_(computer_science)|Expression}}).
Beispiele:
<syntaxhighlight lang="C">
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöung der globalen Variable a)
int func(int par) { a++; return par*2;}
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int a=0;
int func(int par) {
a++;
return par*2;
}
int main(int argc,char *argv[]) {
int a=4,b=7;
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöhung der globalen Variable a)
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ausdrücke entsprechen somit Rechenvorschriften, die ausgewertet werden. Ausdrücke sind in C/C++ überall dort erlaubt, wo ein Operand erwartet wird:
<syntaxhighlight lang="C">
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func3(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf()]) {}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
//Ausdruck innerhalb eines Funktionskopfes
int func1(int par) {
return 1;
}
int func2(void) {
return 1;
}
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf("func() called\n")])
{
printf("func() body\n");
}
int main(int argc,char *argv[]) {
int a=1;
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func1(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
func3(1,arr);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dies ist unter anderen ein Grund dafür, dass C/C++ als unleserlich gilt. Zur besseren Lesbarkeit eines Codes sollte dieses 'Feature' nur dann genutzt werden, wenn es zwingend notwendig ist.
=== Discarded Value / null statement ===
Alle Ausdrücke und nicht void-Funktionen haben einen Rückgabewert, der weiter verwendet werden kann:
<syntaxhighlight lang="C">
a+7 //Rückgabewert ist das Ergebnis der Addtion
printf("hallo") //printf() Funktion ist vom Typ int und gibt die Anzahl
//der ausgegebenen Zeichen zurück
a //gibt den Inhalt der Variablen zurück
7 //gibt den 'Inhalt' der Konstanten zurück
b=(a=7) //der Zuweisungsoperator gibt den Zuweisungswert zurück
</syntaxhighlight>
Der letzte Rückgabewert eines fasst jeden Ausdruckes wird somit nicht genutzt. Dies wird Discarded Value bezeichnet:
<syntaxhighlight lang="C">
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der einfachste Fall eines Discarded Values ist ein Leeranweisung / null statement, d.h. die Anweisung besteht nur aus einem Semikolon. Dies stellt eine syntaktisch korrekte Anweisung dar, die keine Auswirkung hat:
<syntaxhighlight lang="C">
; //Leeranweisung
</syntaxhighlight >
Überall wo statements/Anweisungen erwartet werden (bspw. bei einer for-Schleife, bei einer if-Anweisungen) kann anstatt einer statements eine Leeranweisung stehen, welche dementsprechend nichts ausführt:
<syntaxhighlight lang="C">
for(size_t idx=0; str[idx]!=0; idx++)
; //Leeranweisung
while(a++ < 100)
; //Leeranweisungen
</syntaxhighlight>
An einige Stellen bietet sich die Nutzung dieser Sachverhalte als vorteilhaft an. Oft führen diese Sachverhalten jedoch zu Ausführungsfehlern, da sie aufgrund des korrekten Syntax vom Compiler nicht als Fehler gemeldet werden und beim Suchen dementsprechend nur schwer zu finden sind! Ggf. gibt der Compiler für einige Sachverhalte eine Warnung aus, so dass es vorteilhaft ist, Compiler-Warnings zu beachten!
Hinweise:
* Soll bewusst der Rückgabewert verworfen werden, so kann/sollte mit dem explizten Cast auf (void) der Rückgabewert explizit 'verworfen' werden. Dies ist u.A. hilfreiche bei Variablen, die (noch) nicht benutzt werden und der Compiler die Warning "unsued Variable" ausgibt:
:<syntaxhighlight lang="C">
(void)a; //Zur Vermeidung von Compiler-Warnings "Unused Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(void) {
return 4711;
}
int main(int argc,char *argv[]) {
int a;
(void)a; //Zur Vermeidung von Compiler-Warnings "Unsued Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Mit der Anweisung <nowiki>[[nodiscard]]</nowiki> (ab C++17, ab C23) wird der Compiler angewiesen, dass der Aufrufer einer Funktion mit Rückgabewert der Rückgabewert entgegenzunehmen ist. Wird der Rückgabewert verworfen, so gibt der Compiler eine Fehlermeldung aus:
:<syntaxhighlight lang="C">
[[nodiscard]] int Client(int socket);
Client(5); ////Fehlermeldung, da Rückgabewert nicht verwendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
[[nodiscard]] int Client(int socket) {
return socket+1;
}
int Server(int socket) {
return socket+1;
}
int main(int argc,char *argv[]) {
Server(5); //keine Fehlermeldung
Client(5); //Fehlermeldung, da Rückgabewert nicht verwendet wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sequence Point ===
Ein Sequenzpunkt (u.A. das abschließende Semikolon am Ende der Anweisung) ist nach dem Wikipedia Artikel {{w|lang=en|Sequence_point|Sequence Point}} definiert als der Punkt in der Ausführung eines Computerprogramms, an dem garantiert ist, dass alle Nebenwirkungen früherer Bewertungen durchgeführt wurden und noch keine Nebenwirkungen von nachfolgenden Bewertungen durchgeführt wurden.</br>
Sequenzpunkte führen somit zur Trennung der Abarbeitungsreihenfolge innerhalb von Ausdrücken. Das abschließende Semikolon am Ende eines Ausdruckes sorgt somit dafür, dass zunächst der vorangegangene Ausdruck abgearbeitet wird, bevor der nächste Ausdruck beachtet wird.</br>
Beschreibt das Semikolon explizit einen Sequenzpunkt, so gibt es auch andere Operatoren, die einen Sequenzpunkt beinhalten. Bei solchen Operatoren wird somit zunächst vollständig der erste Teilausdruck ausgewertet, bevor der nächste folgt. Zwei Beispiele für Operatoren mit Sequenzpunkt sind das logische Und <code>&&</code> und der <code>?</code>-Operator:
<syntaxhighlight lang="C">
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(int par) {
return printf("func(%d) called\n",par);
}
int main(int argc,char *argv[]) {
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein weiteres Beispiel ist der Komma-Operator. Hier teilt das Komma den Gesamtausdruck in mehrere Teilausdrücke auf, die nacheinander abgearbeitet werden (siehe
[[Programmieren in C/C++: Grundlagen#Komma-Operator | Komma-Operator]]).
=== Abarbeitungsreihenfolge ===
Die Abarbeitungsreihenfolge der Operatoren innerhalb eines Ausdruckes wird durch die Prioritätenliste/Rangfolge (siehe [[C-Programmierung: _Liste_der_Operatoren_nach_Priorität| C-Programmierung:Liste der Operatoren nach Priorität]]) vorgegeben. Operatoren mit höherer Priorität werden vor Operatoren mit niedriger Priorität ausgeführt. Die ()-Klammer hat die höchste Priorität:
<syntaxhighlight lang="C">
//Der Ausdruck
c = sizeof(x) + ++a / 3;
//wird aufgrund der Prioritäten wie folgt ausgewertet:
c= (sizeof(x)) + ( (++a) / 3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=2;
int c;
int x=0;
c = sizeof(x) + ++a / 3;
printf("a=%d c=%d\n",a,c);
//Wird aufgrund der Prioritäten wie folgt ausgewertet:
a=2;
c= (sizeof(x)) + ( (++a) / 3);
printf("a=%d c=%d\n",a,c);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei identischer Priorität ergibt sich die Abarbeitungsreihenfolge aus der Assoziativität (L-R oder R-L):
<syntaxhighlight lang="C">
a=33 / 5 / 2;
//Wird aufgrund der L-R Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2;
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
a = b = c = d*2; //→ a=(b=(c=(d*2)));
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a;
a=33 / 5 / 2;
printf("a=%d\n",a);
//Wird aufgrund der Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2
printf("a=%d\n",a);
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
int b,c,d=8;
a = b = c = d*2; //→ a=(b=(c=(d*2)));
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
An einigen Stellen gibt die C/C++ Spezifikation die Abarbeitungsreihenfolge nicht vor (indeterminately-sequenced), überlässt diese somit dem Compiler:
* Bei Funktionsaufrufen ist die Abarbeitungsreihenfolge der Parameter nicht spezifiziert:
:<syntaxhighlight lang="C">
//Quelle: C-Spec Kap. 6.5.2.2
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int f1(void) {
printf("f1 called\n");
return 1;
}
int f2(void) {
printf("f2 called\n");
return 2;
}
int f3(void) {
printf("f3 called\n");
return 3;
}
int f4(void) {
printf("f4 called\n");
return 4;
}
void func1(int par1,int par2) {
printf("func1(%d,%d) called\n",par1,par2);
}
void func2(int par1,int par2) {
printf("func2(%d,%d) called\n",par1,par2);
}
int main(int argc,char *argv[]) {
//Quelle: C-Spec Kap. 6.5.2.2
void (*pf[2])(int,int)={func1,func2};
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Per Postinkrement/-dekrement Operator sagt aus, dass für die eigentliche Operation der Wert der Variablen genutzt wird und im Anschluss die Variable erhöht / erniedrigt werden soll. Nach C-Spezifikation [C11 6.5.2.4] muss dies spätestens vor dem nächsten Sequence Point erfolgt sein. Der genaue Zeitpunkt innerhalb des Sequence Points ist jedoch nicht vorgegeben:
:<syntaxhighlight lang="C">
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
printf("a=%d b=%d\n",a,b);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Initialisierungliste ist Abarbeitungsreihenfolge nicht spezifiziert:
<syntaxhighlight lang="C">
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
printf("var={a=%d b=%d c=%d}\n",var.a,var.b,var.c);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Compound-Statement ===
Ein Compound-Statement ist innerhalb der C-Spezifikation ein alternativer Ausdruck für ein block-scope. Dieser fasst mehrere Statements und Deklarationen zu einem Statement zusammen:
<code>
Syntax: {Declaration-or-statement-list/textsuperscript<sub>OPT</sub>}
</code>
Ein Block wird nicht wie bei einer Anweisung mit einem Semikolon abgeschlossen (Das angehängte Semikolon wäre dann eine separate leere Anweisung!).
Ein Block hat blockweite Sichtbarkeit (siehe [[Programmieren in C/C++: Grundlagen#Blockweite Sichtbarkeit | Blockweite Sichtbarkeit]]), , so dass hier definierte Variablen nur hier gültig sind. Deklarationen sind ebenfalls nur in dem Block gültig:
<syntaxhighlight lang="C">
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Verwendung findet das Compound-Statement a) als Strukturierungsmöglichkeit innerhalb von Funktionen (zur Darstellung, dass dieser Bereich 'zusammengehörig' ist) und b) an den Stellen, an denen C/C++ nur eine Anweisung erwartet. Dies sind bspw. die If- und die For-Anweisungen:
<syntaxhighlight lang="C">
for(..) Anweisung; //For-Schleife führt nur diese eine Anweisung aus
for(…) {Block} //For-Schleife führt Block (als eine Anweisung) aus
if(..) Anweisung; else Anweisung; //IF-Anweisung führt nur 'eine'
//Anweisung aus
if(..) {Block} else {Block} //IF-Anweisung führt Block aus
if( ) {Block}; else {Block}; //Semikolon ist eine separate
//Leer-Anweisung, so dass else
//nicht zur IF-Anweisung zugeordnet
//werden kann (2 Anweisungen vor Else)</syntaxhighlight>
=== Embedded Statement ===
Embedded Statements sind eine GNU-C Erweiterung (siehe [https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html GNU-C-Manual 3.18]). Da diese vom Autor als sehr nützlich angesehen und auch von diversen Compilern und auch in C++ unterstützt werden, werden diese nachfolgend beschrieben.
Ein Compound-Statement fasst mehrere Anweisungen zu einer Anweisung zusammen, hat jedoch kein Rückgabewert. Ein Embedded-Statement entspricht einem Compound-Statement mit der Ergänzung, dass dieser einen Rückgabewert hat, so dass ein Embedded-Statement überall dort eingesetzt werden kann, wo eine Operand erwartet wird.
<code>
Syntax: ({Declaration-or-statement-list<sub>OPT</sub>})
</code>
Der Rückgabewert (und Datentyp) wird nicht über eine return-Anweisung angegeben, sondern entstammt aus dem Rückgabewert der letzten Anweisung innerhalb der Liste:
<syntaxhighlight lang="C">
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
printf("var=%d\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein Embedded-Statement ähnelt folglich einem Funktionsaufruf mit dem Unterschied, dass a) in der Tat kein Funktionsaufruf stattfindet und b) der Rückgabewert nicht mit return, sondern über die letzte Anweisung zurückgegeben wird. Der Anwendungsfall ist dort zu finden, wo eine Operand erwartet wird und mehrere Anweisungen zum Ermitteln des Operanden notwendig sind:
<syntaxhighlight lang="C">
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
printf("Bedingung erfüllt");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Ein Embedded-Statement ist insbesondere bei Nutzung von Makros (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]) hilfreich
* Mittels eines Embedded-Statement kann eine anonyme Funktion/Lambdafunktion dargestellt werden:
<syntaxhighlight lang="C">
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {return a%2?a:0;} ; func;})
,arr);
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {printf("Called:%d\n",a);return a%2?a:0;} ; func;})
,arr);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Funktionen / Prozeduren ==
Funktionen/Prozeduren sind ein Strukturierungsmerkmal, so dass Teile der Funktionalität des Programmes wiederverwendbar sind. C/C++ unterscheidet nicht zwischen Funktionen (haben einen Rückgabewert, können damit als Operand in Ausdrücken verwendet werden) und Prozeduren (haben keine Rückgabewert, resp. Rückgabetyp void). <br/>
Mit jedem Aufruf einer Funktion wird für den zugehörigen Block ein eigener Stack-Kontext angelegt, so dass Funktionen sich selbst aufrufen können (Rekursion). Jeder Funktionsinstanz hat somit seinen eigenen lokalen Variablenbereich, teilen sich jedoch die globalen und die statisch lokalen Variablen.<br />
Mit dem Aufruf einer Funktion können Parameter übergeben werden, wobei die Übergabeparameter vom Aufrufer (Caller) durch den Aufruf in die lokalen Variablen des Aufgerufenen (Callee) kopiert/zugewiesen werden (Call by Value). Wird ein Zeiger übergeben, hat der Callee über die Dereferenzierung des Zeigers die Möglichkeit, die Variablen des Caller zu verändern (Call by Reference) (siehe Kap. [[Programmieren in C/C++: Zeiger #Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen).]]).
Hinweise:
* Die Klammerung hinter dem Funktionsnamen (<code>foo()</code>) zeigt an, dass es sich um einen Funktionsaufruf (Verzweigung der Programmausführung zu der Startadresse der Funktion) handelt:
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
foo(); //Klammern hinter dem Funktionsnamen bedeuten Aufruf der Funktion
</syntaxhighlight>
* Die Nutzung des Funktionsnamens ohne Klammerung (<code>foo</code>) gibt die Startadresse der Funktion zurück. Die Startadresse kann in einem Zeiger auf Funktionen gespeichert werden (siehe Kap. [[Programmieren in C/C++: Zeiger#Zeiger auf Funktionen | Zeiger:Zeiger auf Funktionen]]):
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
printf("foo called");
};
int main(int argc, char *argv[]) {
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
fptr(); //Aufruf der Funktion
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklaration/Definition vor dem ersten Aufruf der Funktion 'notwendig', damit Compiler die Übergabeparameter entsprechend bereitstellt und ggf. eine implizite Typkonvertierung durchführt (dito Rückgabewert). Die Angabe der Variablennamen können bei der Deklaration entfallen
* Die fehlende Angabe der Übergabeparameter bedeutet in C (bis einschl. C18), dass diese Funktion mit beliebigen Übergabeparametern aufgerufen werden kann und der Compiler keine Typprüfung durchführt:
:<syntaxhighlight lang="C">
int func(/*Keine Übergabeparameter angegeben*/) {...}
//kann wie folgt aufgerufen werden
func();
func(4);
func("hallo Welt",4.7);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func() {
printf("foo called\n");
};
int main(int argc, char *argv[]) {
func();
func(4);
func("hallo Welt",4.7);
//Ab C23 hat sich die Bedeutung geändert.
//Zum Testen C-Versionsvorgabe -sdc=xxx unter Compiler-options aendern
return 0;
} | execCompilerOptions=-Wall -std=c17|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:→ unbedingt vermeiden<br />
:Hat die Funktion keinen Übergabewert, so wird dies in C mit void gekennzeichnet
* In C++ bedeutet die Schreibweise ohne Datentypbeschreibung, dass keine Parameter erwartet werden
* In der Parameterliste von Funktionen dient in der GNU-C Spezifikation das Semikolon zum Trennen zwischen Deklaration von Übergabeparameter und den Übergabeparametern. Alle Übergabewerte links vom Semikolon sind (Forward)deklarationen:
:<syntaxhighlight lang="C">
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Aufruf
test1(3,7); //a=7 b=3
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim);
//Aufruf
test2("hallo",6);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim) {
printf("dim=%d\n",dim);
}
int main(int argc, char *argv[]) {
//Aufrufe
test1(3,7); //a=7 b=3
test2("hallo",6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Return-Anweisung ===
Mit der Return-Anweisung wird eine Funktion (vorzeitig) beendet. Der optionale Parameter dient der Angabe des Rückgabewertes der Funktion an den Aufrufer. Der Datentyp des Parameters ergibt sich aus dem Rückgabedatentyp der Funktion.
<code>
Syntax: return expression<sub>OPT</sub>
</code>
Der Rückgabewert expresion sagt aus, dass hier nicht nur Konstanten oder Variablen stehen können, sondern ein komplexer Ausdrücke erlaubt ist. Der resultierende Datentyp des Ausdruckes sollte dem Rückgabedatentyp der Funktion entsprechen, andernfalls wird eine implizite Typkonvertierung vollzogen (sofern möglich):<syntaxhighlight lang="C">
int foo(double a, double b) {
return (int)(a*a+b*b);
}
</syntaxhighlight>
Hinweise:
* Bei nicht void-Funktionen ist eine return-Anweisung mit einer Expression entsprechend dem Datentyp der Funktion zwingend notwendig:
:<syntaxhighlight lang="C">
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
double a=func(); //int wird in double konvertiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
int main(int argc, char *argv[]) {
double a=func(); //int wird in double konvertiert
printf("a=%f\n",a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei einer void-Funktion ist die return-Anweisung ohne Expression optional. Hier entspricht der schließende Block der Return-Anweisung
:<syntaxhighlight lang="C">
void func(char *str) {
if(str==NULL)
return;
printf("%s",str);
}
</syntaxhighlight>
Sollen mehr als ein Rückgabewert an den Aufrufer zurückgegeben werden so empfiehlt sich:
* die Rückgabewerte in einer Struktur zu packen (siehe [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++) |Datentypen:Verbundtyp Struktur/Klasse (nur C++)]])
* die Rückgabewerte über die Aufrufparameter als Call-by-Reference zu übergeben (siehe [[Programmieren in C/C++: Zeiger#Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen]])
==== Rückgabewert aus Datentypsicht ====
Aus Datentypsicht kann der Funktionsname inkl. den Parameter(n) in einem Ausdruck mit dem Datentyp des Rückgabewertes der Funktion ausgetauscht werden:
<syntaxhighlight lang="C">
int foo(void) {return 4711;}
int var;
var=1+foo(); //Aus Datentypsicht (int)=(int)+(int)
</syntaxhighlight>
Daraus ergibt sich, dass bei Arrays/Strukturen/Unions direkt auf einzelne Komponenten zugegriffen werden kann, ohne diese zuvor einer Variablen zuzuweisen:
<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
if(foo(12).x == 12) printf("Identisch\n");
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
if(far(3)[2] == 2) printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <stdlib.h>
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
int main(int argc, char *argv[]) {
if(foo(12).x == 12)
printf("Identisch\n");
if(far(3)[2] == 2)
printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
==== Fehlerrückgabe ====
Viele Funktionen können unter gewissen Umständen nicht korrekt ausgeführt werden. Z.B. aufgrund dessen, dass:
* der benötigter Speicher vom Heap nicht bereitgestellt werden kann
* Übergabeparameter außerhalb des zulässigen Wertebereiches liegen
* angeforderte Ressource (Datei, Geräte, …) nicht vorhanden/verfügbar sind
Solche Fälle gilt es dem Aufrufer mitzuteilen, da in diesen Fällen die vom Aufrufer geforderte Funktionalität nicht erfüllt ist und der Aufrufer ggf. nicht weiterarbeiten kann. Zur Mitteilung des Fehlers sollte vorrangig der Rückgabewerte genutzt werden. (auch wenn in C++ mit Exception eine Alternative hierzu bereitsteht)
<syntaxhighlight lang="C">
char *strdup(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup1(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
int main(int argc, char *argv[]) {
char *dup=strdup1("hallo");
if(dup == NULL)
printf("Fehler\n");
else
printf("dup='%s'\n",dup);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Standard-C Library-Funktionen geben in diesem Fall zumeist ein -1 (Rückgabewert Ganzzahl) oder einen NULL-Zeiger (Rückgabewert Zeiger) zurück. Der genaue Fehlergrund ist dann ergänzend in der globalen Variablen errno gespeichert. Mittels der Standard-C Funktion strerror() kann die Zahl in einen für den Anwender/Programmierer lesbaren String umgewandelt werden (die GNU-C Library Funktion printf() bietet ergänzend den Conversion Spezifier %m als alternative Ausgabemöglichkeit an):
<syntaxhighlight lang="C">
#include <errno.h>
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY|O_CREAT|O_EXCL,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY{{!}}O_CREAT{{!}}O_EXCL,
S_IRUSR{{!}}S_IWUSR{{!}}S_IRGRP{{!}}S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'''Für eine sauber Programmierung sollte diese Methodik generell angewendet werden.''' Jede Funktion, welche Fehlschlagen kann, teilt dies per Rückgabewert dem Aufrufer mit. Der Rückgabewert einer jeden Funktion wird vom Aufrufer kontrolliert.
=== Main-Funktion ===
Mit Start der Anwendung übergibt das Betriebssystem die Kontrolle an die Anwendung und führt dort die Funktion main aus. Als Übergabe- und Rückgabeparameter sind folgende Varianten erlaubt:
<syntaxhighlight lang="C">
int main(void) { }
int main(int argc, char *argv[]) { }
</syntaxhighlight>
Mit dem Start der Anwendung kann, wie bei jedem Funktionsaufruf, Parameter an den startenden Prozess übergeben werden. Die Parameter werden als Array von Strings übergeben. Im Parameter argc ist die Anzahl der Strings enthalten. Im Parameter argv[0..argc-1] sind die einzelnen Strings enthalten. Sofern vorhanden ist im ersten String der Programmname/Aufrufname der Anwendung enthalten:
<syntaxhighlight lang="C">
int main(int argc, char *argv[]) {
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++)
printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int max_width=0;
int ret;
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++) {
ret=printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
max_width=ret>max_width ? ret : max_width;
}
//Trennzeichen drucken
char term[max_width];
memset(term,'-',max_width);
printf("%.*s\n",max_width-1,term);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Im Compiler-Explorer können die Parameter im Executor unter 'Execution Arguments', getrennt mit Leerzeichen eingegeben werden.
Wird die Funktion main beendet, entweder über die return Anweisung oder den Aufruf der exit() Funktion, wird die Kontrolle zurück an den startenden Prozess (zumeist Shell) gegeben. Über den Rückgabewert wird im Allgemeinen dem Aufrufer der Fehlerstatus mitgeteilt (EXIT_SUCCESS oder 0 bedeutet fehlerfreie , EXIT_FAILURE oder Werte ungleich 0 fehlerhafte Ausführung).
Hinweise:
* Der Return-Wert der main-Funktion kann mit >>echo $? in der Bash abgefragt werden
* Mittels <code>exit(int status)</code> kann das Programm an jeder Stelle innerhalb des Programms beendet werden. <code>status</code> entspricht dann der expression der return Anweisung von main()
* Ungeachtet des Rückgabedatentyps int bei der Defintion der main() Funktion beträgt der zulässige Wertebereich für Linux Anwendungen 0..255. Der korrekte Rückgabedatentyp der main() Funktion müsste somit 'unsigned char' lauten
=== Inline Funktion ===
Wie der Name inline andeutet, ist die Intention von Inline, dass die aufgerufen Funktion Bestandteil der aufrufenden Funktion ist. Die aufgerufene Funktion soll somit im Kontext des Aufrufers ausgeführt werden, so dass kein eigener Stack bereitgestellt werden muss. Der Start der Funktion kann somit schneller erfolgen:
<code>
inline int foo(void) { }
</code>
Das Funktionseinbindung/zusammenführung erfolgt durch den Compiler (und nicht durch den Linker). Damit das inline vom Compiler ausgeführt werden kann, muss die zu inlinende Funktion vor dem Aufruf definiert sein, d.h. sie muss in derselben C-Datei oder in einer der einzubindenden Header-Dateien enthalten sein [C11 6.7.4].
Hinweis:
* Das 'inlinen' von Funktionen über die eigene Objektdatei hinweg erfolgt in C/C++ über Link Time Optimization (LTO). Hierzu fügt der Compiler den Zwischencode mit in die Objektdatei, so dass der Linker das 'inlinen' vollziehen kann (siehe {{w|lang=en|Interprocedural_optimization| Interprocedural Optimization}})
=== Variadic Function / Ellipsis Punctuator ===
Mit dem Ellipsis Puncturator '…' kann in Funktionsdefinitionen angegebenen werden, dass an dieser Stelle beliebig viele Parameter/Argumente übergeben werden können. Dies wird unter anderen in der printf() Anweisung genutzt:
<syntaxhighlight lang="C">
int printf(const char *fmt, ... );
</syntaxhighlight>
Die wie folgt aufgerufen werden kann:
<syntaxhighlight lang="C">
printf("Hello World"); //es folgt kein Parameter
printf("%d",100); //es folgt ein Parameter vom Datentyp int
printf("%f",1.1); //es folgt ein Parameter vom Datentyp double
printf(conststr,1,2,3,"xyz") //Ohne Worte
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n"); //es folgt kein Parameter
printf("%d\n",100); //es folgt ein Parameter vom Datentyp int
printf("%f\n",1.1); //es folgt ein Parameter vom Datentyp double
const char *conststr="%d %x %c '%s'\n";
printf(conststr,1,2,33,"xyz"); //Ohne Worte
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei der Parameterübergabe wird der Datentyp nicht mit übergeben, so dass die aufgerufene Funktion keine Möglichkeit hat, den Datentype der Parameter zur Laufzeit zu ermitteln. Einzig werden bei Aufruf der variadischen Funktion so viel Bytes auf den Stack gelegt, wie der Datentyp der einzelnen Übergabeparameter groß ist:
:<code>int --> 4 Byte</code>
:<code>double --> 8 Bytes</code>
:<code>Zeiger --> 4/8 Byte</code>
Damit die aufgerufene Funktion die fehlende Datentypinformation dennoch mitgeteilt bekommt, erfolgt dies am Beispiel der printf Funktion über den Format-String:
<syntaxhighlight lang="C">
int vari;
printf("%d",vari); //%d erwartet einen Integer Übergabeparameter (4-Byte)
size_t vars;
printf(" %zu %d ", vars, vari); // %zu zur Mitteilung, dass anstatt
//integer nun size_t als Datentyp übergeben wird
//und somit anstatt 4 Bytes 8 Bytes vom Stack genommen werden
</syntaxhighlight>
<code>printf()</code> entnimmt entsprechend der Datentypbeschreibung im Formatstring die passende Anzahl an Bytes vom Stack.
Da der Compiler für die optionalen Parameter nicht den Zieldatentyp kennt, erlaubt die C-Spezifikation als Übergabedatentypen hier nur die Grunddatentypen <code>signed int, unsigned int, long, long long, double</code> und <code>Zeiger</code>. Entspricht der übergebene Parameter nicht einen dieser Datentypen, so wird er mittels implizit Cast entsprechend nachfolgender Tabelle gewandelt [C11 6.5.2.2 Default Argument Promotions]:
{| class="wikitable"
|-
! Ausgangstyp !! Umwandlungstyp
|-
| char, signed char, short || int
|-
| unsigned char, unsigned short || unsigned int
|-
| float || double
|-
| Alle anderen Datentypen || bleiben erhalten
|}
Bspw.:
<syntaxhighlight lang="C">
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Über den Length-Modifier Parameter im Formatstring kann printf mitgeteilt
//werden, dass von dem übergebenem Integerwert weniger Bytes zu
//interpretieren sind
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
Zum Umgang mit dem variadischen Parameter stellt C die Funktionen <code>va_start(), va_arg(), va_copy()</code> und <code>va_end()</code> bereit. Auf Grundlage des dazugehörigen Datentyps <code>va_list</code> können variadische Parameter auch an Unterfunktionen weitergereicht werden (bspw vprintf()). Dieses Thema bedingt jedoch genaue Kenntnisse vom Umgang mit dem Stack und ist nicht Bestandteil dieser Vorlesung.
=== Funktion in Funktion ===
Die GNU-C Reference (nicht C++) erlaubt es, Funktionen innerhalb von Blöcken (und damit innerhalb von Funktionen) zu definieren. Diese innere Funktion steht dann nur in diesem Block zur Verfügung und kann von außerhalb des Blockes nicht aufgerufen werden. Als Gimmick können Funktionen in Funktionen auf die zuvor definierten lokalen Variablen der inkludierenden Funktion zugreifen:
<syntaxhighlight lang="C">
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Variable Length Array (VLA) ==
Im Normalfall ergibt sich die Anzahl der Elemente eines Arrays aus einer Konstanten, so dass der Compiler zur Compilezeit passend Speicher reserviert (siehe Kap. [[Programmieren in C/C++: Array | Array]]):
<syntaxhighlight lang="C">
int arr[4]; //Compiler reserviert für Variable arr
//4*sizeof(int) Speicherplatz
</syntaxhighlight>
Bei Variable Lenght Array wird die Arraydimension nicht über eine Konstante, sondern über eine Variable oder einen Ausdruck angegeben. D.h. die tatsächliche Dimension des Arrays ergibt sich erst zum Ausführungszeitpunkt der Definition:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //Arraydimension ergibt sich zum Ausführungszeitpunkt
n++; //Nachträgliches Ändern von n ändert nicht
//die Größe des Arrays!
}
</syntaxhighlight>
Ein Variable Length Array kann nur als lokale Variable oder als Übergabeparameter definiert werden (wobei im letzteren Fall kein Speicher hiermit reserviert wird). Eine Initialisierung eines VLA's mit der Definition ist nicht möglich, d.h. nach der Definition beinhaltet das Array 'zufällige' Werte. Es empfiehlt sich daher, diese bspw. mit memset händisch zu initialisieren (siehe auch Kap [[Programmieren in C/C++: Array#Initialisierung | Array:Initialisierung]]):
<syntaxhighlight lang="C">
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
for(size_t lauf=0;lauf<n;lauf++)
printf("str[%zu]=%d\n",lauf,str[lauf]);
}
int main(int argc, char *argv[]) {
foo(4);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mittels sizeof kann weiterhin der Speicherbedarf ermittelt werden, wobei sizeof mit einem VLA als Argument kein Konstantenausdruck ist. Stattdessen wird die Größe zur Laufzeit ermittelt:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
printf("size=%zu\n",size);
}
int main(int argc, char *argv[]) {
foo(5);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
VLA wurden erstmals in C mit C99 eingeführt. In C11 wurden VLA's als optional eingestuft und mit C23 zurück auf notwendig gesetzt. In C++ sind VLA's nicht definiert, werden jedoch vom GCC Compiler unterstützt. Als alternativen Datentyp wird hier std::array empfohlen.
Hinweis:
* VLA sind nicht direkt in einem Switch-Case Block definierbar. Wird hier ein VLA benötigt, so muss hierzu ein Block erzeugt werden:
:<syntaxhighlight lang="C">
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int value=argc;
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Operatoren ==
In der Programmiersprache C sind folgende Punctuators [C11 6.4.6] definiert:
<syntaxhighlight>
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |= , # ##
<: :> <% %> %: %:%:
</syntaxhighlight>
Die Funktionalitäten sind identisch zu Java. Aufgrund des Datentyps Zeiger gibt es in C ergänzend den Punctuator <code>-></code> (siehe Kap [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++)|Datentypen:Verbundtyp Struktur/Klasse (nur C++)]]). Der Präprozessor bedingt die beiden Punctuatoren <code>#</code> und <code>##</code> (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]).
Die letzten 6 Punctuators <code><: :> <% %> %: %:%:</code> werden zu <code>[ ] { } # ##</code> ersetzt. Sie sind für Computersysteme gedacht, welche keine ALTGR-Taste besitzen.<br />
Java kennt ergänzend den <code>>>></code> Operatoren, welcher in C über den normalen Schiebebefehl und den zugrundeliegenden Datentyp gesteuert wird.
Wie in Java sind einige Punctuators vom Kontext abhängig und haben damit unterschiedliche Funktionalitäten:
<syntaxhighlight>
++ → (Postfix) ++ vs. ++(Präfix)
-- → (Postfix) -- vs. --(Präfix)
+/- → Vorzeichen vs. Addition/Subtraktion
() → Funktionsaufruf() vs. Befehlsbestandteil if() vs. Priorisierung
</syntaxhighlight>
Für den Umgang mit dem Datentyp Zeiger besitzen einige Punctuatoren ergänzende Funktionalitäten (siehe Kap [[Programmieren in C/C++: Zeiger| Zeiger]]):
<syntaxhighlight>
& → Bitweises UND:
Anwendung: Ganzahlausdruck & Ganzahlausdruck
& → Adressoperator:
Anwendung: &Variable
* → Multiplikation
Anwendung: Ganzahl-/Gleitkommaausdruck * Ganzahl-/Gleitkommaausdruck
* → Datentyp Zeiger
Anwendung: Datentyp * Variablenname;
* → Dereferenzierung:
Anwendung: * Zeiger
</syntaxhighlight>
Punctuatoren, welche von Java abweichende / ergänzende Funktionalitäten haben, werden nachfolgend gesondert beschrieben.
Sind in einer Anweisung mehrere Operatoren enthalten, so hängt die Abarbeitungsreihenfolge von der Rangfolge/Priorität der Operatoren ab (siehe [[Programmieren in C/C++: Grundlagen#Abarbeitungsreihenfolge | Abarbeitungsreihenfolge]]).<br />
Die Rangfolge ist identisch zu Java, wobei C mehr Operatoren kennt. Generell empfiehlt sich, lieber eine Klammer zu viel als zu wenig zusetzen. Klammern haben die höchste Priorität.
=== Zuweisungs-Operator ===
Die Zuweisung ('='-Operator, assignment expression) weist dem L-Value den R-Value zu.
Der Zuweisungs-Operator gibt den L-Value als Rückgabewert der Zuweisung zurück, so dass mehrere Zuweisungen in einem Ausdruck möglich sind. Die Abarbeitungsreihenfolge ist von rechts nach links (R-L Assoziativität). Wird der 'letzte' Rückgabewert nicht verwendet, so wird dieser verworfen (siehe Kap. [[Programmieren in C/C++: Grundlagen#Discarded Value / null statement | Discarded Value / null statement]]).<br />
Beispiel:
<syntaxhighlight lang="C">
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
//der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
//Compilerfehler geworfen wird
x*=y=z //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a,b,c=3,d=4;
int x,y,z;
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
; //der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
; //Compilerfehler geworfen wird
x*=y=z; //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen return 0;
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Auf beiden Seiten der Zuweisung muss der identische Datentyp stehen. Wenn andernfalls eine implizite Typkonvertierung nicht möglich ist, gibt der Compiler einen Fehler aus:
:<syntaxhighlight lang="C">
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
(void)b;
(void)c;
(void)d;
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
* Bei der Parameterübergabe beim Funktionsaufruf wird ebenfalls indirekt der Zuweisungs-Operator angewendet. Die Parameter des Aufrufers werden per Zuweisung den lokalen Variablen der aufgerufenen Funktion zugewiesen
:<syntaxhighlight lang="C">
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int main(int argc, char *argv[]) {
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
=== Komma-Operator ===
Der Komma-Operator erlaubt es, zwei Ausdrücke auszuführen, wo nur einer erlaubt wäre. Die Ergebnisse/Rückgabewerte aller durch diesen Operator verknüpften Ausdrücke, außer dem letzten werden verworfen. Der letzte Ausdruck dient als Rückgabewert.
Folgendes gilt es bei der Nutzung des Komma-Operators zu beachten:
* Der Komma-Operator wird von links nach rechts ausgewertet (L-R Assoziativität)
* Das Komma selbst stellt eine Sequence Point dar (siehe Kap [[Programmieren in C/C++: Grundlagen#Sequence Point|Sequence Point]])
* An Stellen, wo das Komma zum Syntax gehört (z.B. Trennung der Übergabeparameter bei der Funktionsdefinition und beim Funktionsaufruf, Trennung von Variablen bei der Variablendefinition/-deklaration, Trennung der enum Konstanten) muss der Ausdruck ergänzend geklammert werden, wenn der Komma-Operator gefordert ist
* Der Komma-Operator hat von allen Operatoren die niedrigste Priorität/Rangfolge, so dass dieser Operator als letztes 'ausgewertet' wird
Beispiel:
<syntaxhighlight lang="C">
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
int c=1,d=2,e=3;
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
void func(int value){}
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int value){
printf("func called with %d\n",value);
}
int main(int argc, char *argv[]) {
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
printf("a=%d\n",a);
int c=1,d=2,e=3;
printf("c=%d,d=%d,e=%d\n",c,d,e);
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
printf("c=%d,f=%d\n",c,f);
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'Sinnvolle' Anwendungsbeispiele:
* Bei For-Schleifen, so dass mehrere Variablen initialisiert und mehrere Variablen mit jedem Schleifendurchlauf geändert werden können:
:<syntaxhighlight lang="C">
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf]);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf])
printf("sum=%d lauf=%d\n",sum,lauf);
printf("sum=%d\n",sum);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der Return-Anweisung, bei welcher zur Darstellung der Zusammengehörigkeit mehrere Aktionen ausgeführt werden sollen:
:<syntaxhighlight lang="C">
return errno=EINVAL,-1;
return printf("Fehler"),-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <errno.h>
int foo(void) {
return errno=EINVAL,-1;
}
int far(void) {
return printf("Fehler\n"),-1;
}
int main(int argc, char *argv[]) {
printf("foo()=%d\n",foo());
printf("far()=%d\n",far());
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* An Stellen, wo nur eine Anweisung erlaubt ist (und man zu faul ist, einen Block zu öffnen)
:<syntaxhighlight lang="C">
if(…) y=2,z=3;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int y=0,z=0;
if(1) y=2,z=3;
printf("y=%d z=%d\n",y,z);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In vielen Ländern wird das Komma zur Darstellung von Gleitkommazahlen genutzt. Wird versehentlicher Weise dies in C/C++ übernommen, so führt dies zu einem unerwarteten Verhalten:
:<syntaxhighlight lang="C">
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
printf("var=%f\n",var);
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
printf("var=%f\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== ?-Operator / Conditional-Operator ===
Operator mit 3 Operanden, welcher in Abhängigkeit des ersten Ausdruckes den zweiten oder dritten Ausdruck ausführt und dessen Rückgabewert zurückgibt.
<code>
Syntax: Logical-OR-expression ? expression : condition-expression
</code>
Entspricht der if()-Anweisung, wobei der ?-Operator als solches einen Wert zurückgibt! <code>Expression</code> wird nur ausgeführt, wenn <code>Logical-OR-Expression</code> zu true ausgewertet wird. Andernfalls wird <code>condition-expression</code> ausgeführt. Der zurückgegebene Datentyp ergibt sich aus der <code>expression</code> resp. <code>condition-expression</code>. '''Beide Ausdrücke sollten somit einen identischen resultierenden Datentyp besitzen!'''
Folgendes gilt es bei der Nutzung des ?-Operators zu beachten:
* Der Datentyp <code>expression</code> und <code>condition-expression</code> sollte identisch sein:
<syntaxhighlight lang="C">
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Nach der GNU-C Reference kann der mittlere Ausdruck fehlen. In diesem Fall wird stattdessen das Ergebnis des linken Operanden dort eingesetzt (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)
<syntaxhighlight lang="C">
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
printf("b=%d\n",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* In der Abarbeitungsreihenfolge liegt der ?-Operator oberhalb der Komma- und des Zuweisungsoperators. Soll im <code>condition-expresion</code> Ausdruck der Komma- oder Zuweisung-Operator genutzt werden, so ist <code>condition-expression</code> zu klammern. Andernfalls bedingt die niedrige Priorität des Komma-Operators ein anders Verhalten, als erwartet:
<syntaxhighlight lang="C">
int a=7,max=5,var;
max=a>max ? a : max; //Alles bestens
var= a>5 ? a++,5:6; //Alles bestens
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=7;
int max=5;
max=a>max ? a : max; //Alles bestens
printf("max=%d\n",max);
int var;
var= a>5 ? a++,5:6; //Alles bestens
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
printf("var=%d a=%d\n",var,a);
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
printf("var=%d a=%d\n",var,a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Nutzung des ?-Operators empfiehlt sich an diversen Stellen:
* Bei Makros:
:<syntaxhighlight lang="C">
#define MAX(a,b) (a>b?a:b)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
int main(int argc, char *argv[]) {
printf("MAX(4,5)=%d\n",MAX(4,5));
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Beim Fehlerhandling:
:<syntaxhighlight lang="C">
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion ausgeführt wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn ret==0 ist
//andernfalls wird ret zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 0;
}
int init2(void) {
printf("init2() called\n");
return 0;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn Ret==0 ist
//andernfalls wird Ret zurückgegeben
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Logische Verknüpfungen ===
Alle logischen Operationen nutzen als Operanden Ganzzahlen ,Gleitkommazahlen oder Zeiger. Der Operand wird als false angesehen, wenn der Operand 0, 0.0 oder NULL ist. Andernfalls als true. Das Ergebnis ist immer vom Datentyp int und hat den Wert von 0 oder 1.
<code>Syntax: Expression && Expression</code><br />
<code>Syntax: Expression || Expression</code><br />
<code>Syntax: ! Expression</code><br/>
Bei der logischen UND und ODER Verknüpfung wird zuerst der linke Ausdruck ausgewertet (Operator ist ein Sequence Point). Der rechte Ausdruck wird nur ausgeführt, wenn:
* bei der logischen UND Verknüpfung der linke Ausdruck TRUE ergab
* bei der logische OR Verknüpfung der linke Ausdruck FALSE ergab
Andernfalls steht das Ergebnis schon mit der Auswertung des linken Operanden fest.<br />
In der theoretischen Informatik wird dies 'Non-strict-evaluation' genannt, bei welcher der Rückgabewert feststeht, bevor alle Ausdrücke bearbeitet worden sind.
Beispiel für das Verhalten des Ausbleibens der Auswertung des zweiten Operators:
<syntaxhighlight lang="C">
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a || ++a)
b=1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a {{!}}{{!}} ++a)
b=1;
printf("a=%d b=%d\n",a,b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Diese Funktionalität ist insbesondere beim Umgang mit Fehlern vorteilhaft:
* Prüfen, ob eine Variable einen gültigen Wert hat, bevor sie weiterverwendet wird
<syntaxhighlight lang="C">
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
else
printf("Kein Substring im String gefunden\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion aufgerufen wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 1;
}
int init2(void) {
printf("init1() called\n");
return 1;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Bitweise Verknüpfungen ===
Alle bitweisen Operationen nutzen als Operanden Ganzzahlen. Bei vorzeichenbehafteten Zahlen ist das Ergebnis nach [C11 6.5] Implementierungsabhängig, wobei das Vorzeichenbit zumeist als eigenständiges Bit angesehen wird und bei UND/ODER/EXOR als normales BIT betrachtet wird.
<code>Syntax: Ganzzahl & Ganzzahl → Bitweise UND Operation</code><br />
<code>Syntax: Ganzzahl | Ganzzahl → Bitweise ODER Operation</code><br />
<code>Syntax: Ganzzahl ^ Ganzzahl → Bitweise EXOR Operation</code><br />
<code>Syntax: ~ Ganzzahl → Bitweise Negierung</code><br />
<code>Syntax: Ganzzahl >> additive-expression</code><br />
<code>Syntax: Ganzzahl << additive-expression</code><br />
Mittels des Schiebeoperators können '''Ganzzahlen''' um <code>additive-expression</code> bitweise nach Links <code><<</code> oder Rechts <code>>></code> verschoben werden. Der resultierende Datentyp ergibt sich aus dem linken Operanden. Der rechte Operand muss positiv und der Wert kleiner gleich der Bitbreite des linken Operanden sein. Andernfalls ist das Ergebnis implementierungsspezifisch.
Nach [C11 6.5.7] ist das Ergebnis der Schiebeoperation implementierungsspezifisch, wenn der linke Operand eine negative vorzeichenbehaftete Zahl ist. In der Regel wendet der Compiler jedoch folgende Schiebeoperation an:
* Logisches Schieben (zu füllende Bit-Stellen werden mit 0 aufgefüllt), wenn der linke Operand einen vorzeichenlosen Datentyp hat
* Arithmetisches Schieben (zu füllende Bit-Stelle beim Rechtsschieben wird mit dem Vorzeichenbit aufgefüllt), wenn der linke Operand ein vorzeichenbehaftete Datentyp ist. Hiermit wird das Vorzeichen beibehalten, so dass eine negative Zahl nach dem Schieben weiterhin negativ ist (In Java erfolgt dies durch den >>> - Operator)
Hinweis:
* Ein Schieben um eine Stelle nach rechts entspricht einer Division durch 2
* Ein Schieben um eine Stelle nach links entspricht einer Multiplikation mit 2
=== sizeof-Operator ===
Der sizeof-Operator dient zur Ermittlung des Speicherbedarfs (in Bytes) einer Variablen/eines Datentyps.
<code>Syntax: sizeof (type-name)</code><br />
<code>Syntax: sizeof unary-expression</code><br />
Als Argument für den Sizeof-Operator kann wahlweise ein Datentyp, eine Variable oder ein Ausdruck genutzt werden. Sizeof gilt als Konstantenausdruck, d.h. seine Berechnung erfolgt durch den Compiler, sodass:
* sizeof zur Initialisierung von globalen Variablen genutzt werden
:<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz); //3*sizeof(int)=12
int main(int argc, char *argv[]) {
printf("size=%zu\n",size);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* bei einem Ausdruck dieser nicht ausgeführt wird, sondern nur der resultierende Datentyp bestimmt wird und dessen Größe zurückgegeben
:<syntaxhighlight lang="C">
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der resultierende Datentyp des Rückgabewertes ist <code>size_t</code>.
Es empfiehlt sich, den sizeof-Operator mit Klammern zu nutzen, andernfalls gibt sizeof bei Anwendung auf einen Ausdruck die Größe des linken Operators zurück:
<syntaxhighlight lang="C">
size_t size;
short var;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
size_t size;
short var=0;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
printf("size=%zu var=%d\n",size,var);
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* sizeof angewendet auf char gibt immer den Wert 1 zurück.
* sizeof ist nicht auf Operanden vom Typ Funktion, void, Felder ohne Größenangabe und Bitfelder anwendbar
* wird sizeof auf ein VLA angewendet, so entspricht sizeof nicht mehr einen Konstantenausdruck, sondern einem Funktionsaufruf
:<syntaxhighlight lang="C">
void foo(int n) {
int arr[n];
size_t size=sizeof(arr); //Speicherbedarf ist kein Konstantenausdruck
//sondern wird zur Laufzeit berechnet
</syntaxhighlight>
* Sizeof entspricht nicht strlen(), da sizeof die Größe des für die Variable reservierten Speicherbereich zurückgibt und nicht wie strlen() den Inhalt des Speicher hinsichtlich des Stringendezeichens auswertet:
:<syntaxhighlight lang="C">
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Anweisungen ==
=== If-Anweisung ===
<code>Syntax: if (expression) statement</code><br />
<code>Syntax: if (expression) statement else statement</code><br />
Das Ergebnis des Ausdruckes (Ganzzahl, Gleitkommazahl oder Zeiger) wird auf ungleich 0, 0.0 oder NULL getestet. Trifft dies zu, so wird <code>statement</code> ausgeführt. Andernfalls wird das <code>else statement</code> ausgeführt, sofern vorhanden. Sollen mehrere Anweisungen ausgeführt werden, so sind diese mittels Block zusammenzufassen (diesen dann bitte nicht mit ; abschließen).
Beispiel:
<syntaxhighlight lang="C">
if(a==1)
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
if(a) //entspricht a!=0
if(printf("hallo")<0) //prüfen, ob printf() fehlschlägt
if( ({int dummy=a;a=b;b=dummy;})==6)
if(a=7) //Zuweisung!
if(7=a) //KO, Eine Konstante kann kein L-Value sein
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1,b=2;
if(a==1)
printf("a==1\n");
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
printf("a=1\n");
if(a) //entspricht a!=0
printf("a\n");
if(printf("hallo\n")<0) //prüfen, ob printf() fehlschlägt
printf("printf()\n");
if( ({int dummy=a;a=b;b=dummy;})==6)
printf("({...})\n");
if(a=7) //Zuweisung!
printf("a=7\n");
if(7=a) //KO, Eine Konstante kann kein L-Value sein
;
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei der Anweisung <code>if(a==7)</code> finden aus syntaktischer Sicht zwei Aktionen statt. Zunächst wird geprüft, ob a gleich 7 ist. Dieser Vergleich liefert true(=1) oder false(=0) zurück. Die If-Anweisung prüft im Anschluss, ob das Argument true oder false ist.
=== For-Anweisung ===
<code>Syntax: for(Initialisierungsteil<sub>OPT</sub> ; Test<sub>OPT</sub> ; Fortsetzung<sub>OPT</sub>) Statement</code>
Die For-Anweisung wird vom Compiler wie folgt umgesetzt:
<poem> '''Initialisierungsteil'''<sub>OPT</sub>
Goto Next
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
'''Statement'''
Continue:
'''Fortsetzung'''<sub>OPT</sub>
Next:
if('''Test'''<sub>OPT</sub>) goto Goon
Break:
</poem>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
for(summe=lauf=0;lauf<20;lauf++)
summe+=lauf;
printf("summe=%d\n",summe);
//Initialisierungsteil
summe=lauf=0;
goto Next;
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
//Statement
summe+=lauf;
Continue: __attribute__((unused))
//Fortsetzung
lauf++;
Next:
//if(TestOPT) goto Goon
if(lauf<20) goto Goon;
Break: __attribute__((unused))
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die einzelne Elemente haben folgende Bedeutung/Besonderheiten:
;Initialisierungsteil: Zum Initialisieren von Schleifenvariablen, wird einmalig mit Beginn der FOR-Anweisung ausgeführt.
:* kann Leer sein, dann erfolgt keine Initialisierung
:* Ab C99: Hier kann eine (lokale) Variable definiert werden, welche nur innerhalb dieser For-Anweisung gültig ist
;Testteil: Hierin wird vor jedem Schleifendurchlauf geprüft, ob die Schleifenbedingung erfüllt ist. Wenn die Bedingung nicht erfüllt ist (Ganzzahl, Gleitkommazahl oder Zeiger gleich 0,0.0 oder NULL), wird die For-Schleife beendet.
:* Kann leer sein, dann wird dieser Teil als true angesehen
;Fortsetzungsteil: Wird nach jeden Schleifendurchlauf ausgeführt. In der Regel sollte hier die Schleifenvariable aktualisiert werden
:* Kann leer sein
;Statement: In der Schleife auszuführender Ausdruck
:* Sollen mehrere Ausdrücke ausgeführt werden, so sind diese in einem Block zusammen zu fassen.
Ergänzende Anweisungen innerhalb des Statements/Block
* <code>continue</code> zum Fortsetzen des Schleifendurchlaufes, d.h. Sprung zum Fortsetzungs-Teil
* <code>break</code> zum Beenden des Schleifendurchlaufes
Beispiele:
* For-Schleife mit lokaler Schleifenvariable
:<syntaxhighlight lang="C">
char string[]="hallo";
for(size_t lauf=0; lauf < strlen(string); lauf++)
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
//strlen() aufgerufen wird!
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife mit Break-Anweisung
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t lauf=0; src[lauf]!=0; lauf++) {
printf("lauf=%zu\n",lauf);
if(lauf >= sizeof(dest))
break;
dest[lauf]=src[lauf];
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife, bei welcher die gesamte Aktion innerhalb der For-Anweisung ausgeführt wird
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;
src[l]!=0 && l <sizeof(dest);
printf("l=%zu\n",l),dest[l]=src[l],l++);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;src[l]!=0 && l <sizeof(dest); printf("l=%zu\n",l),dest[l]=src[l],l++);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleifenvariable muss keine Zählvariable sein
:<syntaxhighlight lang="C">
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int zahl=0b100010;
int bits=0;
for(int mask=0b10000000; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
printf("Anzahl Einsen in %b = %d\n",zahl,bits);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zeiger als Schleifenvariable
:<syntaxhighlight lang="C">
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
printf("src='%s' dst='%s'\n",src,dst);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Auch wenn einige Compiler bei eingeschalteter Optimierung die Fähigkeit besitzen, Funktionsaufrufe innerhalb des Test- und Fortsetzungsteil vor die Schleife zu verschieben (siehe: [https://xania.org/202512/13-licking-licm Loop-Invariant Code Motion]), so sollten Funktionsaufrufe an diesen Stellen vermieden werden. Einerseits zeugt dies von schlechten Programmierstiel und andererseits führt dies bei ausgeschalteter Optimierung zu Performanceeinbußen:
:<syntaxhighlight lang="C">
for(size_t lauf=0;lauf<strlen("hallo");lauf++)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zur Geschwindigkeitssteigerung sollte im Testteil auf 0 abgefragt werden, d.h. die Schleifenvariable dekrementiert werden:
:<syntaxhighlight lang="C">
for(int lauf=700000;lauf;lauf--)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(ssize_t lauf=700000000;lauf;lauf--)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
for(ssize_t lauf=0;lauf<700000000;lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Alternativ zu einer Laufvariablen empfiehlt sich die Nutzung von Pointer als Schleifenvariable:
:<syntaxhighlight lang="C">
for(char *ptr=str; *ptr; ptr++);
</syntaxhighlight>
* Verzweigungsbefehle sind einige der langsamsten Maschinenbefehl. Zur Vermeidung von diesen Maschinenbefehle 'entrollen' die Compiler bei eingeschalter Optimierungen und bekannter kleiner Anzahl von Schleifendurchläufe die For-Schleife (siehe: [https://xania.org/202512/10-loop-unrolling Unrolling Loops])
:<syntaxhighlight lang="C">
for(int lauf=4;lauf;lauf--)
sum+=arr[lauf];
//wird aufgrund bekannter Anzahl der Schleifendurchläufe wie folgt entrollt
sum+=arr[4];
sum+=arr[3];
sum+=arr[2];
sum+=arr[1];
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <string.h>
int arr[5];
void arr_init(void) {
memcpy(arr,(int []){1,2,3,4,6},sizeof(arr));
}
int main(int argc, char *argv[]) {
arr_init();
int sum;
sum=0;
for(int lauf=4;lauf;lauf--)
sum+=arr[lauf];
printf("sum=%d\n",sum);
//wird aufgrund bekannter Anzahl der Schleifendurchläufe wie folgt entrollt
sum=0;
sum+=arr[4];
sum+=arr[3];
sum+=arr[2];
sum+=arr[1];
printf("sum=%d\n",sum);
//Zur Darstellung von Loop-Runling Compiler-Option -O0 auf -O1 ändern
return 0;
} | execCompilerOptions=-Wall -O0|
h=c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== While-Anweisung ===
<code>Syntax: while(expression) Statement </code><br />
<code>Syntax: do Statement while(expression);</code><br />
Die While-Anweisungen werden vom Compiler wie folgt umgesetzt:
{| class="wikitable"
! while()-Anweisung !! do while()-Anweisung
|-
| <poem>
Continue:
if(!'''expression''')
goto Break;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
'''Statement'''
goto Continue;
Break:
</poem> ||
<poem>
GoOn:
//Break-Anweisung entspr.
// goto Break;
//Continue-Anweisung ent.
// goto Continue;
'''Statement'''
Continue:
if('''expression''')
goto GoOn;
Break:
</poem>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
lauf=summe=0;
while(lauf<10) {
if(lauf>=5)
break;
lauf++;
if(lauf<3)
continue;
summe+=lauf;
}
printf("summe=%d\n",summe);
lauf=summe=0;
Continue1:
if(!(lauf<10))
goto Break1;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
//Statement
if(lauf>=5) {
goto Break1;
}
lauf++;
if(lauf<3)
goto Continue1;
summe+=lauf;
goto Continue1;
Break1:
printf("summe=%d\n",summe);
lauf=summe=0;
do {
lauf++;
if(lauf>5)
break;
if(lauf<3)
continue;
summe+=lauf;
} while(lauf<10);
printf("summe=%d\n",summe);
lauf=summe=0;
GoOn2:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
//Statement
lauf++;
if(lauf>5)
goto Break2;
if(lauf<3)
goto Continue2;
summe+=lauf;
Continue2:
if(lauf<10)
goto GoOn2;
Break2: __attribute__((unused));
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Folgendes gilt es bei der Nutzung der While-Anweisung zu beachten:
* Soll mehr als ein Statement innerhalb der while-Schleife ausgeführt werden, so sind diese in einem Block zu schreiben
* Statement kann eine Leeranweisung (gekennzeichnet durch ein Semikolon) sein
:<syntaxhighlight lang="C">
while(1);
do ; while(1);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf1=1000;
while(lauf1--);
int lauf2=1000;
do ; while(lauf2--);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der do-while-Schleife ist das abschließende Semikolon Bestandteil des Befehls
* expression muss eine Ganzzahl, Gleitkommazahl oder Zeiger zurückgeben, der bei False (0, 0.0 oder NULL) die Schleife beendet.
Beispiele:
* Endlosschleife
:<syntaxhighlight lang="C">
while(1) {}
</syntaxhighlight>
* Schleife zum Durchlaufen eines String
:<syntaxhighlight lang="C">
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
printf("Stringlänge=%zu\n",len);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Switch-Anweisung ===
<code>Syntax: switch(expression) statement</code><br />
<code>Syntax: statement:= case constant-expression: statement<sub>opt</sub> default: statement<sub>opt</sub></code><br />
Die Switch-Anweisung entspricht einer verschachtelten If-Anweisung, mit der Besonderheit, dass der auszuführende Code nicht im If-Zweig stattfindet, sondern dort ein goto zum eigentlichen Code enthalten ist:
{| class="wikitable"
! Switch-Anweisung !! Compilerumsetzung
|-
|<syntaxhighlight lang="C">
switch(a) {
case 1:
int a=7;
//Code
break;
case 2:
printf("%d",a);
case 3: {
int a;
//Code
}
case 4 ... 8:
default:
//Code
}
</syntaxhighlight>
||<poem>
if(a==1)
goto label1;
else if(a==2)
goto label2;
else
goto label_default;
//-------------------
label1:
//Code
goto label_break;
label2:
//Code
label_default:
goto label_break;
label_break:
</poem>
|}
Folgendes gilt es bei der Nutzung der Switch-Anweisung zu beachten:
* <code>Expression</code> muss zu einer Ganzzahl (int, short, char, long, long long) oder enum (entspricht einer Ganzzahl) ausgewertet werden
* <code>constant-expression</code> muss eine Ganzzahl-Konstante oder ein Enumelement sein. Sie darf nicht doppelt im Block vorkommen. Der genaue Datentyp ergibt sich aus dem Datentyp der <code>expression</code>
* Lt. Spezifikation ist ein nur <code>statement</code> hinter der switch-Anweisung erlaubt, so dass nur ein <code>case</code> Fall oder der <code>default</code> Fall bedient werden kann::<syntaxhighlight lang="C">
int var=1;
switch(var) case 1: printf("hallo");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) case 1: printf("hallo");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweifte Klammer der <code>switch</code>-Anweisung erzeugt einen Block, so dass a) hier mehrere <code>case</code>-Fälle und b) hierin definierte Variablen innerhalb des gesamten Blocks zur Verfügung stehen (sind somit nicht <code>case</code> abhängig). Die <code>case</code> Anweisung ist nichts anderes als eine Sprungmarken (welche durch die switch-Anweisung angesprungen wird) so dass der Initialisierungsteil der lokalen Variablen übersprungen / nicht ausgeführt werden kann:
:<syntaxhighlight lang="C">
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("%d %d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
break;
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1;
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("a=%d b=%d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
(void)a;
break;
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* GNU-C (siehe [https://www.gnu.org/software/c-intro-and-ref/manual/html_node/switch-Statement.html Switch-Statement]) erlaubt ergänzend zur Angabe einer Konstante die Angabe eines Wertebereiches:
:<syntaxhighlight lang="C">
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=2;
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
printf("a im Bereich von 1 bis 8\n");
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* <code>break</code> ist optional. Mittels <code>break</code> wird an das Ende der Switch-Anweisung gesprungen. Wenn <code>break</code> weggelassen wird, wird die nachfolgende Anweisungen ausgeführt. Ggf. gibt der Compiler eine Warning aus. Mittels der GCC-Compiler-Anweisung __attribute__((fallthrough)); kann diese Warning unterdrückt werden:
:<syntaxhighlight lang="C">
switch(a) {
case 0: //ggf. Compiler-Warning
__attribute__((fallthrough)); case 1:
case 2:
break;
}
</syntaxhighlight>
* Ein Variable Length Array ist als Variable im Switch-Block direkt nicht erlaubt. Ist dies notwendig, so ist das VLA in einem inneren Block zu kapseln:
:<syntaxhighlight lang="C">
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Case - Anweisungen sind nichts anderes als Sprungmarken (Labels), so dass CASE-Anweisungen überall innerhalb des Switch-Blockes stehen können:
:<syntaxhighlight lang="C">
int prime(int value) {return value+1;}
void hallo(int var) {
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int prime(int value) {
return value+1;
}
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:oder anderen Anweisungen innerhalb des Switch-Blockes enthalten sein können:
:<syntaxhighlight lang="C">
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++;
case 7: *dst = *src++;
case 6: *dst = *src++;
case 5: *dst = *src++;
case 4: *dst = *src++;
case 3: *dst = *src++;
case 2: *dst = *src++;
case 1: *dst = *src++;
}while(--n>0);
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h> //fuer uintptr_t
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++; printf("%02hhx ",*dst);
case 7: *dst = *src++; printf("%02hhx ",*dst);
case 6: *dst = *src++; printf("%02hhx ",*dst);
case 5: *dst = *src++; printf("%02hhx ",*dst);
case 4: *dst = *src++; printf("%02hhx ",*dst);
case 3: *dst = *src++; printf("%02hhx ",*dst);
case 2: *dst = *src++; printf("%02hhx ",*dst);
case 1: *dst = *src++; printf("%02hhx ",*dst);
}while(--n>0);
}
}
int main(int argc, char *argv[])
{
char src[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char dst;
send(&dst,src,20);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Eine Switch-Case Anweisung über Strings sind in C/C++ nicht möglich:
:<syntaxhighlight lang="C">
switch(str) {
case "hallo":
return 1;
case "du da":
return 2;
case "xyz":
return 3;
default:
rReturn -1;
}
</syntaxhighlight>
:Ein direkte Lösungsansatz ist die Nutzung von strcmp() zum Vergleichen von String. Da strcmp zeichenweise den String vergleicht, ist dieser Ansatz langsam. Alternativ bietet sich an, von allen String einen Hash-Wert zu berechnen und zunächst diesen Hash-Wert zu kontrollieren. Da der Hash-Wert nicht eindeutig ist, muss ergänzend ein strcmp() erfolgen:
:<syntaxhighlight lang="C">
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h>
//Lösungsansatz von: https://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
#define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
#define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
#define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
#define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
#define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
#define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
#define HASH_LAUFZEIT(s) (H256(s,0,0))
//Eigener Lösungsatz zur Umsetzung des vorherigen HASH-Algorithmus
//so dass dieser zur Compilezeit berechnet werden kann
//Was fehlt ist die abschließende EXOR berechnung!
//Problem war, dass die Array-Dereferenzierung nicht zur Compilezeit
//aufelöst werden kann
#define HH0(a,x) (x*65599u+a)
#define HH1(a) HH0(a,HH0(0,HH0(0,HH0(0,0))))
#define HH2(a,b) HH0(b,HH0(a,HH0(0,HH0(0,0))))
#define HH3(a,b,c) HH0(c,HH0(b,HH0(a,HH0(0,0))))
#define HH4(a,b,c,d) HH0(d,HH0(c,HH0(b,HH0(a,0))))
#define HH4x(a,b,c,d,x) HH0(d,HH0(c,HH0(b,HH0(a,x))))
#define HH5(a,b,c,d,e) HH4x(b,c,d,e,HH4x(0,0,0,a,0))
#define HH6(a,b,c,d,e,f) HH4x(c,d,e,f,HH4x(0,0,a,b,0))
#define HH7(a,b,c,d,e,f,g) HH4x(d,e,f,g,HH4x(0,a,b,c,0))
#define HH8(a,b,c,d,e,f,g,h) HH4x(e,f,g,h,HH4x(a,b,c,d,0))
#define HH9(a,b,c,d,e,f,g,h,i) HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0)))
#define HH10(a,b,c,d,e,f,g,h,i,j) HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0)))
#define HH11(a,b,c,d,e,f,g,h,i,j,k) HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0)))
#define HH12(a,b,c,d,e,f,g,h,i,j,k,l) HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0)))
#define HH13(a,b,c,d,e,f,g,h,i,j,k,l,m) HH4x(j,k,l,m,HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0))))
#define HH14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) HH4x(k,l,m,n,HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0))))
#define HH15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) HH4x(l,m,n,o,HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0))))
#define HH16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) HH4x(m,n,o,p,HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0))))
#define EIGHTEENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \
a11,a12,a13,a14,a15,a16,a17,a18, ...) a18
#define CONCAT(c,d) c ## d
#define CONCATI(a,b) CONCAT(a,b)
#define HASH_COMPILEZEIT(...) CONCATI(HH , EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0))(__VA_ARGS__)
//Lösungsansatz basierend auf: https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/preprocessor/macros/__VA_ARGS__/count-arguments
#define COUNT_ARGUMENTS(...) EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main(int argc, char *argv[]) {
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:Siehe:[https://benhoyt.com/writings/hash-table-in-c/ Hash Table in C]
== Label + Goto ==
=== Label ===
<code>Syntax: name:</code><br />
Labels dienen zur Kennzeichnung einer Anweisung, so dass die Programmausführung an dieser Stelle fortgesetzt, resp. mit einer GOTO-Anweisung angesprungen werden kann. Ein Label ist durch den folgenden Doppelpunkt gekennzeichnet. Dem Label muss eine Anweisung folgen, welches auch eine Leeranweisung (Semikolon) sein kann.
Folgendes gilt es bei der Nutzung von Labels zu beachten:
* Ein Label entspricht der Speicheradresse des der Label-Anweisung folgenden Anweisung
* Bei nicht genutzten Labels (mit goto nicht angesprungene Labels) gibt der Compiler eine Warning aus. Diese kann beim GCC-Compiler mit __attribute__((unused)) unterdrückt werden
* die Case- und die Default-Anweisung aus der Switch-Anweisung entspricht einem Label
<br />
Labels hat eine funktionsweite Sichtbarkeit (siehe Kap [[#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]). Dies bedeutet, dass das:
* Labels nur innerhalb einer Funktion gültig ist
* Labels einen von Variablen/Funktionen/Datentypen unabhängigen Namensraum haben
* Kein Prototyp für ein Label notwendig ist, wenn es bei Nutzung über goto noch nicht gesetzt worden ist, also nach vorne gesprungen wird
=== goto ===
<code>Syntax: goto label;</code><br />
Mit der Goto-Anweisung wird die Programmausführung an der mit <code>label</code> gekennzeichneten Stelle fortgesetzt.
Folgendes gilt es bei der Nutzung von goto zu beachten:
* Mit einer <code>goto</code> Anweisung kann an eine beliebige Steller innerhalb der '''identischen''' Funktion gesprungen werden. Es kann nicht zu einem Label in einer anderen Funktion gesprungen werden (hierzu ist <code>setjmp()</code> und <code>longjmp()</code> zu nutzen)
* Mit der Goto Anweisung kann gleichermaßen in einen Block hinein, als auch herausgesprungen werden:
:<syntaxhighlight lang="C">
goto first_time;
for(;;) {
if(a>10)
goto last_time:
first_time:
a++;
}
last_time: ;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0;
goto first_time;
for(;;) {
printf("a=%d\n",a);
if(a>10)
goto last_time;
first_time:
a++;
}
last_time: ; //Leeranweisung wäre hier nicht nötig
return 0; //da dem Label ein return folgt!
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Wird mit der <code>goto</code> Anweisung der Initialisierungsteil einer Variablen übersprungen, so ist zwar die Variable existent, beinhaltet aber nicht ihren Initialisierungswert
Beispiel:
<syntaxhighlight lang="C">
goto label1;
if(a==3) {
label2:
printf("True\n");
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=3;
goto label1;
if(a==3) {
label2:
printf("True\n");
a++;
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In Java gibt es das Schlüsselwort goto, welches aber ohne Funktion ist. Es gibt jedoch Labels, die mit "break label" angesprungen werden können
=== Anwendungsbeispiele ===
Prinzipiell sind Goto-Anweisungen zu vermeiden. In einigen Anwendungsfällen erweist sich goto als nützlich:
* Nutzung nur einer <code>return</code> Anweisung in einer Funktionen
:<syntaxhighlight lang="C">
#include <unistd.h>
int input(int hdl,size_t buflen) {
int rc=-1;
unsigned char packettype;
if(read(hdl,&packettype,1) != 1)
goto exit;
unsigned short packetlen;
if(read(hdl,&packetlen,2) != 2)
goto exit;
if((1+packetlen) > buflen) {
rc=-2;
goto exit;
}
rc=packetlen;
exit:
return rc;
}
</syntaxhighlight>
* Konstruktor mit mehreren Initialisierungsteilen
:<syntaxhighlight lang="C">
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Abbruch einer verschachtelten Schleife
:<syntaxhighlight lang="C">
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Sonstiges ==
=== ??-Trigraphs ===
Zeichenfolge bestehend aus 3 Zeichen beginnend mit 2 Fragezeichen.
Die beiden Fragezeichen entsprechen einem ESCAPE-Operator (siehe Kap [[#Char-Konstanten|Char-Konstanten]]), welcher das nachfolgende Zeichen durch ein anderes ASCII Zeichen ersetzt. Die Ersetzung findet auch innerhalb von Strings statt.<br />
Trigraphs wurden früher genutzt, als die ALTGR Taste noch nicht üblich war.
<syntaxhighlight>
??< → { ??> → }
??( → [ ??) → ]
??/ → \ ??! → |
??' → ^ ??- → ~
??= → #
</syntaxhighlight>
Bei neuer C Varianten muss zur Nutzung von Trigraphs der Compiler mittels -trigraphs aktiviert werden.
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
mnzydqqqxsetkkry99zrb2y7folt27k
1090694
1090667
2026-09-11T10:19:04Z
D. Justen
102048
Initialisierungsteil bzgl. Deklaration und Ausdruck konkretisiert. Beispiele akutalisiert
1090694
wikitext
text/x-wiki
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
<!-- Falls du ein automatisch erstelltes Inhaltsverzeichnis nicht willst, ersetze das nachfolgende TOC durch NOTOC -->
<!-- Einklammerung mit noinclude, damit dieses nicht in der Druckversion erscheint -->
<noinclude>__TOC__</noinclude>
Die Programmiersprache C/C++ beinhaltet mehrere Sprachen/ Syntaxen:
* C-Syntax
* Präprozessor-Syntax
* Printf/Scanf Formatstring Syntax
* Terminal Emulation
* Compiler/Linker Anweisungen
Letztere beiden werden nur rudimentär in dieser Vorlesung/diesem Skript behandelt. Alle anderen sind Bestandteil dieser Vorlesung.
In diesem Kapitel sollen zunächst allgemeine Eigenschaften der Sprache, der grundlegende Syntax und die Kontrollstrukturen erklärt werden. Bei vielen Erklärungen sind Code-Beispiele vorhanden. Da man aus Fehlern am meisten lernt, sind zum Teil auch negative Beispiele enthalten. Für ein besseres Verständnis empfiehlt es sich, Code-Beispiele selbst nachzuvollziehen.<br />
Sofern sich die Eigenschaften auf eine bestimmte C-/C++- oder Compiler-Version beziehen, wird dies gesondert vermerkt.
== Zeichensatz ==
Der Syntax von C nutzt die unteren 128 Zeichen des ASCII Zeichensatzes. Da UTF-8 in den ersten 128 Zeichen deckungsgleich zu ASCII ist, kann auch dieser zur Erstellung des Source Codes genutzt werden.
Zeichen außerhalb dieses gültigen Zeichensatzes können folglich nur in Strings oder Kommentaren vorkommen. Werden Zeichen außerhalb der unteren 128 Zeichen in Strings genutzt, so gilt Folgendes zu berücksichtigen:
* Die String-Funktionalitäten der Standard-C Library gehen von dem regulären ASCII Zeichensatz aus, so dass z.B. die Suche, der Vergleich oder die Konvertierung fehlschlagen kann
* Strings werden oftmals in Verbindung mit printf() genutzt, d.h. auf der Standardausgabe ausgegeben. Der verwendete Zeichensatz sollte hier identisch zum verwendeten Zeichensatz der Terminal-Emulation sein!
== Kommentarzeichen ==
Kommentare dienen dazu, den Source Code mit zusätzlichen Hinweisen zu versehen, so dass die Intension der Anweisungen sichtbar wird. Kommentarzeichen werden durch den Compiler vor dem eigentlichen Übersetzungsdurchlauf entfernt und durch ein Leerzeichen ersetzt [C11 6.4.9]. Innerhalb von Strings wird nicht nach Kommentarzeichen gesucht.
<code>
Syntax: /* */
</code>
Blockkommentar zum Kommentieren eines Bereiches, auch über mehrere Zeilen hinweg. Dieses Kommentarzeichen kann nicht verschachtelt werden, d.h. '*/' beendet die Kommentierung, unabhängig von der Anzahl der zuvor geöffneten Kommentierungen!
<code>
Syntax: //
</code>
Zeilenkommentar zum Kommentieren bis zum Zeilenende (wurde in der Programmiersprache BCPL definiert, aber nicht von C, sondern erst von C++ übernommen).
Sollen größere Bereiche auskommentiert werden, so empfiehlt sich die Nutzung der Präprozessoranweisung #if 0 ... #endif.
Beispiele:
<syntaxhighlight lang="C">
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
/* Blockkommentar mit zwei öffnenden Klammern /*
über mehrere Zeilen, nicht verschachtelt
Compiler-Warning nur aufgrund des Compiler-Schalters -Wall! */
//Zeilenkommentar
/* Kleiner Bereich zum auskommentieren */
#if 0
Großer Bereich zum auskommentieren
#endif
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Namenskonventionen ==
Folgende Regeln gelten bzgl. der Benennung von Variablen und Funktionen:
* Variablen und Funktionsnamen können aus Buchstaben, Zahlen und dem Unterstrich bestehen. Sie müssen mit einem Buchstaben oder einem Unterstrich beginnen
* Seit C95 können weitere Zeichen aus dem Universal Coded Character Set (UCS) genutzt werden [C11 D.1]
* C ist Case sensitiv, d.h. es wird zwischen Groß- und Kleinbuchstaben unterschieden
* Schlüsselwörter können nicht für Variablen/Funktionsnamen/Datentypen genutzt werden
Namenskonventionen von Libraryfunktionen:
* In C (und C++) sind Schlüsselwörter und Standardlibraryfunktionen zumeist in Kleinbuchstaben geschrieben. In der C-Standardlibrary werden oftmals verkürzte Ausdrücke (z.B. isalnum() (zum Testen ob ein Zeichen ein Buchstaben oder ein Digit ist) und in C++ der Unterstrich als Worttrenner (z.b. out_of_range) genutzt
* Makros (siehe Kap.[[Programmieren in C/C++: Präprozessor | Präprozessor]]) werden per Konvention in GROSSBUCHSTABEN und ggf. mit Unterstrich als Worttrenner geschrieben.
* Namen beginnend mit doppelten Unterstrich oder beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (z.B. __LINE__ _Reserved) sind für den Compiler und der Standard-C-Library vorbehalten und sollten im eigenen Programm nicht benutzt werden.
== Zeilenfortsetzung ==
Mit dem Backslash Operator (gefolgt von einem Zeilenende) kann eine Zeile in der nächsten Zeile fortgesetzt werden. Der Compiler löscht das \-Zeichen mit anschließendem Zeilenende und ersetzt dies durch nichts. Dies ist insbesondere bei Anweisungen notwendig, die am Ende der Zeile abgeschlossen sein müssen (z.B. Strings, Makros).
Beispiele:
<syntaxhighlight lang="c">
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
char str1[]="Strings müssen am Ende abgeschlossen sein
so dass dies ein Fehler ist";
char str2[]="Dies\
ist ein Test"; //Vorsicht, führende Leerzeichen vor 'ist'
//bleiben erhalten!
/*mehrzeiliges Makro*/
#define MAX(a,b) (a>b?\
b: \
a)
//Dies ist ein Zeilenkommentar \
welcher in dieser Zeile fortgesetzt wird
/\
* dies ist ein Blockkommentar*\
/
//hinter der Zeilenfortsetzung darf nur ein CR/LF folgen
#define MAX2(a,b) \ //so dass hier kein Kommentar folgen darf
a>b?a:b
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Innerhalb von Char-Literatoren und Strings wird '\' als Escape-Operator genutzt, welche das '\' und ein oder mehrere folgende Zeichen ersetzt (siehe Kap.[[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Grundlagen:Literale/Konstanten]]). Daher darf hinter Backslash als Zeilenfortsetzungszeichen kein weiteres Zeichen folgen.
== Gültigkeit/Sichtbarkeit von Variablen ==
Vorrangig in der objektorientierten Programmierung werden mit Namensräumen Objekte und deren Methoden/Attribute in einer Art Baumstruktur strukturiert. Dies ermöglicht eine eindeutige Ansprache von Variablen/Objekte, aber auch eine doppelte Verwendung von Methoden-/Attributnamen in unterschiedlichen Namensräumen. Ergänzend zu den Namensräumen kann mit public/private/proteced eine Zugriffsbeschränkung von Methoden/Attributen definiert werden.
Die Programmiersprache C unterstützt keinen Namensraum. Zugriffsmodifikatoren werden indirekt über Header-Dateien getätigt. Hinsichtlich der Gültigkeit/Sichtbarkeit unterscheidet C folgende Bereiche [C11 6.2.1]:
* Funktionen (Function Scope)
* Datei (File Scope)
* Block (Block Scope)
* Funktionsparameter in Prototypen (Function Prototype Scope)
Innerhalb eines Gültigkeitsbereiches dürfen Variablen-/Funktions-/Datentypnamen nicht doppelt genutzt werden.<br />
In der Programmiersprache C++ sind weitere Scope wie z.B. Class Scope, Enumationation Scope und ergänzend das Konzept von Namensräumen vorhanden (Beschreibung folgt).
=== Funktionsweite Sichtbarkeit ===
Eine Label-Definition (als Sprungmarke für die goto-Anweisungen) erfolgt immer mit funktionsweiter Sichtbarkeit/Gültigkeit. Die genaue Beschreibung dieses Sichtbarkeitstyps erfolgt im Rahmen des Kapitels [[Programmieren in C/C++: Grundlagen #Label + Goto|Grundlagen:Label+Goto]].
=== Dateiweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp-Definition außerhalb eines Block-Scopes oder von Funktionsparameter, so sind diese innerhalb der gesamten Datei und bei Funktionen/Variablen ergänzend Projektweit (für alle Objektdateien) sichtbar/gültig (= global) (In der C-Spec unter dem Stichwort 'Linkage' beschrieben, siehe Kapitel [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage| DatentypeSpecifier:Internal/External Linkage]]). Alle globalen Funktionen/Variablen können von allen Dateien aus genutzt/zugegriffen werden (sofern sie zuvor deklariert wurden).<br />
Beispiel:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Deklaration von global,
//welche in Datei1.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Deklaration von func(),
//welche in Datei2.c definiert wird
extern void func(void);
//Definition der Variablen global
int global=0;
int main(void) {
func();
global++;
printf("global=%d\n",global);
return 0;
} | datei2_c=#include <stdio.h>
//Deklaration von global,
//welche in example.c definiert wird
extern int global;
//Definition der Funktion func()
void func(void) {
global++;
printf("func() called\n");
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird das Schlüsselwort 'static' der Variablen/Funktionsdefinition vorangestellt, so wird die Sichtbarkeit/Gültigkeit auf Dateiweit eingeschränkt. Variablen/Funktionen können nur innerhalb der (Objekt-) Datei genutzt werden und sind für anderen (Objekt-)Dateien unsichtbar. (Siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Internal/External Linkage|DatentypeSpecifier:Internal/External Linkage]] Internal/External Linkage)
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
return 0;
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
int main(void) {
var1++;
printf("example.c:var1=%d\n",var1);
void func(void); //Prototyp für func()
func();
return 0;
} | datei2_c=#include <stdio.h>
//Dateiweite Sichtbarkeit von var1
static int var1;
void func(void) {
static int var2; //Vorsicht, static
// hat hier eine andere Bedeutung
var1++;
printf("datei2.c:var1=%d\n",var1);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Projektweite Gültigkeit bedeutet insbesondere, dass keine doppelten Benennung von Variablen/Funktionen/Datentypen innerhalb des gesamten Projektes erlaubt sind, d.h. alle Variablen/Funktionennamen über alle Dateien/Librarys eindeutig sein müssen.<br>
Beispiel 1:
{| class="wikitable"
|-
! Datei1.c !! Datei.2
|-
| <syntaxhighlight lang="C">
#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
}</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int a=1;
int main(int argc,char *argv[])
{
printf("Hello World %d",a);
void dummy(void); //Deklaration von Dummy
dummy();
return 0;
} | datei2_c=#include <stdio.h>
#include <stdio.h>
int a=7;
void dummy(void)
{
printf("Hello Again %d\n",a);
} | execCompilerOptions=datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der Linker meldet beim Zusammenfügen der Objekt-Dateien, dass die Variable a bereits woanders definiert sei (multiple definition of `a';)!
Beispiel 2:
<syntaxhighlight lang="C">
#include <stdio.h> //fuer printf() size_t stderr
int printf=7;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int printf=7;
int main(int argc,char *argv[])
{
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hier meldet der Compiler eine Fehlermeldung, da das Symbol printf zu einen als Variable und zum anderen als Funktion (innerhalb der inkludierten Datei stdio.h beschrieben) genutzt wird ('printf' redeclared as different kind of symbol).
=== Blockweite Sichtbarkeit ===
Erfolgt eine Funktion-/Variablen-/Datentyp Definition innerhalb einer Funktion, als Funktionsparameter oder eines Blockes, so sind diese nur innerhalb des Blockes sichtbar/gültig (=Lokale Variable). Blöcke können verschachtelt sein, so dass das bei identischer Namensgebung innere Definitionen Vorrang haben. Ebenso haben Blockdefinitionen Vorrang vor Datei-/Projektdefinitionen (überdecken diese):
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(void) {
int var2; //var2 ist nur innerhalb
//von main() sichtbar
struct xyz //Datentyp ist nur innerhalb
{int x,y,z;};//von main()
//sichtbar/gültig
extern void func(void); //Deklaration
//ist nur innerhalb von
//main() sichtbar/gültig
func();
}
void foo(void) {
struct xyz var_xyz; //Fehler, da
//Datentypedefinition hier nicht mehr
//gültig ist!
func(); //Fehler, da Deklaration
//hier nicht mehr gültig ist
} | datei2_c=#include <stdio.h>
void func(void) {
int var2=1; //var2 ist
//nur innerhalb von
//func() sichtbar
{
int var2=2;
//var2 ist nur innerhalb
//dieses Blockes sichtbar
printf("%d\n",var2);
}
printf("%d\n",var2);
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sichtbarkeit von Funktionsparameter in Protypen ===
Soll eine Funktion aufgerufen werden, die zuvor nicht definiert wurde, so ist ein Prototyp/(Forward)deklaration der Funktion notwendig (siehe nachfolgendes Kapitel). Die Parameterliste dieses Prototyps hat seinen eigenen Gültigkeitsbereich.<br/>
Beispiel:
<syntaxhighlight lang="C">
int a; //a im File Scope
int func(int a, int b); //a und b im Function Prototyp scope
</syntaxhighlight>
Hinweis:
* Bei Prototypen ist die Angabe von Variablenname nicht notwendig. Die alleinige Angabe des Datentyps ist ausreichend
=== Zuordnung der Gültigkeitsbereiche zu globalen/lokalen Variablen ===
Zum einfacheren Verständnis wird im Skript von folgenden Begrifflichkeiten gesprochen:
* '''Globale''' Variablen-/Funktionen-/Datentypdefinitionen → Projektweite Sichtbarkeit/Gültigkeit
* '''Statisch globale''' Variable/Funktionen → Dateiweite Sichtbarkeit/Gültigkeit
* '''Lokale''' Variablen/Funktionen/Funktionsparameter/Datentypen → Nur innerhalb des zugehörigen Blockes sichtbare/gültig
* '''Statisch lokale''' Variablen → Nur innerhalb der Funktion sichtbar/gültig, mit der Besonderheit, dass die Gültigkeit über der Laufzeit der Funktion gilt (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Static Storage Class Specifier|DatentypeSpecifier:Static Storage Class Specifier]])
=== Speicherzuweisung ===
Für die einzelnen Gültigkeitsbereiche werden im Speicher (und auch in der Objekt-Datei) unterschiedliche Speicherbereiche (Segmente) vorgehalten, d.h. der Compiler teilt den Speicher in unterschiedliche Bereiche auf und weist den Variablen/Funktionen in Abhängigkeit der Gültigkeit/Sichtbarkeit unterschiedliche Speicherbereiche zu!
[[File:Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten).png|thumb|Zuordnung von Inhalten eines C-Programms zu Speicherbereichen (Segmenten)]]
Zur Ermöglichung von Rekursion werden lokale Variable auf dem Stack gehandelt. Mit Aufruf einer Funktion oder öffnen eines neuen Block-Scopes wird Speicher auf dem Stack reserviert, der bei Beenden des Scopes wieder freigegeben wird. Die Speicheradresse von lokalen Variablen ist somit nicht Fix, sondern hängt von der Aufrufhierarchie ab!
Globale und statisch globale Variablen werden nicht auf dem Stack gehalten, sondern bekommen einen 'festen' Speicherbereich (hier DATA/BSS/RODATA) während der gesamten Laufzeit des Programms zugewiesen. Die Adresse dieser Variablen sind somit konstant. Das genutzte Speichersegment von globalen Variablen hängen von der Art der Variablen ab. Initialisierte Variablen werden im DATA-Segment gesammelt, welcher mit dem Initialisierungswert der Variablen initialisiert wird. Nicht initialisierte globale Variablen landen im BSS-Segment, so dass diese mit Programmstart durch Füllen dieses Blockes mit 0 auf 0 gesetzt werden.
Konstante globale Variablen werden im RODATA-Segment gehalten. Über das Betriebssystem kann dieser Speicherbereich auf nur Lesbar gesetzt werden.
Dynamische Speicheranforderungen, resp. Speicher, dessen Gültigkeit über die Laufzeit einer Funktion hinausgeht, wird im Heap gesammelt. Für die Verwaltung dieses Speichers ist der Programmierer zuständig.
Entsprechend globalen Variablen wird für Funktionen ebenfalls ein eigener Speicherbereich (TEXT Segment) vorgesehen. Im Gegensatz zu Variablen, wo im Speicher der dazugehörige Inhalt gespeichert ist, ist der Speicherinhalt von Funktionen die Maschinenanweisungen. Die Speicheradresse der Funktionen sind konstant.
Hinweis:
* Die Speicheradresse von sowohl globalen und statisch globalen Variablen als auch von Funktionen ist konstant und ändert sich während der Laufzeit des Programms nicht. Die Adressvergabe dieser Variablen und Funktionen erfolgt somit nicht zur Laufzeit sondern durch die Toolchain (hier der Linker).
* Dieses Konzept ist allgemeingültig, gilt nicht nur für die Programmiersprache C/C++
== Definition/Deklaration(Prototyp) ==
Der C-Compiler ist ein Single-Pass Compiler (siehe Kap [[Programmieren in C/C++: Einführung/Literatur#Arbeitsweise eines Compilers | Einführung/Literatur:Arbeitsweise eines Compilers ]]), d.h. für den Übersetzungsvorgang wird der Quellcode einmalig eingelesen und von vorne nach hinten abgearbeitet. Dies bedingt, dass keine Vorwärtsbezüge im Quelltext enthalten sein dürfen:
* keine Variable genutzt werden kann, die erst später definiert wird (da der Compiler in Abhängigkeit des Datentyps (den er dann noch nicht kennt) keine entsprechende Maschinensprachebefehle erzeugen kann)
* keine Funktion aufgerufen werden kann, die erst später definiert wird (da der Compiler nicht weiß, welcher Datentyp die Übergabewerte haben und folglich keine Maschinensprachebefehle zur Konvertierung und Übergabe der Variablen erzeugen kann)
* kein Datentyp genutzt werden kann (struct, union, enum, typedef), welcher erst später definiert wird (da der Compiler nicht weiß, wieviel Speicher er für die Variable reservieren muss)
Eine Lösungsvariante dieser Problematik ist, im Quellcode alle Variablen/Funktionen/Datentypen/Makros zu definieren, bevor diese erstmalig genutzt werden (Funktion main() steht dann folglich am Ende des Quellcodes):
<syntaxhighlight lang="C">
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
//Hier kein Zugriff auf var möglich!
//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(void) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) { //foo() wird vor dem ersten Aufruf definiert
var++; //Hier kein Zugriff auf var möglich!
uchar xyz;//Hier kein Zugriff auf Datentyp uchar möglich!
}
int var; //var wird vor dem ersten Aufruf definiert
typedef unsigned char uchar; //Definition des Datentyps uchar
int main(int argc, char *argv[]) {
foo(); //da zuvor definiert kann diese Funktion hier aufgerufen werden
var++; //dito
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Sollen globale Funktionen/Variablen in Datei1.c genutzt werden, die in Datei2.c definiert sind, so schlägt diese Vorgehensweise fehl. Um auch dieses zu ermöglichen, bietet C die Möglichkeiten von Prototypen/Deklarationen an. Diese teilt dem Compiler mit, wie im späteren Ablauf die Variable, die Funktion definiert wird, bzw. dass es diesen Datentyp geben wird:
{| class="wikitable"
|-
! Datei1.c !! Datei2.c
|-
| <syntaxhighlight lang="C">
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
}
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Prototyp für Variable var
extern int var;
//Prototyp für Funktion foo
void foo(void);
int main(int argc, char *argv[]) {
foo(); //Compiler kann aufgrund
var++; //der Prototypen diese
//Aufruf in Maschinen-
//sprachebefehle umsetzen
} | datei2_c=#include <stdio.h>
//Definition der Variablen var
int var;
//Definition der Funktion foo
void foo(void) {
} | execCompilerOptions=-Wall datei2.c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Innerhalb der C-Spezifikation werden für den Umgang mit dieser Problematik die Begriffe 'Declaration' und 'Definition' genutzt. Da diese Begriffe jedoch nicht klar abgegrenzt werden und auch für viele weitere Aspekte genutzt werden, sollen in diesem Skript in Anlehnung an den Wikipedia Artikel {{w|Deklaration (Programmierung)|Deklaration (Programmierung)}} (im Absatz zur Programmiersprache C/C++) die Begriffe Definition/Deklaration wie folgt genutzt werden:
;Definition: entspricht der Belegung/Reservierung von Speicherplatz
:* Bei der Definition einer Variablen wird hiermit Speicherplatz entsprechend dem Datentyp der Variable belegt:
:<syntaxhighlight lang="C">
int var1; //entsprechend der Größe des Datentyps int wird
//Speicherplatz für die Variable var1 reserviert
int var2=4711; //Dito, ergänzend wird dieser Speicherplatz mit dem
//Wert 4711 initialisiert
</syntaxhighlight>
:* Bei einer Funktion wird Speicherplatz zur Aufnahme der Maschinenbefehle belegt:
:<syntaxhighlight lang="C">
void foo(void) { //Die Anweisungen in den geschweiften Klammern
//werden in Maschinenbefehle übersetzt. D.h. die
//Funktion foo() belegt Speicher, dessen Inhalt
//die Maschinensprachebefehle sind
}
</syntaxhighlight>
:* Ergänzend wird der Begriff Definition auch in Verbindung mit der Definition von neuen Datentypen genutzt!
;Deklaration/Prototyp: ist die Mitteilung an den Compiler, wie diese Variable/Funktion an einer späteren Stelle im Source-Code oder in einer anderen Source-Datei definiert wird. Auf Grundlage dieser 'vorab' Information kann der Compiler die passenden Maschinensprachebefehle für den Zugriff/Aufruf auf die Variablen/Funktion einsetzen:
:<syntaxhighlight lang="C">
extern int var1; //Deklaration von var1
extern void foo(void); //Deklaration von foo()
void foo(void); //Deklaration von foo()
</syntaxhighlight><br />
Insbesondere bei dem Umgang mit der Deklaration gilt es Folgendes zu berücksichtigen:
* Deklarationen werden entweder:
:* am Anfang einer C-Datei geschrieben, so dass Funktionen/Variablen im Zugriff stehen, die erst später in der C-Datei definiert werden (entspricht dann der Private Anweisung in anderen Sprachen)
:* in Header-Dateien geschrieben, so dass diese Variable/Funktionen für alle sichtbar sind, welche diese Header-Datei einbinden (entspricht der Public Anweisung in anderen Sprachen)
* Deklarationen von Funktionen werden in der C-Spec als (function) Prototyp bezeichnet und sind dadurch gekennzeichnet, dass diese mit einem Semikolon abgeschlossen sind. Der Specifier 'extern' ist hier optional und sagt eigentlich aus, dass diese Funktion external Linkage besitzt (siehe [[Programmieren in C/C++:_DatentypeSpecifier#Internal/External Linkage | DatentypeSpecifier:Internal/External Linkage]]). Die Benennung der Parametervariablen sind gleichermaßen optional:
:<syntaxhighlight lang="C">
extern int foo(int var1, float var2); //Deklaration
extern int foo(int , float ); //Deklaration
int foo(int var1, float var2); //Deklaration + external Linkage
int foo(int , float ); //Deklaration + external Linkage
</syntaxhighlight>
* Für globale Variablen gibt es keine (Variablen) Prototype. Stattdessen muss zur Bekanntgabe des Datentyps der Specifier 'extern' vorangestellt werden, mit welchen ergänzend zum Ausdruck gebracht wird, das diese Variable external Linkage und damit globale Gültigkeit hat (siehe Kap [[Programmieren in C/C++: DatentypeSpecifier# Extern - Storage Class Specifier| DatentypeSpecifier:Extern - Storage Class Specifier]]). Da die Deklaration einzig zur Bestimmung der Zugriffsmethoden auf Maschinenspracheebene genutzt wird, können diese keine Initialisierungswerte enthalten:
:<syntaxhighlight lang="C">
extern int var1;
extern int var2=7; //KO Deklarationen können keine
//Initialisierungswerte haben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern int foo;
extern int foo=7;
int main(int argc, char *argv[]) {
return foo;
}
int foo=7;| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen von statisch globalen, lokalen und statisch lokalen Variablen nicht möglich sind:
:<syntaxhighlight lang="C">
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sich auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
extern static int glob; //keine Deklaration von statisch globalen
//Variablen möglich
int main(int argc, char *argv[]) {
extern int var; //Deklaration bezieht sicht auf eine globale
//Variable, die nicht definiert ist
extern static int lok;
printf("%d %d\n",var,lok);
int var;
static int lok;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklarationen für identische Variablen/Funktionen können beliebig oft erfolgen, sofern der Datentyp identisch ist:
:<syntaxhighlight lang="C">
extern int var;
extern int var; //OK, doppelt Deklaration mit identischen Datentyp
extern unsigned int var; //KO, Doppelte Deklaration mit unterschiedlichen
// Datentyp
</syntaxhighlight>
* Sofern eine Deklaration und eine Definition in der identischen Datei erfolgen überprüft der Compiler, ob Deklaration und Definition identisch sind. Es empfiehlt sich, die eigene Header-Datei (in welcher die Deklaration normalerweise enthalten ist) zu inkludieren:
:{| class="wikitable"
|-
! Datei1.c !! Datei1.h
|-
| <syntaxhighlight lang="C">
//Include der eigenen Header-Datei
#include "datei1.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
</syntaxhighlight> ||
<syntaxhighlight lang="C">
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
</syntaxhighlight>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Include der eigenen Header-Datei
#include "example.h"
int var1; //Definition von var1
short var2; //Definition von var2
int var3; //Private Variable
//da kein Prototyp
//im Header vorhanden
void func(void) {
}
int main(int argc, char *argv[]) {
return 0;
} | example_h=
extern int var1; //Deklaration
extern char var2; //KO, da Deklaration
//von Definition
//abweicht
void func(int); //KO, da Deklaration
//von Definition
//abweicht
| execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Datei kann eine Variable identischen Datentyps mehrmals definiert werden (bei identischen Initialisierungswert). Diese Definitionen werden vom Compiler als eine Definition angesehen. Wenn jedoch eine identische Variable in unterschiedlichen Dateien definiert wird, so legt jede Datei eine eigene unabhängige Variable an, welche dann beim Zusammenführen der Objektdateien durch den Linker zu Fehler führt. Da Header-Datei zumeist in mehrere C-Dateien inkludiert werden, sind Definitionen in Header-Dateien 'verboten'.
* Deklarationen innerhalb eines Block-Scopes oder eines Function Prototyp Scopes sind nur in diesen Bereich gültig.
== Grundlegende Datentypen und Typsicherheit ==
Die Programmiersprache C kennt folgende grundlegende Datentypen (siehe Kap. [[Programmieren in C/C++: Datentypen | Datentypen]]). Von jedem Datentyp kann ein Zeiger angelegt werden:
{| class="wikitable"
|-
! Datentyp !! Bsp. für Datentyp !! Bsp. für Zeiger auf Datentyp
|-
| Ganzzahl ||
<syntaxhighlight lang="C">
char var;
int var;
short int var;
long int var;
long long int var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
char *ptr;
int *ptr;
short int *ptr;
long int *ptr;
long long int *ptr;
</syntaxhighlight>
|-
| Gleitkommazahl ||
<syntaxhighlight lang="C">
double var;
float var;
long double var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
double *ptr;
float *ptr;
long double *ptr;
</syntaxhighlight>
|-
| Funktionen ||
<syntaxhighlight lang="C">
void func(void) {}
</syntaxhighlight>
|| <syntaxhighlight lang="C">
void (*pfunc)(void);
</syntaxhighlight>
|-
| Arrays ||
<syntaxhighlight lang="C">
int arr[10];
float arr[3][3];
</syntaxhighlight>
||
<syntaxhighlight lang="C">
int (*parr);
float (*parr)[3];
void (*pfunc[5])(void);
</syntaxhighlight>
|-
| Strukturen/Unions ||
<syntaxhighlight lang="C">
struct xyz {int x,y,z};
union abc {int a,b,c};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
struct xyz *ptr;
union abc *ptr;
</syntaxhighlight>
|-
| Aufzählungstyp ||
<syntaxhighlight lang="C">
enum abc {A,B,C};
</syntaxhighlight>
||
<syntaxhighlight lang="C">
enum abc *ptr;
</syntaxhighlight>
|-
| Boolescher Datentyp ||
<syntaxhighlight lang="C">
_Bool var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Bool *ptr;
</syntaxhighlight>
|-
| Komplexe Zahlen ||
<syntaxhighlight lang="C">
_Complex var;
</syntaxhighlight>
||
<syntaxhighlight lang="C">
_Complex *ptr;
</syntaxhighlight>
|}
C/C++ unterscheidet zwischen vorzeichenbehafteten <code>signed</code> und vorzeichenlosen <code>unsigned</code> ganzzahligen Datentypen. Vorzeichenlose Datentypen können nur positive Zahlen incl. der 0 aufnehmen (Anwendungsbereich bspw. Speicheradressen/Arrayindexe, welche nicht negativ sein können). Deren max. Zahlenwert ergibt sich aus der Datenbreite N des Datentyps 2<sup>N</sup>-1. Ein Vergleich eines vorzeichenlosen Datentyps mit ≥ 0 ist somit immer TRUE:
<syntaxhighlight lang="C">
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt"); //dieser ggf. vom Compiler wegoptimiert wird!
for(var=10; var>=0; var--); //Endlosschleife! 0 dekrementiert ergibt 255
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char var=0;
if(var >= 0) //Bedingung ist immer erfüllt, so dass
printf("Bedingung erfüllt\n"); //dieser ggf. vom Compiler wegoptimiert wird!
//Beim Öfffnen des Compiler-Fensters ist die IF-Anweisung nicht farblich
//hervorgehoben. Dies bedeutet, dass diese Zeile wegoptimiert wurde und folglich
//kein Maschinencode für diese Anweisung erzeugt wurde
for(var=10; var>=0; var--) //Endlosschleife! 0 dekrementiert ergibt 255
printf("%u ",var),fflush(stdout);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Vorzeichenlose Datentypen halbieren den verfügbaren Zahlenbereich und 'weisen' dem oberen Wertebereich den negativen Zahlen zu.<br>
Wird ein ganzzahliger Datentyp ohne Angabe des Vorzeichentyps (signedness) definiert, so ist diese vorzeichenbehaftet. Bei vorzeichenlosen Variablen muss explizit <code>unsigned</code> vorangestellt werden. Die Voranstellung von <code>signed</code> ist optional. Einzige Ausnahme stellt der Datentyp char dar. Hier gibt die Spezifikation keine default signedness vor, so dass bei Nutzung dieses Datentyps zur Aufnahme von Zahlen immer signed oder unsigned vorangestellt werden sollte!<br>
Innerhalb des Formatstrings bei den printf()/scanf() Anweisungen '''muss''' die signedness vom Programmierer händisch berücksichtigt werden. Die Formatanweisung %d und %i interpretieren die übergebenen Zahl als vorzeichenbehaftete Zahl. Soll eine vorzeichenlose Zahl ausgegeben werden, so muss %u verwendet werden:
<syntaxhighlight lang="C">
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%d varu=%u",vari,varu); //Korrekt
printf("vari=%u varu=%i",vari,varu); //Falsche Werteausgaben!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
signed int vari=-10;
unsigned int varu=3000000000;
printf("vari=%12d varu=%12u\n",vari,varu); //Korrekt
printf("vari=%12u varu=%12i\n",vari,varu); //Falsche Werteausgaben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit der Definition (dem Anlegen) einer Variablen eines Datentyps wird Speicher entsprechend der Größe des Datentyps reserviert. Optional kann dieser Speicher initialisiert werden. Über den Datentyp wird ausgesagt, wie der Inhalt des Speichers zu interpretieren ist:
<syntaxhighlight lang="C">
char var1; //Speicherplatzreservierung von 1 Byte
//Inhalt der Speicherstelle wird als Zahl interpretiert
//(Hinweis: ASCII-Zeichen sind Zahlen)
double var2=47.11; //Speicherplatzreservierung von 8 Byte
//Inhalt der Speicherstellen wird als Gleitkommazahl
//interpretiert (bestehend aus je einer Ganzzahl für
//Mantisse und Exponent)
short arr[10]; //Speicherplatzreservierung von 10*2 Byte
//Inhalt der 10 Speicherstellen werden als Ganzzahl
//interpretiert
</syntaxhighlight>
Die Funktionalität der Operatoren hängt vom Datentyp der Operanden ab. Der Plus-Operator angewendet auf ganzzahlige Operanden führt eine Ganzzahl Addition aus, angewendet auf gleitkomma Operanden eine Gleitkomma Addition. Ist einer der Operanden ein Zeiger, so wird eine Zeigeraddition angewendet. Für andere Datentypen ist der Plus-Operator nicht definiert, so dass der Compiler einen Fehler wirft. '''Bei der Betrachtung eines Ausdruckes sollte dem genutzten Datentypen folglich eine besondere Aufmerksamkeit zuteil werden''':
<syntaxhighlight lang="C">
int vari=47;
vari+12; //(int) + (int) → Ganzzahladdition
float varf=12.3;
3.1415F+varf; //(float) + (float) → Gleitkommaaddition
int *ptr=&vari;
ptr+3; //(int *) + (int) → Zeigeraddition
int arr[3];
arr+3; //(int (*)) + (int) → Zeigeraddition
</syntaxhighlight>
Das Ergebnis einer Operation hat ebenfalls einen Datentyp. Eine Ganzzahl Addition gibt bspw. als Ergebnis einen Ganzahl Datentyp zurück, eine Gleitkomma Addtition einen Gleitkomma Datentyp und ein Vergleichsoperator den Datentyp _Bool:
<syntaxhighlight lang="C">
int vari1=47;
int vari2=11;
vari1 + 12 + vari2; //((int)+(int)+(int))→((int)+(int))→(int)
40 < vari1 < 50; //((int)<(int)<(int))→((_Bool=int)<(int))→(_Bool=int)
</syntaxhighlight>
Wie Operatoren haben auch Funktionen Operanden (in Form von Übergabeparameter). Das Ergebnis eines Funktionsaufrufes wird ebenfalls in Form eines Datentyps zurückgegeben:
<syntaxhighlight lang="C">
float add(int par1,par2) {return par1+par2;}
int vari1=47;
int vari2=11;
vari1 + add(var2,12); //(int)+((int),(int)→(float))→(int)+(float)→(float)
</syntaxhighlight>
Wird auf einen Operator gleichermaßen ein vorzeichenbehafteter und ein vorzeichenloser Operand angewendet, so kann es zu unerwarteten Konvertierungsproblemen führen:
<syntaxhighlight lang="C">
unsigned char varu=12;
signed char vars=-12;
float varf;
varf = varu + vars;
if(vars < varu)
</syntaxhighlight>
Sind die Datentypen der Operanden nicht 'kompatibel', so 'passt' der Compiler die Datentypen im Falle von Ganzahl und Gleitkomadatentypen per impliziter Regel an (siehe Kap. [[Programmieren in C/C++: Datentypen#Implizite Typumwandlung | Datentypen:Implizite Typumwandlung]]). Über explizite Typumwandlung (siehe Kap.[[Programmieren in C/C++: Datentypen# Explizite Typumwandlung|Datentypen:Explizite Typumwandlung]]) kann ein Datentyp z.T. in einen anderen Datentyp gewandelt werden.
In allen anderen Fällen ist C Typsicher, d.h. der Compiler gibt zumindest eine Warning aus, wenn die Datentypen nicht identisch sind und der Compiler keine implizite Regel anwenden kann.
Tipp:
* Compiler gibt bei Fehlermeldung oftmals die erwarteten und die vorhandenen Datentyp an. Wenn solch eine Fehlermeldung kommt, sollten sie sich a) überlegen, was wollten sie syntaktisch geschrieben haben und b) was haben sie in der Tat geschrieben. Ein Google nach einer Lösung des Compilerproblems löst zumeist nicht das Problem, sondern umgeht es!
Hinweis:
* Ein guter Programmierer sollte die Datentypen so wählen, dass:
:* die Datentypen zum Inhalt und zum Wertebereiches passen
:* keine Datentypkonvertierungen notwendig sind
: andernfalls besteht die Gefahr, dass hiermit Laufzeitfehler einprogrammiert werden.
* Wenn Datentypkonvertierungen notwendig sind, sollte die explizite Konvertierung genutzt werden
== Abhängigkeiten bzgl. Rechnerarchitektur ==
Kenngrößen von Prozessoren sind unter anderem die Anzahl der Bits für den Datentransport und für Arithmetisch-/Logische-Operationen (→ Datenbreite) und die Anzahl der Bits für die Adressierung des Speichers (→ Adressierungsbreite). Die Datenbreite sagt dabei aus, welche max. Datenbreite ein Maschinenbefehl (zumeist in einem Taktzyklus) transportieren/berechnen kann. Werden programmtechnisch größere Datenbreiten benötigt, bedingt dies, dass hierzu mehrere Maschinenbefehle notwendig sind. Wenn kleinere Datenbreiten notwendig sind, so wird oftmals das Ergebnis abgeschnitten (sofern der Prozessor keine Befehle für den Umgang mit kleineren Datentyp beherrscht):
{| class="wikitable"
|-
! 32-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 64-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
! 16-Bit Datentransport/Operation<br /> bei 32-Bit Datenbreite
|-
| <syntaxhighlight lang="C">
int32_t a32,b32;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int64_t a64,b64;
</syntaxhighlight>
|| <syntaxhighlight lang="C">
int16_t a16,b16;
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=b32;
mov eax,b32
mov a32,eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=b64;
mov eax ,b64
mov edx ,b64+4
mov a64 ,eax
mov a64+4,edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
//a16=b16;
movz eax,b16
mov a16,ax
</syntaxhighlight>
|-
| <syntaxhighlight lang="asm">
// a32=a32+b32;
mov edx, a32
mov eax, b32
add eax, edx
mov a32, eax
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a64=a64+b64;
mov ecx , a64
mov ebx , a64+4
mov eax , b64
mov edx , b64+4
add eax , ecx
adc edx , ebx
mov a64 , eax
mov a64+4, edx
</syntaxhighlight>
|| <syntaxhighlight lang="asm">
// a16=16+b16;
movzx eax, a16
mov edx, eax
movzx eax, b16
add eax, edx
mov a16, ax
</syntaxhighlight>
|}
Die Adressierungsbreite gibt an, mit welcher Bitbreite der Speicher adressiert werden kann:
* Bei einem 32-Bit System können 2<sup>32</sup>=4.294.967.295=4Gi Bytes/Speicherstellen adressiert werden
* Bei einem 16-Bit System können 2<sup>16</sup>=65.536=64Ki Bytes/Speicherstellen adressiert werden
* Bei einem 64-Bit System können 2<sup>64</sup>=18.446.744.073.709.551.616 =16Ei ~18Exa Bytes/Speicherstellen adressiert werden
Waren die Datenbreite und die Adressierungsbreite bei den ersten Prozessoren noch unterschiedlich, so sind diese heutzutage zumeist identisch. Bei einem 32-Bit Prozessor bedeutet dies, dass dieser max. 4Gi Bytes Speicherstellenstellen adressieren kann und Maschinenbefehle für den Datentransport und die Berechnung von 32-Bit Datenworten beinhaltet.
Die Datenbreite und auch die Adressierungsbereite haben direkten Einfluss auf die Programmiersprache:
* Wird defaultmäßig mit größerer Datenbreite gerechnet, als der Prozessor 'von Hause' aus unterstützt, so werden die erzeugten Maschinenprogramme größer und langsamer (Umgedreht bedeutet dies jedoch nicht, dass die Maschinenprogramme kleiner und schneller werden)
* Die max. Größe von Verbunddatentypen und Arrays ergibt sich aus der Adressierungsbreite des Prozessors
Die Intention der Programmiersprache C/C++ ist, die Prozessorarchitektur optimal zu nutzen. Dementsprechend sind diverse Eigenschaften der Sprache nicht fest spezifiziert, sondern von der Rechnerarchitektur abhängig.
=== Integer Datentyp ===
Intention von C/C++ ist, dass der Umgang mit dem Grunddatentyp 'int' möglichst direkt in einen Maschinensprachebefehl umgesetzt werden kann.<br />
Bei einem 16-Bit Prozessor hat der Datentyp int daher eine Breite von 16-Bit und bei einem 32-Bit Prozessor eine Breite von 32-Bit (siehe Kap [[Programmieren in C/C++: Datentypen # Ganzzahlige Datentypen|Datentypen:Ganzahl Datentypen]]). Über vorangestellte Qualifier kann dieser Grunddatentyp verkleinert/vergrößert werden.
=== Integer Arithmetik ===
Ganzzahlen haben nur einen begrenzten Wertebereich. Wird dieser bspw. durch eine Addition überschritten (d.h. das Rechenergebnis benötigt zur Darstellung mehr Stellen, als der Datentyp 'hergibt'), so gibt es zwei Vorgehensweisen:
* Arithmetischer Überlauf (siehe {{w|arithmetischer Überlauf}}): Die nicht speicherfähigen Stellen werden verworfen, so dass i.d.R. ein falsches Ergebnis erzeugt wird!
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist (254+3)%256=1
c=a*b; //c ist (254*3)%256=250
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
unsigned char a=254,b=3,c1,c2;
c1=a+b; //c ist (254+3)%256=1
c2=a*b; //c ist (254*3)%256=250
printf("c1=%hhu c2=%hhu\n",c1,c2);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Sättigungsarithmetik (siehe {{w|Sättigungsarithmetik}}): Alle Operationen laufen innerhalb eines festen Intervalls ab, so dass Überläufe und Unterläufe auf dieses Intervall begrenzt werden:
:Beispiel:
:<syntaxhighlight lang="C">
unsigned char a=254,b=3,c;
c=a+b; //c ist MAX((254+3),255)=255
c=a*b; //c ist MAX((254*3),255)=255
</syntaxhighlight>
Die Spezifikation von C macht bezüglich der zu nutzenden Methodik keine Vorgaben, so dass das Handling von der ALU des Prozessors abhängt. Aus Komplexitäts- und Geschwindigkeitsgründen ist dies zumeist der arithmetische Überlauf. Nur bei Spezialprozessoren (z.B. DSP Digital Signal Processor) kommt z.T. die Sättigungsarithmetik zum Einsatz.
=== Gleitkomma Datentyp und Arithmetik ===
Für den Umgang mit Gleitkommazahlen bieten einige Prozessoren spezielle Recheneinheiten ({{w|Gleitkommaeinheit}} Floating Point Units FPU) an. Sowohl die Darstellung von Gleitkommazahlen als auch das Verhalten bei Überlauf/Unterlauf ist damit Herstellerabhängig. Um auch diese Einheiten effektiv nutzen zu können, ist die C/C++ Spezifikation in diesem Bereich ebenfalls sehr offen.
=== Max. Speicherbedarf von Variablen ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C/C++ von der zugrundeliegenden Rechnerarchitektur abhängig:
<syntaxhighlight lang="C">
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
//Zur Darstellung bitte Compiler-Fenster öffnen
//und dort den CC65-Compiler für den 6502 Prozessor auswählen
char a[100000]; //Speicherbedarf=100.000*1Byte=100.000 Bytes
//Bei 16-Bit Architektur KO
//Ab 32-Bit Architektur OK
struct size_16 {
char a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_256 {
struct size_16 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_4096 {
struct size_256 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 {
struct size_4096 a,b,c,d,e,f,g,h,
i,j,k,l,m,n,o,p;
};
struct size_65536 var65536; //Speicherbedarf=65536 Bytes
//Bei 16-Architektur KO
//Ab 32-Architektur OK
int main(int argc,char *argv[]) {
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Im Falle von globalen Variablen erzeugt der Compiler/Linker eine Fehlermeldung. Werden von diesen Datentypen Variablen als lokale Variablen angelegt, so erzeugt dies zur Laufzeit einen Stackoverflow.
=== Zeigervariable ===
Eine Zeigervariable ist eine Variable, die eine Speicheradresse speichert. Die Größe dieses Datentyps hängt von der Adressierungsbreite des Prozessors ab. Unabhängig von dem Datentyp, auf den die Zeigervariable zeigt, ergibt sich folgende Breite:
* 4-Byte bei einer 32-Bit Rechnerarchitektur
* 8-Byte bei einer 64-Bit Rechnerarchitektur
* 2-Byte bei einer 16-Bit Rechnerarchitektur
=== Datentyp size_t ===
Die maximale Größe von Arrays/Strukturen/Unions ist in C von der zugrundeliegenden Rechnerarchitektur abhängig. Sie ergibt sich aus der Adressierungsbreite. Da die Datenbreite des Datentyps int zumeist kleiner als die Adressierungsbreite ist, existiert in C/C++ der vorzeichenlose Datentyp size_t.<br />
Alle Funktionen, welche den Speicherbedarf übergeben bekommen, bzw. zurückgeben (bspw. strlen(), memcpy(), sizeof()) , nutzen den Datentyp size_t:
<syntaxhighlight lang="C">
//Prototypen
size_t strlen(char *str); //Die max. Stringlänge ist durch den
//adressierbaren Speicher vorgegeben
void *malloc(size_t size);
void *memcpy(void *dest, const void *src, size_t n);
</syntaxhighlight>
Der Datentyp size_t ist in der Header-Datei stddef.h der Standard-C-Library per typedef gesetzt. Im Normalfall muss diese Header-Datei nicht explizit inkludiert werden, da bei Nutzung von z.B. strlen() diese bereits durch die Header-Datei string.h inkludiert wird:
<syntaxhighlight lang="C">
typedef unsigned long long size_t; //Bei einer 64-Bit Rechnerarchitektur
</syntaxhighlight>
Hinweis:
* Der Datentyp size_t ist immer ein vorzeichenloser Datentyp (es gibt keine negativen Speicheradressen).
* Mit dem Datentype ssize_t wird eine vorzeichenbehaftete Variante zur Verfügung gestellt, welche hilfreich ist, wenn Speicheradresse subtrahiert werden sollen.
* Soll der Wert vom Datentyp size_t mittels printf() ausgegeben werden, so ist der 'Length Modifier' z und der 'Conversion Specifier' u zu nutzen:
:<syntaxhighlight lang="C">
size_t var=strlen("String");
printf("%zu",var);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[]) {
size_t var=strlen("String");
printf("%zu",var);
printf("%d",var); //Hier sollte es eine Compiler-Warning geben!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Boolescher-Datentype/Operatoren ==
Ursprünglich gab es den booleschen Datentyp in der Programmiersprache C nicht. Mit C99 wurde zwar der Datentyp <code>_Bool</code> eingeführt, dies änderte jedoch nicht den Umgang mit Anweisungen und Operatoren, die einen booleschen Datentyp erwarten/zurückgeben!
An allen Stellen, an denen ein boolescher Datentyp erwartet wird (z.B. IF-Abfrage, bei booleschen Operationen) wird der Datentyp Ganzzahl, Gleitkommazahl oder Zeiger erwartet (= Scalar-Type) und ausgewertet. Der hierin gespeicherte Zahlenwert sagt aus, ob diese Zahl als True oder False zu interpretieren ist:
* False, wenn Ganzzahl gleich 0 oder Gleitkommazahl gleich 0.0 oder Zeiger gleich NULL
* True, wenn Ganzzahl ungleich 0 oder Gleitkommazahl ungleich 0.0 oder Zeiger ungleich NULL
Beispiel:
<syntaxhighlight lang="C">
int a=3;
double b=0.0;
int *ptr=&a;
while(1);
if(a) {}
for( ; b && ptr ; );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
double b=0.0;
int *ptr=&a;
while(0);
if(a) {}
for( ; b && ptr ; ) {}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Operatoren, welchen einen booleschen Wert zurückliefern (Vergleichs-Operatoren und Boolesche-Operatoren), liefern ein Integer-Datentyp zurück:
* (int)0 für False
* (int)1 für True
Beispiel:
<syntaxhighlight lang="C">
int a=3;
int b= (a==3); //b=1
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3;
int b= (a==3); //b=1
printf("%d",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
In den if()/for()/while() Anweisungen ist folglich kein explizites Konvertieren eines Ganzzahl-/Gleitkomma-/Zeigerwertes mittels des Vergleichs-Operators in einen Booleschen Wert notwendig:
<syntaxhighlight lang="C">
int a;
double b;
if(a) //entspricht if(a!=0)
if(!b) //entspricht if(b==0.0)
while(1) //entspricht while(True)
for(int lauf=1; lauf ; lauf--);
</syntaxhighlight>
Umgedreht kann ein boolescher Wert oder auch das Ergebnis einer booleschen Operation direkt mit einer Ganzzahl- oder Gleitkommazahl verknüpft werden:
<syntaxhighlight lang="C">
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
if( a==1 & b==2)
if(3 < a < 9) //Vorsicht, die Schreibweise lässt ein
//anderes Verhalten erwarten!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
int a=3,b=2;
a=a+1 && 7 << 3 & a==3;
printf("%d\n",a);
if(a==1 & b==2)
printf("true\n");
else
printf("false\n");
if(3 < a < 9)
if( (a==1) & (b==2))
printf("true\n");
else
printf("false\n");
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mit C99 wurde der Datentyp <code>_Bool</code> eingeführt. Dieser entspricht weiterhin einem Integerdatentyp mit der Besonderheit, dass beim Zuweisen eines Wertes dieses auf true oder false geprüft wird und Variablen dieses Datentyps nur die Werte 0 oder 1 annehmen können:
<syntaxhighlight lang="C">
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool! möglich
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
_Bool var1=12;
printf("var1=%d\n",var1); //→ 1
float var2=13.2;
var1=var2;
printf("var1=%d\n",var1); //→ 1
var1--; //Post/Pre Inkrement/Dekrement in C++ nicht auf Datentyp bool!
printf("var1=%s\n",var1?"true(1)":"false(0)"); //→ false
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für den einfacheren Umgang mit dem 'neuen' Datentyp wurde in der Header-Datei <code>stdbool.h</code> die Makros <code>true</code> (als Austauschwert für die Ganzzahl 1) und <code>false</code> (als Austauschwert für die Ganzahl 0) definiert. Ergänzend wird hier der Datentyp <code>bool</code> als Alias auf <code>_Bool</code> gesetzt.
<syntaxhighlight lang="C">
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdbool.h>
bool foo(int par,int min,int max) {
if((par >= min) && (par <= max))
return true;
else
return false;
}
int main(int argc,char *argv[]) {
foo(4,3,6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In C++ gibt es anstatt des Datentypes <code>_Bool</code> den Datentyp <code>bool</code>. Auch sind die beiden Konstanten <code>true</code> und <code>false</code> ohne zusätzliches Einbinden der Header-Datei vorhanden. Der weitere Umgang ist jedoch identisch zu C.
== Literale/Konstanten ==
In Computerprogramm werden an diversen Stellen Konstanten in Source Code genutzt. Sei es als Initialisierungswert für Variablen, als Vergleichswert für Abfragen, zur Definition von Schleifendurchläufe oder als Strings für die Kommunikation. Der Syntax der Programmiersprache bietet dazu verschiedene Möglichkeiten, wie Zahlen zu beschreiben sind und wie der Datentyp vorgeben wird.</br>
Ungeachtet der Schreibweise werden im Computer alle Zahlen identisch als binäre Zalen gespeichert. Beispiele, wie die Zahlen intern gespeichert werden:
<syntaxhighlight lang="C">
int var=17; //0000 0000 0000 0000 0000 0000 0001 0001
short var=0x307;// 0000 0011 0000 0111
char var=017; // 0000 1111
int var=-1; //1111 1111 1111 1111 1111 1111 1111 1111
float var=0.0; //0000 0000 0000 0000 0000 0000 0000 0000
float var=1.0; //0011 1111 1000 0000 0000 0000 0000 0000
</syntaxhighlight>
=== Ganzzahl-Konstanten ===
Im Allgemeinen ordnet der Compiler einer numerischen, ganzzahligen Konstanten den kleinstmöglichen Datentyp beginnend vom Datentyp integer zu. Sobald der Wert der Konstanten den Wertebereich von integer übersteigt, wird der nächst größere passende Datentyp gewählt. Ergänzend gilt, dass alle Ganzzahl-Konstanten als vorzeichenbehaftete Ganzzahl-Konstanten angesehen werden!<br />
Beispiele für integer Konstanten:
<pre>
123
+123
-123 → Formal wird das Minus als Operator angesehen
und die positive Zahl 123 negiert
0x123 → Konstante ist in hexadezimaler Schreibweise notiert
0123 → Konstante ist in oktaler Schreibweise notiert
0b011 → Konstante ist in binärer Schreibweise notiert
nicht offizieller C-Syntax, wird aber von vielen Compiler unterstützt
ab C23-Spezifikation offiziell im C-Syntax enthalten!
6'432'108 → Tausendertrenner (ab C23 und in C++)
6'4'3'2'10 → Tausendertrenner
0x12'23'5 → Tausendertrenner
0b1001'001 → Tausendertrenner
5123123123 → Wertebereich größer als 2^31 so dass automatisch
zum nächst größeren Datentyp konvertiert wird
</pre>
Mit den Suffixen L/l und LL/ll kann der Datentyp long und long long erzwungen werden:
<pre>
12L → Konstante wird in eine long Integer Konstante konvertiert
4711LL → Konstante wird in eine Long Long Konstante konvertiert
</pre>
Mit dem Suffix U/u kann die Konstante explizit auf unsigned gesetzt werden:
<pre>
12U → Konstante wird als vorzeichenlose Zahl gesepeichert
4711ULL → Konstante wird in eine vorzeichenlose
Long Long Konstante konvertiert
</pre>
=== Char-Konstanten ===
In einfachen Anführungsstrichen geschriebene ASCII Zeichen werden entsprechend der {{w|American Standard Code for Information Interchange | ASCII-Tabelle}} als Zahlenwert (Datentyp int) dargestellt:
<pre>
'A' → Integerkonstante 65
'a' → Integerkonstante 97
…
</pre>
Über den {{w|Escape-Sequenz|Escape-Operator}} (Zeichen Backslash '\') wird das/die dem ESCAPE Operator folgende Zeichen gesondert interpretiert. Die im Source-Code erhaltene Zeichenfolge wird im Computerprogramm als ein Zahlenwert (Datentyp int) gespeichert. Dies ist u.A. zur Darstellung von ' und " aber auch zur Darstellung der unteren 32 Zeichen der ASCII Tabelle notwendig (Siehe auch {{w|Steuerzeichen}})
<pre>
ESCAPE Integer- → Bedeutung / (Terminal)funktionalität
Sequence konstante
'\0' = 0 → 0 Character = Stringendezeichen
'\a' = 7 → Bell (erzeugt auf dem Terminal einen Ton)
'\b' = 8 → Backspace (Bewegt den Cursor um eine Position nach links)
'\t' = 9 → Horizontal Tab (Bewegt den Curso auf die nächste horizontale
Tabulatorposition, Abstand ist Terminalspezifisch)
'\n' = 10 → NewLine (Zeilenvorschub)
'\v' = 11 → Vertial Tab
'\r' = 13 → Carriage Return (Wagenrücklauf, Bewegt den Cursor an den
Zeilenanfang)
'\"' = 34 → Double Quote
'\'' = 39 → Single Quote
'\?' = 63 → Question mark
'\\' = 92 → Backslash
'\f' = 12 → FormFeed (Erzeugt auf dem Terminal/Drucker
einen Seitenvorschub)
'\ooo' = 0ooo → Oktal, wobei o Digits von 0..7 sein müssen
'\xdd' = 0xdd → Hexadezimal, wobei d Digits von 0..9 A..F sein müssen
'\udddd' Unicode mit 4 Digits
'\Udddddddd' Unicode mit 8 Digits
</pre>
Beispiel
<syntaxhighlight lang="C">
'A' == 65 == '\101' == '\x41' == '\u0041' == '\U00000041'
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc,char *argv[]) {
//Programmiersprache wurde auf C++ gesetzt
if('A' == 65) printf("'A' == 65\n");
if('A' == '\101') printf("'A' == '\\101'\n");
if('A' == '\x41') printf("'A' == '\\x41'\n");
if('A' == '\u0041') printf("'A' == '\\u0041'\n");
if('A' == '\U00000041') printf("'A' == '\\U00000041'\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true|
lang=c++
}} Öffnen im Compiler Explorer] }}
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
u'b' → unicode 16 (nur C++)
U'b' → unicode 32 (nur C++)
L'b' → wchar_t
</pre>
Hinweis
* Die ASCII-Tabelle basiert auf einer 7-Bit Zeichenkodierung, so dass bspw. die Umlaute 'ä', 'ö' und 'ü' dort nicht kodiert sind. Sollen auch diese Zeichen genutzt werden, so empfiehlt sich der Datentyp wchar_t
=== Gleitkommakonstanten ===
Alle Gleitkommakonstanten sind ohne weitere Angaben vom Datentyp double!
<pre>
555.12
555. → 555.0
.1 → 0.1
4e2 → 400.0
1'234.678'9 → Tausendertrenner (ab C23 und in C++)
0x22.11p13 → Konstante in Hexadezimalen Schreibweise (ab C99)
</pre>
Über Suffixe kann ein alternativer Datentyp erzwungen werden:
<pre>
3.0F → Datentyp float
3.0l → Datentyp long double
</pre>
Hinweis:
* Aufgrund der unterschiedlichen Basis zwischen dem menschlichen Zehner-System und dem computerinternen Binär-System entstehen insbesondere bei den Nachkommastellen Rundungsfehler. Die Konstante 0.1f wird durch die Wandlung intern als 1.00000001490116119384765625e-1 dargestellt (siehe [[Programmieren in C/C++: Datentypen#Gleitkomma Datentypen | Datentypen:Gleitkomma Datentypen]])
* Die C-Spec verlangt, dass die binäre Repräsentation von Gleitkommazahlen zur Laufzeit (z.B. durch die Funktion atof() strtod() scanf("%f")) identisch zur der zur Compilezeit ist. Beispiel:
:<syntaxhighlight lang="C">
if(3.14==atof("3.14")) printf("muss erfüllt sein");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
if(3.14==atof("3.14")) printf("muss erfüllt sein\n");
//3.14 wird vom Compiler in ein Binärwert gewandelt
//Der String "3.14" wird zur Laufzeit mittels atof in ein Binärwert gewandelt
//Beide Wandlungsergebnisse müssen identisch sein
printf("Intern wird 3.14 wie folgt dargestellt %14.20f",3.14);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Konstanten Ausdrücke ===
Ergänzend zu den Zahlenwerten werden auch Ausdrücke durch den Compiler ausgewertet. Als Voraussetzung für die Ausdrücke gilt, dass alle Operatoren Literale/Konstante sein müssen, so dass der Compiler die Berechnung durchführen kann. Als Operatoren können alle im normalem Syntax erlaubten Operatoren (z.B.: +,-,*,/,&,&&,|,||,>>,<<,==,!=) genutzt werden.<br />
Beispiel:
<syntaxhighlight lang="C">
int var1=7*3+5; → wird vom Compiler durch 26 ersetzt
int var2=(4710+(8-1))&-8; → wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); → wird vom Compiler durch 16 * var1 + 154 ersetzt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
int var1=7*3+5; //→ wird vom Compiler durch 26 ersetzt
int var2;
var2=(4710+(8-1))&-8; //→ wird vom Compiler durch 4712 ersetzt
var1=4*4*var1+77*(77%3); //→ wird vom Compiler durch var1 * 16 + 154 ersetzt
return 0;
} | execCompilerOptions=-Wall|
h=g|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Konstante Ausdrücke bieten sich an, um den Sourcecode lesbarer zu gestalten. Da der Compiler die Berechnung durchführt, wird zur Laufzeit keine Rechenleistung benötigt. Einzig die Compiledauer wird etwas erhöht:
<syntaxhighlight lang="C">
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180); //siehe nachfolgende Hinweise
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int ad_get(void) {
return 615; //614;
}
int main(int argc,char *argv[]) {
double alpha1=0.7071067811;
double alpha2=sin(45.0*M_PI/180);
printf("%f\n%f\n",alpha1,alpha2);
if(ad_get() > 614 ) printf("Sensor defekt\n");
if(ad_get() > (int)(3.0/(5.0/1023)+0.5) ) printf("Sensor defekt\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Ergänzend zu den oben aufgeführten Operatoren erlauben einige Compiler weitere Funktionen der Math.h Library in Konstantenausdrücken (z.B. sin(), cos(), ...)
* Konstanten Ausdrücke werden innerhalb des Compilers durch den Präprozessor ausgewertet, so dass dieser die Ergebnisse ebenfalls nutzen kann:
:<syntaxhighlight lang="C">
#define BUF_SIZE 512
#if (BUF_SIZE & (BUF_SIZE -1)) != 0
#endif
</syntaxhighlight>
=== String Konstanten ===
Stringkonstanten erzeugen ein Array von Characters. Mit dem abschließenden Hochkommata wird das Array um ein Stringendezeichen ergänzt:
<pre>
"abc" → (char []) {'a','b','c','\0'}
</pre>
Adjacent Strings Konstanten werden vom Compiler zu einer String-Kontante zusammengefasst, so dass nur ein Stringendezeichen vorhanden ist:
<pre>
"xxx" "yyy" → (char []) {'x','x','x','y','y','y','\0'}
</pre>
Über Prefixe können alternative Zieldatentypen/Konvertierungen erzwungen werden:
<pre>
L"string" → (wchar_t[7]){L's',L't',L'r' …)
</pre>
Über Postfixes können in C++ Objekte erzeugt werden:
<pre>
"string"s → erzeugt einen String vom Datentyp std::string
"string"sw → Erzeugt einen String vom Datentyp std::string_view
</pre>
String Konstanten werden Compilerintern über unnamed Variablen realisiert, welche als globale Variable angelegt werden und per default const sind:
<syntaxhighlight lang="C">
printf("Wert=%d",4);
//entspricht
const char unnamed1[]="Wert=%d";
printf(unnamed1,4);
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
printf("Wert=%d\n",4);
//entspricht
const char unnamed1[]="Wert=%d\n";
printf(unnamed1,4);
fflush(stdout); //Zur Darstellung der Ausgabe, da nachfolgend
//das Programm abstürzt und die gepufferte Ausgabe
//nicht zur Anzeige gebracht wird
//String Konstanten sind per Default Konstant
char *str="hallo"; //Typkonflikt!, da "hallo" vom Datentyp const char[] ist
str[0]='H'; //Laufzeitfehler, da nun schreibender Zugriff auf im
//Readonly Speicher angelegt Variable.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Für doppelte String Konstanten wird nur einmal Speicher reserviert:
<syntaxhighlight lang="C">
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2) printf("Identische Startadressen");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
const char *str1="hallo";
const char *str2="hallo";
if(str1==str2)
printf("Identische Startadressen");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Initialisierungsliste / Compound Literal ==
Arrays, Strukturen und Unions bestehen zumeist aus mehreren Elementen. Zur Initialisierung solcher Variablen werden die Initialisierungswerte in geschweiften Klammern als Initialisierungsliste zusammengefasst.
<code>
Syntax: {Initialisierungsliste}
</code>
Für eine Initialisierungsliste wird kein Speicher vorgehalten. Vielmehr wird bei der Variablendefinition die Variable direkt mit dem Inhalt der Liste initialisiert. Der Datentyp der Initialisierungsliste ergibt sich aus dem Datentyp der zu initialisierenden Variable:
<syntaxhighlight lang="C">
int arr[5] = { 1,2,3,4,5 };
struct xyz { int x,y,z;}; //Definition einer Struktur
struct xyz var = { 1,2,3 };
</syntaxhighlight>
Wird der Initialisierungsliste ein Datentyp in runden Klammern vorangestellt, so wird hiermit eine 'unnamend' Variable/Objekt, ein Compound Literal erstellt:
<code>
Syntax: (type) {Initialisierungsliste}
</code>
Ein Compound Literal entspricht einer anonymen Variablen des angegebenen Datentyps. Wie bei einer normalen Variablendefinition wird hier ebenfalls eine Variable angelegt und diese mit den Initialisierungswerten initialisiert. Im Unterschied zu einer normalen Variable kann auf solch eine Variable im Nachgang nicht mehr zugegriffen werden. Der Rückgabewert eines Compound Literals entspricht somit dem einer Variablen.</br>
Compound Literale bieten sich überall dort an, wo Variablen nur für einen einmaligen Zweck angelegt werden (bspw. bei der Parameterübergabe von Funktionen):
<syntaxhighlight lang="C">
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawline(struct point start,struct point end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start.x,start.y,end.x,end.y);
}
void printarray(int arr[4]) {
printf("[ ");
for(size_t idx=0;idx<4;idx++)
printf("%d ",arr[idx]);
printf("]\n");
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
struct point {int x; int y;};
drawline((struct point){1,2},(struct point){2,3});
printarray((int []){1,2,3,4});
//entsprechen
struct point unnamed1={1,2},unnamed2={2,3};
drawline(unnamed1,unnamed2);
int unnamed3[]={1,2,3,4};
printarray(unnamed3);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Über den Adressoperator kann auch die Adresse der anonymen Variablen ermittelt werden. In diesem Falle ist dann der Gültigkeitsbereich/-dauer des Compound Literals zu berücksichtigen. Wird eine Compound Literals außerhalb eines Block-Scopes angelegt, so entspricht sie einer globalen Variable, andernfalls einer lokalen Variablen. Außerhalb des Gültigkeitsbereiches verliert die Adresse auf solch eine Variable ihre Gültigkeit:
<syntaxhighlight lang="C">
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct point {int x,y;};
void drawlinep(struct point *start,struct point *end) {
printf("Linie von (%d,%d) nach (%d,%d)\n",start->x,start->y,end->x,end->y);
}
#include <stdlib.h>
int main(int argc,char *argv[]) {
drawlinep( &(struct point){1,2},&(struct point){2,3});
//entspricht
struct point unnamed1={1,2},unnamed2={2,3};
drawlinep( &unnamed1, &unnamed2);
struct point point1, *point2;
{ //Block-Scope, zwecks Darstellung von lokalen Variablen
point1= (struct point){1,2}; //Compound Literal entspricht hier
//Initialisierungswert für point1
point2=&(struct point){3,4}; //Compound Literal ist nur in diesem
//Block gültig
drawlinep(&point1 /*OK*/, point2 /*OK*/);
}
drawlinep(&point1 /*OK*/, point2 /*KO*/); //Zeiger zeigt auf nicht mehr
//gültigen Speicherbereich
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Compound-Literal sind per Default keine Konstanten, können also zur Laufzeit geändert werden (siehe Kap. [[Programmieren in C/C++: DatentypeSpecifier#Const Type Qualifier|DatentypeSpecifier:Const Type Qualifier]]):
:<syntaxhighlight lang="C">
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
float *arr=(float []){1.1,2.2,3.3}; //Kein Typkonflikt
arr[0]=47.11; //Änderung des 'Konstanten' arr[0] ist möglich
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweiften Klammern <code>{ }</code> sind nicht mit dem Block-Operator (siehe [[Programmieren in C/C++: Grundlagen#Block / Compound-Statement | Block / Compound-Statement]]) zu verwechseln. Werden die geschweiften Klammern bei der Initialisierung von Variablen genutzt, dann beschreibt der Inhalt der geschweiften Klammern eine Initialisierungsliste. Wird diesen ein Datentyp vorangestellt, dann wird hiermit eine Compound Literal definiert.
== Variableninitialisierung ==
Mit der Definition einer Variable kann diese optional initialisiert werden. Der tatsächliche Zeitpunkt der Variableninitialisierung (zur Laufzeit oder zur Compilezeit) und damit die Ausführung der Initialisierung (Maschinensprachebefehle oder Speichervorbelegung) hängt von der Gültigkeit/Sichtbarkeit der Variablen ab(siehe [[Programmieren in C/C++: Grundlagen#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]).
=== Globale + Static lokale Variablen ===
Globale und statisch globale Variablen werden in einem während der Laufzeit des Programms festen Speicherbereich gehalten. Zum Startzeitpunkt des Programms ist der Speicherplatz solch einer Variable mit dem Initialisierungswert gefüllt, so das bei erstmaliger Nutzung dieser Variablen diese ihre Initialisierungswerte enthalten. Die Belegung des Speicherplatzes erfolgt durch den Compiler, so dass als Initialisierungswerte / Inhalt der Initialisierungsliste nur Konstanten oder Konstanten-Ausdrücke (siehe [[Programmieren in C/C++: Grundlagen#Literale/Konstanten | Literale/Konstanten]]) erlaubt sind:
<syntaxhighlight lang="C">
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
double sin(double); //DJ: Include-Anweisung in wikibooks schlägt fehlt
int g=1; //Speicherstelle der Variable g wird
//mit 1 belegt
short array[3]={1,1+1, sin(0.0)}; //Speicherstellen des Arrays wird
//mit 1, 2 und 0 (Funktion sin() wird zur
//Compilezeit ausgeführt) belegt
int main(int argc,char *argv[]) {
printf("%hd %hd %hd\n",array[0],array[1],array[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Nicht initialisierte globale und static lokale Variablen werden mit 0 initialisiert! D.h. die Speicherstellen dieser Variablen werden mit dem Wert 0 vorbelegt::
<syntaxhighlight lang="C">
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int f; //f hat den Wert 0
double arr[10]; //Alle Elemente von arr werden mit 0.0 initialisiert!
int main(int argc,char *argv[]) {
printf("f=%d\n",f);
printf("%f %f %f\n",arr[0],arr[1],arr[2]);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Lokale Variable ===
Der Speicherplatz für lokale Variable wird auf dem Stack zur Verfügung gestellt. Mit jedem öffnenden Block-Scope wird Speicher für die innerhalb dies Block-Scopes vorhandenen Variablen vom Stack nach dem LIFO Prinzip reserviert und mit der Variablendefinition Maschinencode zur Initialisierung der Speicherstellen ausgeführt (sofern Variable einen Initialisierungswert hat):
<syntaxhighlight lang="C">
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für int) und 8 Bytes (für double)
int var1=12; //erzeugt Maschinencode zur Initialisierung
//der ersten 4 Byte mit dem Wert 12
double var2=sin(f); //erzeugte Maschinencode, welche zunächst
//die Funktion sin() mit dem Übergabewert f
//aufruft und dessen Rückgabewert in die
//nächsten 8 Byte des reservierten Speichers
//kopiert
...
{ //siehe zuvor
int var3=var1; //siehe zuvor
double var4=var2+var1;
} //siehe nachfolgenden
} //Freigabe des zuvor reservierten Speichers
</syntaxhighlight>
Dies gilt auch für Funktionsaufrufe. Mit der öffnenden geschweiften Funktionsklammer wird ebenfalls Speicher reserviert:
<syntaxhighlight lang="C">
void foo(int par)
{ //Öffnende Funktionsklammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Bytes (für (Übergabe)Variable par und 4 Bytes für Variable var
int var; //Da keine Initialisierung vorhanden ist wird auch
//kein Maschinencode zur Initialisierung ausgeführt
{ //Öffnende Klammer erzeugt Maschinencode zur Speicherreservierung
//von 4 Byte für Variable x
int x;
...
</syntaxhighlight>
Aufgrund der mit der Initialisierung bedingten Erzeugung von Maschinencode können die Initialisierungswerte/Inhalte der Initialisierungsliste bei lokalen Variablen aus beliebigen Ausdrücken bestehen und müssen keine Konstanten oder Konstanten Ausdrücke sein:
<syntaxhighlight lang="C">
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sin(f)}; //werden zur Laufzeit berechnet
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h> //fuer sinf()
void foo(float f,float g) {
float summe=f+g; //Initialisierungswerte
float arr[3] = {f+f,g-f,sinf(f)}; //werden zur Laufzeit berechnet
printf("%f\n",(double)summe);
printf("%f %f %f\n",(double)arr[0],(double)arr[1],(double)arr[2]);
}
int main(int argc,char *argv[]) {
foo(3,4);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dieser Maschinencode wird jedes Mal ausgeführt, wenn die dazugehörige Anweisung abgearbeitet wird und bedingt dementsprechend Rechenzeit. Zehnmaliges Ausführen einer Funktion oder zehnmaliges Öffnen eines Block-Scopes innerhalb einer For-Schleife führt zur zehnmaligen Ausführung der oben genannten Sachverhalte:
<syntaxhighlight lang="C">
void foo(int);
void var(void) {
for(int lauf=10; lauf>0; lauf--)
{ //zehnmaliges Reservieren von Speicher
int var=lauf*2; //zehnmalige Initialisierung
foo(var);
} //Freigabe des Speichers
}
void foo(int par) { //zehnmaliges Reservieren von Speicher
int var=12; //zehnmalige Initialisierung
} //Freigabe des Speichers
</syntaxhighlight>
Nicht initialisierte lokale Variablen werden nicht initialisiert, d.h. keine zusätzlichen Maschinenbefehle zum Initialisieren erzeugt. Der Variablenwert entspricht dann einem 'Zufallswert' oder korrekter gesagt dem Inhalt der Variablen, welcher zuvor der Speicherstelle zugewiesen war:
<syntaxhighlight lang="C">
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//und damit auch dessen zuletzt gültigen Wert
}
int main(int argc, char *argv[]) {
int var1=first(); //var1 beinhaltet Wert 7
int var2=second(); //var2 beinhaltet Wert 7
printf("var_foo=%d\n",var1);
printf("var_far=%d\n",var2);
return 0;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int first(void) {
int var_first=7;
return var_first;
}
int second(void) {
int var_second; //Variable var_second bekommt den identischen
return var_second; //Speicherbereich wie var_first zugwiesen
//(und damit auch dessen zuletzt gültigen Wert)
}
int main(int argc, char *argv[]) {
printf("%d\n",second()); //Zufallswert (0, da Stack mit 0 initialisiert ist)
printf("%d\n",first()); //Stack belegen
printf("%d\n",second()); //Zufallswert (7, da Speicherstelle zuvor mit 7
return 0; //belegt wurde)
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Wird eine Variableninitialisierung mit einer switch oder goto Anweisung übersprungen, so wird zwar die Variable angelegt (Speicherplatz reserviert), jedoch die Maschinenbefehle zur Initialisierung dieser Variablen nicht ausgeführt (siehe auch [[Programmieren in C/C++: Grundlagen# Switch-Anweisung|Switch-Anweisung]] und [[Programmieren in C/C++: Grundlagen# Label + Goto|Label + Goto]]). Die Variable enthält dann einen Zufallswert:
<syntaxhighlight lang="C">
switch(value) {
case 0:
int lok=7;
printf("%d",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(int value) {
switch(value) {
case 0:
int lok=7;
printf("%d\n",lok); //OK, lok beinhaltet den Wert 7
break;
default:
printf("%d\n",lok); //KO, Variable lok vorhanden,
//aber nicht initialisiert. D.h. Ausgabe einer
break; //Zufallszahl
}
}
void far(void) {
int var1=4711;
int var2=1799;
printf("Marke: %d, Erscheinungsjahr: %d\n",var1,var2);
}
int main(int argc,char *argv[]) {
foo(2); //Zufallswert (0, da Stack mit 0 initialisiert ist)
foo(0); //Initialisierungswert
far(); //Stack belegen
foo(2); //Zufallswert
return 0;
} | execCompilerOptions=|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei erstmaligem Funktionsaufruf kann eine nicht initialisierten lokale Variablen den Wert 0 beinhalten (Stackframe wird mit Programmstart auf 0 gesetzt). Beim nächsten Aufruf der Funktion ist zumeist die Speicherstelle der lokalen Variablen mit anderen Werten gefüllt worden, so dass nun ein anderer 'Zufallswert' als 'Initialisierungswert' enthalten ist
=== C++ ===
In C++ ist ergänzend die Initialisierung einer Variablen über () möglich. Bei Objekten wird hierüber der zugehörige Konstruktor aufgerufen. Bei primitiven Datentypen entspricht der Wert in den Klammern dem Initialisierungswert:
<syntaxhighlight lang="C++">
int variable(10); //Bei primitiven Datentype entspricht dies
//int variable=10;
struct test {
int a;
test(int par) {a=par;} //Konstruktor der Struktur test
};
struct test test(4); //Konstruktor test(int par) wird aufgerufen
struct test test(4,5); //KO, kein passender Konstruktor vorhanden
</syntaxhighlight>
=== Sonstiges ===
Folgende weitere Sachverhalten gilt es bzgl. Variableninitialisierung zu berücksichtigen:
* Nach C-Spezifikation ist eine Initialisierung von Variablen nicht notwendig. Es liegt folglich kein Fehler vor, wenn auf eine nicht initialisierte Variable lesend zugegriffen wird. Ungeachtet der C-Spezifikation überprüft der Compiler mit dem Schalter '-Wall' diesen Sachverhalt und gibt eine Warning aus
* Deklarationen/Prototypen können keinen Initialisierungswert enthalten
<syntaxhighlight lang="C++">
extern int var=7; //Fehlerhaft
</syntaxhighlight>
* Const und lokale Static Variablen sollten initialisiert werden, auch wenn C in diesem Fall keinen Fehler meldet!
<syntaxhighlight lang="C++">
const int konstante; //Syntaktisch OK, Initialisierungswert fraglich!
static int statisch;
</syntaxhighlight>
== Anweisung (Statement) & Expression ==
Eine Anweisung (Statement) stellt entsprechend dem Wikipedia Artikel {{w|Anweisung_(Programmierung) | Anweisung}} ''"ein in der Syntax einer Programmiersprache formulierte einzelne Vorschrift dar, die im Rahmen der Abarbeitung des Programms auszuführen ist"''.</br>
Aus der Statement Spezifikation ergibt sich folglich, welche Bestandteile ein Programm beinhaltet kann. In der C-Spezifikation [C11 6.8] sind folgende Anweisungen definiert:
: labeled-statement: Eine Sprungmarke für die Switch- und die Goto-Anweisung
: compound-statement: siehe nachfolgendes Kapitel
: expression-statement: siehe nachfolgendes Kapitel
: selection-statement: Eine if() oder switch() Anweisung
: iteration-statement: Eine while(), do while() oder eine for() Anweisung
: jump-statement: Eine goto, break, continue oder return Anweisung
so dass ein Programmablauf wie folgt aussehen könnte:
<syntaxhighlight lang="C">
int main(int argc, char argv[]) {
int var; //declaration innerhalb eines compound-statements
label: //labeled-statement
var=var*2+1; //expression-statement
for(var=0;var<100;var++); //iteration-statement
if(var<0) //selection-statement
printf("var<0"); //espression-statement
{ int lok=var; lok++; } //compound-statement
goto label; //jump-statement
return 0;
}
</syntaxhighlight>
=== Ausdruck (Expression) ===
Entsprechend der C-Spezifikation [C11 6.5] ist ein Ausdruck eine Folge von Operatoren und Operanden, die die Berechnung eines Werts angibt, ein Objekt oder eine Funktion bezeichnet, Nebenwirkungen erzeugt oder eine Kombination davon ausführt. Die Wertberechnungen der Operanden eines Operators werden vor der Wertberechnung des Ergebnisses des Operators ausgeführt (siehe auch {{w|lang=en|Expression_(computer_science)|Expression}}).
Beispiele:
<syntaxhighlight lang="C">
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöung der globalen Variable a)
int func(int par) { a++; return par*2;}
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
int a=0;
int func(int par) {
a++;
return par*2;
}
int main(int argc,char *argv[]) {
int a=4,b=7;
//Ausdruck ohne Nebenwirkung
a=sqrt(a*a+b*b);
//Ausdruck mit Nebenwirkungen (Erhöhung der globalen Variable a)
b=func(1)*func(2);
//Ausdruck mit undefinierten Verhalten (siehe später)
a=++a + 1;
//Statement (welches folglich keinen Rückgabewert hat)
//for-Statement beinhaltet jedoch 3 Ausdrücke (Initialisierungsteil,
//Testteil und Fortsetzungsteil)
a=for(int lauf=10;lauf>0;lauf--);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ausdrücke entsprechen somit Rechenvorschriften, die ausgewertet werden. Ausdrücke sind in C/C++ überall dort erlaubt, wo ein Operand erwartet wird:
<syntaxhighlight lang="C">
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func3(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf()]) {}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <math.h>
//Ausdruck innerhalb eines Funktionskopfes
int func1(int par) {
return 1;
}
int func2(void) {
return 1;
}
//Ausdruck innerhalb eines Funktionskopfes
void func3(int par, int arr[par*3*printf("func() called\n")])
{
printf("func() body\n");
}
int main(int argc,char *argv[]) {
int a=1;
//Ausdruck innerhalb der Parameterübergabe
func1(3*12*func2());
//Ausdruck innerhalb einer if/for/switch-Anweisung
if(a+1*3 > 3)
for(a=4*func1(12); 12*func2()<9; func1(a)*9);
switch( (a*3)&0x0f) {}
//Ausdruck innerhalb der Arraydefinition
int arr[1*3*13];
func3(1,arr);
return 0;
} | execCompilerOptions=-Wall -lm|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Dies ist unter anderen ein Grund dafür, dass C/C++ als unleserlich gilt. Zur besseren Lesbarkeit eines Codes sollte dieses 'Feature' nur dann genutzt werden, wenn es zwingend notwendig ist.
=== Discarded Value / null statement ===
Alle Ausdrücke und nicht void-Funktionen haben einen Rückgabewert, der weiter verwendet werden kann:
<syntaxhighlight lang="C">
a+7 //Rückgabewert ist das Ergebnis der Addtion
printf("hallo") //printf() Funktion ist vom Typ int und gibt die Anzahl
//der ausgegebenen Zeichen zurück
a //gibt den Inhalt der Variablen zurück
7 //gibt den 'Inhalt' der Konstanten zurück
b=(a=7) //der Zuweisungsoperator gibt den Zuweisungswert zurück
</syntaxhighlight>
Der letzte Rückgabewert eines fasst jeden Ausdruckes wird somit nicht genutzt. Dies wird Discarded Value bezeichnet:
<syntaxhighlight lang="C">
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
a; //Variable a wird gelesen, der Wert jedoch verworfen
7; //Konstante wird erzeugt und anschließend verworfen
a+7; //Ergebnis wird Berechnet und verworfen
printf("hallo"); //Rückgabewert von printf wird verworfen
a=a+7; //Die Zuweisung hat einen Rückgabewert, der verworfen wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der einfachste Fall eines Discarded Values ist ein Leeranweisung / null statement, d.h. die Anweisung besteht nur aus einem Semikolon. Dies stellt eine syntaktisch korrekte Anweisung dar, die keine Auswirkung hat:
<syntaxhighlight lang="C">
; //Leeranweisung
</syntaxhighlight >
Überall wo statements/Anweisungen erwartet werden (bspw. bei einer for-Schleife, bei einer if-Anweisungen) kann anstatt einer statements eine Leeranweisung stehen, welche dementsprechend nichts ausführt:
<syntaxhighlight lang="C">
for(size_t idx=0; str[idx]!=0; idx++)
; //Leeranweisung
while(a++ < 100)
; //Leeranweisungen
</syntaxhighlight>
An einige Stellen bietet sich die Nutzung dieser Sachverhalte als vorteilhaft an. Oft führen diese Sachverhalten jedoch zu Ausführungsfehlern, da sie aufgrund des korrekten Syntax vom Compiler nicht als Fehler gemeldet werden und beim Suchen dementsprechend nur schwer zu finden sind! Ggf. gibt der Compiler für einige Sachverhalte eine Warnung aus, so dass es vorteilhaft ist, Compiler-Warnings zu beachten!
Hinweise:
* Soll bewusst der Rückgabewert verworfen werden, so kann/sollte mit dem explizten Cast auf (void) der Rückgabewert explizit 'verworfen' werden. Dies ist u.A. hilfreiche bei Variablen, die (noch) nicht benutzt werden und der Compiler die Warning "unsued Variable" ausgibt:
:<syntaxhighlight lang="C">
(void)a; //Zur Vermeidung von Compiler-Warnings "Unused Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(void) {
return 4711;
}
int main(int argc,char *argv[]) {
int a;
(void)a; //Zur Vermeidung von Compiler-Warnings "Unsued Variable"
(void)(a+7); //hier eine explizte 'Ansage' der Verwerfung des Wertes
(void)func();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Mit der Anweisung <nowiki>[[nodiscard]]</nowiki> (ab C++17, ab C23) wird der Compiler angewiesen, dass der Aufrufer einer Funktion mit Rückgabewert der Rückgabewert entgegenzunehmen ist. Wird der Rückgabewert verworfen, so gibt der Compiler eine Fehlermeldung aus:
:<syntaxhighlight lang="C">
[[nodiscard]] int Client(int socket);
Client(5); ////Fehlermeldung, da Rückgabewert nicht verwendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
[[nodiscard]] int Client(int socket) {
return socket+1;
}
int Server(int socket) {
return socket+1;
}
int main(int argc,char *argv[]) {
Server(5); //keine Fehlermeldung
Client(5); //Fehlermeldung, da Rückgabewert nicht verwendet wird
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Sequence Point ===
Ein Sequenzpunkt (u.A. das abschließende Semikolon am Ende der Anweisung) ist nach dem Wikipedia Artikel {{w|lang=en|Sequence_point|Sequence Point}} definiert als der Punkt in der Ausführung eines Computerprogramms, an dem garantiert ist, dass alle Nebenwirkungen früherer Bewertungen durchgeführt wurden und noch keine Nebenwirkungen von nachfolgenden Bewertungen durchgeführt wurden.</br>
Sequenzpunkte führen somit zur Trennung der Abarbeitungsreihenfolge innerhalb von Ausdrücken. Das abschließende Semikolon am Ende eines Ausdruckes sorgt somit dafür, dass zunächst der vorangegangene Ausdruck abgearbeitet wird, bevor der nächste Ausdruck beachtet wird.</br>
Beschreibt das Semikolon explizit einen Sequenzpunkt, so gibt es auch andere Operatoren, die einen Sequenzpunkt beinhalten. Bei solchen Operatoren wird somit zunächst vollständig der erste Teilausdruck ausgewertet, bevor der nächste folgt. Zwei Beispiele für Operatoren mit Sequenzpunkt sind das logische Und <code>&&</code> und der <code>?</code>-Operator:
<syntaxhighlight lang="C">
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int func(int par) {
return printf("func(%d) called\n",par);
}
int main(int argc,char *argv[]) {
int a=0;
bool val = a++*5-1 && func(a);
//Der &&-Operator ist ein Sequenzpunkt, so dass zunächst
//der Ausdruck des linken Operators 'a++*5-1' vollständig berechnet wird,
//bevor der rechte Operator 'func(a)' ausgeführt wird.
//Wird beim logischen UND der linke Operator zu false ausgewertet,
//so kommt der rechte Operator nicht zur Ausführung!
int b=0,c=0;
c=c+++b*5+3 ? c++ : c--;
//Der ?-Operator beinhaltet zwei Sequenzpunkte. Zunächst wird
//der ganz linke Ausdruck 'c+++b*5+3 ausgewertet. Wird dieser
//zu TRUE ausgewertet, wird im Anschluss der mittlere Ausdruck 'c++'
//ausgewertet und der rechte Ausdruck 'c--' entfällt.
//Andernfalls wird nur der rechte Ausdruck ausgewertet
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein weiteres Beispiel ist der Komma-Operator. Hier teilt das Komma den Gesamtausdruck in mehrere Teilausdrücke auf, die nacheinander abgearbeitet werden (siehe
[[Programmieren in C/C++: Grundlagen#Komma-Operator | Komma-Operator]]).
=== Abarbeitungsreihenfolge ===
Die Abarbeitungsreihenfolge der Operatoren innerhalb eines Ausdruckes wird durch die Prioritätenliste/Rangfolge (siehe [[C-Programmierung: _Liste_der_Operatoren_nach_Priorität| C-Programmierung:Liste der Operatoren nach Priorität]]) vorgegeben. Operatoren mit höherer Priorität werden vor Operatoren mit niedriger Priorität ausgeführt. Die ()-Klammer hat die höchste Priorität:
<syntaxhighlight lang="C">
//Der Ausdruck
c = sizeof(x) + ++a / 3;
//wird aufgrund der Prioritäten wie folgt ausgewertet:
c= (sizeof(x)) + ( (++a) / 3);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=2;
int c;
int x=0;
c = sizeof(x) + ++a / 3;
printf("a=%d c=%d\n",a,c);
//Wird aufgrund der Prioritäten wie folgt ausgewertet:
a=2;
c= (sizeof(x)) + ( (++a) / 3);
printf("a=%d c=%d\n",a,c);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei identischer Priorität ergibt sich die Abarbeitungsreihenfolge aus der Assoziativität (L-R oder R-L):
<syntaxhighlight lang="C">
a=33 / 5 / 2;
//Wird aufgrund der L-R Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2;
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
a = b = c = d*2; //→ a=(b=(c=(d*2)));
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a;
a=33 / 5 / 2;
printf("a=%d\n",a);
//Wird aufgrund der Assoziativität wie folgt ausgewertet:
//a= (33 / 5) / 2
printf("a=%d\n",a);
//und damit zu 3 und nicht zu 16 (bei 33 / (5/2)) ausgewertet
int b,c,d=8;
a = b = c = d*2; //→ a=(b=(c=(d*2)));
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
a = b = 1+c = d; //→ a=(b=((1+c)=d)); //Compilerfehler, da
//1+c kein lvalue ist
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
An einigen Stellen gibt die C/C++ Spezifikation die Abarbeitungsreihenfolge nicht vor (indeterminately-sequenced), überlässt diese somit dem Compiler:
* Bei Funktionsaufrufen ist die Abarbeitungsreihenfolge der Parameter nicht spezifiziert:
:<syntaxhighlight lang="C">
//Quelle: C-Spec Kap. 6.5.2.2
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int f1(void) {
printf("f1 called\n");
return 1;
}
int f2(void) {
printf("f2 called\n");
return 2;
}
int f3(void) {
printf("f3 called\n");
return 3;
}
int f4(void) {
printf("f4 called\n");
return 4;
}
void func1(int par1,int par2) {
printf("func1(%d,%d) called\n",par1,par2);
}
void func2(int par1,int par2) {
printf("func2(%d,%d) called\n",par1,par2);
}
int main(int argc,char *argv[]) {
//Quelle: C-Spec Kap. 6.5.2.2
void (*pf[2])(int,int)={func1,func2};
//Aufrufruf einer Funktion, deren Parameter sich aus Funktionsaufrufen
//ergeben
(*pf[f1()]) (f2(), f3() + f4()); //pf -> Array von Funktionszeigern
//Die Funktionen f1,f2,f3 und f4 können in einer beliebigen Reihenfolge
//aufgerufen werden
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Per Postinkrement/-dekrement Operator sagt aus, dass für die eigentliche Operation der Wert der Variablen genutzt wird und im Anschluss die Variable erhöht / erniedrigt werden soll. Nach C-Spezifikation [C11 6.5.2.4] muss dies spätestens vor dem nächsten Sequence Point erfolgt sein. Der genaue Zeitpunkt innerhalb des Sequence Points ist jedoch nicht vorgegeben:
:<syntaxhighlight lang="C">
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int a=7;
int b=a++ + a; //Ergebnis Abhängig, ob das Postinkrement vor oder
//nach der Addition ausgeführt wird.
a=a++ + 1; //dito
printf("a=%d b=%d\n",a,b);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Innerhalb einer Initialisierungliste ist Abarbeitungsreihenfolge nicht spezifiziert:
<syntaxhighlight lang="C">
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
struct abc {int a,b,c;};
struct abc var={var.c=1,var.a=2};
printf("var={a=%d b=%d c=%d}\n",var.a,var.b,var.c);
//Gerne anderen Compiler auswählen, z.B. x86-64 icc...
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Compound-Statement ===
Ein Compound-Statement ist innerhalb der C-Spezifikation ein alternativer Ausdruck für ein block-scope. Dieser fasst mehrere Statements und Deklarationen zu einem Statement zusammen:
<code>
Syntax: {Declaration-or-statement-list/textsuperscript<sub>OPT</sub>}
</code>
Ein Block wird nicht wie bei einer Anweisung mit einem Semikolon abgeschlossen (Das angehängte Semikolon wäre dann eine separate leere Anweisung!).
Ein Block hat blockweite Sichtbarkeit (siehe [[Programmieren in C/C++: Grundlagen#Blockweite Sichtbarkeit | Blockweite Sichtbarkeit]]), , so dass hier definierte Variablen nur hier gültig sind. Deklarationen sind ebenfalls nur in dem Block gültig:
<syntaxhighlight lang="C">
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void foo(void) {
int var1;
{ //Block innerhalb von Block als Strukturierungswerkzeug
int var1; //Var1 'überdeckt' var1 des äußeren Blockes
struct xyz{int x,y,z;}; //Defintion eines Datentyps im Block
struct xyz var3;
void far(void); //Prototyp
far();
}
struct xyz var4; //KO, Datentyp hier nicht mehr bekannt
far(); //KO, Prototyp hier nicht mehr bekannt
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Verwendung findet das Compound-Statement a) als Strukturierungsmöglichkeit innerhalb von Funktionen (zur Darstellung, dass dieser Bereich 'zusammengehörig' ist) und b) an den Stellen, an denen C/C++ nur eine Anweisung erwartet. Dies sind bspw. die If- und die For-Anweisungen:
<syntaxhighlight lang="C">
for(..) Anweisung; //For-Schleife führt nur diese eine Anweisung aus
for(…) {Block} //For-Schleife führt Block (als eine Anweisung) aus
if(..) Anweisung; else Anweisung; //IF-Anweisung führt nur 'eine'
//Anweisung aus
if(..) {Block} else {Block} //IF-Anweisung führt Block aus
if( ) {Block}; else {Block}; //Semikolon ist eine separate
//Leer-Anweisung, so dass else
//nicht zur IF-Anweisung zugeordnet
//werden kann (2 Anweisungen vor Else)</syntaxhighlight>
=== Embedded Statement ===
Embedded Statements sind eine GNU-C Erweiterung (siehe [https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html GNU-C-Manual 3.18]). Da diese vom Autor als sehr nützlich angesehen und auch von diversen Compilern und auch in C++ unterstützt werden, werden diese nachfolgend beschrieben.
Ein Compound-Statement fasst mehrere Anweisungen zu einer Anweisung zusammen, hat jedoch kein Rückgabewert. Ein Embedded-Statement entspricht einem Compound-Statement mit der Ergänzung, dass dieser einen Rückgabewert hat, so dass ein Embedded-Statement überall dort eingesetzt werden kann, wo eine Operand erwartet wird.
<code>
Syntax: ({Declaration-or-statement-list<sub>OPT</sub>})
</code>
Der Rückgabewert (und Datentyp) wird nicht über eine return-Anweisung angegeben, sondern entstammt aus dem Rückgabewert der letzten Anweisung innerhalb der Liste:
<syntaxhighlight lang="C">
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var;
var={int par=7;} //KO Block hat keine Rückgabewert.
var=({int par=7; par++; par;}); //OK Embedded-Statement hat einen
//Rückgabewert, der sich aus der
//letzten Anweisung 'Par;' ergibt
//Hier 8.
printf("var=%d\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Ein Embedded-Statement ähnelt folglich einem Funktionsaufruf mit dem Unterschied, dass a) in der Tat kein Funktionsaufruf stattfindet und b) der Rückgabewert nicht mit return, sondern über die letzte Anweisung zurückgegeben wird. Der Anwendungsfall ist dort zu finden, wo eine Operand erwartet wird und mehrere Anweisungen zum Ermitteln des Operanden notwendig sind:
<syntaxhighlight lang="C">
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc,char *argv[]) {
int var1=8;
int b=({int d=var1++;d>10?10:d;});
if( ({int d=b;b=var1;b=d;}) > 1)
printf("Bedingung erfüllt");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Ein Embedded-Statement ist insbesondere bei Nutzung von Makros (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]) hilfreich
* Mittels eines Embedded-Statement kann eine anonyme Funktion/Lambdafunktion dargestellt werden:
<syntaxhighlight lang="C">
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {return a%2?a:0;} ; func;})
,arr);
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
void test(int (*fptr)(int),int arr[10]) {
for(int lauf=0;lauf<10;lauf++)
arr[lauf]=fptr(arr[lauf]);
}
int main(int argc, char *argv[]) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
//Aufruf mit einer anonymen Funktion
test( ({int func(int a) {printf("Called:%d\n",a);return a%2?a:0;} ; func;})
,arr);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Funktionen / Prozeduren ==
Funktionen/Prozeduren sind ein Strukturierungsmerkmal, so dass Teile der Funktionalität des Programmes wiederverwendbar sind. C/C++ unterscheidet nicht zwischen Funktionen (haben einen Rückgabewert, können damit als Operand in Ausdrücken verwendet werden) und Prozeduren (haben keine Rückgabewert, resp. Rückgabetyp void). <br/>
Mit jedem Aufruf einer Funktion wird für den zugehörigen Block ein eigener Stack-Kontext angelegt, so dass Funktionen sich selbst aufrufen können (Rekursion). Jeder Funktionsinstanz hat somit seinen eigenen lokalen Variablenbereich, teilen sich jedoch die globalen und die statisch lokalen Variablen.<br />
Mit dem Aufruf einer Funktion können Parameter übergeben werden, wobei die Übergabeparameter vom Aufrufer (Caller) durch den Aufruf in die lokalen Variablen des Aufgerufenen (Callee) kopiert/zugewiesen werden (Call by Value). Wird ein Zeiger übergeben, hat der Callee über die Dereferenzierung des Zeigers die Möglichkeit, die Variablen des Caller zu verändern (Call by Reference) (siehe Kap. [[Programmieren in C/C++: Zeiger #Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen).]]).
Hinweise:
* Die Klammerung hinter dem Funktionsnamen (<code>foo()</code>) zeigt an, dass es sich um einen Funktionsaufruf (Verzweigung der Programmausführung zu der Startadresse der Funktion) handelt:
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
foo(); //Klammern hinter dem Funktionsnamen bedeuten Aufruf der Funktion
</syntaxhighlight>
* Die Nutzung des Funktionsnamens ohne Klammerung (<code>foo</code>) gibt die Startadresse der Funktion zurück. Die Startadresse kann in einem Zeiger auf Funktionen gespeichert werden (siehe Kap. [[Programmieren in C/C++: Zeiger#Zeiger auf Funktionen | Zeiger:Zeiger auf Funktionen]]):
:<syntaxhighlight lang="C">
void foo(void) {printf("foo called");};
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
printf("foo called");
};
int main(int argc, char *argv[]) {
void (*fptr)(void)=foo; //Gibt Startadresse der Funktion zurück
//ohne diese aufzurufen
fptr(); //Aufruf der Funktion
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Deklaration/Definition vor dem ersten Aufruf der Funktion 'notwendig', damit Compiler die Übergabeparameter entsprechend bereitstellt und ggf. eine implizite Typkonvertierung durchführt (dito Rückgabewert). Die Angabe der Variablennamen können bei der Deklaration entfallen
* Die fehlende Angabe der Übergabeparameter bedeutet in C (bis einschl. C18), dass diese Funktion mit beliebigen Übergabeparametern aufgerufen werden kann und der Compiler keine Typprüfung durchführt:
:<syntaxhighlight lang="C">
int func(/*Keine Übergabeparameter angegeben*/) {...}
//kann wie folgt aufgerufen werden
func();
func(4);
func("hallo Welt",4.7);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func() {
printf("foo called\n");
};
int main(int argc, char *argv[]) {
func();
func(4);
func("hallo Welt",4.7);
//Ab C23 hat sich die Bedeutung geändert.
//Zum Testen C-Versionsvorgabe -sdc=xxx unter Compiler-options aendern
return 0;
} | execCompilerOptions=-Wall -std=c17|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:→ unbedingt vermeiden<br />
:Hat die Funktion keinen Übergabewert, so wird dies in C mit void gekennzeichnet
* In C++ bedeutet die Schreibweise ohne Datentypbeschreibung, dass keine Parameter erwartet werden
* In der Parameterliste von Funktionen dient in der GNU-C Spezifikation das Semikolon zum Trennen zwischen Deklaration von Übergabeparameter und den Übergabeparametern. Alle Übergabewerte links vom Semikolon sind (Forward)deklarationen:
:<syntaxhighlight lang="C">
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Aufruf
test1(3,7); //a=7 b=3
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim);
//Aufruf
test2("hallo",6);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void test1(int a; int b,int a) {
// Forward; Parameter
printf("a=%d b=%d\n",a,b);
}
//Sinnvoll im Umgang mit Variable Length Arrays
void test2(int dim; const char str[dim], int dim) {
printf("dim=%d\n",dim);
}
int main(int argc, char *argv[]) {
//Aufrufe
test1(3,7); //a=7 b=3
test2("hallo",6);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Return-Anweisung ===
Mit der Return-Anweisung wird eine Funktion (vorzeitig) beendet. Der optionale Parameter dient der Angabe des Rückgabewertes der Funktion an den Aufrufer. Der Datentyp des Parameters ergibt sich aus dem Rückgabedatentyp der Funktion.
<code>
Syntax: return expression<sub>OPT</sub>
</code>
Der Rückgabewert expresion sagt aus, dass hier nicht nur Konstanten oder Variablen stehen können, sondern ein komplexer Ausdrücke erlaubt ist. Der resultierende Datentyp des Ausdruckes sollte dem Rückgabedatentyp der Funktion entsprechen, andernfalls wird eine implizite Typkonvertierung vollzogen (sofern möglich):<syntaxhighlight lang="C">
int foo(double a, double b) {
return (int)(a*a+b*b);
}
</syntaxhighlight>
Hinweise:
* Bei nicht void-Funktionen ist eine return-Anweisung mit einer Expression entsprechend dem Datentyp der Funktion zwingend notwendig:
:<syntaxhighlight lang="C">
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
double a=func(); //int wird in double konvertiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int func(void) {
return 5.1; //Datentyp wird zuvor int konvertiert
}
int main(int argc, char *argv[]) {
double a=func(); //int wird in double konvertiert
printf("a=%f\n",a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei einer void-Funktion ist die return-Anweisung ohne Expression optional. Hier entspricht der schließende Block der Return-Anweisung
:<syntaxhighlight lang="C">
void func(char *str) {
if(str==NULL)
return;
printf("%s",str);
}
</syntaxhighlight>
Sollen mehr als ein Rückgabewert an den Aufrufer zurückgegeben werden so empfiehlt sich:
* die Rückgabewerte in einer Struktur zu packen (siehe [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++) |Datentypen:Verbundtyp Struktur/Klasse (nur C++)]])
* die Rückgabewerte über die Aufrufparameter als Call-by-Reference zu übergeben (siehe [[Programmieren in C/C++: Zeiger#Zeiger bei Funktionsaufrufen | Zeiger:Zeiger bei Funktionsaufrufen]])
==== Rückgabewert aus Datentypsicht ====
Aus Datentypsicht kann der Funktionsname inkl. den Parameter(n) in einem Ausdruck mit dem Datentyp des Rückgabewertes der Funktion ausgetauscht werden:
<syntaxhighlight lang="C">
int foo(void) {return 4711;}
int var;
var=1+foo(); //Aus Datentypsicht (int)=(int)+(int)
</syntaxhighlight>
Daraus ergibt sich, dass bei Arrays/Strukturen/Unions direkt auf einzelne Komponenten zugegriffen werden kann, ohne diese zuvor einer Variablen zuzuweisen:
<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
if(foo(12).x == 12) printf("Identisch\n");
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
if(far(3)[2] == 2) printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <stdlib.h>
struct xyz{int x,y,z;};
struct xyz foo(int par) {
struct xyz var;
var.x=var.y=var.z=par;
return var;
}
int *far(size_t par) {
int *ret=malloc(par*sizeof(int));
for(size_t lauf=0;lauf<par;ret[lauf]=lauf,lauf++);
return ret;
}
int main(int argc, char *argv[]) {
if(foo(12).x == 12)
printf("Identisch\n");
if(far(3)[2] == 2)
printf("Identiisch\n");
//Hinweis: Funktion erzeugt aufgrund des fehlenden free's
//ein MemoryLeak
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
==== Fehlerrückgabe ====
Viele Funktionen können unter gewissen Umständen nicht korrekt ausgeführt werden. Z.B. aufgrund dessen, dass:
* der benötigter Speicher vom Heap nicht bereitgestellt werden kann
* Übergabeparameter außerhalb des zulässigen Wertebereiches liegen
* angeforderte Ressource (Datei, Geräte, …) nicht vorhanden/verfügbar sind
Solche Fälle gilt es dem Aufrufer mitzuteilen, da in diesen Fällen die vom Aufrufer geforderte Funktionalität nicht erfüllt ist und der Aufrufer ggf. nicht weiterarbeiten kann. Zur Mitteilung des Fehlers sollte vorrangig der Rückgabewerte genutzt werden. (auch wenn in C++ mit Exception eine Alternative hierzu bereitsteht)
<syntaxhighlight lang="C">
char *strdup(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup1(char *src) {
char *dst;
if((dst=malloc(strlen(src)+1))==NULL)
return NULL;
strcpy(dst,src);
return dst;
}
int main(int argc, char *argv[]) {
char *dup=strdup1("hallo");
if(dup == NULL)
printf("Fehler\n");
else
printf("dup='%s'\n",dup);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Standard-C Library-Funktionen geben in diesem Fall zumeist ein -1 (Rückgabewert Ganzzahl) oder einen NULL-Zeiger (Rückgabewert Zeiger) zurück. Der genaue Fehlergrund ist dann ergänzend in der globalen Variablen errno gespeichert. Mittels der Standard-C Funktion strerror() kann die Zahl in einen für den Anwender/Programmierer lesbaren String umgewandelt werden (die GNU-C Library Funktion printf() bietet ergänzend den Conversion Spezifier %m als alternative Ausgabemöglichkeit an):
<syntaxhighlight lang="C">
#include <errno.h>
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY|O_CREAT|O_EXCL,
S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int var;
if(-1==scanf("%d",&var) ) printf("Es wurde keine Zahl erkannt\n");
int ret=open("/etc/ptmp",O_WRONLY{{!}}O_CREAT{{!}}O_EXCL,
S_IRUSR{{!}}S_IWUSR{{!}}S_IRGRP{{!}}S_IROTH);
if(-1==ret)
printf("open failed() with %s\n",strerror(errno));
if(-1==ret)
printf("open failed() with %m (nur glibc)\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'''Für eine sauber Programmierung sollte diese Methodik generell angewendet werden.''' Jede Funktion, welche Fehlschlagen kann, teilt dies per Rückgabewert dem Aufrufer mit. Der Rückgabewert einer jeden Funktion wird vom Aufrufer kontrolliert.
=== Main-Funktion ===
Mit Start der Anwendung übergibt das Betriebssystem die Kontrolle an die Anwendung und führt dort die Funktion main aus. Als Übergabe- und Rückgabeparameter sind folgende Varianten erlaubt:
<syntaxhighlight lang="C">
int main(void) { }
int main(int argc, char *argv[]) { }
</syntaxhighlight>
Mit dem Start der Anwendung kann, wie bei jedem Funktionsaufruf, Parameter an den startenden Prozess übergeben werden. Die Parameter werden als Array von Strings übergeben. Im Parameter argc ist die Anzahl der Strings enthalten. Im Parameter argv[0..argc-1] sind die einzelnen Strings enthalten. Sofern vorhanden ist im ersten String der Programmname/Aufrufname der Anwendung enthalten:
<syntaxhighlight lang="C">
int main(int argc, char *argv[]) {
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++)
printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int max_width=0;
int ret;
//Variante 1: Darstellung des Inhaltes des Arrays von Strings
for(int lauf=0;lauf < argc; lauf++) {
ret=printf("%d.Parameter: '%s'\n",lauf,argv[lauf]);
max_width=ret>max_width ? ret : max_width;
}
//Trennzeichen drucken
char term[max_width];
memset(term,'-',max_width);
printf("%.*s\n",max_width-1,term);
//Variante 2: Darstellung des Inhaltes des Arrays von Strings
(void)argv; //Wird hier nicht benötigt
for(char **str=argv;*str!=NULL;str++)
printf("Parameter: '%s'\n",*str);
return EXIT_SUCCESS;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Im Compiler-Explorer können die Parameter im Executor unter 'Execution Arguments', getrennt mit Leerzeichen eingegeben werden.
Wird die Funktion main beendet, entweder über die return Anweisung oder den Aufruf der exit() Funktion, wird die Kontrolle zurück an den startenden Prozess (zumeist Shell) gegeben. Über den Rückgabewert wird im Allgemeinen dem Aufrufer der Fehlerstatus mitgeteilt (EXIT_SUCCESS oder 0 bedeutet fehlerfreie , EXIT_FAILURE oder Werte ungleich 0 fehlerhafte Ausführung).
Hinweise:
* Der Return-Wert der main-Funktion kann mit >>echo $? in der Bash abgefragt werden
* Mittels <code>exit(int status)</code> kann das Programm an jeder Stelle innerhalb des Programms beendet werden. <code>status</code> entspricht dann der expression der return Anweisung von main()
* Ungeachtet des Rückgabedatentyps int bei der Defintion der main() Funktion beträgt der zulässige Wertebereich für Linux Anwendungen 0..255. Der korrekte Rückgabedatentyp der main() Funktion müsste somit 'unsigned char' lauten
=== Inline Funktion ===
Wie der Name inline andeutet, ist die Intention von Inline, dass die aufgerufen Funktion Bestandteil der aufrufenden Funktion ist. Die aufgerufene Funktion soll somit im Kontext des Aufrufers ausgeführt werden, so dass kein eigener Stack bereitgestellt werden muss. Der Start der Funktion kann somit schneller erfolgen:
<code>
inline int foo(void) { }
</code>
Das Funktionseinbindung/zusammenführung erfolgt durch den Compiler (und nicht durch den Linker). Damit das inline vom Compiler ausgeführt werden kann, muss die zu inlinende Funktion vor dem Aufruf definiert sein, d.h. sie muss in derselben C-Datei oder in einer der einzubindenden Header-Dateien enthalten sein [C11 6.7.4].
Hinweis:
* Das 'inlinen' von Funktionen über die eigene Objektdatei hinweg erfolgt in C/C++ über Link Time Optimization (LTO). Hierzu fügt der Compiler den Zwischencode mit in die Objektdatei, so dass der Linker das 'inlinen' vollziehen kann (siehe {{w|lang=en|Interprocedural_optimization| Interprocedural Optimization}})
=== Variadic Function / Ellipsis Punctuator ===
Mit dem Ellipsis Puncturator '…' kann in Funktionsdefinitionen angegebenen werden, dass an dieser Stelle beliebig viele Parameter/Argumente übergeben werden können. Dies wird unter anderen in der printf() Anweisung genutzt:
<syntaxhighlight lang="C">
int printf(const char *fmt, ... );
</syntaxhighlight>
Die wie folgt aufgerufen werden kann:
<syntaxhighlight lang="C">
printf("Hello World"); //es folgt kein Parameter
printf("%d",100); //es folgt ein Parameter vom Datentyp int
printf("%f",1.1); //es folgt ein Parameter vom Datentyp double
printf(conststr,1,2,3,"xyz") //Ohne Worte
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World\n"); //es folgt kein Parameter
printf("%d\n",100); //es folgt ein Parameter vom Datentyp int
printf("%f\n",1.1); //es folgt ein Parameter vom Datentyp double
const char *conststr="%d %x %c '%s'\n";
printf(conststr,1,2,33,"xyz"); //Ohne Worte
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Bei der Parameterübergabe wird der Datentyp nicht mit übergeben, so dass die aufgerufene Funktion keine Möglichkeit hat, den Datentype der Parameter zur Laufzeit zu ermitteln. Einzig werden bei Aufruf der variadischen Funktion so viel Bytes auf den Stack gelegt, wie der Datentyp der einzelnen Übergabeparameter groß ist:
:<code>int --> 4 Byte</code>
:<code>double --> 8 Bytes</code>
:<code>Zeiger --> 4/8 Byte</code>
Damit die aufgerufene Funktion die fehlende Datentypinformation dennoch mitgeteilt bekommt, erfolgt dies am Beispiel der printf Funktion über den Format-String:
<syntaxhighlight lang="C">
int vari;
printf("%d",vari); //%d erwartet einen Integer Übergabeparameter (4-Byte)
size_t vars;
printf(" %zu %d ", vars, vari); // %zu zur Mitteilung, dass anstatt
//integer nun size_t als Datentyp übergeben wird
//und somit anstatt 4 Bytes 8 Bytes vom Stack genommen werden
</syntaxhighlight>
<code>printf()</code> entnimmt entsprechend der Datentypbeschreibung im Formatstring die passende Anzahl an Bytes vom Stack.
Da der Compiler für die optionalen Parameter nicht den Zieldatentyp kennt, erlaubt die C-Spezifikation als Übergabedatentypen hier nur die Grunddatentypen <code>signed int, unsigned int, long, long long, double</code> und <code>Zeiger</code>. Entspricht der übergebene Parameter nicht einen dieser Datentypen, so wird er mittels implizit Cast entsprechend nachfolgender Tabelle gewandelt [C11 6.5.2.2 Default Argument Promotions]:
{| class="wikitable"
|-
! Ausgangstyp !! Umwandlungstyp
|-
| char, signed char, short || int
|-
| unsigned char, unsigned short || unsigned int
|-
| float || double
|-
| Alle anderen Datentypen || bleiben erhalten
|}
Bspw.:
<syntaxhighlight lang="C">
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Über den Length-Modifier Parameter im Formatstring kann printf mitgeteilt
//werden, dass von dem übergebenem Integerwert weniger Bytes zu
//interpretieren sind
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
signed char varc=-1;
float varf =0.1;
printf("%d %f",varc, varf); //varc wird beim Aufruf nach int konvertiert!
//varf wird beim Aufruf nach double konvertiert!
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
Zum Umgang mit dem variadischen Parameter stellt C die Funktionen <code>va_start(), va_arg(), va_copy()</code> und <code>va_end()</code> bereit. Auf Grundlage des dazugehörigen Datentyps <code>va_list</code> können variadische Parameter auch an Unterfunktionen weitergereicht werden (bspw vprintf()). Dieses Thema bedingt jedoch genaue Kenntnisse vom Umgang mit dem Stack und ist nicht Bestandteil dieser Vorlesung.
=== Funktion in Funktion ===
Die GNU-C Reference (nicht C++) erlaubt es, Funktionen innerhalb von Blöcken (und damit innerhalb von Funktionen) zu definieren. Diese innere Funktion steht dann nur in diesem Block zur Verfügung und kann von außerhalb des Blockes nicht aufgerufen werden. Als Gimmick können Funktionen in Funktionen auf die zuvor definierten lokalen Variablen der inkludierenden Funktion zugreifen:
<syntaxhighlight lang="C">
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(void) {
{
int label=1;
//Funktion innerhalb einer Funktion
void dummy(void){
label++; //Zugriff auf Variablen des umschließenden Blockes
}
dummy(); //Aufruf der nur in diesem Block gültigen Funktion
}
dummy(); //KO, Funktion hier nicht mehr gültig
}
int main(int argc,char *argv[]) {
foo();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Variable Length Array (VLA) ==
Im Normalfall ergibt sich die Anzahl der Elemente eines Arrays aus einer Konstanten, so dass der Compiler zur Compilezeit passend Speicher reserviert (siehe Kap. [[Programmieren in C/C++: Array | Array]]):
<syntaxhighlight lang="C">
int arr[4]; //Compiler reserviert für Variable arr
//4*sizeof(int) Speicherplatz
</syntaxhighlight>
Bei Variable Lenght Array wird die Arraydimension nicht über eine Konstante, sondern über eine Variable oder einen Ausdruck angegeben. D.h. die tatsächliche Dimension des Arrays ergibt sich erst zum Ausführungszeitpunkt der Definition:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //Arraydimension ergibt sich zum Ausführungszeitpunkt
n++; //Nachträgliches Ändern von n ändert nicht
//die Größe des Arrays!
}
</syntaxhighlight>
Ein Variable Length Array kann nur als lokale Variable oder als Übergabeparameter definiert werden (wobei im letzteren Fall kein Speicher hiermit reserviert wird). Eine Initialisierung eines VLA's mit der Definition ist nicht möglich, d.h. nach der Definition beinhaltet das Array 'zufällige' Werte. Es empfiehlt sich daher, diese bspw. mit memset händisch zu initialisieren (siehe auch Kap [[Programmieren in C/C++: Array#Initialisierung | Array:Initialisierung]]):
<syntaxhighlight lang="C">
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
void foo(size_t n) {
char str[n];
memset(str,0,n*sizeof(char)); //Array mit 0 füllen
for(size_t lauf=0;lauf<n;lauf++)
printf("str[%zu]=%d\n",lauf,str[lauf]);
}
int main(int argc, char *argv[]) {
foo(4);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Mittels sizeof kann weiterhin der Speicherbedarf ermittelt werden, wobei sizeof mit einem VLA als Argument kein Konstantenausdruck ist. Stattdessen wird die Größe zur Laufzeit ermittelt:
<syntaxhighlight lang="C">
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void foo(size_t n) {
int arr[n*2+1]; //VLA
size_t size;
size=sizeof(arr); //sizeof(arr) entspricht einem Funktionsaufruf
//welcher die Speichergröße des VLA's ermittelt
printf("size=%zu\n",size);
}
int main(int argc, char *argv[]) {
foo(5);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
VLA wurden erstmals in C mit C99 eingeführt. In C11 wurden VLA's als optional eingestuft und mit C23 zurück auf notwendig gesetzt. In C++ sind VLA's nicht definiert, werden jedoch vom GCC Compiler unterstützt. Als alternativen Datentyp wird hier std::array empfohlen.
Hinweis:
* VLA sind nicht direkt in einem Switch-Case Block definierbar. Wird hier ein VLA benötigt, so muss hierzu ein Block erzeugt werden:
:<syntaxhighlight lang="C">
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int value=argc;
switch(value) {
case 1:
char arr1[value]; //Compilerfehler, da bei value!=1 kein Speicherplatz
//für das VLA reserviert wird
break;
case 2: {
char arr2[value]; //OK
}
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Operatoren ==
In der Programmiersprache C sind folgende Punctuators [C11 6.4.6] definiert:
<syntaxhighlight>
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |= , # ##
<: :> <% %> %: %:%:
</syntaxhighlight>
Die Funktionalitäten sind identisch zu Java. Aufgrund des Datentyps Zeiger gibt es in C ergänzend den Punctuator <code>-></code> (siehe Kap [[Programmieren in C/C++: Datentypen#Verbundtyp Struktur/Klasse (nur C++)|Datentypen:Verbundtyp Struktur/Klasse (nur C++)]]). Der Präprozessor bedingt die beiden Punctuatoren <code>#</code> und <code>##</code> (siehe Kap [[Programmieren in C/C++: Präprozessor | Präprozessor]]).
Die letzten 6 Punctuators <code><: :> <% %> %: %:%:</code> werden zu <code>[ ] { } # ##</code> ersetzt. Sie sind für Computersysteme gedacht, welche keine ALTGR-Taste besitzen.<br />
Java kennt ergänzend den <code>>>></code> Operatoren, welcher in C über den normalen Schiebebefehl und den zugrundeliegenden Datentyp gesteuert wird.
Wie in Java sind einige Punctuators vom Kontext abhängig und haben damit unterschiedliche Funktionalitäten:
<syntaxhighlight>
++ → (Postfix) ++ vs. ++(Präfix)
-- → (Postfix) -- vs. --(Präfix)
+/- → Vorzeichen vs. Addition/Subtraktion
() → Funktionsaufruf() vs. Befehlsbestandteil if() vs. Priorisierung
</syntaxhighlight>
Für den Umgang mit dem Datentyp Zeiger besitzen einige Punctuatoren ergänzende Funktionalitäten (siehe Kap [[Programmieren in C/C++: Zeiger| Zeiger]]):
<syntaxhighlight>
& → Bitweises UND:
Anwendung: Ganzahlausdruck & Ganzahlausdruck
& → Adressoperator:
Anwendung: &Variable
* → Multiplikation
Anwendung: Ganzahl-/Gleitkommaausdruck * Ganzahl-/Gleitkommaausdruck
* → Datentyp Zeiger
Anwendung: Datentyp * Variablenname;
* → Dereferenzierung:
Anwendung: * Zeiger
</syntaxhighlight>
Punctuatoren, welche von Java abweichende / ergänzende Funktionalitäten haben, werden nachfolgend gesondert beschrieben.
Sind in einer Anweisung mehrere Operatoren enthalten, so hängt die Abarbeitungsreihenfolge von der Rangfolge/Priorität der Operatoren ab (siehe [[Programmieren in C/C++: Grundlagen#Abarbeitungsreihenfolge | Abarbeitungsreihenfolge]]).<br />
Die Rangfolge ist identisch zu Java, wobei C mehr Operatoren kennt. Generell empfiehlt sich, lieber eine Klammer zu viel als zu wenig zusetzen. Klammern haben die höchste Priorität.
=== Zuweisungs-Operator ===
Die Zuweisung ('='-Operator, assignment expression) weist dem L-Value den R-Value zu.
Der Zuweisungs-Operator gibt den L-Value als Rückgabewert der Zuweisung zurück, so dass mehrere Zuweisungen in einem Ausdruck möglich sind. Die Abarbeitungsreihenfolge ist von rechts nach links (R-L Assoziativität). Wird der 'letzte' Rückgabewert nicht verwendet, so wird dieser verworfen (siehe Kap. [[Programmieren in C/C++: Grundlagen#Discarded Value / null statement | Discarded Value / null statement]]).<br />
Beispiel:
<syntaxhighlight lang="C">
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
//der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
//Compilerfehler geworfen wird
x*=y=z //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a,b,c=3,d=4;
int x,y,z;
a=7; //Zuweisung
a=b=7; //Erste Zuweisung (b=7) hat einen Rückgabewert, welcher im
//Anschluss a zugewiesen wird
if(a=7) //Variablen a wird der Wert 7 zugewiesen. Der Rückgabewert
; //der Zuweisung wird im Anschluss auf True oder False geprüft
if(7=a) //Besser, da aufgrund der fehlerhafter Zuweisung ein
; //Compilerfehler geworfen wird
x*=y=z; //entspricht x=x*(y=z)
a=b=d+7; //entspricht a=(b=(d+7))
a=b==c; //a bekommt das boolesche Ergebnis der Vergleichsoperation
//zugewiesen return 0;
a=7+b=8; //Fehler, da der Zuweisungs-Operator die zweitniedrigste Priorität hat
//Abarbeitungsreihenfolge: a=(7+b)=8 -> 7+b kann keinen Wert zugewiesen werden
a=7+(b=8);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* Auf beiden Seiten der Zuweisung muss der identische Datentyp stehen. Wenn andernfalls eine implizite Typkonvertierung nicht möglich ist, gibt der Compiler einen Fehler aus:
:<syntaxhighlight lang="C">
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a = 7.3; //implizite Typkonvertierung
double b=a+3; //Implizite Typkonvertierung der Intergeraddition nach double
float c=(float)a+(float)3; //Explizite Typkonvertierung
char *d=a; //Compilerfehler, da Integerwert nicht implizit in einen
//Zeiger konvertiert werden kann
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
(void)b;
(void)c;
(void)d;
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
* Bei der Parameterübergabe beim Funktionsaufruf wird ebenfalls indirekt der Zuweisungs-Operator angewendet. Die Parameter des Aufrufers werden per Zuweisung den lokalen Variablen der aufgerufenen Funktion zugewiesen
:<syntaxhighlight lang="C">
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int a, float b) {
printf("a=%d b=%f",a,b);
}
int main(int argc, char *argv[]) {
int x=4;
float y=5.0;
func(x,y); //der Inhalt der Variablen x wird der lokalen Variable a
//(a=x) und der Inhalt der Variablen y der lokalen Variablen b
//(b=y) zugewiesen.
func(y,x); //Dito, mit der Ergänzung, dass eine implizite Typkonvertierung
//stattfindet (a=(int)y) und (b=(float)x).
//Zur Darstellung der besagten Konvertierung siehe rechtes Fenster
return 0;
} | execCompilerOptions=-Wall|
h=g
}} Öffnen im Compiler Explorer] }}
=== Komma-Operator ===
Der Komma-Operator erlaubt es, zwei Ausdrücke auszuführen, wo nur einer erlaubt wäre. Die Ergebnisse/Rückgabewerte aller durch diesen Operator verknüpften Ausdrücke, außer dem letzten werden verworfen. Der letzte Ausdruck dient als Rückgabewert.
Folgendes gilt es bei der Nutzung des Komma-Operators zu beachten:
* Der Komma-Operator wird von links nach rechts ausgewertet (L-R Assoziativität)
* Das Komma selbst stellt eine Sequence Point dar (siehe Kap [[Programmieren in C/C++: Grundlagen#Sequence Point|Sequence Point]])
* An Stellen, wo das Komma zum Syntax gehört (z.B. Trennung der Übergabeparameter bei der Funktionsdefinition und beim Funktionsaufruf, Trennung von Variablen bei der Variablendefinition/-deklaration, Trennung der enum Konstanten) muss der Ausdruck ergänzend geklammert werden, wenn der Komma-Operator gefordert ist
* Der Komma-Operator hat von allen Operatoren die niedrigste Priorität/Rangfolge, so dass dieser Operator als letztes 'ausgewertet' wird
Beispiel:
<syntaxhighlight lang="C">
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
int c=1,d=2,e=3;
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
void func(int value){}
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
void func(int value){
printf("func called with %d\n",value);
}
int main(int argc, char *argv[]) {
int a=(5,3); //5 wird verworfen, 3 dient als Rückgabewert, so dass
//a den Wert 3 erhält.
int b=5,3; //KO, da das Komma hier zur Trennung der Variablen dient
//und nicht als Komma-Operator fungiert
printf("a=%d\n",a);
int c=1,d=2,e=3;
printf("c=%d,d=%d,e=%d\n",c,d,e);
int f=(c+=2,a+a); //c um zwei erhöht, a+a in f
printf("c=%d,f=%d\n",c,f);
int g= c+=2,a+a; //KO, da Komma Bestandteil der Defintion ist
func(1); //Funktion wird mit dem Wert 1 aufgerufen
func(1,2); //KO, da Komma Bestandteil des Funktionsaufrufes ist
func((1,2)); //Funktion wird mit dem Wert 2 aufgerufen
int arr[12];
arr[3,4]=1; //3 wird verworfen, 4 dient als Index für das Array
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
'Sinnvolle' Anwendungsbeispiele:
* Bei For-Schleifen, so dass mehrere Variablen initialisiert und mehrere Variablen mit jedem Schleifendurchlauf geändert werden können:
:<syntaxhighlight lang="C">
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf]);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int sum,lauf;
int arr[]={5,4,3,2,1};
for(sum=100,lauf=5 ; lauf ; lauf--,sum+=arr[lauf])
printf("sum=%d lauf=%d\n",sum,lauf);
printf("sum=%d\n",sum);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der Return-Anweisung, bei welcher zur Darstellung der Zusammengehörigkeit mehrere Aktionen ausgeführt werden sollen:
:<syntaxhighlight lang="C">
return errno=EINVAL,-1;
return printf("Fehler"),-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <errno.h>
int foo(void) {
return errno=EINVAL,-1;
}
int far(void) {
return printf("Fehler\n"),-1;
}
int main(int argc, char *argv[]) {
printf("foo()=%d\n",foo());
printf("far()=%d\n",far());
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* An Stellen, wo nur eine Anweisung erlaubt ist (und man zu faul ist, einen Block zu öffnen)
:<syntaxhighlight lang="C">
if(…) y=2,z=3;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int y=0,z=0;
if(1) y=2,z=3;
printf("y=%d z=%d\n",y,z);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In vielen Ländern wird das Komma zur Darstellung von Gleitkommazahlen genutzt. Wird versehentlicher Weise dies in C/C++ übernommen, so führt dies zu einem unerwarteten Verhalten:
:<syntaxhighlight lang="C">
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
double var;
var=5.3; //Variable wird mit 5.3 initialisiert
printf("var=%f\n",var);
var=5,3; //KO, da Komma Bestandteil der Defintion ist
var=(5,3); //Variable wird mit 3 initialisiert
printf("var=%f\n",var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== ?-Operator / Conditional-Operator ===
Operator mit 3 Operanden, welcher in Abhängigkeit des ersten Ausdruckes den zweiten oder dritten Ausdruck ausführt und dessen Rückgabewert zurückgibt.
<code>
Syntax: Logical-OR-expression ? expression : condition-expression
</code>
Entspricht der if()-Anweisung, wobei der ?-Operator als solches einen Wert zurückgibt! <code>Expression</code> wird nur ausgeführt, wenn <code>Logical-OR-Expression</code> zu true ausgewertet wird. Andernfalls wird <code>condition-expression</code> ausgeführt. Der zurückgegebene Datentyp ergibt sich aus der <code>expression</code> resp. <code>condition-expression</code>. '''Beide Ausdrücke sollten somit einen identischen resultierenden Datentyp besitzen!'''
Folgendes gilt es bei der Nutzung des ?-Operators zu beachten:
* Der Datentyp <code>expression</code> und <code>condition-expression</code> sollte identisch sein:
<syntaxhighlight lang="C">
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=5;
a=a > 10 ? "String" : 4; //KO, "String" ist vom Datentyp (char*) und
// 4 ist vom Datentyp (int).
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Nach der GNU-C Reference kann der mittlere Ausdruck fehlen. In diesem Fall wird stattdessen das Ergebnis des linken Operanden dort eingesetzt (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals)
<syntaxhighlight lang="C">
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=13;
int b=a>10 ? : 0; //wenn a > 10 wird true, andernfalls false zurückgegeben
printf("b=%d\n",b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* In der Abarbeitungsreihenfolge liegt der ?-Operator oberhalb der Komma- und des Zuweisungsoperators. Soll im <code>condition-expresion</code> Ausdruck der Komma- oder Zuweisung-Operator genutzt werden, so ist <code>condition-expression</code> zu klammern. Andernfalls bedingt die niedrige Priorität des Komma-Operators ein anders Verhalten, als erwartet:
<syntaxhighlight lang="C">
int a=7,max=5,var;
max=a>max ? a : max; //Alles bestens
var= a>5 ? a++,5:6; //Alles bestens
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int a=7;
int max=5;
max=a>max ? a : max; //Alles bestens
printf("max=%d\n",max);
int var;
var= a>5 ? a++,5:6; //Alles bestens
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :6,a=1; //Komma- und Zuweisungsoperator haben
//niedrigere Priorität, so das der
printf("var=%d a=%d\n",var,a);
var=(a>5 ? a++ :6),a=1; //Ausdruck wie folgt interpretiert wird
printf("var=%d a=%d\n",var,a);
var= a>5 ? a++ :(6,a=1); //Andernfalls Klammerung hilfreich!
printf("var=%d a=%d\n",var,a);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die Nutzung des ?-Operators empfiehlt sich an diversen Stellen:
* Bei Makros:
:<syntaxhighlight lang="C">
#define MAX(a,b) (a>b?a:b)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
int main(int argc, char *argv[]) {
printf("MAX(4,5)=%d\n",MAX(4,5));
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Beim Fehlerhandling:
:<syntaxhighlight lang="C">
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str=strstr("hallo123","lox");
//Ausgabe von str nur, wenn Suche erfolgreich (str!=NULL) war
printf("%s",str!=NULL?str : "(not found)" );
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion ausgeführt wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn ret==0 ist
//andernfalls wird ret zurückgegeben
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 0;
}
int init2(void) {
printf("init2() called\n");
return 0;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //im Fehlerfreien gibt init1() 0 zurück
ret=ret?:init2(); //Aufruf von init2() nur wenn Ret==0 ist
//andernfalls wird Ret zurückgegeben
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Logische Verknüpfungen ===
Alle logischen Operationen nutzen als Operanden Ganzzahlen ,Gleitkommazahlen oder Zeiger. Der Operand wird als false angesehen, wenn der Operand 0, 0.0 oder NULL ist. Andernfalls als true. Das Ergebnis ist immer vom Datentyp int und hat den Wert von 0 oder 1.
<code>Syntax: Expression && Expression</code><br />
<code>Syntax: Expression || Expression</code><br />
<code>Syntax: ! Expression</code><br/>
Bei der logischen UND und ODER Verknüpfung wird zuerst der linke Ausdruck ausgewertet (Operator ist ein Sequence Point). Der rechte Ausdruck wird nur ausgeführt, wenn:
* bei der logischen UND Verknüpfung der linke Ausdruck TRUE ergab
* bei der logische OR Verknüpfung der linke Ausdruck FALSE ergab
Andernfalls steht das Ergebnis schon mit der Auswertung des linken Operanden fest.<br />
In der theoretischen Informatik wird dies 'Non-strict-evaluation' genannt, bei welcher der Rückgabewert feststeht, bevor alle Ausdrücke bearbeitet worden sind.
Beispiel für das Verhalten des Ausbleibens der Auswertung des zweiten Operators:
<syntaxhighlight lang="C">
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a || ++a)
b=1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0,b=0;
//a=-1; //Als alternativer Startwert
if(++a {{!}}{{!}} ++a)
b=1;
printf("a=%d b=%d\n",a,b);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Diese Funktionalität ist insbesondere beim Umgang mit Fehlern vorteilhaft:
* Prüfen, ob eine Variable einen gültigen Wert hat, bevor sie weiterverwendet wird
<syntaxhighlight lang="C">
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str = strstr("hallo123","la");
if(str!=NULL && strlen(str) )
printf("Len = %ld",strlen(str));
else
printf("Kein Substring im String gefunden\n");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Prüfen, ob eine Funktion erfolgreich ausgeführt wurde, bevor eine weitere Funktion aufgerufen wird:
<syntaxhighlight lang="C">
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int init1(void) {
printf("init1() called\n");
return 1;
}
int init2(void) {
printf("init1() called\n");
return 1;
}
int main(int argc, char *argv[]) {
int ret;
ret=init1(); //Bei erfolgreicher Initialisierung wird 1 zurückgegeben
ret=ret && init2();
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Bitweise Verknüpfungen ===
Alle bitweisen Operationen nutzen als Operanden Ganzzahlen. Bei vorzeichenbehafteten Zahlen ist das Ergebnis nach [C11 6.5] Implementierungsabhängig, wobei das Vorzeichenbit zumeist als eigenständiges Bit angesehen wird und bei UND/ODER/EXOR als normales BIT betrachtet wird.
<code>Syntax: Ganzzahl & Ganzzahl → Bitweise UND Operation</code><br />
<code>Syntax: Ganzzahl | Ganzzahl → Bitweise ODER Operation</code><br />
<code>Syntax: Ganzzahl ^ Ganzzahl → Bitweise EXOR Operation</code><br />
<code>Syntax: ~ Ganzzahl → Bitweise Negierung</code><br />
<code>Syntax: Ganzzahl >> additive-expression</code><br />
<code>Syntax: Ganzzahl << additive-expression</code><br />
Mittels des Schiebeoperators können '''Ganzzahlen''' um <code>additive-expression</code> bitweise nach Links <code><<</code> oder Rechts <code>>></code> verschoben werden. Der resultierende Datentyp ergibt sich aus dem linken Operanden. Der rechte Operand muss positiv und der Wert kleiner gleich der Bitbreite des linken Operanden sein. Andernfalls ist das Ergebnis implementierungsspezifisch.
Nach [C11 6.5.7] ist das Ergebnis der Schiebeoperation implementierungsspezifisch, wenn der linke Operand eine negative vorzeichenbehaftete Zahl ist. In der Regel wendet der Compiler jedoch folgende Schiebeoperation an:
* Logisches Schieben (zu füllende Bit-Stellen werden mit 0 aufgefüllt), wenn der linke Operand einen vorzeichenlosen Datentyp hat
* Arithmetisches Schieben (zu füllende Bit-Stelle beim Rechtsschieben wird mit dem Vorzeichenbit aufgefüllt), wenn der linke Operand ein vorzeichenbehaftete Datentyp ist. Hiermit wird das Vorzeichen beibehalten, so dass eine negative Zahl nach dem Schieben weiterhin negativ ist (In Java erfolgt dies durch den >>> - Operator)
Hinweis:
* Ein Schieben um eine Stelle nach rechts entspricht einer Division durch 2
* Ein Schieben um eine Stelle nach links entspricht einer Multiplikation mit 2
=== sizeof-Operator ===
Der sizeof-Operator dient zur Ermittlung des Speicherbedarfs (in Bytes) einer Variablen/eines Datentyps.
<code>Syntax: sizeof (type-name)</code><br />
<code>Syntax: sizeof unary-expression</code><br />
Als Argument für den Sizeof-Operator kann wahlweise ein Datentyp, eine Variable oder ein Ausdruck genutzt werden. Sizeof gilt als Konstantenausdruck, d.h. seine Berechnung erfolgt durch den Compiler, sodass:
* sizeof zur Initialisierung von globalen Variablen genutzt werden
:<syntaxhighlight lang="C">
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
struct xyz{int x,y,z;};
size_t size=sizeof(struct xyz); //3*sizeof(int)=12
int main(int argc, char *argv[]) {
printf("size=%zu\n",size);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* bei einem Ausdruck dieser nicht ausgeführt wird, sondern nur der resultierende Datentyp bestimmt wird und dessen Größe zurückgegeben
:<syntaxhighlight lang="C">
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
short var=4711;
size_t size=sizeof var++; //var=4711, size=2
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Der resultierende Datentyp des Rückgabewertes ist <code>size_t</code>.
Es empfiehlt sich, den sizeof-Operator mit Klammern zu nutzen, andernfalls gibt sizeof bei Anwendung auf einen Ausdruck die Größe des linken Operators zurück:
<syntaxhighlight lang="C">
size_t size;
short var;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
size_t size;
short var=0;
size=sizeof var+0; //size=2, da sizeof auf var angewendet wird
printf("size=%zu var=%d\n",size,var);
size=sizeof(var+0); //size=4, da sizoeof auf den resultierenden datentyp
//angewendet wird
printf("size=%zu var=%d\n",size,var);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweise:
* sizeof angewendet auf char gibt immer den Wert 1 zurück.
* sizeof ist nicht auf Operanden vom Typ Funktion, void, Felder ohne Größenangabe und Bitfelder anwendbar
* wird sizeof auf ein VLA angewendet, so entspricht sizeof nicht mehr einen Konstantenausdruck, sondern einem Funktionsaufruf
:<syntaxhighlight lang="C">
void foo(int n) {
int arr[n];
size_t size=sizeof(arr); //Speicherbedarf ist kein Konstantenausdruck
//sondern wird zur Laufzeit berechnet
</syntaxhighlight>
* Sizeof entspricht nicht strlen(), da sizeof die Größe des für die Variable reservierten Speicherbereich zurückgibt und nicht wie strlen() den Inhalt des Speicher hinsichtlich des Stringendezeichens auswertet:
:<syntaxhighlight lang="C">
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[100]="Test";
printf("%zu\n",sizeof(string)); //100
printf("%zu\n",strlen(string)); //4
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Anweisungen ==
=== If-Anweisung ===
<code>Syntax: if (expression) statement</code><br />
<code>Syntax: if (expression) statement else statement</code><br />
Das Ergebnis des Ausdruckes (Ganzzahl, Gleitkommazahl oder Zeiger) wird auf ungleich 0, 0.0 oder NULL getestet. Trifft dies zu, so wird <code>statement</code> ausgeführt. Andernfalls wird das <code>else statement</code> ausgeführt, sofern vorhanden. Sollen mehrere Anweisungen ausgeführt werden, so sind diese mittels Block zusammenzufassen (diesen dann bitte nicht mit ; abschließen).
Beispiel:
<syntaxhighlight lang="C">
if(a==1)
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
if(a) //entspricht a!=0
if(printf("hallo")<0) //prüfen, ob printf() fehlschlägt
if( ({int dummy=a;a=b;b=dummy;})==6)
if(a=7) //Zuweisung!
if(7=a) //KO, Eine Konstante kann kein L-Value sein
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1,b=2;
if(a==1)
printf("a==1\n");
if(a=1) //Erst Zuweisung, dann prüfen der Rückgabe der Zuweisung
printf("a=1\n");
if(a) //entspricht a!=0
printf("a\n");
if(printf("hallo\n")<0) //prüfen, ob printf() fehlschlägt
printf("printf()\n");
if( ({int dummy=a;a=b;b=dummy;})==6)
printf("({...})\n");
if(a=7) //Zuweisung!
printf("a=7\n");
if(7=a) //KO, Eine Konstante kann kein L-Value sein
;
if(7==a)
{printf("a ist 7");}; //Semikolon hinter Blocksope ist eine zweite
else //Anweisung, so dass die ELSE Anweisung nicht
{printf("Compilerfehler");};//zur IF-Anwesigung zugeordnet werden kann.
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Bei der Anweisung <code>if(a==7)</code> finden aus syntaktischer Sicht zwei Aktionen statt. Zunächst wird geprüft, ob a gleich 7 ist. Dieser Vergleich liefert true(=1) oder false(=0) zurück. Die If-Anweisung prüft im Anschluss, ob das Argument true oder false ist.
=== For-Anweisung ===
<code>Syntax: for(Initialisierungsteil<sub>OPT</sub> ; Test<sub>OPT</sub> ; Fortsetzung<sub>OPT</sub>) Statement</code>
Die For-Anweisung wird vom Compiler wie folgt umgesetzt:
<poem> '''Initialisierungsteil'''<sub>OPT</sub>
Goto Next
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
'''Statement'''
Continue:
'''Fortsetzung'''<sub>OPT</sub>
Next:
if('''Test'''<sub>OPT</sub>) goto Goon
Break:
</poem>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
for(summe=lauf=0;lauf<20;lauf++)
summe+=lauf;
printf("summe=%d\n",summe);
//Initialisierungsteil
summe=lauf=0;
goto Next;
Goon:
//Continue-Anweisung entspricht goto Continue
//Break-Anweisung entspricht goto Break;
//Statement
summe+=lauf;
Continue: __attribute__((unused))
//Fortsetzung
lauf++;
Next:
//if(TestOPT) goto Goon
if(lauf<20) goto Goon;
Break: __attribute__((unused))
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Die einzelne Elemente haben folgende Bedeutung/Besonderheiten:
;Initialisierungsteil: Zum Initialisieren von Schleifenvariablen, wird einmalig mit Beginn der FOR-Anweisung ausgeführt:
:* kann einen beliebigen '''Ausdruck''' oder alternativ eine '''Deklaration''' (ab C99 und in C++) enthalten. Im Falle einer Deklaration ist/sind die dort definierte Variablen nur innerhalb der for-Schleife gültig/sichtbar
:* kann Leer sein, dann erfolgt keine Initialisierung
;Testteil: Hierin wird vor jedem Schleifendurchlauf geprüft, ob die Schleifenbedingung erfüllt ist. Wenn die Bedingung nicht erfüllt ist (Ganzzahl, Gleitkommazahl oder Zeiger gleich 0,0.0 oder NULL), wird die For-Schleife beendet.
:* Kann leer sein, dann wird dieser Teil als true angesehen
;Fortsetzungsteil: Wird nach jeden Schleifendurchlauf ausgeführt. In der Regel sollte hier die Schleifenvariable aktualisiert werden
:* Kann leer sein
;Statement: In der Schleife auszuführender Ausdruck
:* Sollen mehrere Ausdrücke ausgeführt werden, so sind diese in einem Block zusammen zu fassen.
Ergänzende Anweisungen innerhalb des Statements/Block
* <code>continue</code> zum Fortsetzen des Schleifendurchlaufes, d.h. Sprung zum Fortsetzungs-Teil
* <code>break</code> zum Beenden des Schleifendurchlaufes
Beispiele:
* For-Schleife mit Ausdruck im Initialisierungsteil
:<syntaxhighlight lang="C">
unsigned int zahl=0b100010;
unsigned int mask,bits;
for(mask=0b10000000,bits=mask&0; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
//Schleifenvariable mus keine Zählvariable sein!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
unsigned int zahl=0b100010;
unsigned int mask,bits;
for(mask=0b10000000,bits=mask&0; mask!=0; mask>>=1 )
bits+= zahl & mask ? 1 : 0;
//Schleifenvariable mus keine Zählvariable sein!
printf("Anzahl Einsen in %b = %d\n",zahl,bits);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* For-Schleife mit Deklaration im Initialisierungsteil und break-Anweisung
:<syntaxhighlight lang="C">
char string[]="hallo";
size_t size=0;
for(size_t lauf=0; lauf < strlen(string); lauf++) {
if(string[lauf]=='A') break;
size++;
}
//Variable lauf ist außerhalb der Schleife nicht mehr gültig!
// Dadurch ist im Nachgang nicht direkt feststellbar, ob die Schleife
// bis zum Ende gelaufen ist oder durch break beendet wurde
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
// strlen() aufgerufen wird!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t size1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++) {
if(string1[lauf]=='A') break;
size1++;
}
//Variable lauf ist außerhalb der Schleife nicht mehr gültig!
// Dadurch ist im Nachgang nicht direkt feststellbar, ob die Schleife
// bis zum Ende gelaufen ist oder durch break beendet wurde
//Schleife ist Suboptimal, da in jedem Durchlauf die Funktion
// strlen() aufgerufen wird!
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t size2=0;
//Funktionsaufrufe mit konstanten Ergebnis vor die Schleife verlegen
size_t lauf_max=strlen(string2);
for(size_t lauf=0; lauf < lauf_max; lauf++) {
if(string2[lauf]=='A') break;
size2++;
}
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",size1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",size2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Schleife, bei welcher die gesamte Aktion innerhalb der For-Anweisung ausgeführt wird
:<syntaxhighlight lang="C">
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;
src[l]!=0 && l <sizeof(dest);
printf("l=%zu\n",l),dest[l]=src[l],l++);
//Beliebige Ausdrücke im Test- und Fortsetzungsteil möglich!
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char dest[5];
char src[10]="HalloWelt";
for(size_t l=0;src[l]!=0 && l <sizeof(dest); printf("l=%zu\n",l),dest[l]=src[l],l++);
//Beliebige Ausdrücke im Test- und Fortsetzungsteil möglich!
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zeiger als Schleifenvariable
:<syntaxhighlight lang="C">
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char src[]="hallo";
char dst[strlen(src)+1];
char *s,*d;
for(s=src,d=dst; *s; )
*d++=*s++;
*d=0;
printf("src='%s' dst='%s'\n",src,dst);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Auch wenn einige Compiler bei eingeschalteter Optimierung die Fähigkeit besitzen, Funktionsaufrufe innerhalb des Test- und Fortsetzungsteil vor die Schleife zu verschieben (siehe: [https://xania.org/202512/13-licking-licm Loop-Invariant Code Motion]), so sollten Funktionsaufrufe an diesen Stellen vermieden werden. Einerseits zeugt dies von schlechten Programmierstiel und andererseits führt dies bei ausgeschalteter Optimierung zu Performanceeinbußen:
:<syntaxhighlight lang="C">
for(size_t lauf=0;lauf<strlen("hallo");lauf++)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(size_t lauf=0; lauf < strlen(string1); lauf++)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
size_t count2=strlen(string2);
for(size_t lauf=0; lauf < count2; lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Zur Geschwindigkeitssteigerung sollte im Testteil auf 0 abgefragt werden, d.h. die Schleifenvariable dekrementiert werden:
:<syntaxhighlight lang="C">
for(int lauf=700000;lauf;lauf--)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <time.h>
struct timespec diff_timespec(const struct timespec *minuend,
const struct timespec *subtrahend ) {
struct timespec diff = {
.tv_sec = minuend->tv_sec - subtrahend->tv_sec,
.tv_nsec = minuend->tv_nsec - subtrahend->tv_nsec};
//Sekundenüberlauf?
if (diff.tv_nsec < 0) {
diff.tv_nsec += 1000000000;
diff.tv_sec--;
}
return diff;
}
int main(int argc, char *argv[]) {
char string1[10000];
char string2[10000];
memset(string1,'a',sizeof(string1));
memset(string2,'a',sizeof(string2));
string1[sizeof(string1)-1]=0;
string2[sizeof(string2)-1]=0;
struct timespec start1,stop1;
struct timespec start2,stop2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start1);
size_t sum1=0;
for(ssize_t lauf=700000000;lauf;lauf--)
sum1++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start2);
size_t sum2=0;
for(ssize_t lauf=0;lauf<700000000;lauf++)
sum2++;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&stop2);
stop1=diff_timespec(&stop1,&start1);
stop2=diff_timespec(&stop2,&start2);
printf("Slow: Sum1=%zu Time=%lds %ldns\n",sum1,stop1.tv_sec,stop1.tv_nsec);
printf("Fast: Sum2=%zu Time=%lds %ldns\n",sum2,stop2.tv_sec,stop2.tv_nsec);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Alternativ zu einer Laufvariablen empfiehlt sich die Nutzung von Pointer als Schleifenvariable:
:<syntaxhighlight lang="C">
for(char *ptr=str; *ptr; ptr++);
</syntaxhighlight>
* Verzweigungsbefehle sind einige der langsamsten Maschinenbefehl. Zur Vermeidung von diesen Maschinenbefehle 'entrollen' die Compiler bei eingeschalter Optimierungen und bekannter kleiner Anzahl von Schleifendurchläufe die For-Schleife (siehe: [https://xania.org/202512/10-loop-unrolling Unrolling Loops])
:<syntaxhighlight lang="C">
for(int lauf=4;lauf;lauf--)
sum+=arr[lauf];
//wird aufgrund bekannter Anzahl der Schleifendurchläufe wie folgt entrollt
sum+=arr[4];
sum+=arr[3];
sum+=arr[2];
sum+=arr[1];
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
#include <string.h>
int arr[5];
void arr_init(void) {
memcpy(arr,(int []){1,2,3,4,6},sizeof(arr));
}
int main(int argc, char *argv[]) {
arr_init();
int sum;
sum=0;
for(int lauf=4;lauf;lauf--)
sum+=arr[lauf];
printf("sum=%d\n",sum);
//wird aufgrund bekannter Anzahl der Schleifendurchläufe wie folgt entrollt
sum=0;
sum+=arr[4];
sum+=arr[3];
sum+=arr[2];
sum+=arr[1];
printf("sum=%d\n",sum);
//Zur Darstellung von Loop-Runling Compiler-Option -O0 auf -O1 ändern
return 0;
} | execCompilerOptions=-Wall -O0|
h=c|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== While-Anweisung ===
<code>Syntax: while(expression) Statement </code><br />
<code>Syntax: do Statement while(expression);</code><br />
Die While-Anweisungen werden vom Compiler wie folgt umgesetzt:
{| class="wikitable"
! while()-Anweisung !! do while()-Anweisung
|-
| <poem>
Continue:
if(!'''expression''')
goto Break;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
'''Statement'''
goto Continue;
Break:
</poem> ||
<poem>
GoOn:
//Break-Anweisung entspr.
// goto Break;
//Continue-Anweisung ent.
// goto Continue;
'''Statement'''
Continue:
if('''expression''')
goto GoOn;
Break:
</poem>
|}
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=
#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf;
int summe;
lauf=summe=0;
while(lauf<10) {
if(lauf>=5)
break;
lauf++;
if(lauf<3)
continue;
summe+=lauf;
}
printf("summe=%d\n",summe);
lauf=summe=0;
Continue1:
if(!(lauf<10))
goto Break1;
//Break-Anweisung entspricht
// goto Break;
//Continue-Anweisung entspr.
// goto Continue;
//Statement
if(lauf>=5) {
goto Break1;
}
lauf++;
if(lauf<3)
goto Continue1;
summe+=lauf;
goto Continue1;
Break1:
printf("summe=%d\n",summe);
lauf=summe=0;
do {
lauf++;
if(lauf>5)
break;
if(lauf<3)
continue;
summe+=lauf;
} while(lauf<10);
printf("summe=%d\n",summe);
lauf=summe=0;
GoOn2:
//Break-Anweisung entspr.
// goto Break
//Continue-Anweisung ent.
// goto Continue
//Statement
lauf++;
if(lauf>5)
goto Break2;
if(lauf<3)
goto Continue2;
summe+=lauf;
Continue2:
if(lauf<10)
goto GoOn2;
Break2: __attribute__((unused));
printf("summe=%d\n",summe);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Folgendes gilt es bei der Nutzung der While-Anweisung zu beachten:
* Soll mehr als ein Statement innerhalb der while-Schleife ausgeführt werden, so sind diese in einem Block zu schreiben
* Statement kann eine Leeranweisung (gekennzeichnet durch ein Semikolon) sein
:<syntaxhighlight lang="C">
while(1);
do ; while(1);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int lauf1=1000;
while(lauf1--);
int lauf2=1000;
do ; while(lauf2--);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Bei der do-while-Schleife ist das abschließende Semikolon Bestandteil des Befehls
* expression muss eine Ganzzahl, Gleitkommazahl oder Zeiger zurückgeben, der bei False (0, 0.0 oder NULL) die Schleife beendet.
Beispiele:
* Endlosschleife
:<syntaxhighlight lang="C">
while(1) {}
</syntaxhighlight>
* Schleife zum Durchlaufen eines String
:<syntaxhighlight lang="C">
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[]="string";
char *ptr=str;
while(*ptr++);
size_t len=ptr-str-1;
printf("Stringlänge=%zu\n",len);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
=== Switch-Anweisung ===
<code>Syntax: switch(expression) statement</code><br />
<code>Syntax: statement:= case constant-expression: statement<sub>opt</sub> default: statement<sub>opt</sub></code><br />
Die Switch-Anweisung entspricht einer verschachtelten If-Anweisung, mit der Besonderheit, dass der auszuführende Code nicht im If-Zweig stattfindet, sondern dort ein goto zum eigentlichen Code enthalten ist:
{| class="wikitable"
! Switch-Anweisung !! Compilerumsetzung
|-
|<syntaxhighlight lang="C">
switch(a) {
case 1:
int a=7;
//Code
break;
case 2:
printf("%d",a);
case 3: {
int a;
//Code
}
case 4 ... 8:
default:
//Code
}
</syntaxhighlight>
||<poem>
if(a==1)
goto label1;
else if(a==2)
goto label2;
else
goto label_default;
//-------------------
label1:
//Code
goto label_break;
label2:
//Code
label_default:
goto label_break;
label_break:
</poem>
|}
Folgendes gilt es bei der Nutzung der Switch-Anweisung zu beachten:
* <code>Expression</code> muss zu einer Ganzzahl (int, short, char, long, long long) oder enum (entspricht einer Ganzzahl) ausgewertet werden
* <code>constant-expression</code> muss eine Ganzzahl-Konstante oder ein Enumelement sein. Sie darf nicht doppelt im Block vorkommen. Der genaue Datentyp ergibt sich aus dem Datentyp der <code>expression</code>
* Lt. Spezifikation ist ein nur <code>statement</code> hinter der switch-Anweisung erlaubt, so dass nur ein <code>case</code> Fall oder der <code>default</code> Fall bedient werden kann::<syntaxhighlight lang="C">
int var=1;
switch(var) case 1: printf("hallo");
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) case 1: printf("hallo");
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Die geschweifte Klammer der <code>switch</code>-Anweisung erzeugt einen Block, so dass a) hier mehrere <code>case</code>-Fälle und b) hierin definierte Variablen innerhalb des gesamten Blocks zur Verfügung stehen (sind somit nicht <code>case</code> abhängig). Die <code>case</code> Anweisung ist nichts anderes als eine Sprungmarken (welche durch die switch-Anweisung angesprungen wird) so dass der Initialisierungsteil der lokalen Variablen übersprungen / nicht ausgeführt werden kann:
:<syntaxhighlight lang="C">
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("%d %d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
break;
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=1;
switch(a) {
int a=3; //Variable in gesamten Block gültig
case 1:
int b=3; //Variabe in gesamten Block gültig
printf("a=%d b=%d",a,b); //a undefiniert, b=3
break;
case 2:
printf("%d %d",a,b); //a und b undefiniert
break;
case 3: { //Block, so dass Variable
int a=4711; //nur in diesem CASE gültig ist
(void)a;
break;
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* GNU-C (siehe [https://www.gnu.org/software/c-intro-and-ref/manual/html_node/switch-Statement.html Switch-Statement]) erlaubt ergänzend zur Angabe einer Konstante die Angabe eines Wertebereiches:
:<syntaxhighlight lang="C">
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=2;
switch(a) {
case 1 ... 8: //Leerzeichen zwischen den Konstanten zwingend notwendig
//andernfalls wird der Punkt zur Konstante zugehörig
//interpretiert (erzeugt dann eine Gleitpunktkonstante)
printf("a im Bereich von 1 bis 8\n");
break;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* <code>break</code> ist optional. Mittels <code>break</code> wird an das Ende der Switch-Anweisung gesprungen. Wenn <code>break</code> weggelassen wird, wird die nachfolgende Anweisungen ausgeführt. Ggf. gibt der Compiler eine Warning aus. Mittels der GCC-Compiler-Anweisung __attribute__((fallthrough)); kann diese Warning unterdrückt werden:
:<syntaxhighlight lang="C">
switch(a) {
case 0: //ggf. Compiler-Warning
__attribute__((fallthrough)); case 1:
case 2:
break;
}
</syntaxhighlight>
* Ein Variable Length Array ist als Variable im Switch-Block direkt nicht erlaubt. Ist dies notwendig, so ist das VLA in einem inneren Block zu kapseln:
:<syntaxhighlight lang="C">
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
case 1:
int arr[var]; //KO
break;
case 2: {
int arr[var]; //OK
}
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Case - Anweisungen sind nichts anderes als Sprungmarken (Labels), so dass CASE-Anweisungen überall innerhalb des Switch-Blockes stehen können:
:<syntaxhighlight lang="C">
int prime(int value) {return value+1;}
void hallo(int var) {
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int prime(int value) {
return value+1;
}
int main(int argc, char *argv[]) {
int var=1;
switch(var) {
default:
if(prime(var))
case 2: case 4:
printf("%d",var);
else {
case 3: case 6:
printf("%x",var);
}
case 7:
printf("xyz");
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:oder anderen Anweisungen innerhalb des Switch-Blockes enthalten sein können:
:<syntaxhighlight lang="C">
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++;
case 7: *dst = *src++;
case 6: *dst = *src++;
case 5: *dst = *src++;
case 4: *dst = *src++;
case 3: *dst = *src++;
case 2: *dst = *src++;
case 1: *dst = *src++;
}while(--n>0);
}
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h> //fuer uintptr_t
void send(register char *dst,
register char *src,
register size_t count)
{
register char unsigned n=(count+7)/8;
switch(count%8) {
case 0: do{ *dst = *src++; printf("%02hhx ",*dst);
case 7: *dst = *src++; printf("%02hhx ",*dst);
case 6: *dst = *src++; printf("%02hhx ",*dst);
case 5: *dst = *src++; printf("%02hhx ",*dst);
case 4: *dst = *src++; printf("%02hhx ",*dst);
case 3: *dst = *src++; printf("%02hhx ",*dst);
case 2: *dst = *src++; printf("%02hhx ",*dst);
case 1: *dst = *src++; printf("%02hhx ",*dst);
}while(--n>0);
}
}
int main(int argc, char *argv[])
{
char src[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
char dst;
send(&dst,src,20);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* Eine Switch-Case Anweisung über Strings sind in C/C++ nicht möglich:
:<syntaxhighlight lang="C">
switch(str) {
case "hallo":
return 1;
case "du da":
return 2;
case "xyz":
return 3;
default:
rReturn -1;
}
</syntaxhighlight>
:Ein direkte Lösungsansatz ist die Nutzung von strcmp() zum Vergleichen von String. Da strcmp zeichenweise den String vergleicht, ist dieser Ansatz langsam. Alternativ bietet sich an, von allen String einen Hash-Wert zu berechnen und zunächst diesen Hash-Wert zu kontrollieren. Da der Hash-Wert nicht eindeutig ist, muss ergänzend ein strcmp() erfolgen:
:<syntaxhighlight lang="C">
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
#include <stdint.h>
//Lösungsansatz von: https://stackoverflow.com/questions/2826559/compile-time-preprocessor-hashing-of-string
#define H1(s,i,x) (x*65599u+(uint8_t)s[(i)<strlen(s)?strlen(s)-1-(i):strlen(s)])
#define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x))))
#define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x))))
#define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x))))
#define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x))))
#define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16)))
#define HASH_LAUFZEIT(s) (H256(s,0,0))
//Eigener Lösungsatz zur Umsetzung des vorherigen HASH-Algorithmus
//so dass dieser zur Compilezeit berechnet werden kann
//Was fehlt ist die abschließende EXOR berechnung!
//Problem war, dass die Array-Dereferenzierung nicht zur Compilezeit
//aufelöst werden kann
#define HH0(a,x) (x*65599u+a)
#define HH1(a) HH0(a,HH0(0,HH0(0,HH0(0,0))))
#define HH2(a,b) HH0(b,HH0(a,HH0(0,HH0(0,0))))
#define HH3(a,b,c) HH0(c,HH0(b,HH0(a,HH0(0,0))))
#define HH4(a,b,c,d) HH0(d,HH0(c,HH0(b,HH0(a,0))))
#define HH4x(a,b,c,d,x) HH0(d,HH0(c,HH0(b,HH0(a,x))))
#define HH5(a,b,c,d,e) HH4x(b,c,d,e,HH4x(0,0,0,a,0))
#define HH6(a,b,c,d,e,f) HH4x(c,d,e,f,HH4x(0,0,a,b,0))
#define HH7(a,b,c,d,e,f,g) HH4x(d,e,f,g,HH4x(0,a,b,c,0))
#define HH8(a,b,c,d,e,f,g,h) HH4x(e,f,g,h,HH4x(a,b,c,d,0))
#define HH9(a,b,c,d,e,f,g,h,i) HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0)))
#define HH10(a,b,c,d,e,f,g,h,i,j) HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0)))
#define HH11(a,b,c,d,e,f,g,h,i,j,k) HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0)))
#define HH12(a,b,c,d,e,f,g,h,i,j,k,l) HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0)))
#define HH13(a,b,c,d,e,f,g,h,i,j,k,l,m) HH4x(j,k,l,m,HH4x(f,g,h,i,HH4x(b,c,d,e,HH4x(0,0,0,a,0))))
#define HH14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) HH4x(k,l,m,n,HH4x(g,h,i,j,HH4x(c,d,e,f,HH4x(0,0,a,b,0))))
#define HH15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) HH4x(l,m,n,o,HH4x(h,i,j,k,HH4x(d,e,f,g,HH4x(0,a,b,c,0))))
#define HH16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) HH4x(m,n,o,p,HH4x(i,j,k,l,HH4x(e,f,g,h,HH4x(a,b,c,d,0))))
#define EIGHTEENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, \
a11,a12,a13,a14,a15,a16,a17,a18, ...) a18
#define CONCAT(c,d) c ## d
#define CONCATI(a,b) CONCAT(a,b)
#define HASH_COMPILEZEIT(...) CONCATI(HH , EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0))(__VA_ARGS__)
//Lösungsansatz basierend auf: https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/preprocessor/macros/__VA_ARGS__/count-arguments
#define COUNT_ARGUMENTS(...) EIGHTEENTH_ARGUMENT(dummy, ## __VA_ARGS__, \
16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
int main(int argc, char *argv[]) {
char *str="hallo";
switch(HASH_LAUFZEIT(str)) {
case HASH_COMPILEZEIT('d','u'):
if(!strcmp(str,"du"))
printf("Case \"du\":\n");
break;
case HASH_COMPILEZEIT('h','a','l','l','o'):
if(!strcmp(str,"hallo"))
printf("Case \"hallo\"\n");
else if(!strcmp(str,"xyz"))
printf("String='xyz'\n");
break;
default:
return -1;
}
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
:Siehe:[https://benhoyt.com/writings/hash-table-in-c/ Hash Table in C]
== Label + Goto ==
=== Label ===
<code>Syntax: name:</code><br />
Labels dienen zur Kennzeichnung einer Anweisung, so dass die Programmausführung an dieser Stelle fortgesetzt, resp. mit einer GOTO-Anweisung angesprungen werden kann. Ein Label ist durch den folgenden Doppelpunkt gekennzeichnet. Dem Label muss eine Anweisung folgen, welches auch eine Leeranweisung (Semikolon) sein kann.
Folgendes gilt es bei der Nutzung von Labels zu beachten:
* Ein Label entspricht der Speicheradresse des der Label-Anweisung folgenden Anweisung
* Bei nicht genutzten Labels (mit goto nicht angesprungene Labels) gibt der Compiler eine Warning aus. Diese kann beim GCC-Compiler mit __attribute__((unused)) unterdrückt werden
* die Case- und die Default-Anweisung aus der Switch-Anweisung entspricht einem Label
<br />
Labels hat eine funktionsweite Sichtbarkeit (siehe Kap [[#Gültigkeit/Sichtbarkeit von Variablen| Gültigkeit/Sichtbarkeit von Variablen]]). Dies bedeutet, dass das:
* Labels nur innerhalb einer Funktion gültig ist
* Labels einen von Variablen/Funktionen/Datentypen unabhängigen Namensraum haben
* Kein Prototyp für ein Label notwendig ist, wenn es bei Nutzung über goto noch nicht gesetzt worden ist, also nach vorne gesprungen wird
=== goto ===
<code>Syntax: goto label;</code><br />
Mit der Goto-Anweisung wird die Programmausführung an der mit <code>label</code> gekennzeichneten Stelle fortgesetzt.
Folgendes gilt es bei der Nutzung von goto zu beachten:
* Mit einer <code>goto</code> Anweisung kann an eine beliebige Steller innerhalb der '''identischen''' Funktion gesprungen werden. Es kann nicht zu einem Label in einer anderen Funktion gesprungen werden (hierzu ist <code>setjmp()</code> und <code>longjmp()</code> zu nutzen)
* Mit der Goto Anweisung kann gleichermaßen in einen Block hinein, als auch herausgesprungen werden:
:<syntaxhighlight lang="C">
goto first_time;
for(;;) {
if(a>10)
goto last_time:
first_time:
a++;
}
last_time: ;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=0;
goto first_time;
for(;;) {
printf("a=%d\n",a);
if(a>10)
goto last_time;
first_time:
a++;
}
last_time: ; //Leeranweisung wäre hier nicht nötig
return 0; //da dem Label ein return folgt!
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Wird mit der <code>goto</code> Anweisung der Initialisierungsteil einer Variablen übersprungen, so ist zwar die Variable existent, beinhaltet aber nicht ihren Initialisierungswert
Beispiel:
<syntaxhighlight lang="C">
goto label1;
if(a==3) {
label2:
printf("True\n");
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int a=3;
goto label1;
if(a==3) {
label2:
printf("True\n");
a++;
}
else
label1:
{
printf("False\n");
}
if(a==3) goto label2;
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
Hinweis:
* In Java gibt es das Schlüsselwort goto, welches aber ohne Funktion ist. Es gibt jedoch Labels, die mit "break label" angesprungen werden können
=== Anwendungsbeispiele ===
Prinzipiell sind Goto-Anweisungen zu vermeiden. In einigen Anwendungsfällen erweist sich goto als nützlich:
* Nutzung nur einer <code>return</code> Anweisung in einer Funktionen
:<syntaxhighlight lang="C">
#include <unistd.h>
int input(int hdl,size_t buflen) {
int rc=-1;
unsigned char packettype;
if(read(hdl,&packettype,1) != 1)
goto exit;
unsigned short packetlen;
if(read(hdl,&packetlen,2) != 2)
goto exit;
if((1+packetlen) > buflen) {
rc=-2;
goto exit;
}
rc=packetlen;
exit:
return rc;
}
</syntaxhighlight>
* Konstruktor mit mehreren Initialisierungsteilen
:<syntaxhighlight lang="C">
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
}
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]) {
enum {INIT_2,INIT_1,INIT_START} fortschritt=INIT_START;
int *ptr1;
int *ptr2;
if(!(ptr1=malloc(10)))
goto end;
fortschritt=INIT_1;
if(!(ptr2=malloc(20)))
goto end;
fortschritt=INIT_2;
// ...
end:
switch(fortschritt) {
case INIT_2: free(ptr2); __attribute__((fallthrough));
case INIT_1: free(ptr1); __attribute__((fallthrough));
case INIT_START:
}
return (int)fortschritt;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
* Abbruch einer verschachtelten Schleife
:<syntaxhighlight lang="C">
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
</syntaxhighlight>
{{noprint|
[{{:Programmieren in C/C++:Vorlage:CompilerExplorerLink|example_c=#include <stdio.h>
int main(int argc, char *argv[]) {
int arr[10][10];
size_t zeile;
size_t spalte;
for(zeile=0;zeile<10;zeile++)
for(spalte=0;spalte<0;spalte++)
if(arr[zeile][spalte]==0)
goto label_end;
label_end:
if((zeile==0) && (spalte==0))
printf("Nichts gefunden");
else
printf("Gefunden an %zu %zu",zeile,spalte);
return 0;
} | execCompilerOptions=-Wall|
execCompilerOutputShown=true
}} Öffnen im Compiler Explorer] }}
== Sonstiges ==
=== ??-Trigraphs ===
Zeichenfolge bestehend aus 3 Zeichen beginnend mit 2 Fragezeichen.
Die beiden Fragezeichen entsprechen einem ESCAPE-Operator (siehe Kap [[#Char-Konstanten|Char-Konstanten]]), welcher das nachfolgende Zeichen durch ein anderes ASCII Zeichen ersetzt. Die Ersetzung findet auch innerhalb von Strings statt.<br />
Trigraphs wurden früher genutzt, als die ALTGR Taste noch nicht üblich war.
<syntaxhighlight>
??< → { ??> → }
??( → [ ??) → ]
??/ → \ ??! → |
??' → ^ ??- → ~
??= → #
</syntaxhighlight>
Bei neuer C Varianten muss zur Nutzung von Trigraphs der Compiler mittels -trigraphs aktiviert werden.
<noinclude>
{{Navigation zurückhochvor buch
|zurücklink=Programmieren in C/C++: Toolchain/Entwicklungsumgebung
|zurücktext=Toolchain/Entwicklungsumgebung
|hochlink=Programmieren in C/C++
|hochtext=Inhaltsverzeichnis
|vorlink=Programmieren in C/C++: Datentypen
|vortext=Datentypen}}
</noinclude>
4u92hhppy4ysw6pvl1hb26kax1xc26z
CPRT/cef7
0
119065
1090668
1090653
2026-09-10T20:08:27Z
Pelikam
111447
/* Herleitungen Energie E */
1090668
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\,\frac{\partial E}{\partial V} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
+ dS\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
+ dV\,\frac{\partial}{\partial V}\frac{\partial E}{\partial V} \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial \mu}{\partial N}
+ S\,\frac{\partial \mu}{\partial S}
+ V\,\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial p}{\partial N}
+ S\,\frac{\partial p}{\partial S}
+ V\,\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
mdxsj89v4hj7mfcyq35jwlsor8hs5gt
1090669
1090668
2026-09-10T20:18:37Z
Pelikam
111447
/* Herleitungen Energie E */
1090669
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial \mu}{\partial N}
+ S\,\frac{\partial \mu}{\partial S}
+ V\,\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial p}{\partial N}
+ S\,\frac{\partial p}{\partial S}
+ V\,\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
benxivi6xi5c56e6cioj7c4q826ou2v
1090670
1090669
2026-09-10T20:27:25Z
Pelikam
111447
/* Herleitungen Energie E */
1090670
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial (-V)}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial (-V)}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial (-V)}\left(dV\right) = d\frac{\partial V}{\partial (-V)} = d(-1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial (-V)}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial (-V)}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial \mu}{\partial N}
+ S\,\frac{\partial \mu}{\partial S}
+ V\,\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial p}{\partial N}
+ S\,\frac{\partial p}{\partial S}
+ V\,\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
bf1llkdwmndw9zfxhnsxnf7lujjina8
1090671
1090670
2026-09-10T20:40:48Z
Pelikam
111447
/* Herleitungen Energie E */
1090671
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial (-V)}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial (-V)}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial (-V)}\left(dV\right) = d\frac{\partial V}{\partial (-V)} = d(-1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial (-V)}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial (-V)}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial \mu}{\partial N}
+ S\,\frac{\partial \mu}{\partial S}
+ V\,\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial p}{\partial N}
+ S\,\frac{\partial p}{\partial S}
+ V\,\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
9ucmb8uw3yswwlc3j46m1h11inkwwtq
1090673
1090671
2026-09-10T20:55:44Z
Pelikam
111447
/* Herleitungen Energie E */
1090673
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial (-V)}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial (-V)}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial (-V)}\left(dV\right) = d\frac{\partial V}{\partial (-V)} = d(-1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial (-V)}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial (-V)}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial p}{\partial N}
+ S\,\frac{\partial p}{\partial S}
+ V\,\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
7b94qled1tntd5m0ve0l0pqf9yp2c2i
1090674
1090673
2026-09-10T21:02:51Z
Pelikam
111447
/* Herleitungen Energie E */
1090674
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial (-V)}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial (-V)}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial (-V)}\left(dV\right) = d\frac{\partial V}{\partial (-V)} = d(-1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial (-V)}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial (-V)}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial p}{\partial N}
+ S\,\frac{\partial p}{\partial S}
+ V\,\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
kbyhtnfcdglnmjdoypmas7kuw1eims3
1090675
1090674
2026-09-10T21:12:23Z
Pelikam
111447
/* Herleitungen Energie E */
1090675
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial (-V)}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial (-V)}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial (-V)}\left(dV\right) = d\frac{\partial V}{\partial (-V)} = d(-1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial (-V)}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial (-V)}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial V}
- \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
g4f8h5jfen5d21bs6qw2eviup5obh20
1090677
1090675
2026-09-10T21:36:54Z
Pelikam
111447
/* Herleitungen Energie E */
1090677
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial (-V)}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial (-V)}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial (-V)}\left(dV\right) = d\frac{\partial V}{\partial (-V)} = d(-1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial (-V)}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial (-V)}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial (-V)}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)}dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
nuk7yewpb09g2l10k0v2uo83ja0frf0
1090678
1090677
2026-09-10T21:50:46Z
Pelikam
111447
/* Herleitungen Energie E */
1090678
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (01)\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- dS\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- dS\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(dN\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(dS\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V} dE </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)} dE \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\mu - \mu = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,t - t = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
cap5bsf19iqnpfn2a89l002zighggia
1090679
1090678
2026-09-10T22:05:38Z
Pelikam
111447
/* Herleitungen Energie E */
1090679
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- dS\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- dS\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(dN\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(dS\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V} dE </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\mu - \mu = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,t - t = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|}
l09k5ytj89l7xocr8ugh56ezo6tynjv
1090680
1090679
2026-09-10T22:16:03Z
Pelikam
111447
/* Herleitungen Energie E */
1090680
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- dS\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- dS\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(dN\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(dS\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V} dE </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\mu - \mu = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,t - t = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial \,dE}{\partial N}
- S\frac{\partial \,dE}{\partial S}
- V\frac{\partial \,dE}{\partial V} = 0 </math>
|| <math> \qquad\qquad </math>
|}
cxeoq20yc7vanjpepld86y99lvnbgev
1090687
1090680
2026-09-11T09:05:24Z
Pelikam
111447
/* Herleitungen Energie E */
1090687
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- dS\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- dS\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(dN\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(dS\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V} dE </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\mu - \mu = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,t - t = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,d\left(N\frac{\partial E}{\partial N}\right)
- d\left(S\frac{\partial E}{\partial S}\right)
- d\left(V\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dE + dE = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (07)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \,dE}{\partial N}
+ S\frac{\partial \,dE}{\partial S}
+ V\frac{\partial \,dE}{\partial V} \neq dE </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\frac{\partial E}{\partial N}
+ S\,d\frac{\partial E}{\partial S}
+ V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\mu + S\,dt + V\,d(-p) = 0 </math>
|| <math> \qquad\qquad </math>
|}
iepwk0ajbipf121cwnyzvyhf5e3xx54
1090688
1090687
2026-09-11T09:17:57Z
Pelikam
111447
/* Herleitungen Energie E */
1090688
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- dS\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- dS\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(dN\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(dS\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V} dE </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (07)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> \neq </math>
|| <math> +\,N\frac{\partial \,dE}{\partial N}
+ S\frac{\partial \,dE}{\partial S}
+ V\frac{\partial \,dE}{\partial V} = 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\frac{\partial E}{\partial N}
+ S\,d\frac{\partial E}{\partial S}
+ V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\mu + S\,dt + V\,d(-p) = 0 </math>
|| <math> \qquad \leftarrow (06) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\mu - \mu = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,t - t = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,d\left(N\frac{\partial E}{\partial N}\right)
- d\left(S\frac{\partial E}{\partial S}\right)
- d\left(V\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dE + dE = 0 </math>
|| <math> \qquad\qquad </math>
|}
90liev9m5uyenc1qz2wvrjwqhk0zcj2
1090689
1090688
2026-09-11T09:19:50Z
Pelikam
111447
/* Herleitungen Energie E */
1090689
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
=== Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Beispielhafte Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- dS\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- dS\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(dN\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(dS\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V} dE </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (07)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> \neq </math>
|| <math> +\,N\frac{\partial \,dE}{\partial N}
+ S\frac{\partial \,dE}{\partial S}
+ V\frac{\partial \,dE}{\partial V} = 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\frac{\partial E}{\partial N}
+ S\,d\frac{\partial E}{\partial S}
+ V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\mu + S\,dt + V\,d(-p) = 0 </math>
|| <math> \qquad \leftarrow (06) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\mu - \mu = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,t - t = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,d\left(N\frac{\partial E}{\partial N}\right)
- d\left(S\frac{\partial E}{\partial S}\right)
- d\left(V\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dE + dE = 0 </math>
|| <math> \qquad\qquad </math>
|}
tged1yqauq8r7ddjxjtnovcydx0hj1o
1090690
1090689
2026-09-11T09:21:33Z
Pelikam
111447
/* Energie E */
1090690
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
== Energie E ==
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
=== Beispielhafte Herleitungen Energie E ===
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- dS\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- dS\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(dN\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(dS\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V} dE </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (07)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> \neq </math>
|| <math> +\,N\frac{\partial \,dE}{\partial N}
+ S\frac{\partial \,dE}{\partial S}
+ V\frac{\partial \,dE}{\partial V} = 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\frac{\partial E}{\partial N}
+ S\,d\frac{\partial E}{\partial S}
+ V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\mu + S\,dt + V\,d(-p) = 0 </math>
|| <math> \qquad \leftarrow (06) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\mu - \mu = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,t - t = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,d\left(N\frac{\partial E}{\partial N}\right)
- d\left(S\frac{\partial E}{\partial S}\right)
- d\left(V\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dE + dE = 0 </math>
|| <math> \qquad\qquad </math>
|}
d2s0f6qh5f3crgcx0g4g5kumtqeq1tu
1090691
1090690
2026-09-11T09:22:01Z
Pelikam
111447
/* Beispielhafte Herleitungen Energie E */
1090691
wikitext
text/x-wiki
[[CPRT|< Energie E - CPRT]]
== Energie E ==
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|}
== Beispielhafte Herleitungen Energie E ==
{|
|-
|| <math> (01)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,dN + t\,dS + p\,d(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial E}{\partial N}
+ dS\frac{\partial E}{\partial S}
+ dV\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\,\mu + dS\,t + d(-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(dN \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> dN\frac{\partial }{\partial N}\frac{\partial E}{\partial N},\quad
\frac{\partial}{\partial N}\left(dN\right) = d\frac{\partial N}{\partial N} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> d\mu(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial N} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(dS \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> dS\frac{\partial }{\partial S}\frac{\partial E}{\partial S},\quad
\frac{\partial}{\partial S}\left(dS\right) = d\frac{\partial S}{\partial S} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dt(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial S} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ dV\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(dN\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(dS\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(dV \frac{\partial E}{\partial V}\right)</math>||<math> = </math>
|| <math> dV\frac{\partial }{\partial V}\frac{\partial E}{\partial V},\quad
\frac{\partial}{\partial V}\left(dV\right) = d\frac{\partial V}{\partial V} = d(1) = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> dp(N,S,V) </math>||<math> = </math>
|| <math> +\,d\frac{\partial E}{\partial (-V)} \neq 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ dS\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ dV\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- dS\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dN\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- dS\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- dV\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(dN\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(dS\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(dV\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V} dE </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial (-V)} dE \neq 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (02)\qquad </math>
|| <math> E(N,S,V) </math>||<math> = </math>
|| <math> +\,\mu\,N + t\,S + p\,(-V) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}\,N
+ \frac{\partial E}{\partial S}\,S
+ \frac{\partial E}{\partial V}\,V </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial E}{\partial N}
+ S\,\frac{\partial E}{\partial S}
+ V\,\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\mu + S\,t + (-V)\,p </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (07)\qquad </math>
|| <math> dE(N,S,V) </math>||<math> \neq </math>
|| <math> +\,N\frac{\partial \,dE}{\partial N}
+ S\frac{\partial \,dE}{\partial S}
+ V\frac{\partial \,dE}{\partial V} = 0 </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\frac{\partial E}{\partial N}
+ S\,d\frac{\partial E}{\partial S}
+ V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,d\mu + S\,dt + V\,d(-p) = 0 </math>
|| <math> \qquad \leftarrow (06) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial N}\left(N \frac{\partial E}{\partial N}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial N} + N\frac{\partial }{\partial N}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (03)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial \mu}{\partial N}
+ S\frac{\partial \mu}{\partial S}
+ V\frac{\partial \mu}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial N}
+ S\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ V\frac{\partial}{\partial N}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial N}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial N}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial N}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial N}
- \frac{\partial E}{\partial N} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\mu - \mu = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial S}\left(S \frac{\partial E}{\partial S}\right)</math>||<math> = </math>
|| <math> \frac{\partial E}{\partial S} + S\frac{\partial }{\partial S}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (04)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial t}{\partial N}
+ S\,\frac{\partial t}{\partial S}
+ V\,\frac{\partial t}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial N}\frac{\partial E}{\partial S}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial V}\frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\,\frac{\partial}{\partial S}\frac{\partial E}{\partial N}
+ S\,\frac{\partial}{\partial S}\frac{\partial E}{\partial S}
+ V\,\frac{\partial}{\partial S}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial}{\partial S}\left(N\frac{\partial E}{\partial N}\right)
+ \frac{\partial}{\partial S}\left(S\frac{\partial E}{\partial S}\right)
+ \frac{\partial}{\partial S}\left(V\frac{\partial E}{\partial V}\right)
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial S}
- \frac{\partial E}{\partial S} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,t - t = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> \frac{\partial}{\partial V}\left(V \frac{\partial E}{\partial V}\right) </math>||<math> = </math>
|| <math> \frac{\partial E}{\partial V} + V\frac{\partial }{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (05)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> +\,N\frac{\partial p}{\partial N}
+ S\frac{\partial p}{\partial S}
+ V\frac{\partial p}{\partial V} </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial (-V)}
+ S\frac{\partial}{\partial S}\frac{\partial E}{\partial (-V)}
+ V\frac{\partial}{\partial V}\frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial N}\frac{\partial E}{\partial V}
- S\frac{\partial}{\partial S}\frac{\partial E}{\partial V}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\frac{\partial}{\partial V}\frac{\partial E}{\partial N}
- S\frac{\partial}{\partial V}\frac{\partial E}{\partial S}
- V\frac{\partial}{\partial V}\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial}{\partial V}\left(N\frac{\partial E}{\partial N}\right)
- \frac{\partial}{\partial V}\left(S\frac{\partial E}{\partial S}\right)
- \frac{\partial}{\partial V}\left(V\frac{\partial E}{\partial V}\right)
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,\frac{\partial E}{\partial V}
+ \frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,\frac{\partial E}{\partial (-V)}
- \frac{\partial E}{\partial (-V)} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> +\,p - p = 0 </math>
|| <math> \qquad\qquad </math>
|-
|| <math> (06)\qquad </math>
|| <math> 0 </math>||<math> = </math>
|| <math> -\,N\,d\mu - S\,dt - V\,d(-p) </math>
|| <math> \qquad (N,S,V) \qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,N\,d\frac{\partial E}{\partial N}
- S\,d\frac{\partial E}{\partial S}
- V\,d\frac{\partial E}{\partial V} </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,d\left(N\frac{\partial E}{\partial N}\right)
- d\left(S\frac{\partial E}{\partial S}\right)
- d\left(V\frac{\partial E}{\partial V}\right) </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> </math>
|| <math> +\,\frac{\partial E}{\partial N} dN
+ \frac{\partial E}{\partial S} dS
+ \frac{\partial E}{\partial V} dV </math>
|| <math> \qquad\qquad </math>
|-
|| <math> \qquad\qquad </math>
|| <math> </math>||<math> = </math>
|| <math> -\,dE + dE = 0 </math>
|| <math> \qquad\qquad </math>
|}
9o3fo2i0076er7fr28676pohf0ws1kg
Diskussion:Gödel
1
121966
1090692
1090412
2026-09-11T09:44:31Z
Santiago
19191
/* Farbgebung */ Korrektur
1090692
wikitext
text/x-wiki
== Zirkelbeweis? ==
[[Spezial:Permalink/1077179|Das]], also schon die [[Wiktionary:de:Grundannahme|Grundannahme]], daß es (DEN einen) [[w:Gott|Gott]] (hier wohl der [[w:Juden|Juden]] wirklich) <u>gäbe</u>, sieht mir doch sehr nach einem auch sobezeichneten [[w:Zirkelbeweis|Zirkelbeweis]](-Versuch sowie endlosen [[w:Spezial:Permalink/245848029|Teufelskreis]]) aus. Naja, als (ernsthafter) Wissenschaftler würde ich mir diese Grundannahme aller höchstens denken, aus meinem Beweis aber besser rauslassen und stattdessen mit anderen ('''[[Wiktionary:de:echt|echten]]''') '''[[Wiktionary:de:Beweis|Beweisen]]''' (auch unabhängig von [[w:Kurt Gödel|''Gödel''s]] ''[[Wiktionary:de:Logik|Logik]]'') versuchen, meine Grundannahme (wirklich) zu beweisen (und, in diesem Fall hier, solange der Beweis nicht wirklich erbracht ist, besser erstmal beim [[w:fliegendes Spaghettimonster|fliegenden ''Spaghettimonster'']] bleiben :-) ). Mit [[w:Wikipedia:Wikiliebe|lieben]] Grüßen. -- [[Spezial:Beiträge/~2025-36467-86|~2025-36467-86]] ([[Benutzer Diskussion:~2025-36467-86|Diskussion]]) 11:02, 26. Nov. 2025 (CET)
:Die Wahrscheinlichkeit, dass in den Arbeiten Gödels ein Zirkelschluss nachweisbar ist, geht im Allgemeinen gegen Null. In Einklang mit Anselm und Leibniz, beweist Gödel, „''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''“, dass es logisch korrekt ist, wenn die „''theologische Weltanschauung''“ (der Juden, Christen und Moslems) ,annimmt‘, dass es mit ,Notwendigkeit‘ (nur) einen Gott gibt ''':''' — <math>\Box \; \exists x \; G(x)</math> —, weil es, nachweislich auch formal-syntaktisch, <u>ohne Widerspruch</u> ,denkbar‘ ist ''':''' — <math>\Diamond \; \exists x \; G(x)</math> —, dass es Gott gibt. Damit ist Gödel dem Wunsch Leibniz‘ nach ,mathematischer Evidenz‘ für das Theorem Anselms nachgekommen, das in seiner Bedeutung, nach Leibniz, das „''Privilegium der Gottheit''“ darstellt. Der Zugang zu Gott ist jedoch nicht der ,Beweis‘. (Das Gödel-Kalkül ist kein Beweis für die Existenz Gottes!) Der Zugang zu Gott ist der ,Glaube‘, d.h. eine persönliche Entscheidung für Gott. Mit freundlichem Gruß. --[[Benutzer:Santiago|Santiago]] 17:35, 19. Dez. 2025 (CET)
::„Die Wahrscheinlichkeit, …“? Na das sieht mir so aus, daß (auch) du Gödels ''Logik'' bisher nicht verstanden hast/nicht (in allem/gänzlich) nachvollziehen kannst. Dann von wegen: „ohne sich auf den Glauben […] zu stützen“ daß es den von ihm (''Godel'') vorher ja angenommenen Gott gäbe, nein, gibt(!) … also genau das ist ja (schon, ganz am Anfang) seine Grundannahme, welche er dann versuchte (eben in einem ewigen ''Zirkel''schluß, also im Grunde nur für sich selbst) zu „beweisen“. Und „ohne Widerspruch“ damit ist hier wahrscheinlich nur die (eben sogenannte [[Wiktionary:de:formal|''formal''e]]) Berechnung gemeint, daß diese am Ende auf beiden Seiten der Gleichung eben gleich (=) ist, was aber keine Kunst ist, wenn das Angenommene (hier ein [[Wiktionary:de:Willkür|willkürlich]] ausgedachter Gott) nur ein fester Wert (eben bspw. auch nur die Annahme, daß der Gotteswert G = 1 oder [immer] [[w:Wahrheitswert|wahr]], also) einfach nur ein (eben vorher, willkürlich bestimmter) fester Wert (sowie aber auch eine beliebig, in sich veränderbare [sowie ''[[Wiktionary:de:variabel|variable]]'' Schein]''[[Wiktionary:de:Konstante|Konstante]]'') ist (Gott, als angenommenes „echtes“ Wesen ist ja, in seiner [ebenso nur angenommenen] [[w:Allmacht|Allmacht]], auch in sich veränderlich), welche dann auch einfach bspw. durch die (wahrscheinlich ebenso) endlose Zahl(enreihe) ''Pi'', also durch die auch sobezeichnete [[w:Kreiszahl|'''K'''reiszahl]] ('''K'''), oder auch durch das hier oben schon genannte (fliegende) '''''S'''paghettimonster'' ('''S''', beide Vorgenannten dann eben durch '''K''' = [immer] wahr ODER '''S''' = [ebenso für immer und ewig] wahr, eben durch so einen dann festgelegten [ja auch willkürlich [[Wiktionary:de:Vorbestimmung|vorbestimmten]]] Wert) ersetzt werden könnte. -- [[Spezial:Beiträge/~2025-41998-40|~2025-41998-40]] ([[Benutzer Diskussion:~2025-41998-40|Diskussion]]) 12:30, 21. Dez. 2025 (CET)
Kurt Gödel ist gestorben, daher kann er nicht sich selbst gegen den Vorwurf eines Zirkelschlusses in seinen Arbeiten wehren. Nach dem, was aus seiner Biographie bekannt ist, könnte es sein, dass in den Arbeiten seiner letzten Jahre logische Fehler auffindbar sind. Das soll aber seiner psychischen Erkrankung gegen Ende seines Lebens geschuldet sein – berichten seine Biographen. Aber sicher nicht in den Werken, die seinen Ruhm unter den Logikern und Mathematikern begründet haben, sind Zirkelschlüsse nachweisbar. In seiner Arbeit zum sog. ontologischen Gottesbeweis gibt es nachweislich keinen Zirkelschluss. „''Gödels Argumentationskette ist nachweisbar korrekt''“ – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph Benzmüller und Bruno Wolzenlogel-Paleo nun gezeigt. Auch ist er selber überzeugt von der logischen Korrektheit seines ontologischen Beweises: »''Ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig'' [ sic ! ], ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', [ dass es Gott gibt ], ''mit allen bekannten Tatsachen'', [ d.h. mit den Maßstäben einer modernen Logik ], ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker Leibniz versucht''.« Es ist also schon recht ,abenteuerlich‘, Kurt Gödel, dem Ausnahmelogiker des 20. Jahrhunderts, einen Zirkelschluss zu unterstellen. Mit freundlichem Gruß -- [[Benutzer:Santiago|Santiago]] 18:49, 22. Dez. 2025 (CET)
:Es wird „wohl“ auch nicht ohne Grund „Teufelskreis“ genannt. Meiner Erfahrung nach sehen (selbst) Betroffene auch nur selten (bis nie) ihre Fehler ein. Auf Gödel selbst wollte ich zudem eh nicht zu sprechen kommen (da mir schon klar war, daß er tot ist), sondern rein sachlich (mit den Mitteln der Vernunft und Wahrheitsfindung) an die Sache rangehen (daher u.a. auch der Verweis auf [[w:Wahrheitswert]]). Bei einem (selbst Gott-)Gläubigen hätte ich das aber eh nicht erwartet, zumal sowas auch bei „Wissenschaftlern“ vorkommt. Naja, von meiner Seite aus ist die Sache hier jedenfalls '''erledigt'''. Du bist da eh zu nah drann und entsprechend voreingenommen. Jede weitere Schleife wird (auch) dich nur noch tiefer, hier nur in Gödels Kaninchenbau hineintreten lassen. -- [[Spezial:Beiträge/~2025-42378-53|~2025-42378-53]] ([[Benutzer Diskussion:~2025-42378-53|Diskussion]]) 19:48, 22. Dez. 2025 (CET)
Falls es gelungen ist, Dich zu überzeugen, dass in der Argumentation Gödels zum ontologischen Beweis kein Zirkelschluss vorliegt, dann freut es mich, und unsere Auseinandersetzung hat einen Sinn gehabt. Damit ist die Sache erledigt. Mit freundlichem Gruß -- [[Benutzer:Santiago|Santiago]] 20:13, 22. Dez. 2025 (CET)
:Es ist dir nicht gelungen. Da glaube ich eher an das fliegende Spaghettimonster, daß ich in dich schlüssiger. :-D -- [[Spezial:Beiträge/~2025-42033-63|~2025-42033-63]] ([[Benutzer Diskussion:~2025-42033-63|Diskussion]]) 20:40, 22. Dez. 2025 (CET)
::Ich weiß nicht, ob der Satz "Das Gödel-Kalkül ist kein Beweis für die Existenz Gottes!" irgendwie übersehen wurde, ich vermute dies aber schon... Vielmehr, wenn ich die Einleitung gut verstehe, soll dieser Beweis zeigen, dass die Grundannahme "es gibt Gott" zu keinem Widerspruch nach den Grundsätzen der Logik führt, im Gegensatz zur Grundannahme "es gibt keinen Gott". Allerdings besagt so ein Beweis nichts über die Grundannahme "ich kann nicht wissen, ob es Gott gibt" oder die Grundannahme "es ist unsicher, ob es Gott gibt". Vermute ich wieder... Wie ein Widerspruchsbeweis gegen eine Grundannahme funktioniert, wissen wir schon vom Beweis der Irrationalität von Wurzel 2... LG! [[Benutzer:Yomomo|Yomomo]] 21:44, 22. Dez. 2025 (CET)
:::Ja, das wurde (hier oben, <small>von mir</small>) übersehen, nach dem (vorgeblich oder tatsächlich?) [[Wiktionary:de:mathematisch|''mathemat''ischen]] Zeichen''salat'' und der zugehörigen „''Evidenz''“ <small>([[Wiktionary:de:Evidenz|welche]] ich mir jetzt <s>noch nicht</s> auch schon mit „Eindeutigkeit, Gewissheit, Klarheit, Offensichtlichkeit, Sicherheit“ [[Wiktionary:de:Spezial:Permalink/10437411|mutmaßlich richtig<nowiki/>]] übersetzt habe)</small> konnte ich nicht mehr, also rein verstandesmäßig, da sowas schlicht nicht meine [[w:Erstsprache|Erstsprache]] ist. Im Übrigen sollte das <small>(also mein)</small> vorherige<small>(s)</small> Satzende besser: „das ist (oder erscheint mir) in sich schlüssiger.“ heißen (vor allem auch hinsichtlich des [[w:Ockhams Rasiermesser|[wissenschaftlichen] Sparsamkeits[grund]gedanken]]). Außerdem scheinen mir nun die hier ([[Spezial:Permalink/1078426#Weitere Klarstellungen|gegenwärtig]]) [[#Weitere Klarstellungen|folgenden „Klarstellungen“]] (wenigstens im ersten Abschnitt) nun auch wissenschaftlicher (sowie verständlicher, <small>anstelle dem (mir anfänglichen) Glauben(sbekenntis) nacheifernd</small>) zu sein, also mit Aussagen wie, „es ist möglich, daß es einen Gott (sowie ein übermächtiges, allwissendes Wesen) gibt“ und „wir wissen aber nicht, ob dem tatsächlich so ist“ kann ich mich auf jeden Fall abfinden. Allerdings brauche ich dafür auch nicht so eine (nur scheinbar wissenschaftliche) Berechnung, wie hier ([[Spezial:Permalink/1078334|gegenwärtig]]) [[{{VORDERSEITE}}|nebenan]], wo schon in der ersten großen Zwischenüberschrift was von einem „''ontolog''ische[n] Gottesbeweis“ steht (zudem ich mir auch [//Wissen.de/Fremdwort/ontologisch dieses Fremdwort] <small>(← dort dann erstmal zur ''[//Wissen.de/Fremdwort/Ontologie Ontologie]'' usw. usf.)</small> [weiter] übersetzen [lassen] müßte). Naja, womöglich habe ich aber auch da schon, also beim '''''[[w:deutsche Sprache|de]]'''.wikibooks'', irgendwas miß- oder schlicht (grundsätzlich) anders verstanden <small>(als all die [<nowiki/>[[w:de:Wikipedia:unterstelle gute Absichten|mutmaßlich aber wohl meistens unabsichtlichen]]] Fremdwortschwurbler)</small>. Mit lieben Grüßen. -- [[Spezial:Beiträge/~2025-42527-61|~2025-42527-61]] ([[Benutzer Diskussion:~2025-42527-61|Diskussion]]) 12:35, 23. Dez. 2025 (CET)
Zur Orientierung: Die Diskussion um Gott läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser Anselm gesagt: „Ich glaube an Gott … (sonst wäre er sicher nicht Erzbischof von Canterbury geworden) … aber ich möchte auch wissen und verstehen, ob das stimmt, was ich da glaube!“ Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Philosoph Immanuel Kant hat das, was Anselm da aufgeschrieben hat, gelesen, und das dann den „ontologischen Gottesbeweis“ genannt, (obwohl es in Wirklichkeit gar kein Gottesbeweis ist), und dieser große Kant hat dann großartig bewiesen, dass das, was Anselm aufgeschrieben hat, falsch ist, und daher „gar kein“ Gottesbeweis ist, (na-ja was sonst ?) Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichlichen Gott mit hundert Talern in seinem Vermögenszustande verglichen hat. (Das ist aber eine andere Geschichte.) Hundert Taler und Gott haben ,an sich‘ nichts gemeinsam, außer, wenn Kant ,wirklich‘ hundert Taler hat, und Gott auch ,wirklich‘ existiert, (wie Anselm und gläubige Menschen glauben), dann gibt es beide eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit Kant läuft die ganze Diskussion um Gott immer nur als Diskussion um den (von Kant) sogenannten „ontologischen,(kosmologischen, teleologischen etc.) Gottesbeweis“ – obwohl es niemals einen Beweis für Gott geben kann und niemals geben wird. (Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich gesagt.) Beweisen kann man Naturgesetze. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie mit Mehrheitsbeschlüssen dann verändern. Wenn Gott ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz Gottes wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. Gott ist „Person“, für Christgläubige „ein Gott in drei Personen“. Und Gott ist „Geist“. Das besagt, dass er nicht mit materiellen Dingen verwechselt werden darf. Und ganz wesentlich: der Zugang zu Gott läuft nicht über den Beweis sondern immer nur über den Glauben. Wer an Gott glauben will, dem antwortet Gott auf seine Weise – nämlich „geistig“ bzw. „geistlich“. Und der Glaube ist frei. Niemand darf gezwungen werden. Wenn es einen Beweis für Gott gäbe, wäre jeder vernünftige Mensch gezwungen, an Gott zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Gottesbeweis!!! Daher darf man das System des Logiker Gödels nicht als einen Gottesbeweis lesen. Mit freundlichem Gruß -- [[Benutzer:Santiago|Santiago]] 16:25, 23. Dez. 2025 (CET)
==Weitere Klarstellungen==
Wenn man das Gödel Argument genau liest, dann ist nur die Annahme: „es ist möglich, dass es Gott gibt“ bewiesen, weil aus der Annahme: „es ist unmöglich, dass es Gott gibt“ ein logischen Widerspruch ableitbar ist. Die Aussage: „es gibt Gott“ ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Mensch, der aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann: „es gibt Gott wirklich“, wenn er will. Das ist das Argument Anselms, der ein christlicher Amtsträger war, und der von dieser Grundannahme auch ausgeht. Aber niemand ist gezwungen, aus der Möglichkeit, dass es Gott gibt, daraus zu schließen, dass es Gott auch mit Notwendigkeit gibt, wie das im Argument Anselms geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit Leibniz, der an Gott geglaubt hat, sagen: „''gesetzt, dass Gott möglich ist, so ist er, was das Privilegium der Gottheit allein ist''“
Wenn Du den 3. Beweisgang des Gödel-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument Anselms in der Zeile 11 zwar immer noch logisch abhängig ist von der methodologischen Glaubens-Prämisse, „x steht für den Gott der Christen“, was bis zur Zeile 10 noch offensichtlich ist, d.h. er ist in seiner Struktur wohl immer noch regulär von der Glaubens-Prämisse: Term :01: abhängig, aber jetzt steht er an zweiter Stelle in der Zeile 11, und damit hat er die Glaubens-Prämisse nicht mehr als notwendige Bedingung, sondern jetzt hat er eine neue und andere Voraussetzung. Der Schwerpunkt des Argument Anselms liegt damit am Begründungs-Teil. Der Begründungs-Teil, das Antezedens, im Argument Anselms ist nicht mehr von dieser Glaubens-Prämisse, abhängig, sondern nur vom Axiom-1 der Widerspruchsfreiheit und von der mathematischen Äquivalenz der positiven Eigenschaften im Axiom-2, im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘ am Schluss, und damit unabhängig von jeder Glaubensüberzeugung. Weil widerspruchsfrei und mathematisch evident, kenn er als logischer Begründungs-Teil für den Konsequenz-Teil gelesen werden, und damit die Konsequenz, die Glaubensüberzeugung eines gläubigen Menschen, bestätigen. Dessen Glaube ist widerspruchsfrei und enthält damit auch keinen Zirkelschluss.
Zusammengefasst heißt das konkret: Wenn Du an Gott glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist logisch in der <u>bewiesenen Möglichkeit</u> Gottes begründet. Wenn Du nicht an Gott glauben willst, dann musst Du nicht an ihn glauben, auch wenn es möglich ist, dass es Gott gibt. Denn der Glaube an Gott muss immer eine freie Entscheidung sein und bleiben. Niemand darf zum Glauben gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Mit freundlichem Gruß -- [[Benutzer:Santiago|Santiago]] 23:16, 22. Dez. 2025 (CET)
== Farbgebung ==
Gibt es irgendeinen guten Grund warum der Text so bunt formatiert ist? Das macht es m.M.n. echt schwierig das Buch zu lesen. --[[Benutzer:Intruder|Intruder]] 11:56, 18. Jul. 2026 (CEST)
:Also ich nehme einfach mal an, nach dem nun wieder ersten (An)Lesen des [[Spezial:Permalink/1089126#Vorwort|(gegenwärtigen) Vorwortes]] <small>(genauer, nur der ersten Sätze; habe früher schonmal versucht, weiterzulesen)</small>, daß die erste Farbe (gegenwärtig ein <span style="color:#FF6000">Rotgelb</span> <small>oder auch noch immer sobezeichnetes ''[[Wiktionary:de:Orange|<span style="background-color:#FF6000; color:yellow;">Orange</span>]]''</small>) das Ursprüngliche (von dem Herrn ''[[w:Kurt Gödel|Gödel]]'' Verfaßte) und die zweite Farbe (wohl eine Art <span style="color:#00B000">Gelbgrün</span>) das vom gegenwärtig( <small>alleinig?</small>)en (Haupt-)Verfasser ist <small>(womit also eigentlich [[Benutzer:Santiago|''Santiago''s]] Anmerkungen gemeint sind)</small>. Aber stimmt schon, eine '''Farb-Erklärung''' (oder auch '''[[w:Spezial:Suche/Farbbeschreibung|-beschreibung]]''' <small>und zudem auch noch sobezeichnete [[w:Spezial:Suche/Farblegende|-''legend''e]]</small>, vom gegenwärtigen Hauptverfasser) wäre mal nicht schlecht, also auch für (die) Außenstehende (Leserschaft) recht hilfreich, <small>welche sich mal ersthaft mit diesem Buch weiterbefassen oder dort wirklich (noch) tiefer ([[w:Zirkelbeweis|end]][[Wiktionary:de:Endlosschleife|los?]] tief) einsteigen möchte</small>. Mit [[w:Wikipedia:Wikiliebe|lieben]] Grüßen. -- [[Spezial:Beiträge/~2026-40933-26|~2026-40933-26]] ([[Benutzer Diskussion:~2026-40933-26|Diskussion]]) 11:35, 22. Jul. 2026 (CEST)
::Ja, kann gut sein. Und eine Farblegende wäre wirklich sinnvoll. Weitere auftretende Farben (mit der möglichen Bedeutung):
::* violett ... Überschriften
::* hellviolett ... wahrscheinlich biblischer Text
::* blau ... logische Terme und der Begriff "theologisch"
::* schwarz ... "sonstiger" Text
::* gelb hervorgehoben ... wahrscheinlich irgendetwas Wichtiges.
::Mit freundlichen Grüßen [[Benutzer:Intruder|Intruder]] 17:46, 22. Jul. 2026 (CEST)
Vor 56 Jahren hat GÖDEL, abschließend, auf zwei Notiz-Zetteln seinen, den, von ihm so bezeichneten, ,ontologischen Beweis‘ skizziert, und zwar in der formalen Sprache der ,''Principia Mathematica''‘ von WHITHEAT und RUSSELL, die er gewohnt war, mit ein paar sprachlichen Zusätzen, als Ergebnis seiner mehrjährigen Überlegungen zu diesem Thema. Diese Zettel wurden, von mehreren Bearbeitern danach, in die dann, jeweilig modernere, formal-logische Sprachform, transformiert, bzw. transkripiert. Auf diesen Zetteln stehen fünf Axiome und drei Definitionen, zwei Theoreme und ein, nicht als solches bezeichnetes, Korollar; und ein paar <span style="color:#00B000">(syntaktische)</span> Bemerkungen dazu. Sowohl A. FUHRMANN als auch G. J. WIRSCHING, haben heute, für die zwei Theoremen und dem Korollar GÖDELS, jeweils einen nachvollziehbaren Beweis, d.h. mit Hilfe der GÖDEL-Axiome und -Definitionen, drei logisch-formale Ableitungen aus <span style="color:#00B000">(nicht näher diskutierten)</span> Prämissen vorgelegt, die ich hier als Grundlage meiner Studie verwendet habe.
Der Text meiner Arbeit ist sukzessiv, aufeinanderfolgend, nur die Summe aller Antworten, die sich aus den Fragen ergeben haben, die sich stellen, wenn man das GÖDEL-System eingehend studiert. Daher ist für das Lesen meiner Arbeit, immer die fragende Beschäftigung mit dem GÖDEL-Kalkül selbst, Voraussetzung '''!''' Dazu biete ich meine Neu-Kalkülisierung des GÖDEL-Systems im Anhang an, in die alle Erkenntnis aus meinen Beobachtungen am syntaktischen Formal-Text eingeflossen sind, und so, nach und nach, ihre Form, <span style="color:#00B000">(und auch ihre Interpretation, bzw. ,Benennungen‘)</span>, gefunden haben. Das Ziel war, das begründete und begründbare Verstehen des GÖDEL-Systems.
Meine Studie zum GÖDEL-Kalkül sagt, mit sehr ,vielen‘ Worten, was die GÖDEL-Zeichen einfach nur ,anzeigen‘. Daher liegt ein Augenmerk meiner Arbeit auch auf der formal-formatierten Struktur der Worte, mit denen ich über die GÖDEL-Zeichen spreche. <span style="color:#00B000">(Zeichen sind immer mehrdeutig interpretierbar '''!''' )</span> Einfache Sachverhalte, über die ich in einem Satz spreche, stehen zwischen ,einfachen‘ Anführungszeichen. Sachverhalte, die in meiner Arbeit einen wichtigeren Stellenwert haben, sind mit einer Farbe gekennzeichnet, und stehen zwischen <span style="color:#FF6000">„doppelten“</span> Anführungszeichen, und sind meistens <span style="color:#FF6000">,rotgelb‘</span>, <span style="color:#00B000">(,Danke‘ dem anonymen Wortspender '''!''' )</span> gefärbt.
Sachverhalte, die von ,Autoritäten‘, schon vor mir, diskutiert worden sind, werden als ganze Zitate, <span style="color:#FF6000">,''rotgelb kursiv''‘</span>, eingerückt, auch ohne Farbe, oder als weiter benutzte Worte aus diesen Zitaten, <span style="color:#FF6000">,''rotgelb kursiv''‘</span> zwischen <span style="color:#FF6000">»</span>Winkel<span style="color:#FF6000">«</span>-Anführungszeichen gestellt, und, wenn nötig, mit einer Quellenangabe versehen. Die <span style="color:#4C58FF">,blauen‘</span> Axiome und Definitionen, die Theoreme und Korollare des GÖDEL-Systems werden von mir durch ''kursive'', zwischen <span style="color:#FF6000">»''rotgelbe Winkel-Anführungszeichen''«</span> gestellte Sätze, kontextkonform interpretiert.
Da ich, mit A. FUHRMANN, das GÖDEL-System als eine <span style="color:#4C58FF">„axiomatische Theologie“</span> lese, haben sowohl alle Terme und Meta-Terme des Kalküls, als auch die <span style="color:#4C58FF">„Theologie“</span> und alle <span style="color:#4C58FF">„theologischen“</span> Fachausdrücke, in der Erklärung, die <span style="color:#4C58FF">,blaue‘</span> Farbe. <span style="color:#00B000">(Der Parser in dem, — sehr nützlichen —, Mathematik-Teil-Programm von Wikibooks stürzt ab, wenn ich alle Terme des GÖDEL-Kalküls <span style="color:#4C58FF">,blau‘</span>-färben wollte.)</span> Zitate aus der Bibel sind <span style="color:#CC66FF">,violett‘</span>, wie schon festgestellt.
Längere Zitate, zwischen farbigen Anführungszeichen, sind deswegen nicht gefärbt, weil ich die Zitate mit meinen Anmerkungen und Zusätzen, intern, in <span style="color:#00B000">[ eckigen gelbgrünen ]</span> Klammern gestellt, kommentiere, auch mit Hinzuziehung anderer <span style="color:#FF6000">„Zitate“</span> und <span style="color:#FF6000">„Sachverhalte“</span>. Alle Zusätze im Fließ-Text, alle Erklärungen, Ergänzungen, Klarstellungen, und auch größere, weiterführende, erklärende Exkurse zum Thema, sind <span style="color:#00B000">,gelbgrün‘</span> gefärbt, und stehen immer innerhalb von <span style="color:#00B000">(runden gelbgrünen)</span> Klammern. Nur Exkurse zu Themen, die in einer Diskussion zu weit führen würden, sind in die Fußnoten abgestellt.
Für die ,Legende des Kalküls‘ ist es hilfreich, sich vorerst allgemein, über die Inhalte der ,Aussagenlogik‘ und der ,Prädikatenlogik‘ zu informieren.
Mit freundlichen Grüßen [[Benutzer:Santiago|Santiago]] 04:56, 29. Jul. 2026 (CEST)
hw5a66v0smvvr8iq2nbqz9tcgwhzfor
1090693
1090692
2026-09-11T09:47:14Z
Santiago
19191
/* Farbgebung */ Korrektur
1090693
wikitext
text/x-wiki
== Zirkelbeweis? ==
[[Spezial:Permalink/1077179|Das]], also schon die [[Wiktionary:de:Grundannahme|Grundannahme]], daß es (DEN einen) [[w:Gott|Gott]] (hier wohl der [[w:Juden|Juden]] wirklich) <u>gäbe</u>, sieht mir doch sehr nach einem auch sobezeichneten [[w:Zirkelbeweis|Zirkelbeweis]](-Versuch sowie endlosen [[w:Spezial:Permalink/245848029|Teufelskreis]]) aus. Naja, als (ernsthafter) Wissenschaftler würde ich mir diese Grundannahme aller höchstens denken, aus meinem Beweis aber besser rauslassen und stattdessen mit anderen ('''[[Wiktionary:de:echt|echten]]''') '''[[Wiktionary:de:Beweis|Beweisen]]''' (auch unabhängig von [[w:Kurt Gödel|''Gödel''s]] ''[[Wiktionary:de:Logik|Logik]]'') versuchen, meine Grundannahme (wirklich) zu beweisen (und, in diesem Fall hier, solange der Beweis nicht wirklich erbracht ist, besser erstmal beim [[w:fliegendes Spaghettimonster|fliegenden ''Spaghettimonster'']] bleiben :-) ). Mit [[w:Wikipedia:Wikiliebe|lieben]] Grüßen. -- [[Spezial:Beiträge/~2025-36467-86|~2025-36467-86]] ([[Benutzer Diskussion:~2025-36467-86|Diskussion]]) 11:02, 26. Nov. 2025 (CET)
:Die Wahrscheinlichkeit, dass in den Arbeiten Gödels ein Zirkelschluss nachweisbar ist, geht im Allgemeinen gegen Null. In Einklang mit Anselm und Leibniz, beweist Gödel, „''rein verstandesmäßig, (ohne sich auf den Glauben an irgendeine Religion zu stützen)''“, dass es logisch korrekt ist, wenn die „''theologische Weltanschauung''“ (der Juden, Christen und Moslems) ,annimmt‘, dass es mit ,Notwendigkeit‘ (nur) einen Gott gibt ''':''' — <math>\Box \; \exists x \; G(x)</math> —, weil es, nachweislich auch formal-syntaktisch, <u>ohne Widerspruch</u> ,denkbar‘ ist ''':''' — <math>\Diamond \; \exists x \; G(x)</math> —, dass es Gott gibt. Damit ist Gödel dem Wunsch Leibniz‘ nach ,mathematischer Evidenz‘ für das Theorem Anselms nachgekommen, das in seiner Bedeutung, nach Leibniz, das „''Privilegium der Gottheit''“ darstellt. Der Zugang zu Gott ist jedoch nicht der ,Beweis‘. (Das Gödel-Kalkül ist kein Beweis für die Existenz Gottes!) Der Zugang zu Gott ist der ,Glaube‘, d.h. eine persönliche Entscheidung für Gott. Mit freundlichem Gruß. --[[Benutzer:Santiago|Santiago]] 17:35, 19. Dez. 2025 (CET)
::„Die Wahrscheinlichkeit, …“? Na das sieht mir so aus, daß (auch) du Gödels ''Logik'' bisher nicht verstanden hast/nicht (in allem/gänzlich) nachvollziehen kannst. Dann von wegen: „ohne sich auf den Glauben […] zu stützen“ daß es den von ihm (''Godel'') vorher ja angenommenen Gott gäbe, nein, gibt(!) … also genau das ist ja (schon, ganz am Anfang) seine Grundannahme, welche er dann versuchte (eben in einem ewigen ''Zirkel''schluß, also im Grunde nur für sich selbst) zu „beweisen“. Und „ohne Widerspruch“ damit ist hier wahrscheinlich nur die (eben sogenannte [[Wiktionary:de:formal|''formal''e]]) Berechnung gemeint, daß diese am Ende auf beiden Seiten der Gleichung eben gleich (=) ist, was aber keine Kunst ist, wenn das Angenommene (hier ein [[Wiktionary:de:Willkür|willkürlich]] ausgedachter Gott) nur ein fester Wert (eben bspw. auch nur die Annahme, daß der Gotteswert G = 1 oder [immer] [[w:Wahrheitswert|wahr]], also) einfach nur ein (eben vorher, willkürlich bestimmter) fester Wert (sowie aber auch eine beliebig, in sich veränderbare [sowie ''[[Wiktionary:de:variabel|variable]]'' Schein]''[[Wiktionary:de:Konstante|Konstante]]'') ist (Gott, als angenommenes „echtes“ Wesen ist ja, in seiner [ebenso nur angenommenen] [[w:Allmacht|Allmacht]], auch in sich veränderlich), welche dann auch einfach bspw. durch die (wahrscheinlich ebenso) endlose Zahl(enreihe) ''Pi'', also durch die auch sobezeichnete [[w:Kreiszahl|'''K'''reiszahl]] ('''K'''), oder auch durch das hier oben schon genannte (fliegende) '''''S'''paghettimonster'' ('''S''', beide Vorgenannten dann eben durch '''K''' = [immer] wahr ODER '''S''' = [ebenso für immer und ewig] wahr, eben durch so einen dann festgelegten [ja auch willkürlich [[Wiktionary:de:Vorbestimmung|vorbestimmten]]] Wert) ersetzt werden könnte. -- [[Spezial:Beiträge/~2025-41998-40|~2025-41998-40]] ([[Benutzer Diskussion:~2025-41998-40|Diskussion]]) 12:30, 21. Dez. 2025 (CET)
Kurt Gödel ist gestorben, daher kann er nicht sich selbst gegen den Vorwurf eines Zirkelschlusses in seinen Arbeiten wehren. Nach dem, was aus seiner Biographie bekannt ist, könnte es sein, dass in den Arbeiten seiner letzten Jahre logische Fehler auffindbar sind. Das soll aber seiner psychischen Erkrankung gegen Ende seines Lebens geschuldet sein – berichten seine Biographen. Aber sicher nicht in den Werken, die seinen Ruhm unter den Logikern und Mathematikern begründet haben, sind Zirkelschlüsse nachweisbar. In seiner Arbeit zum sog. ontologischen Gottesbeweis gibt es nachweislich keinen Zirkelschluss. „''Gödels Argumentationskette ist nachweisbar korrekt''“ – so viel hat der Computer nach Ansicht der Wissenschaftler Christoph Benzmüller und Bruno Wolzenlogel-Paleo nun gezeigt. Auch ist er selber überzeugt von der logischen Korrektheit seines ontologischen Beweises: »''Ich glaube, schon heute dürfte es möglich sein, rein verstandesmäßig'' [ sic ! ], ''(ohne sich auf den Glauben an irgendeine Religion zu stützen) einzusehen, dass die theologische Weltanschauung'', [ dass es Gott gibt ], ''mit allen bekannten Tatsachen'', [ d.h. mit den Maßstäben einer modernen Logik ], ''durchaus vereinbar ist. Das hat schon vor 250 Jahren der berühmte Philosoph und Mathematiker Leibniz versucht''.« Es ist also schon recht ,abenteuerlich‘, Kurt Gödel, dem Ausnahmelogiker des 20. Jahrhunderts, einen Zirkelschluss zu unterstellen. Mit freundlichem Gruß -- [[Benutzer:Santiago|Santiago]] 18:49, 22. Dez. 2025 (CET)
:Es wird „wohl“ auch nicht ohne Grund „Teufelskreis“ genannt. Meiner Erfahrung nach sehen (selbst) Betroffene auch nur selten (bis nie) ihre Fehler ein. Auf Gödel selbst wollte ich zudem eh nicht zu sprechen kommen (da mir schon klar war, daß er tot ist), sondern rein sachlich (mit den Mitteln der Vernunft und Wahrheitsfindung) an die Sache rangehen (daher u.a. auch der Verweis auf [[w:Wahrheitswert]]). Bei einem (selbst Gott-)Gläubigen hätte ich das aber eh nicht erwartet, zumal sowas auch bei „Wissenschaftlern“ vorkommt. Naja, von meiner Seite aus ist die Sache hier jedenfalls '''erledigt'''. Du bist da eh zu nah drann und entsprechend voreingenommen. Jede weitere Schleife wird (auch) dich nur noch tiefer, hier nur in Gödels Kaninchenbau hineintreten lassen. -- [[Spezial:Beiträge/~2025-42378-53|~2025-42378-53]] ([[Benutzer Diskussion:~2025-42378-53|Diskussion]]) 19:48, 22. Dez. 2025 (CET)
Falls es gelungen ist, Dich zu überzeugen, dass in der Argumentation Gödels zum ontologischen Beweis kein Zirkelschluss vorliegt, dann freut es mich, und unsere Auseinandersetzung hat einen Sinn gehabt. Damit ist die Sache erledigt. Mit freundlichem Gruß -- [[Benutzer:Santiago|Santiago]] 20:13, 22. Dez. 2025 (CET)
:Es ist dir nicht gelungen. Da glaube ich eher an das fliegende Spaghettimonster, daß ich in dich schlüssiger. :-D -- [[Spezial:Beiträge/~2025-42033-63|~2025-42033-63]] ([[Benutzer Diskussion:~2025-42033-63|Diskussion]]) 20:40, 22. Dez. 2025 (CET)
::Ich weiß nicht, ob der Satz "Das Gödel-Kalkül ist kein Beweis für die Existenz Gottes!" irgendwie übersehen wurde, ich vermute dies aber schon... Vielmehr, wenn ich die Einleitung gut verstehe, soll dieser Beweis zeigen, dass die Grundannahme "es gibt Gott" zu keinem Widerspruch nach den Grundsätzen der Logik führt, im Gegensatz zur Grundannahme "es gibt keinen Gott". Allerdings besagt so ein Beweis nichts über die Grundannahme "ich kann nicht wissen, ob es Gott gibt" oder die Grundannahme "es ist unsicher, ob es Gott gibt". Vermute ich wieder... Wie ein Widerspruchsbeweis gegen eine Grundannahme funktioniert, wissen wir schon vom Beweis der Irrationalität von Wurzel 2... LG! [[Benutzer:Yomomo|Yomomo]] 21:44, 22. Dez. 2025 (CET)
:::Ja, das wurde (hier oben, <small>von mir</small>) übersehen, nach dem (vorgeblich oder tatsächlich?) [[Wiktionary:de:mathematisch|''mathemat''ischen]] Zeichen''salat'' und der zugehörigen „''Evidenz''“ <small>([[Wiktionary:de:Evidenz|welche]] ich mir jetzt <s>noch nicht</s> auch schon mit „Eindeutigkeit, Gewissheit, Klarheit, Offensichtlichkeit, Sicherheit“ [[Wiktionary:de:Spezial:Permalink/10437411|mutmaßlich richtig<nowiki/>]] übersetzt habe)</small> konnte ich nicht mehr, also rein verstandesmäßig, da sowas schlicht nicht meine [[w:Erstsprache|Erstsprache]] ist. Im Übrigen sollte das <small>(also mein)</small> vorherige<small>(s)</small> Satzende besser: „das ist (oder erscheint mir) in sich schlüssiger.“ heißen (vor allem auch hinsichtlich des [[w:Ockhams Rasiermesser|[wissenschaftlichen] Sparsamkeits[grund]gedanken]]). Außerdem scheinen mir nun die hier ([[Spezial:Permalink/1078426#Weitere Klarstellungen|gegenwärtig]]) [[#Weitere Klarstellungen|folgenden „Klarstellungen“]] (wenigstens im ersten Abschnitt) nun auch wissenschaftlicher (sowie verständlicher, <small>anstelle dem (mir anfänglichen) Glauben(sbekenntis) nacheifernd</small>) zu sein, also mit Aussagen wie, „es ist möglich, daß es einen Gott (sowie ein übermächtiges, allwissendes Wesen) gibt“ und „wir wissen aber nicht, ob dem tatsächlich so ist“ kann ich mich auf jeden Fall abfinden. Allerdings brauche ich dafür auch nicht so eine (nur scheinbar wissenschaftliche) Berechnung, wie hier ([[Spezial:Permalink/1078334|gegenwärtig]]) [[{{VORDERSEITE}}|nebenan]], wo schon in der ersten großen Zwischenüberschrift was von einem „''ontolog''ische[n] Gottesbeweis“ steht (zudem ich mir auch [//Wissen.de/Fremdwort/ontologisch dieses Fremdwort] <small>(← dort dann erstmal zur ''[//Wissen.de/Fremdwort/Ontologie Ontologie]'' usw. usf.)</small> [weiter] übersetzen [lassen] müßte). Naja, womöglich habe ich aber auch da schon, also beim '''''[[w:deutsche Sprache|de]]'''.wikibooks'', irgendwas miß- oder schlicht (grundsätzlich) anders verstanden <small>(als all die [<nowiki/>[[w:de:Wikipedia:unterstelle gute Absichten|mutmaßlich aber wohl meistens unabsichtlichen]]] Fremdwortschwurbler)</small>. Mit lieben Grüßen. -- [[Spezial:Beiträge/~2025-42527-61|~2025-42527-61]] ([[Benutzer Diskussion:~2025-42527-61|Diskussion]]) 12:35, 23. Dez. 2025 (CET)
Zur Orientierung: Die Diskussion um Gott läuft schon über zweitausend Jahren. Vor etwa tausend Jahren hat sich ein gewisser Anselm gesagt: „Ich glaube an Gott … (sonst wäre er sicher nicht Erzbischof von Canterbury geworden) … aber ich möchte auch wissen und verstehen, ob das stimmt, was ich da glaube!“ Dann hat er seine Überlegungen dazu aufgeschrieben, und das kann man in seinen Schriften auch heute noch lesen. Der sehr geschätzte deutsche Philosoph Immanuel Kant hat das, was Anselm da aufgeschrieben hat, gelesen, und das dann den „ontologischen Gottesbeweis“ genannt, (obwohl es in Wirklichkeit gar kein Gottesbeweis ist), und dieser große Kant hat dann großartig bewiesen, dass das, was Anselm aufgeschrieben hat, falsch ist, und daher „gar kein“ Gottesbeweis ist, (na-ja was sonst ?) Wobei er den Fehler gemacht hat, dass er den, an sich, unvergleichlichen Gott mit hundert Talern in seinem Vermögenszustande verglichen hat. (Das ist aber eine andere Geschichte.) Hundert Taler und Gott haben ,an sich‘ nichts gemeinsam, außer, wenn Kant ,wirklich‘ hundert Taler hat, und Gott auch ,wirklich‘ existiert, (wie Anselm und gläubige Menschen glauben), dann gibt es beide eben ,wirklich‘. Aber damit ist man nicht schlauer geworden. Seit Kant läuft die ganze Diskussion um Gott immer nur als Diskussion um den (von Kant) sogenannten „ontologischen,(kosmologischen, teleologischen etc.) Gottesbeweis“ – obwohl es niemals einen Beweis für Gott geben kann und niemals geben wird. (Das haben Wissenschaftler jeder Richtung und Philosophen aller Weltanschauungen uns immer wieder nachdrücklich gesagt.) Beweisen kann man Naturgesetze. Die sind unveränderlich und fix, immer und überall. Jeder vernünftige Mensch muss sie akzeptieren. Man kann darüber nicht diskutieren und sie mit Mehrheitsbeschlüssen dann verändern. Wenn Gott ebenso bewiesen werden könnte, dann wäre jeder vernünftige Mensch gezwungen, die Existenz Gottes wie ein Naturgesetz anzunehmen. Gott ist aber kein Naturgesetz. Gott ist „Person“, für Christgläubige „ein Gott in drei Personen“. Und Gott ist „Geist“. Das besagt, dass er nicht mit materiellen Dingen verwechselt werden darf. Und ganz wesentlich: der Zugang zu Gott läuft nicht über den Beweis sondern immer nur über den Glauben. Wer an Gott glauben will, dem antwortet Gott auf seine Weise – nämlich „geistig“ bzw. „geistlich“. Und der Glaube ist frei. Niemand darf gezwungen werden. Wenn es einen Beweis für Gott gäbe, wäre jeder vernünftige Mensch gezwungen, an Gott zu glauben. Und das widerspricht ganz entschieden der Freiheit des Glaubens. Daher gibt es nie und nimmermehr einen Gottesbeweis!!! Daher darf man das System des Logiker Gödels nicht als einen Gottesbeweis lesen. Mit freundlichem Gruß -- [[Benutzer:Santiago|Santiago]] 16:25, 23. Dez. 2025 (CET)
==Weitere Klarstellungen==
Wenn man das Gödel Argument genau liest, dann ist nur die Annahme: „es ist möglich, dass es Gott gibt“ bewiesen, weil aus der Annahme: „es ist unmöglich, dass es Gott gibt“ ein logischen Widerspruch ableitbar ist. Die Aussage: „es gibt Gott“ ist dagegen schon eine Glaubensaussage, und damit ist das auch die ,Grundannahme‘ eines gläubigen Mensch, der aus der ,bewiesenen Möglichkeit‘, dass es Gott gibt, ableiten kann: „es gibt Gott wirklich“, wenn er will. Das ist das Argument Anselms, der ein christlicher Amtsträger war, und der von dieser Grundannahme auch ausgeht. Aber niemand ist gezwungen, aus der Möglichkeit, dass es Gott gibt, daraus zu schließen, dass es Gott auch mit Notwendigkeit gibt, wie das im Argument Anselms geschieht, außer, er akzeptiert auch die Grundannahme, dass es den Unendlichen und Unvergleichlichen tatsächlich gibt. Dann kann er mit Leibniz, der an Gott geglaubt hat, sagen: „''gesetzt, dass Gott möglich ist, so ist er, was das Privilegium der Gottheit allein ist''“
Wenn Du den 3. Beweisgang des Gödel-Kalküls genauer anschaust, dann siehst Du, dass der Konsequenz-Teil im Argument Anselms in der Zeile 11 zwar immer noch logisch abhängig ist von der methodologischen Glaubens-Prämisse, „x steht für den Gott der Christen“, was bis zur Zeile 10 noch offensichtlich ist, d.h. er ist in seiner Struktur wohl immer noch regulär von der Glaubens-Prämisse: Term :01: abhängig, aber jetzt steht er an zweiter Stelle in der Zeile 11, und damit hat er die Glaubens-Prämisse nicht mehr als notwendige Bedingung, sondern jetzt hat er eine neue und andere Voraussetzung. Der Schwerpunkt des Argument Anselms liegt damit am Begründungs-Teil. Der Begründungs-Teil, das Antezedens, im Argument Anselms ist nicht mehr von dieser Glaubens-Prämisse, abhängig, sondern nur vom Axiom-1 der Widerspruchsfreiheit und von der mathematischen Äquivalenz der positiven Eigenschaften im Axiom-2, im 1. Beweisgang, bzw. im Beweisgang ,Widerlegung‘ am Schluss, und damit unabhängig von jeder Glaubensüberzeugung. Weil widerspruchsfrei und mathematisch evident, kenn er als logischer Begründungs-Teil für den Konsequenz-Teil gelesen werden, und damit die Konsequenz, die Glaubensüberzeugung eines gläubigen Menschen, bestätigen. Dessen Glaube ist widerspruchsfrei und enthält damit auch keinen Zirkelschluss.
Zusammengefasst heißt das konkret: Wenn Du an Gott glauben willst, dann kannst Du das unbedenklich tun, denn Dein Glaube ist logisch in der <u>bewiesenen Möglichkeit</u> Gottes begründet. Wenn Du nicht an Gott glauben willst, dann musst Du nicht an ihn glauben, auch wenn es möglich ist, dass es Gott gibt. Denn der Glaube an Gott muss immer eine freie Entscheidung sein und bleiben. Niemand darf zum Glauben gezwungen werden, auch nicht mit ,logischen‘ Argumenten. Mit freundlichem Gruß -- [[Benutzer:Santiago|Santiago]] 23:16, 22. Dez. 2025 (CET)
== Farbgebung ==
Gibt es irgendeinen guten Grund warum der Text so bunt formatiert ist? Das macht es m.M.n. echt schwierig das Buch zu lesen. --[[Benutzer:Intruder|Intruder]] 11:56, 18. Jul. 2026 (CEST)
:Also ich nehme einfach mal an, nach dem nun wieder ersten (An)Lesen des [[Spezial:Permalink/1089126#Vorwort|(gegenwärtigen) Vorwortes]] <small>(genauer, nur der ersten Sätze; habe früher schonmal versucht, weiterzulesen)</small>, daß die erste Farbe (gegenwärtig ein <span style="color:#FF6000">Rotgelb</span> <small>oder auch noch immer sobezeichnetes ''[[Wiktionary:de:Orange|<span style="background-color:#FF6000; color:yellow;">Orange</span>]]''</small>) das Ursprüngliche (von dem Herrn ''[[w:Kurt Gödel|Gödel]]'' Verfaßte) und die zweite Farbe (wohl eine Art <span style="color:#00B000">Gelbgrün</span>) das vom gegenwärtig( <small>alleinig?</small>)en (Haupt-)Verfasser ist <small>(womit also eigentlich [[Benutzer:Santiago|''Santiago''s]] Anmerkungen gemeint sind)</small>. Aber stimmt schon, eine '''Farb-Erklärung''' (oder auch '''[[w:Spezial:Suche/Farbbeschreibung|-beschreibung]]''' <small>und zudem auch noch sobezeichnete [[w:Spezial:Suche/Farblegende|-''legend''e]]</small>, vom gegenwärtigen Hauptverfasser) wäre mal nicht schlecht, also auch für (die) Außenstehende (Leserschaft) recht hilfreich, <small>welche sich mal ersthaft mit diesem Buch weiterbefassen oder dort wirklich (noch) tiefer ([[w:Zirkelbeweis|end]][[Wiktionary:de:Endlosschleife|los?]] tief) einsteigen möchte</small>. Mit [[w:Wikipedia:Wikiliebe|lieben]] Grüßen. -- [[Spezial:Beiträge/~2026-40933-26|~2026-40933-26]] ([[Benutzer Diskussion:~2026-40933-26|Diskussion]]) 11:35, 22. Jul. 2026 (CEST)
::Ja, kann gut sein. Und eine Farblegende wäre wirklich sinnvoll. Weitere auftretende Farben (mit der möglichen Bedeutung):
::* violett ... Überschriften
::* hellviolett ... wahrscheinlich biblischer Text
::* blau ... logische Terme und der Begriff "theologisch"
::* schwarz ... "sonstiger" Text
::* gelb hervorgehoben ... wahrscheinlich irgendetwas Wichtiges.
::Mit freundlichen Grüßen [[Benutzer:Intruder|Intruder]] 17:46, 22. Jul. 2026 (CEST)
Vor 56 Jahren hat GÖDEL, abschließend, auf zwei Notiz-Zetteln seinen, den, von ihm so bezeichneten, ,ontologischen Beweis‘ skizziert, und zwar in der formalen Sprache der ,''Principia Mathematica''‘ von WHITHEAT und RUSSELL, die er gewohnt war, mit ein paar sprachlichen Zusätzen, als Ergebnis seiner mehrjährigen Überlegungen zu diesem Thema. Diese Zettel wurden, von mehreren Bearbeitern danach, in die dann, jeweilig modernere, formal-logische Sprachform, transformiert, bzw. transkripiert. Auf diesen Zetteln stehen fünf Axiome und drei Definitionen, zwei Theoreme und ein, nicht als solches bezeichnetes, Korollar; und ein paar <span style="color:#00B000">(syntaktische)</span> Bemerkungen dazu. Sowohl A. FUHRMANN als auch G. J. WIRSCHING, haben heute, für die zwei Theoremen und dem Korollar GÖDELS, jeweils einen nachvollziehbaren Beweis, d.h. mit Hilfe der GÖDEL-Axiome und -Definitionen, drei logisch-formale Ableitungen aus <span style="color:#00B000">(nicht näher diskutierten)</span> Prämissen vorgelegt, die ich hier als Grundlage meiner Studie verwendet habe.
Der Text meiner Arbeit ist sukzessiv, aufeinanderfolgend, nur die Summe aller Antworten, die sich aus den Fragen ergeben haben, die sich stellen, wenn man das GÖDEL-System eingehend studiert. Daher ist für das Lesen meiner Arbeit, immer die fragende Beschäftigung mit dem GÖDEL-Kalkül selbst, Voraussetzung '''!''' Dazu biete ich meine Neu-Kalkülisierung des GÖDEL-Systems im Anhang an, in die alle Erkenntnis aus meinen Beobachtungen am syntaktischen Formal-Text eingeflossen sind, und so, nach und nach, ihre Form, <span style="color:#00B000">(und auch ihre Interpretation, bzw. ,Benennungen‘)</span>, gefunden haben. Das Ziel war, das begründete und begründbare Verstehen des GÖDEL-Systems.
Meine Studie zum GÖDEL-Kalkül sagt, mit ,vielen‘ Worten, was die GÖDEL-Zeichen einfach nur ,anzeigen‘. Daher liegt ein Augenmerk meiner Arbeit auch auf der formal-formatierten Struktur der Worte, mit denen ich über die GÖDEL-Zeichen spreche. <span style="color:#00B000">(Zeichen sind immer mehrdeutig interpretierbar '''!''' )</span> Einfache Sachverhalte, über die ich in einem Satz spreche, stehen zwischen ,einfachen‘ Anführungszeichen. Sachverhalte, die in meiner Arbeit einen wichtigeren Stellenwert haben, sind mit einer Farbe gekennzeichnet, und stehen zwischen <span style="color:#FF6000">„doppelten“</span> Anführungszeichen, und sind meistens <span style="color:#FF6000">,rotgelb‘</span>, <span style="color:#00B000">(,Danke‘ dem anonymen Wortspender '''!''' )</span> gefärbt.
Sachverhalte, die von ,Autoritäten‘, schon vor mir, diskutiert worden sind, werden als ganze Zitate, <span style="color:#FF6000">,''rotgelb kursiv''‘</span>, eingerückt, auch ohne Farbe, oder als weiter benutzte Worte aus diesen Zitaten, <span style="color:#FF6000">,''rotgelb kursiv''‘</span> zwischen <span style="color:#FF6000">»</span>Winkel<span style="color:#FF6000">«</span>-Anführungszeichen gestellt, und, wenn nötig, mit einer Quellenangabe versehen. Die <span style="color:#4C58FF">,blauen‘</span> Axiome und Definitionen, die Theoreme und Korollare des GÖDEL-Systems werden von mir durch ''kursive'', zwischen <span style="color:#FF6000">»''rotgelbe Winkel-Anführungszeichen''«</span> gestellte Sätze, kontextkonform interpretiert.
Da ich, mit A. FUHRMANN, das GÖDEL-System als eine <span style="color:#4C58FF">„axiomatische Theologie“</span> lese, haben sowohl alle Terme und Meta-Terme des Kalküls, als auch die <span style="color:#4C58FF">„Theologie“</span> und alle <span style="color:#4C58FF">„theologischen“</span> Fachausdrücke, in der Erklärung, die <span style="color:#4C58FF">,blaue‘</span> Farbe. <span style="color:#00B000">(Der Parser in dem, — sehr nützlichen —, Mathematik-Teil-Programm von Wikibooks stürzt ab, wenn ich alle Terme des GÖDEL-Kalküls <span style="color:#4C58FF">,blau‘</span>-färben wollte.)</span> Zitate aus der Bibel sind <span style="color:#CC66FF">,violett‘</span>, wie schon festgestellt.
Längere Zitate, zwischen farbigen Anführungszeichen, sind deswegen nicht gefärbt, weil ich die Zitate mit meinen Anmerkungen und Zusätzen, intern, in <span style="color:#00B000">[ eckigen gelbgrünen ]</span> Klammern gestellt, kommentiere, auch mit Hinzuziehung anderer <span style="color:#FF6000">„Zitate“</span> und <span style="color:#FF6000">„Sachverhalte“</span>. Alle Zusätze im Fließ-Text, alle Erklärungen, Ergänzungen, Klarstellungen, und auch größere, weiterführende, erklärende Exkurse zum Thema, sind <span style="color:#00B000">,gelbgrün‘</span> gefärbt, und stehen immer innerhalb von <span style="color:#00B000">(runden gelbgrünen)</span> Klammern. Nur Exkurse zu Themen, die in einer Diskussion zu weit führen würden, sind in die Fußnoten abgestellt.
Für die ,Legende des Kalküls‘ ist es hilfreich, sich vorerst allgemein, über die Inhalte der ,Aussagenlogik‘ und der ,Prädikatenlogik‘ zu informieren.
Mit freundlichen Grüßen [[Benutzer:Santiago|Santiago]] 04:56, 29. Jul. 2026 (CEST)
5taynepdxcldpbz0e6mh8kucwpt04de