Neden "2i" ifadesi; Derleyici hatasına neden OLMAZ?


82

Bunun yerine 2*idikkatsizce yazdım 2i:

Derleyicinin hatayı yakalamasını bekliyordum. Ama olmadı. Öyleyse 2iC'de geçerli bir ifade var mı? Eğer öyleyse ne işe yarar? Şaşkın!

Gcc 5.3.0 sürümünü kullanarak derledim ve işte montaj çıktısı:


Bu hangi derleyici?
Iharob Al Asimi

_ComplexSayılarla çalışmıyorum . Standartta ve sağlanan bağlantıda biraz okuduktan sonra, @ iharob'un cevabının doğru olduğunu düşünüyorum.
bu site için çok dürüst

@Olaf Batıdaki fastet Fourier Dönüşümü fftw türünü kullanır _Complex. Bunu tezim için bir veri işleme yazılımı yazarken buldum ( Fizik aslında, bilgisayar bilimi veya benzeri değil ) - ( bir alçak geçirgen filtre uygulamalıydım, bu yüzden evrişim çok Hızlı Fourier Dönüşümü, yani fftw ).
Iharob Al Asimi

@iharob: Hmm, bu ffte'den daha hızlı mı ve değilse, batıda yaşıyorsam daha hızlı kullanmama izin var mı? ;-) Cidden: Bilgi için teşekkürler. Göründüğü gibi, C standardı, C11 ile benzer basit bir gösterimi desteklemiyor bile.
bu site için çok dürüst

Çok iyi bir örnek ".. 'Eureka' değil, 'Bu komik ...'"!
Jongware

Yanıtlar:


107

Bu bir gcc uzantısıdır ve 2ihayali sabittir görüntü açıklamasını buraya girin. Böylece aşağıdaki gibi karmaşık bir sayı yazabilirsiniz:


12
Vay canına, bu bir sürpriz oldu! Complex.h başlık dosyasını eklemediğim halde neden çalıştığını söyler misiniz?
daltonfury42

4
@ daltonfury42 Başlık _Complextür içindir, 2ibir sabittir ( gcc'nin anladığı gibi ). std=c99Veya std=c11işaretini ekleyin ve -Wallbir uyarı göreceksiniz. Ayrıca, gerçekten de geri dönmüyor, 0ancak dönüş türü _Complexve değeri olması gerektiğinden 0 + 2i, onu inceleyemezsiniz printf(). Yani belki de gerçek kısmı budur 0!
Iharob Al Asimi

12
@ daltonfury42: Kayan nokta sabitleri için destek almanız #include <float.h>(veya math.h) gerekmez .
bu site için çok dürüst

2
@ daltonfury42 Doğru. Başlık dosyaları dil sözdizimini değiştirmez, sadece değişkenler, işlevler, türler vb. Gibi şeyleri
bildirirler

2
@ daltonfury42 Bu sözdiziminin tanınmasının a tarafından kontrol edilmesi mümkün olsa da #pragma, complex.hsorun olabilir. Ama bu şekilde yapmadılar.
Barmar

13

2igcckarmaşık bir tamsayı için bir uzantıdır, karekökün iki katı saf sanal bir sayıdır -1. Bu uzantı da tarafından desteklenmektedir clang.

İle derlemenizin gcc 5.4.0postalanmış derleme çıktısını oluşturması biraz şaşırtıcıdır :

  • Üzerinde Derleme http://gcc.godbolt.org/# Ben bir derleme hatası alıyorum gcc5.3.0: http://gcc.godbolt.org/#: error: cannot convert '__complex__ int' to 'int' in return.
  • İşlev için gönderilen derleme kodu fooyanlış: geri dönmüyor 0. Karmaşık tamsayı sabiti dönüştürme 2iiçin intgerçek bir kısmını dönmelidir 0.

Tersine, clang3.7 ile, bir uyarı olmadan derler ve optimum kod üretir, ancak elbette beklediğiniz gibi değildir:

Bu sözdizimi, diğer soneklerle herhangi bir sırada birleştirilebilir. Aşağıdaki kodu derlemek clang -Weverythingbana uygun uyarıları veriyor warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]:

Bu çıktıyı benim ortamımda üretir:

Sonuncuyu sözdizimi renklendirme düzenleyicinizle deneyin ;-)


Arch Linux çalıştıran bilgisayarımda GCC 5.3.0 kullandığımda elde ettiğim şey bu. İşte sen ilgilenen eğer benim gcc yapılandırmasıdır.
daltonfury42
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.