SORU
22 AĞUSTOS 2015, CUMARTESİ


= 1 tanımsız davranışlara neden bir [[0]]?

Bu C99 kodu tanımsız davranış üretir?

#include <stdio.h>

int main() {
  int a[3] = {0, 0, 0};
  a[a[0]] = 1;
  printf("a[0] = %d\n", a[0]);
  return 0;
}

Açıklamada a[a[0]] = 1; , a[0] hem okuyup değiştirilir.

ISO/IEC 9899 bu n1124 taslak baktım. Diyor (6.5 İfadelerde):

Önceki ve sonraki sıra nokta arasında bir nesne saklanan değeri en fazla bir yorumuna göre modifiye eder. Ayrıca, önceki değeri yalnızca depolanacak değerini belirlemek için okunur.

Nesnenin kendisi belirlemek için bir nesne değiştirilecek okuma söz etmez. Böylece bu ifade tanımsız davranışlara neden olabilir.

Ancak, garip hissediyorum. Bu aslında tanımsız davranış üretir?

(Ben de diğer ISO C sürümlerinde bu sorun hakkında bilmek istiyorum.)

CEVAP
22 AĞUSTOS 2015, CUMARTESİ


önceki değeri yalnızca depolanacak değerini belirlemek için okunur.

Bu biraz belirsiz ve C11 attın neden kısmen ve yeni bir sıralama modeli piyasaya karışıklığa neden oldu.

Söylemeye çalıştığı şey: eğer eski değer okuma süresi içinde daha önce yeni değeri yazmak daha ortaya garantili ise sorun değil. Aksi halde İK. Ve tabii ki yeni bir değer yazılmadan önce hesaplanan bu bir gerekliliktir.

(Tabii ki sadece yazdım açıklama bazıları tarafından Standart metin daha belirsiz olduğu tespit edilecektir!)

Örneğin x = x 5 Olası ilk x bilmeden x 5 çalışmak için değil, çünkü doğru. Ancak a[i] = i sol tarafta i okuma i saklamak için yeni değerini anlamak için gerekli değildir, çünkü yanlış. (i iki okur ayrı ayrı olarak kabul edilir).


Kodunuz geri şimdi. Dizi dizin yazmadan önce meydana garantilidir tespit etmek amacıyla a[0] okuma çünkü iyi tanımlanmış bir davranış olduğunu düşünüyorum.

Belirledik yazmak kadar burada yazmak edemeyiz. Ve a[0] okuduk sonra Nereye yazacağımı bilmiyorum. Bu nedenle okuma yazma önce gelmeli, İK yoktur.

Birisi hakkında sırası puan yorumladı. C99'da Bu ifadede sıra nokta yok, sıra noktaları bu tartışmaya girer.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ADDVOiCE

    ADDVOiCE

    28 Mayıs 2009
  • Floortile83

    Floortile83

    16 Ocak 2010
  • Rooster Teeth

    Rooster Teet

    11 Temmuz 2006