C auto anahtar sözcüğü nerede kullanılır?


104

Üniversite günlerimde autoanahtar kelimeyi okudum ve zamanla ne olduğunu gerçekten unuttum. Şu şekilde tanımlanır:

yerel bir değişkeni yerel bir ömre sahip olarak tanımlar

Hiçbir yerde kullanıldığını hiç bulamadım, gerçekten kullanılıyor mu ve eğer öyleyse nerede ve hangi durumlarda kullanılıyor?

Yanıtlar:


90

autogibi bir değiştiricidir static. Bir değişkenin depolama sınıfını tanımlar. Bununla birlikte, yerel değişkenler için varsayılan değer olduğu için auto, normalde manuel olarak belirtmeniz gerekmez.

Bu sayfa , C'de farklı depolama sınıflarını listeler.


13
Birisi cevabımı yukarı oyladıktan sonra buna tekrar bakıyordum. Normalde manuel olarak belirtmenize gerek olmadığını söylüyorsunuz. Olduğu bir durum aslında var: Sadece sormak zorunda auto olabilir belirtilebilir ancak varsayılan olarak olmayacak?
Jerry Coffin

2
@JerryCoffin C'de değil. C ++ 11'de, başka bir amaçla kullanılır ve yerel değişken türü çıkarımını etkili bir şekilde elde etmek için kullanabilirsiniz.
Mehrdad Afshari

2
Olası bir kullanım, GNU C'de iç içe geçmiş işlevlerin ileriye dönük bildirilmesidir - bu, öğesinin orijinal tanımının ele geçirilmesidir auto. tigcc.ticalc.org/doc/keywords.html#auto
josiah

2
Bağlanan sayfa güncel değil. C11'den beri _Thread_localayrıntılar da var : en.cppreference.com/w/c/language/storage_duration ve stackoverflow.com/a/14289720/6557621
MCCCS

132

IAQ (Seyrek Sorulan Sorular) listesini okursanız, auto'nun öncelikle bir aracı tanımlamak veya ilan etmek için yararlı olduğunu bilirsiniz:

auto my_car;

Sürekli olarak açık havada park eden bir araç:

extern auto my_car;

Mizah duygusundan yoksun olanlar ve "sadece gerçekler Hanımefendi" isteyenler için: Kısa cevap, kullanmak autoiçin hiçbir zaman bir neden olmadığıdır . Kullanmanıza izin verilen tek zaman auto, zaten autodepolama sınıfına sahip bir değişkendir , yani her halükarda olacak bir şeyi belirliyorsunuz. Depolama sınıfına autosahip olmayan herhangi bir değişkeni kullanmaya çalışmak auto, derleyicinin kodunuzu reddetmesine neden olur. Sanırım teknik bilgi almak istiyorsanız, uygulamanızın bir derleyici olması gerekmiyor (ama öyle) ve teorik olarak bir tanılama yaptıktan sonra kodu derlemeye devam edebilir (ama olmayacak).

Tarafından Küçük Zeyilname kaz :

Ayrıca birde şu var:

static auto my_car;

ISO C'ye göre bir teşhis gerektirir. Bu doğrudur, çünkü arabanın arızalı olduğunu bildirir. Teşhis ücretsizdir, ancak gösterge paneli ışığını kapatmak size seksen dolara mal olacaktır. (EBay'den yerleşik tanılama için kendi USB dongle'ınızı satın alırsanız yirmi veya daha az).

Yukarıda belirtilenler extern auto my_carayrıca bir teşhis gerektirir ve bu nedenle, park etme denetimiyle görevli şehir personeli dışında hiçbir zaman derleyiciden çalıştırılmaz.

Herhangi extern static auto ...bir kod tabanında çok şey görüyorsanız , kötü bir mahalledesiniz; Tüm yer Rust'a dönmeden önce hemen daha iyi bir iş arayın.


@self .: ISO bir "ISO 2011" bilmiyor gibi görünüyor. Neyi standartlaştıracağına inanıyorsunuz?
Jerry Coffin

6
Ağzımda kahve, kola, şişman veya başka bir koyu renkli sıvı olmaması iyi bir şey. Böyle olsaydı, bana @JerryCoffin adlı bir bilgisayar ekranı borçlusunuz. ŞİMDİYE KADAR EN İYİ CEVAP!
David Hammen

2
@Dan: Dürüst olmak gerekirse, 5 satırlık bir metni okumanız ve "kısa cevap, otomatik kullanmak için hiçbir zaman hiçbir neden olmadığı" dediği kısma gelmeniz "epey zaman" aldı? Ciddi anlamda? Sizinkinin hemen önündeki yoruma bakıldığında, en azından birkaç kişinin olumlu bir katkı bulduğu görülüyor.
Jerry Coffin

@JerryCoffin Bunu zaten açıkladım, yorumumu tekrar oku. Hindsight 20/20.
Dan Bechard

2
Geçenlerde ciddi bir yangını (iki şeridi kapattım) geçtim ve buna ihtiyaç olduğunu düşündümchar auto my_car;
sade

46

autoAnahtar kelime C dilinde işe yaramaz. Oradadır çünkü C dilinden önce yerel değişkenleri bildirmek için bu anahtar kelimenin gerekli olduğu bir B dili vardı. (B, C haline gelen NB'ye dönüştürüldü).

İşte B için başvuru kılavuzu .

Gördüğünüz gibi kılavuz auto, kullanıldığı örneklerle doludur . Bunun nedeni intanahtar kelime olmamasıdır . "Bu bir değişkenin bildirimi" demek için bir tür anahtar kelimeye ihtiyaç vardır ve bu anahtar kelime aynı zamanda bunun yerel mi yoksa harici mi olduğunu gösterir (buna autokarşılık extrn). Birini veya diğerini kullanmazsanız, sözdizimi hatası alırsınız. Yani x, y;kendi başına bir beyan değil, öyledir auto x, y;.

B'de yazılan kod tabanlarının, dil geliştirildikçe NB'ye ve C'ye taşınması gerektiğinden, dilin daha yeni sürümleri, daha az işe çevrilen, geliştirilmiş geriye dönük uyumluluk için bir miktar bagaj taşıdı. Durumda auto, programcıların her oluşumunu araştırması autove kaldırması gerekmiyordu .

Kılavuzdan açıkça anlaşılıyor ki, C'deki artık eskimiş olan "örtük int" kısaltması ( önünde main() { ... }herhangi bir şey olmadan yazabilme int) da B'den geliyor. Bu, B kodunu destekleyen başka bir geriye dönük uyumluluk özelliği. İşlevlerin B'de belirtilen bir dönüş türü yoktur çünkü türler yoktur. Her şey, birçok assembly dilinde olduğu gibi bir kelimedir.

Bir fonksiyonun nasıl sadece bildirilebileceğine extrn putcharve sonra onu tanımlayıcının kullanımı olan bir fonksiyon yapan tek şeyin olduğuna dikkat edin : bu gibi bir fonksiyon çağrısı ifadesinde kullanılır putchar(x)ve derleyiciye bu tipsiz kelimeyi bir fonksiyon işaretçisi olarak ele almasını söyleyen şey budur.


24

C'de auto, bir değişkenin bir bloğa yerel olduğunu belirten bir anahtar sözcüktür. Bu, blok kapsamlı değişkenler için varsayılan olduğundan, gereksizdir ve çok nadiren kullanılır (anahtar kelimeyi tartışan metinlerdeki örneklerin dışında kullanıldığını hiç görmediğimi sanmıyorum). Birisi, autodoğru bir çözümleme veya davranış elde etmek için kullanımının gerekli olduğu bir durumu işaret edebilirse ilgilenirim .

Bununla birlikte, C ++ 11 standardında autoanahtar kelime, tür çıkarımını desteklemek için 'ele geçirildi', burada bir değişkenin türü, başlatıcısının türünden alınabilir:

auto someVariable = 1.5;   // someVariable will have type double

Tür çıkarımı, esas olarak şablonlarda değişken bildirmeyi desteklemek için ekleniyor veya bir şablon parametresine dayalı türlerin (veya bir şablon başlatıldığında derleyici tarafından çıkarıldığı) genellikle manuel olarak bildirilmesi oldukça zahmetli olabilen şablon işlevlerinden döndürülüyor.


1
"Değişken bir blok için yereldir" - bu hiç de doğru değil. Bir blokta bildirilen tüm değişkenler bu blok için yereldir (kapsam açısından). Programdaki diğer değişkenlerle bağlantılı olabilirler, ancak bildirim yalnızca o blokta görülebilir. autogörünürlükle ilgisi olmayan depolama sınıfı ile ilgilidir.
2018

12

Eski Aztec C derleyicisiyle, bir komut satırı anahtarı kullanarak tüm otomatik değişkenleri statik değişkenlere (daha yüksek adresleme hızı için) dönüştürmek mümkündü.

Ancak açıkça bildirilen değişkenler autobu durumda olduğu gibi bırakıldı. (Aksi takdirde düzgün çalışmayacak özyinelemeli işlevler için bir zorunluluktur!)


7

autoAnahtar kelime Python noktalı virgül dahil benzer, bir önceki dille gerekmiştir ( B) ancak geliştiriciler çoğu şeyi çünkü gereksiz olduğunu fark etti auto.

B'den C'ye geçişe yardımcı olmak için bırakıldığından şüpheleniyorum. Kısacası, bir kullanım B dili uyumluluğu içindir.

Örneğin B ve 80'ler C'de:

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10.  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n, b) {
        extrn putchar;
        auto a;

        if (a = n / b)        /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n % b + '0');
}

1

Auto anahtar sözcüğü, bir depolama sınıfı (değişkenin yaşam süresine ve depolama yerine karar veren bazı teknikler) örneğidir. Söz konusu anahtar kelimenin Yardımı tarafından yapılan değişkenin ömrü (ömür boyu) yalnızca küme parantezleri içinde bulunduğu bir davranışa sahiptir.

{
    auto int x=8;        
    printf("%d",x);  // here x is 8

    { 
        auto int x=3;
        printf("%d",x);  // here x is 3
    }              

    printf("%d",x);  // here x is 8
}          

1

autoyalnızca blok kapsamlı değişkenler için kullanılabilir. extern auto intçöptür çünkü derleyici bunun harici bir tanım kullanıp kullanmayacağını veya extern'i otomatik tanımla geçersiz kılıp kılmayacağını belirleyemez (ayrıca auto ve extern gibi tamamen farklı depolama süreleridir static auto int, ki bu da açıkça saçmadır). Her zaman bir şekilde yorumlamayı seçebilir, ancak bunun yerine onu bir hata olarak ele almayı seçer.

Bir özelliği yoktur autosağlamak ve en sağlayarak bir işlev içinde kural 'Her şeyi bir int' gelmez. Dosya kapsamında atamalar olmadığından a=3tanım olarak yorumlanan bir fonksiyonun dışından farklı olarak, bir fonksiyonun içindeki bir hatadır çünkü görünüşe göre derleyici bunu her zaman bir tanımdan ziyade harici bir değişkene atama olarak yorumlar (orada olsa bile hiçbir vardır dosya kapsamı işlevinde veya ileri beyanlar), ancak böyle bir belirteci , , veya bir tanımıdır ve dışında derleyici, bir tanım olarak onu alır geldiği anlamına geliyordu diğer belirteçleri yan etkileri yoktur. bu nedenle dolaylı olarak . Kuşkusuz,int a =3a=3extern int astaticconstvolatileautoautoauto a=3auto int a = 3signed a = 3aynı etkiye sahiptir ve unsigned a = 3her zaman işaretsiz bir tamsayıdır.

Ayrıca ' autobir nesnenin bir kayda tahsis edilip edilmeyeceği üzerinde hiçbir etkisi yoktur (belirli bir derleyici ona dikkat etmedikçe, ancak bu olası görünmüyor)' '


-1

C'deki "extern", "static", "register" ve "auto" olan depolama sınıfı tanımlayıcılarına aşina olduğunuzdan eminim. "Auto" kelimesinin tanımı hemen hemen diğer cevaplarda verilmiştir, ancak burada "auto" anahtar kelimesinin olası bir kullanımı var, emin değilim, ancak bunun derleyiciye bağlı olduğunu düşünüyorum. Görüyorsunuz, depolama sınıfı belirleyicileriyle ilgili olarak bir kural var. Bir değişken için birden fazla depolama sınıfı belirticisi kullanamayız. Bu nedenle statik global değişkenler dışlanamaz. Bu nedenle, sadece dosyalarıyla bilinirler. Derleyici ayarınıza gittiğinizde, hız için optimizasyon bayrağını etkinleştirebilirsiniz. derleyicinin optimize etme yollarından biri, depolama sınıfı belirteçleri olmayan değişkenleri arar ve ardından önbellek kullanılabilirliğine ve bu değişkeni kayıt belirteci kullanarak işlemesi gerekip gerekmediğini görmek için diğer bazı faktörlere dayalı bir değerlendirme yapar. Şimdi, programımızdaki belirli bir değişkenin çok önemli olmadığını bilerek kodumuzu hız için optimize etmek istiyorsak ve derleyicinin onu kayıt olarak düşünmesini istemiyorsak ne olur? Yine de auto koyarak, derleyici "register auto int a;" yazdığından beri bir değişkene kayıt belirticisi ekleyemeyecek. VEYA "auto register int a;" birden çok depolama sınıfı belirticisi kullanma hatasını ortaya çıkarır. Özetlemek gerekirse, auto'nun derleyicinin bir değişkeni optimizasyon yoluyla kayıt olarak işlemesini engelleyebileceğini düşündüm. programımızdaki belirli bir değişkenin çok önemli olmadığını bilerek kodumuzu hız için optimize etmek istiyorsak ve derleyicinin onu kayıt olarak bile düşünmesini istemiyorsak ne olur? Yine de auto koyarak, derleyici "register auto int a;" yazdığından beri bir değişkene kayıt belirticisi ekleyemeyecek. VEYA "auto register int a;" birden çok depolama sınıfı belirticisi kullanma hatasını ortaya çıkarır. Özetlemek gerekirse, auto'nun derleyicinin bir değişkeni optimizasyon yoluyla kayıt olarak işlemesini engelleyebileceğini düşündüm. programımızdaki belirli bir değişkenin çok önemli olmadığını bilerek kodumuzu hız için optimize etmek istiyorsak ve derleyicinin onu kayıt olarak bile düşünmesini istemiyorsak ne olur? Yine de auto koyarak, derleyici "register auto int a;" yazdığından beri bir değişkene kayıt belirticisi ekleyemeyecek. VEYA "auto register int a;" birden çok depolama sınıfı belirticisi kullanma hatasını ortaya çıkarır. Özetlemek gerekirse, auto'nun derleyicinin bir değişkeni optimizasyon yoluyla kayıt olarak işlemesini engelleyebileceğini düşündüm. birden çok depolama sınıfı belirticisi kullanma hatasını ortaya çıkarır. Özetlemek gerekirse, auto'nun derleyicinin bir değişkeni optimizasyon yoluyla kayıt olarak işlemesini engelleyebileceğini düşündüm. birden çok depolama sınıfı belirticisi kullanma hatasını ortaya çıkarır. Özetlemek gerekirse, auto'nun derleyicinin bir değişkeni optimizasyon yoluyla kayıt olarak işlemesini engelleyebileceğini düşündüm.

Bu teori GCC derleyicisi için işe yaramadı ancak diğer derleyicileri denemedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.