Çözüldü return ne işe yarıyor?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Phoremnqart

Hectopat
Katılım
20 Temmuz 2020
Mesajlar
76
Çözümler
1
Arkadaşlar C++ henüz çok başındayım, o yüzden çok salakça bir soru olmuş olabilir kusura bakmayın. Ben return ne işe yaradığını tam anlayamadım. Fonksiyona değer döndürüyor deniyor fakat return olmadan da işe yarıyor örneğin;

C++:
int toplama(int A, int B, int C){

int toplam = 0;

toplam = a+b+C;}

Gibi basit bir fonksiyon olsun bu fonksiyonda return olmamasına rağmen istediğim değişkene atayabiliyorum.

Ayrıca main fonksiyonunun veri tipini belirtmemiz gerekmiyorken diğer fonksiyonlarda neden gerekiyor çağırdığımız için mi?
 
Son düzenleyen: Moderatör:
Çözüm
Return komutunun fonksiyona değer döndürdüğünü biliyorum fakat return olmadan da aynı sonuç oluyorsa o zaman neden return kullanalım demek istemiştim. Verdiğim örnekte return yok fakat sizin verdiğiniz örnek ile aynı işlevi görüyor.
GCC'nin garip bir özelliğini keşfetmişsin. Return etmeden bir şey döndürebiliyor olmasının sebebi, return instruction'ı olmadığından son değişkeni döndürmeye çalışıyor.

C:
#include <stdio.h>

int add(int a, int b) {
   int res = (a + b);
}

int main() {
    printf("%d", add(3, 5));
    return 0;
}

Yukarıdaki kodu compiler explorer'a yazdım. Clang ve GCC ile derledim.
Bu GCC derlemesi;
1715085592074.png


Bu da clang derlemesi;
1715085690298.png


Burada fark edeceğin şey Clang'in oluşturduğun değişkeni temporary bloğa kaydetmesi, GCC'ninse direkt stack üzerine yerleştirmesi. Return dediğiyse stack'in en üstündeki şeyi döndürüyor. Bu tarz bir durumda problem olmayacağını düşünebilirsin. Ancak gelelim şöyle bir koda;
C++:
int add(int a, int b) {
   int res = 0;
   for(int i = a; i < b; i++) {
        res += i;
   } 
}

Sonucu kestirebiliyor musun? Eğer add(1, 10) dersem 45 olması gereken sonuç sence ne geliyordur return etmediğimde? 10 geliyor. 45 değil. Eğer en sona int ret = res; gibi bir şey eklersem yine stackin en üstünde bu değişken olduğundan yine onu döndürecek. Ancak bu bir bug. Undefined behaviour. Her zaman buna güvenemezsin. Ya daha fazla iş yapıyor olsaydın? Daha uzun ve karmaşık bir kod kullanıyor olsaydın?
"return" komutu bir işlemi ana fonksiyon içerisinde sonlandırmak ve o işlemin sonucunu ana fonksiyona atamak için kullanılıyor. Bu ana fonksiyonun karşılığının return ile döndürülen değere karşılık gelmesi gerek tabii. Yoksa different type uyarısı alabilirsin.
 
Return ifadesi, bir fonksiyonun sonucunu çağıran yere döndürmek için kullanılır. Örneğin, bir toplama fonksiyonunuz varsa ve sonucu geri döndürmek istiyorsanız, return ifadesini kullanmanız gerekir.

Kod:
int toplama(int A, int B, int C) {
 int toplam = A + B + C;
 return toplam;
}

Bu şekilde olabilir return a toplamı atayabilirsin.
 
Return ifadesi, bir fonksiyonun sonucunu çağıran yere döndürmek için kullanılır. Örneğin, bir toplama fonksiyonunuz varsa ve sonucu geri döndürmek istiyorsanız, return ifadesini kullanmanız gerekir.

Kod:
int toplama(int A, int B, int C) {
 int toplam = A + B + C;
 return toplam;
}

Bu şekilde olabilir return a toplamı atayabilirsin.
Return komutunun fonksiyona değer döndürdüğünü biliyorum fakat return olmadan da aynı sonuç oluyorsa o zaman neden return kullanalım demek istemiştim. Verdiğim örnekte return yok fakat sizin verdiğiniz örnek ile aynı işlevi görüyor.
 
Return komutunun fonksiyona değer döndürdüğünü biliyorum fakat return olmadan da aynı sonuç oluyorsa o zaman neden return kullanalım demek istemiştim. Verdiğim örnekte return yok fakat sizin verdiğiniz örnek ile aynı işlevi görüyor.
Verdiğin örnekte bilgisayara sonucu hesaplatıp toplam değişkenine atıyorsun. Ama eğer mesela bir metodun/fonksiyonun içinde bir değişkenimiz var ve o değişkenin içindeki veriye (mesela sayı olabilir) başka bir yerden ulaşmak istediğinde bunu return sayesinde yaparsın.

C++:
int main(){
    a = toplam(3,4,5);
    // a ile birşeyler yap
    return 0;
}

int toplam(int A, int B, int C){
    t = A + B + C;
    return t;
}

Buradaki örneğe bak mesela toplam adında tam sayı döndüren bir metodumuz var. Bu metodu A,B,C olarak üç parametre geçerek kullanıyoruz ve bu metodu belki de yazdığımız kod boyunca defalarca kez kendisine verdiğimiz üç sayıyı her seferinde farklı parametrelerle (bu metot için farklı üç sayıyla) kullanacağız. Metodun kendi içinde tanımladığım t değişkenini main fonksiyonu görmez ve toplam metodunun içindeki t değişkenine de sakladığı veriye (bu durumda sayıya) de main'den veya başka bir yerden erişemem. Ki toplam()'ı her çağırdığımda içine farklı sayılar girebileceğim için t'nin burada sabit bir değeri de yok. Ama t'yi return ile döndüğüm zaman, ben her toplam fonksiyonunu çağırdığımda gerekli parametreleri gireceğim ve toplam(3,4,5) yazdığım yere aslında sanki direkt t'nin girdiğim parametrelerle aldığı değeri yazmış gibi olacağım. Eğer return t; yazmasaydım onun değerine main'den ulaşamazdım.
 
Return komutunun fonksiyona değer döndürdüğünü biliyorum fakat return olmadan da aynı sonuç oluyorsa o zaman neden return kullanalım demek istemiştim. Verdiğim örnekte return yok fakat sizin verdiğiniz örnek ile aynı işlevi görüyor.
GCC'nin garip bir özelliğini keşfetmişsin. Return etmeden bir şey döndürebiliyor olmasının sebebi, return instruction'ı olmadığından son değişkeni döndürmeye çalışıyor.

C:
#include <stdio.h>

int add(int a, int b) {
   int res = (a + b);
}

int main() {
    printf("%d", add(3, 5));
    return 0;
}

Yukarıdaki kodu compiler explorer'a yazdım. Clang ve GCC ile derledim.
Bu GCC derlemesi;
1715085592074.png


Bu da clang derlemesi;
1715085690298.png


Burada fark edeceğin şey Clang'in oluşturduğun değişkeni temporary bloğa kaydetmesi, GCC'ninse direkt stack üzerine yerleştirmesi. Return dediğiyse stack'in en üstündeki şeyi döndürüyor. Bu tarz bir durumda problem olmayacağını düşünebilirsin. Ancak gelelim şöyle bir koda;
C++:
int add(int a, int b) {
   int res = 0;
   for(int i = a; i < b; i++) {
        res += i;
   } 
}

Sonucu kestirebiliyor musun? Eğer add(1, 10) dersem 45 olması gereken sonuç sence ne geliyordur return etmediğimde? 10 geliyor. 45 değil. Eğer en sona int ret = res; gibi bir şey eklersem yine stackin en üstünde bu değişken olduğundan yine onu döndürecek. Ancak bu bir bug. Undefined behaviour. Her zaman buna güvenemezsin. Ya daha fazla iş yapıyor olsaydın? Daha uzun ve karmaşık bir kod kullanıyor olsaydın?
 
Çözüm
Gcc'nin garip bir özelliğini keşfetmişsin. Return etmeden bir şey döndürebiliyor olmasının sebebi, return instruction'ı olmadığından son değişkeni döndürmeye çalışıyor.

C:
#include <stdio.h>

int add(int a, int b) {
 int res = (a + b);
}

int main() {
 printf("%d", add(3, 5));
 return 0;
}

Yukarıdaki kodu compiler explorer'a yazdım. Clang ve gcc ile derledim.
Bu gcc derlemesi;
Eki Görüntüle 2189252

Bu da clang derlemesi;
Eki Görüntüle 2189253

Burada fark edeceğin şey Clang'in oluşturduğun değişkeni temporary bloğa kaydetmesi, gcc'ninse direkt stack üzerine yerleştirmesi. Return dediğiyse Stack'in en üstündeki şeyi döndürüyor. Bu tarz bir durumda problem olmayacağını düşünebilirsin. Ancak gelelim şöyle bir koda;
C++:
int add(int a, int b) {
 int res = 0;
 for(int i = a; i < b; i++) {
 res += i;
 }
}

Sonucu kestirebiliyor musun? Eğer add(1, 10) dersem 45 olması gereken sonuç sence ne geliyordur return etmediğimde? 10 geliyor. 45 değil. Eğer en sona int ret = res; gibi bir şey eklersem yine stackin en üstünde bu değişken olduğundan yine onu döndürecek. Ancak bu bir bug. Undefined behaviour. Her zaman buna güvenemezsin. Ya daha fazla iş yapıyor olsaydın? Daha uzun ve karmaşık bir kod kullanıyor olsaydın?

Anladım çok teşekkür ederim.
 

Yeni konular

Geri
Yukarı