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

  • Anthony Cumia

    Anthony Cumi

    5 EYLÜL 2006
  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • tseyina

    tseyina

    2 AĞUSTOS 2006