PDA

View Full Version : چیزایی که تابحال در مورد سی پلاس پلاس نمی دونستی



beginner1010
دوشنبه 11 بهمن 1389, 15:46 عصر
فکر می کنید خروجی این برنامه چیه ؟؟






#include <iostream>
using namespace std;
int main() {
cout << "Salaaam ??!" << endl ;
}

amin1softco
دوشنبه 11 بهمن 1389, 18:39 عصر
??! = |
:متفکر:

mehdi.mousavi
دوشنبه 11 بهمن 1389, 18:51 عصر
سلام.
در حالت عادی، خروجی Salaaam ??! و در نهایت EOL خواهد بود. اما اگر منظورتون اینه که string نوشته شده اگر Unicode در نظر گرفته بشه، اونوقت چی میشه؛ در اونصورت آدرس جاییکه اون string در حافظه نگهداری شده نمایش داده میشه. بطور مثال،


cout << L"test" << endl;

کد فوق، آدرس به حافظه ای که test در اون نگهداری شده رو نشون میده، مگر اینکه از wcout استفاده کنیم.

موفق باشید.

beginner1010
دوشنبه 11 بهمن 1389, 19:28 عصر
در حالت عادی، خروجی Salaaam ??! و در نهایت EOL خواهد بود.پس یه بار اجراش کن :لبخند:

یکمی بیشتر نظر بدید تا دلیلشو بگم

cout << L"test" << endl; جالب بود نمی دونستم

mehdi.mousavi
دوشنبه 11 بهمن 1389, 19:38 عصر
پس یه بار اجراش کن :لبخند: یکمی بیشتر نظر بدید تا دلیلشو بگم جالب بود نمی دونستم

سلام.
دلیل چی رو بگید؟ همونطور که گفتم خروجی در حالت نرمال همون string ای هستش که نوشته اید (مگر اینکه Option های Compiler رو دستکاری کرده باشید، که تا نگید چی تو خروجی میگیرید، نمیتونم حدسی بزنم).

65786

موفق باشید.

r00tkit
دوشنبه 11 بهمن 1389, 20:20 عصر
سلام

استاد خیلی جا ها رو گشتم ولی دلیلی پیدا نکردم برای اینکه چرا چاپ unicode در cout ادرس رو چاپ می کنه !!!


یا چرا ؟



CStringW f("Geek");

std::wcout<<f;

با cout باز هم ادرس چاپ می شه?

اما با GetBuffer مشکل حل می شه

beginner1010
دوشنبه 11 بهمن 1389, 20:55 عصر
خروجی



Salaaam |

خواهد بود
علتش trigraph ها هستند
خب باید بگم که در GCC ,visual studio 2010 , این option به صورت پیش فرض غیر فعال هست ( و من تنظیمات کامپایلر دستکاری نکردم :لبخند: )
حالا trigraph چی هست ؟

به تمام سه حرفی های زیر trigraph می گن که با عبارت روبرو عوض می شن






----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??= | # | ??( | [ | ??< | { |
| ??/ | \ | ??) | ] | ??> | } |
| ??’ | ˆ | ??! | | | ??- | ˜ |
----------------------------------------------------------------------------

هم دانشگاهی
دوشنبه 11 بهمن 1389, 21:05 عصر
جالب بود حالا برای اینکه تو DEV این trigraph رو فعال کنیم باید چی کار کنیم ؟!

آخه منم که اجراش کردم بهم
Salaaam ??! رو داد !!!

منتها یه warning به صورت زیر رو هم دادش :

5:22 E:\Dev-Cpp\Examples\WinMenu\Untitled1.cpp [Warning] trigraph ??! ignored, use -trigraphs to enable

هم دانشگاهی
دوشنبه 11 بهمن 1389, 21:20 عصر
آره ! تو visual studio که اجراش کردم این جوری آورد:

Salaaam |


:تشویق: :تشویق: :تشویق:

r00tkit
دوشنبه 11 بهمن 1389, 21:30 عصر
علاوه بر trigraph ما Digraph هم داریم


<: چاپ می شه [

:> پاپ می شه ]

و....
اما واقعا" برای خودم متاسفم که چرا خودم اول اینو ننوشتم و به علت چاپ ادرس فکر کردم

http://en.wikipedia.org/wiki/Digraphs_and_trigraphs

r00tkit
دوشنبه 11 بهمن 1389, 22:05 عصر
و دیگه این که بازم ازین چیزا سراغ درین ؟ جالب بود !

برو بشین یه کتاب بخون :



Effective C++
More Effective C++
Inside C++ Object Model (1996)
C++ Gotchas Avoiding Common Problems in Coding and Design
.....

رو بخون عوض این چیز ها

Salar Ashgi
دوشنبه 11 بهمن 1389, 22:53 عصر
خروجی تست شده توسط من :

65795

در کامپایلر Borland 5.02

در ضمن چنین مباحثی ، فکر نکنم دارای بار علمی باشند ؛ چراکه ما چیزی بعنوان مثلا ترفند
در زبان برنامه نویسی (++C) نداریم ، بلکه برای هر چیز علت و قانونی وجود دارد .
این رو گفتم چون دیدم بعضی برنامه نویس ها گاها مطرح میکنن ، یکسری ترفند های کاربردی در ...
مثلا یه نمونه ، عوض کردن جای اسم و اندیس در آرایه :


#include <iostream>
#include <conio>
int main(){
int a[]={1,2,3,4};
for(int i=0;i<4;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"=============\n";
for(int i=0;i<4;i++)
cout<<i[a]<<" ";
getch();
}

mehdi.mousavi
دوشنبه 11 بهمن 1389, 23:53 عصر
سلام.
همونطور که گفتم، باید می گفتید چه اتفاقی میفته تا بهتون بگم چیکار کرده اید، چون من خودم از VS2010 استفاده میکنم، با چنین چیزی روبرو نشدم. برای افرادی که از VS2010 استفاده میکنن و مایلن این Feature احمقانه رو روشن کنن میتونن اینکارو کنن: روی پروژه Right Click کنید، Properties رو انتخاب کنید. سپس سمت چپ Configuration Properties رو انتخاب کنید، C/C++ و سپس گزینه Command Line رو انتخاب کنید. سمت راست در قسمت Additional Options سوئیچ زیر رو وارد کنید:


/Zc:trigraphs و کلید OK رو فشار بدید. برنامه رو کامپایل کنید تا مساله مطرح شده رو بتونید ببینید.

در هر حال، اگر تا به امروز پشت ترمینالهای IBM نشسته باشید، می دونید که این ترمینالها از Character Set شرکت IBM پشتیبانی میکنن (و نه ASCII CharSet ها). در C++0x قرار بود Trigraph ها حذف بشن، اما نمایندگان شرکت IBM در کمیته ISO C++ شدیدا با این موضوع مخالفت کردند؛ چرا که حذف Trigraph ها برای اونها، به معنی انتقال از EBCDIC به UTF-8 بود که خوب، IBM علاقه ای به این مساله نداره. دونستن این مطلب خوبه، اما فقط وقتی به درد میخوره که مشکلی پیش بیاد؛ به اعتقاد من این قابلیت بیشتر باعث آسیب رسوندن به مغز میشه تا اینکه یه مشکل واقعی رو از پیش رومون برداره...

موفق باشید.

emab110
پنج شنبه 14 بهمن 1389, 10:03 صبح
جالب بود حالا برای اینکه تو DEV این trigraph رو فعال کنیم باید چی کار کنیم ؟!

آخه منم که اجراش کردم بهم
Salaaam ??! رو داد !!!

منتها یه warning به صورت زیر رو هم دادش :

5:22 E:\Dev-Cpp\Examples\WinMenu\Untitled1.cpp [Warning] trigraph ??! ignored, use -trigraphs to enable

می تونید در این پنجره
http://www.daltonfilho.com/articles/swingwx/compiler-flags.png
Option زیر

-trigraphs
را اضافه کنید.

هم دانشگاهی
جمعه 15 بهمن 1389, 19:41 عصر
ممنون ولی . . .

مطمئنی این که گفتی برای DEV - CPP هستش؟ :متفکر: