SORU
13 ŞUBAT 2013, ÇARŞAMBA


İfadeleri "j = (ı | O); ve j = (ı & ı); lvalue bir hata olmalı?

Aşağıdaki benim kod bunu bekliyordum:

#include<stdio.h> 
int main(){
    int i = 10; 
    int j = 10;

    j =   (i | i);
    printf("%d %d\n", j, i);

    j =   (i & i);
    printf("%d %d\n", j, i);

    return 1;
}

ifadeler j = (i | i); j = (i & i); aşağıda lvalue hataları üretir:

x.c: In function ‘main’:
x.c:6: error: lvalue required as increment operand
x.c:9: error: lvalue required as increment operand   

Ama kod başarıyla derlenmiş, yukarıda o aşağıda ben de şaşırtıcı

~$ gcc x.c -Wall
~$ ./a.out 
11 11
12 12   

the above code working doğru kontrol edin.

Diğer operatörler hata anladığım kadarıyla () üretmek iken. Hatta bit XOR operatörü bir hata j = (i ^ i); (derleme operators produce an lvalue error diğer kontrol) neden olur.

Sebebi nedir? Bu belirsiz ya da tanımsız olur ? ya bit YA VE operatörler farklı mı?

sürüm derleyici:

gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

Ama derleyici sürümü düzgün olmayan davranış için bir sebep olmamalı inanıyorum. ** 11 sonra derlenmiş | & da değil. aksi halde herkes için çalışması gerekir

C99 modunda bu derleyici ile değil, onun bir hata: gcc x.c -Wall -std=c99.

CEVAP
13 ŞUBAT 2013, ÇARŞAMBA


Derlemek değil, ve çoğu derleyici, derleme değil.
(Derleyici bir hata veriyor tam olarak belirtin lütfen

Sadece derleyici (i | i) == i (i & i) == i kimlikler bilir ve bu kimlikleri ifade, sadece değişken i geride bırakarak optimize uzakta kullanıyor varsayımında olabilir.

Bu sadece bir tahmin, ama bana mantıklı bir sürü yapar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dom Esposito

    Dom Esposito

    26 Mayıs 2011
  • Ownage Pranks

    Ownage Prank

    13 AĞUSTOS 2007
  • SegaAmerica

    SegaAmerica

    5 Mart 2008