Stattdessen 2*i
schrieb ich nachlässig 2i
:
int foo(int i)
{
2i;
return 2i;
}
Ich habe erwartet, dass der Compiler den Fehler abfängt. Aber das tat es nicht. Ist also 2i
eine gültige Aussage in C? Wenn ja, was macht es? Verwirrt!
Ich habe mit gcc Version 5.3.0 kompiliert und hier ist die Assembly-Ausgabe:
.file "strange.c"
.text
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -4(%rbp)
nop
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.ident "GCC: (GNU) 5.3.0"
.section .note.GNU-stack,"",@progbits
_Complex
Zahlen. Nach einigem Lesen des Standards und des bereitgestellten Links denke ich, dass die Antwort von @ iharob richtig ist._Complex
Typ. Ich fand dies heraus, als ich eine Datenverarbeitungssoftware für meine Diplomarbeit schrieb ( Physik eigentlich nicht Informatik oder ähnliches ) - ( ich musste einen Tiefpassfilter anwenden, also Faltung so schnelle Fourier-Transformation, so fftw ).Antworten:
Dies ist eine gcc- Erweiterung und
. Sie können also eine komplexe Zahl wie folgt schreiben:
2i
die imaginäre Konstantequelle
_Complex
Typ,2i
ist eine Konstante ( wie gcc es versteht ). Wenn Sie das Flagstd=c99
oder instd=c11
Kombination mit-Wall
hinzufügen, wird eine Warnung angezeigt. Es wird zwar nicht zurückgegeben,0
aber da der Rückgabetyp_Complex
und der Wert sein sollten0 + 2i
, können Sie ihn nicht überprüfenprintf()
. Vielleicht ist das nur der eigentliche Teil0
!#include <float.h>
(odermath.h
) auch keine Unterstützung für Gleitkommakonstanten erhalten .#pragma
,complex.h
könnte dies zu Problemen führen . Aber sie haben es nicht so gemacht.2i
ist einegcc
Erweiterung für ein komplexes ganzzahliges Literal, eine reine imaginäre Zahl, die doppelt so groß ist wie die Quadratwurzel von-1
. Diese Erweiterung wird auch von unterstütztclang
.Es ist etwas überraschend, dass beim Kompilieren mit
gcc 5.4.0
die veröffentlichte Assembly-Ausgabe erzeugt wird:gcc
5.3.0:http://gcc.godbolt.org/#
:error: cannot convert '__complex__ int' to 'int' in return
.foo
ist falsch: Er wird nicht zurückgegeben0
. Das Konvertieren der komplexen Ganzzahlkonstante2i
inint
sollte ihren Realteil zurückgeben0
.Umgekehrt wird mit
clang
3.7 ohne Warnung kompiliert und der optimale Code generiert, aber natürlich nicht das, was Sie erwarten:Diese Syntax kann in beliebiger Reihenfolge mit anderen Suffixen kombiniert werden. Das Kompilieren des folgenden Codes mit
clang -Weverything
gibt mir entsprechende Warnungenwarning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
:Es erzeugt diese Ausgabe in meiner Umgebung:
Probieren Sie den letzten mit Ihrem Syntax-Farbeditor aus
;-)
quelle