چرا cout<"aa ارور نمیده ؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

چرا cout<"aa ارور نمیده ؟

+1 امتیاز

سلام خسته نباشید .

من برام سوال پیش امده . چرا این کد ارور نمیده ؟

    cout<"aa";

 

سوال شده بهمن 30, 1392  بوسیله ی porya (امتیاز 64)   6 13 19

2 پاسخ

+3 امتیاز
 
بهترین پاسخ

cout یک شی از کلاس ostream هستش

خود کلاس ostram هم typedef از   basic_ostream

extern ostream cout;

typedef basic_ostream<char> ostream;

template <class charT, class traits = char_traits<charT> >
  class basic_ostream;

شما وقتی که از > توی c++ استفاده می کنی کامپایلر سعی می کنه بصورت  ضمنی تبدیل رو انجام بده

و از اون جایی هم که basic_ios از اپراتور void* استفاده می کنه و "aa" هم  قابل تبدیل به void* هست کامپایلر میاد اینا رو به هم تبدیل می کنه بعد مقایسه می کنه..

http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

در ضمن کد بالا از c++11 به بعد نباید اجرا بشه چون operator bool جایگزین void* شده (البته اگر کامپایلر بصورت کامل پشتیبانی کنه )

یک مثال ساده از چیزایی که بالا گفتم میتونه این کد باشه :

class A
{
public:
    operator void*(){return 0;}
};

int main() {
  A a;
  a<"tt";//ok !
}

 

پاسخ داده شده اسفند 1, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
+2 امتیاز

به دلیل اینکه این کد به معنی اینه که "اگر cout (سمت چپ) کوچک تر بود از اشاره گر (سمت راست) "

همین !

در واقع این یک عبارت شرطی و مقایسه ای هست.

یه نمونه دیگه از این رو میشه اینطوری نوشت .

 

int t =  "TT" > "TT";
cout<<t<<endl;

اینجا ۲ تا رشته ی "TT" داریم .

ولی هر کدوم از اینا توی آدرس خاصی هستند و آدرس هر کدوم هم توی یک اشاره گر خاص است .

ولی چون اینجا شما بصورت لفظی رشته ها رو نوشتید یعنی که شما آدرس اونها اینجا نوشتید .

بهر حال آدرس "TT" سمت چپ با آدرس "TT" سمت راست مقایسه میشه و اگر آدرس "TT" سمت چپ بزرگ تر بود مقدار t میشه 1 و در غیر اینصورت میشه ۰0 .

پاسخ داده شده اسفند 1, 1392 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
...