SORU
3 HAZİRAN 2015, ÇARŞAMBA


Ben = (i, i, 1) 1; nedir?

Tanımsız davranış ve sıra noktaları hakkında this cevabı okuduktan sonra, küçük bir program yazdım:

#include <stdio.h>

int main(void) {
  int i = 5;
  i = (i,   i, 1)   1;
  printf("%d\n", i);
  return 0;
}

ve çıkış 2. Tanrım, azaltmalar geldiğini görmedim! Biri burada neler olduğunu açıklayabilir mi?

Yukarıdaki kod derleme sırasında ayrıca, bir uyarı aldım

px.:5:8 c: uyarı: sol virgül ifadenin işlenen hiçbir etkisi olmaz

  [-Wunused-value]   i = (i,   i, 1)   1;
                        ^

Neden? Ama muhtemelen otomatik olarak benim ilk sorunun cevabı cevap olacak.

CEVAP
3 HAZİRAN 2015, ÇARŞAMBA


Deyim (i, i, 1), virgül kullanılır comma operator

virgül operatörü (tarafından temsil edilen bir belirteç ,) bir ikili operatör veren ilk işlenen ve atar sonucu, ve sonra ikinci işlenen değerlendirir ve bu değeri döndürür (ve türü).

İlk işlenen atar, çünkü genellikleilk terim arzu yan etkileri olduğu için daha faydalı. Eğer ilk terim için yan etkisi gerçekleşir mi eğer değilse, o zaman derleyici etkisi ile ifade hakkında uyarı verebilir.

Bu yüzden, ifade yukarıdaki, en soldaki i değerlendirilecek ve değerini atılacak. Sonra i değerlendirilecek ve 1 i atılacak ifadenin değeri tekrar i artırırama 12* *yan etkisi kalıcı olur. Sonra 1 değerlendirilecek ve ifadenin değeri 1 olacak.

Eşdeğerdir

i;          // Evaluate i and discard its value. This has no effect.
  i;        // Evaluate i and increment it by 1 and discard the value of expression   i
i = 1   1;  

Unutmayınyukarıdaki ifade geçerlidir ve tanımsız davranış çağırmak değilsol değerlendirilmesi ve virgül sağ işlenen arasında sequence point bir operatör var.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Keith Anthe

    Keith Anthe

    26 NİSAN 2011
  • Kyler Briskey

    Kyler Briske

    20 ŞUBAT 2011
  • xXGAMERrs_Xx

    xXGAMERrs_Xx

    31 Temmuz 2014