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

  • cyriak

    cyriak

    29 Mart 2006
  • jesiel santos

    jesiel santo

    15 Ocak 2009
  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006