Jump to content
smily

Cout << I++ << I++ << I++;

Recommended Posts

hmm.tapi aku takleh pkai using namespace std   tu ...ade kaitan ke ??

Keunikan Ms Visual C++ berbanding ngan Borland C++ ialah MSVC boleh pakai statement tu; Borland C++ tak bleh.... tapi bukan bermakna tiadanya statement tu, ada something's wrong, takder kena-mengena ngan coding & effect!!

Ok, aku revice coding hampeh dan outputnya (apabila i++ dilakukan sekali)

cout << i << i << i ; => 111

cout <<i << i << i++ ; => 221

cout <<i<< i++<< i; =>211

cout <<i++<< i << i ; => 111

OK, aku bagi i++ dilakukan dua kali n tgk hasilnya

cout << i++ << i << i ++; => 221

cout <<i << i ++<< i++ ; => 321 ( sebijik output cam cout<<i++<<i++<<i++; )

cout <<i++<< i++<< i; =>211

OK, yg latest ujian ialah apabila saya buat test coding mcm nih

int i=3;
cout<<i--<<i--<<i--;

outputnya ialah 123 ohmy.gif (ntahlah nanti ada plak kata output ialah 321)

Edited by mfar

Share this post


Link to post
Share on other sites

OK, yg latest ujian ialah apabila saya buat test coding mcm nih

int i=3;
cout<<i--<<i--<<i--;
outputnya ialah 123 ohmy.gif (ntahlah nanti ada plak kata output ialah 321)
skali sama ngan
cout << i << i-- << i--; 

aku rase dia paparkan nilai i dulu sebelum buat pengiraan -- la tu ...

Share this post


Link to post
Share on other sites

nampaknya ada sesetengah dari kita masih tak faham lagi berkenaan i++ dan ++i.. cuba fahamkan yg ni dulu..

another thing is, pada sesiapa yg tak tahu, cout bukanlah sejenis function..

Share this post


Link to post
Share on other sites

OK, yg latest ujian ialah apabila saya buat test coding mcm nih

int i=3;
cout<<i--<<i--<<i--;
outputnya ialah 123 ohmy.gif (ntahlah nanti ada plak kata output ialah 321)
halamak.. serius aku dapat 321 tongue.gif terus terang aku cakap, aku mmg dah pening... sbb ni first time aku dgr postincrement working vice versa. tongue.gif so let's make it clear.... i++ = maknanya ia akan increment sebanyak satu terhadap value i (dlm kes ni integer value i), betul ke? i-- = maknanya, dlm kes ni, ia akan decrement value integer dlm i sebanyak satu, so suppose dari 3 jadi 2. betul ke? logically, kalau statement di atas tak betul, so macam mana nak implement i++ pada 'for' atau while 'loop' sebagai incrementer. aku rasa nak huraikan masalah ni, aku cadangkan kita compile coding dari deitel and deitel : How to program C++, yg implement postincrement (i++) dlm coding
// Ex. 2.15: ex02_15.cpp
// What does this program print?
#include <iostream>

using std::cout;
using std::endl;

// function main begins program execution
int main()
{
   int y;          // declare y
   int x = 1;      // initialize x
   int total = 0;  // initialize total

   while ( x <= 10 ) {    // loop 10 times
      y = x * x;          // perform calculation
      cout << y << endl;  // output result
      total += y;         // add y to total
      ++x;                // increment counter x

   } // end while

   cout << "Total is " << total << endl;  // display result

   return 0;  // indicate successful termination

} // end function main



/************************************************************
 * (C) Copyright 1992-2003 by Deitel & Associates, Inc. and Prentice      *
 * Hall. All Rights Reserved.                                             *
 ************************************************************/

and then kita compare result nya.

pastu, kalau la result korang sama ngan aku, maknya logik la, dlm perbincangan kita bahawa i++ menaikkan value i sebanyak satu, macam coding Deitel di atas, x++ menaikkan/increment nilai x sebanyak 1 ... huh.gif

Share this post


Link to post
Share on other sites

pergh masalah coding pendek tapi nak cari answer susah tul ..huhuhu ... poning kepale

ni jawapan dari coding atas tuh ::

1

4

9

16

25

36

49

64

81

100

Total is 385

same ke??

Edited by hampeh

Share this post


Link to post
Share on other sites

aku rasa benda ni takde kaitan secara terus dgn masalah cout << i++ << i++ << i++; tu, tapi aku nak cerita jugaklah..

sememangnya i++ akan tambah 1 kepada nilai i tersebut .. tapi masalahnya di sini ialah bila masakah operasi increment itu dilakukan?

i++ akan melakukan increment setelah line tersebut dilaksanakan

dan ++i akan melaksanakan increment serta merta pada line itu juga..

itu yg aku faham, kalau salah tolong betul kan..

cuba ini

int i = 1;
cout << i++;
cout << i;
dan ini
int i = 1;
cout << ++i;
cout << i;

oleh itu......... jeng.. jeng.. jeng..

cout << ++i << ++i << ++i;

akan berikan hasil berlainan juga.. macam mana dgn

cout << (i+=1) << (i+=1) << (i+=1);

pula?

Share this post


Link to post
Share on other sites

variable i lebih menonjol sifatnya mengikut increament semasa cout

cout<<i++; => cout paparkan nilai i sebelum nilai i ditambah dgn nilai 1

cout<<++i; => cout paparkan nilai i selepas nilai i ditambah dgn nilai 1

tapi cout<<i++<<i++; sama output dgn cout<<i<<i++; (seperti kajian kes ujian aku buat dlm post lepas) tapi tak sama dgn cout<<i++<<i;... KENAPA? Kalo ikut aku punya trace dlm Borland C++, anu i yg pertama skali sepatutnya akan display dulu... berjujukan drpd kiri ke kanan (yakni drpd cout ke ';') tapi bila jumpa ini => "i--/i++"... nilai sebelah kanan kena rombak balik... kemudian akan display selepas pengiraan dibuat... (ada pembetulan daripada expert?? unsure.gif)

1

4

9

16

25

36

49

64

81

100

Total is 385

OK, aku dah uji dah coding electroboy tu... jawapannya sebijik SAMA smile.gif

Share this post


Link to post
Share on other sites

Ini yg aku faham.. pengalaman c++ aku tak byk, lebih kurang 3 tahun shj, dan aku tak pernah nak explore dalam2 sgt..

first and foremost, harap2 kita semua sudah tahu bahawa cout bukanlah sejenis function.. ia adalah built-in object yg berjenis ostream yg mewakili "standard output stream"

Mana kala ada dua jenis "<<" yg digunakan sebagai "output operator"..

Pertama ialah dari jenis ostream& ostream::operator<<(int&) iaitu operator<<() yg menjadi member function dlm ostream.. Dan kedua adalah ostream& operator<<(ostream&, int&) yg bukan member function dlm ostream, tapi function biasa, yg global..

Sekarang ni kita bercakap tentang "operator overloading", (look it up if you dont understand, sorry i cant explain here).. kalau tengok mcm tu jadi susah sikit, oelh itu utk mudah faham, dlm contoh2 seterusnya kita anggapkan function foo() melakukan exactly the same thing as operator<<() ..

Maka,

1] ostream& ostream::operator<<(int&) menjadi ostream& ostream::foo(int&)

dan

2] ostream& operator<<(int&) menjadi ostream& foo(ostream&, int&)

cout << i boleh diterjemahkan kepada dua, sama ada kepada yg pertama, menjadi cout.foo(i) atau kedua menjadi foo(cout, i) ..

dan akhirnya bila kita gunakan ke atas cout << i++ << i++ << i++; maka ia boleh sama ada menjadi

cout.foo(i++).foo(i++).foo(i++);

atau

foo(foo(foo(cout, i++), i++), i++);

Perhatikan susunan warna2 tu.. menunjukkan sususan operasi increment dilakukan.. Jadi, compiler yg berlainan mungkin menterjemahkan kepada bentuk berlainan.. maka sebab itulah ada 2 output berbeza..

Cuma masalahnya..

1] Aku tak pasti apa yg aku cakap kat atas tu betul laugh.gif ada sesapa boleh confirm kan?

2] Aku rasa masalah ni bukan sbb compiler berlainan, kena check assembly yg dihasilkan lah ni.. Ada sesiapa volunteer smile.gif

3] Ada suara2 halus membisikkan padaku bahawa benda ini ada kaitan dgn "output buffering", tapi aku tak pasti itu suara malaikat atau syaitan..

4] Walaupun rasa sangat curious giler, tapi nampaknya aku tak mampu nak pergi sampai assembly level.. ilmu masih cetek, dan byk kerja lain nak buat.. Ancient_One tanak try ke? try la tengokkan A1.. ko kan terer bab2 asm nih smile.gif aku merayu pada mu..

Sapa boleh clearkan benda ni layak dipanggil "guru" nih..

Rujukan:

http://www.cplusplus.com/ref/iostream/ostr...eratorltlt.html

http://www.cplusplus.com/doc/tutorial/tut4-2.html

Share this post


Link to post
Share on other sites

SOALAN

Kenapa "cout << i++ << i++ << i++;" dapat jawapan "321"

JAWAPAN

Hasil jawapan dikaji dengan pensyarah pada tahun 2000 (HANYA UNTUK BORLAND SAHAJA). Sebab compiler lain seperti Dev C++ akan hasilkan jawapan lain.

i++ = "Buat proses lain dulu baru tambah"

++i = "Tambah dulu baru buat next proses"

Dalam kes ni

Output pertama

i++ (1) tunggu i++(2) tunggu i++(3)

so output pertama = 3

Output kedua

i++ (2) tunggu i++(3)

so output kedua = 2

Output ketiga

i++(3) dan i++ (2) telah diproses maka barulah i++(1) proseskan diri dia

so output ketiga = 1

Hasil Output

"321"

***************************************************************

JIKA ATAS TAK FAHAM JANGAN BACA BAWAH NIE

bila i=1 korang akan pikir jadi "432" atau "234" sebab

i=1

i++ = 2

i++ = 3

i++ = 4

cout <<i++ <<i++ <<i++;

Cuba tengok i++ (3), ++ adalah di depan maka dalam kes nie ++ tak dikira

++ hanya berlaku selepas "cout" telah melakukan proses

=>> masa proses cout i=3 , selepas i=4

Kenapa i=1 dipaparkan?, sebab i diproses dalam cout diikuti dengan operasi ++

maka i++ menghasilkan nilai asal 1 sebelum ditambah dan akan ditambah selepas menyelesaikan proses yang lain.

Kesimpula i++(3) tidak mengira "++" pada "cout" tapi selepas cout

***************************************************************

EDIT : "Typing error"

Edited by zsuperxtreme

Share this post


Link to post
Share on other sites

hehe teringat soalan final aku aritu camnih .....susah siot nak kira ,,sampai bape line ade camnih ...nasib baik guna borland ...idup borland smile.gif

Share this post


Link to post
Share on other sites

Trima kasih, zsuperxtreme!! Akhirnya 'pecah' jugak persoalan yg terperangkap dlm kepala aku nih tentang coding simple yg menjadi topik hangat kerana 'implementation'nya menimbulkan kontroversi antara ahli!!

Harap² yg pakai Borland khususnya, fahamilah penerangannya smile.gif

Share this post


Link to post
Share on other sites

first and foremost, harap2 kita semua sudah tahu bahawa cout bukanlah sejenis function.. ia adalah built-in object yg berjenis ostream yg mewakili "standard output stream"

Mana kala ada dua jenis "<<" yg digunakan sebagai "output operator"..

aku sokong kenyataan ko 1khz.

wahaha.. aku tgk balik soalan test semester satu aku dulu (pasal c++ programming) soalannya sebijik cam yg ditanya smily(pembuka thread) iaitu "determine the output of the following algorithm" dan soalannya tanya output bagi cout << x++ << x++ << x++; bila int x = 1

...dan markah yg diperuntukkan pula hanya 1 dari 30 markah penuh... tak sangka soalan satu markah dah jadi isu hangat di sini plak laugh.gif

Share this post


Link to post
Share on other sites

zsuperextreme (a.k.a butaKomputer), mcm mana pula dgn sesetengah yg lain yg dapat jwpn "123".. ada explaination utk ini?

Mcm mana pulak dgn yg zeph test tu? Dapat "111"..

Aku ingat korang dah clear pasal hal increment tu.. aku lebih concern pasal kenapa ada output yg beza..

Edited by 1kHz

Share this post


Link to post
Share on other sites

sebelum ader yg tensen... kat sini aku cuma nak tekankan satu perkara jer... KITA SEMUA BETUL!!! Samada 123, 321 or even 111 semuanya betul.. (aku cakap kat atas tu sebab aku jumpa gak problem ni 2 tahun lepas dan maser tu aku guna gcc.. gcc kasi aku 321).. memandangkan korang dah kasi korang nyer teori yang bernas2.. ni aku kasi teori dari C++ nyer standard :

4 Except where noted, the order of evaluation of operands of  individual

  operators  and subexpressions of individual expressions, and the order

  in which side effects take place, is unspecified.  Between the  previ-

  ous  and  next  sequence  point  a scalar object shall have its stored

  value modified at most once by the evaluation of an expression.  Fur-

  thermore,  the  prior  value  shall  be accessed only to determine the

  value to be stored.  The requirements of this paragraph shall  be  met

  for  each  allowable  ordering of the subexpressions of a full expres-

  sion; otherwise the behavior is undefined.  [Example:

          i = v[i++];      // the behavior is undefined

          i = 7, i++, i++; // `i' becomes 9

          i = ++i + 1;    // the behavior is undefined

          i = i + 1;      // the value of 'i' is incremented

  --end example]

Kalau nak diringkaskan, behavior (untuk konteks cout << i++ << i++ << i++) ni adalah BERGANTUNG KEPADA COMPILER ANDA.

Share this post


Link to post
Share on other sites

1khz:

Pernyataan aku tu hanya untuk "BORLAND SAHAJA" ----"THE BEST COMPILER EVER IN THE WORLD"

Hasil "123" tu guna compiler lain. Compiler yang masih lemah.

Hasil "111" tu di test oleh Hampeh memang betul la jawapan tu bila guna COUT<<i<<i<<i...so takda masalah kat sini.

Share this post


Link to post
Share on other sites

CARA MENGIRA MASALAH TERSEBUT

Aku cuba kira hasil test korang

Guna kaedah belakang...

cout << i << i << i ; => 111

- Bila i =1

- i(3)=1

- i(2)=i(3)=1

- i(1)=i(2)=1

output : i(1)i(2)i(3) = "111"

cout <<i << i << i++ ; => 221

- Bila i =1

- i(3)=1

- "++" proses kemudian i+1=2

- maka i(2)=2

- i(1)=i(2)=2

output : i(1)i(2)i(3) = "221"

cout <<i<< i++<< i; =>211

- Bila i=1

- i(3)=1

- i(2)=i(3)=1

- "++" proses kemudian i+1=2

- maka i(1)=2

output : i(1)i(2)i(3) = "211"

cout <<i++<< i << i ; => 111

- Bila i=1

- i(3)=1

- i(2)=i(3)=1

- i(1)=i(2)=1

- proses lepas cout i+1=2, "++" tidak dikira dalam cout tetapi lepas cout.

output : i(1)i(2)i(3) = "111"

cout << i++ << i << i ++; => 221

- Bila i=1

- i(3)=1

- "++" proses kemudian i+1=2

- maka i(2)=2

- i(1)=i(2)=2

- "++" proses lepas cout i+1=3.

output : i(1)i(2)i(3) = "221"

cout <<i << i ++<< i++ ; => 321

- Bila i=1

- i(3)=1

- "++" proses kemudian i+1=2

- maka i(2)=2

- "++" proses kemudian i+1=3

- maka i(1)=3.

output : i(1)i(2)i(3) = "321"

cout <<i++<< i++<< i; =>211

- Bila i=1

- i(3)=1

- i(2)=i(3)=1

- "++" proses kemudian i+1=2

- maka i(1)=2

- "++" proses kemudian selepas cout i+1=3.

output : i(1)i(2)i(3) = "211"

So inilah cara mengira bagi setiap kemushkilan

Edited by zsuperxtreme

Share this post


Link to post
Share on other sites

Ader lagi benda menarik mengenai VC++ 2K3 Toolkit..

#include <iostream>

using namespace std;

void main() {
  int i = 1;
  cout << i++ << i++ << i++;
  cin >> i;
}

beri output 321!!!! Tanpa "cin >> i;", ia bagi 111!!!! Best btul compiler nih..

Share this post


Link to post
Share on other sites

imho..the best c++ compiler utk win32 platform ialah VC++ 2K3 Toolkit/Microsoft Visual C++ .NET selain daripada intel c++ yg optimized utk intel processor

site ni sebagai contoh http://libsh.org/faq.html#vc6 recommended free VC++ 2K3 Toolkit

pasal issue, cout << i++ << i++ << i++; jawapan dah dibagi oleh A1 - http://forum.putera.com/tanya/index.php?show...ndpost&p=189918

so..dah takde benda yg nak dibincangkan

lastly, bawak2 membaca la buku c++ standard

kalau untuk C, dapat http://theinquirer.net/?article=24092

Share this post


Link to post
Share on other sites

lastly, bawak2 membaca la buku c++ standard

aku sokong pendapat ini....

cuma masalah output berbeza (disebabkan compiler) yg dibincangkan di sini masih menghantui aku, sbbnya sesuatu application yg dibuat pada compiler lain akan menimbulkan bugs di compiler lain... nasib baik aku baru sedar akan hakikat ini.

Share this post


Link to post
Share on other sites

actually benda ni takde kena mengena ngan cout.. it's how the compiler evaluate the expression, terutamanya yang ader side effect cam ++ dan --. dan kalau bacer standard, ader lagi benda2 yang bergantung kepada compiler dan standard tak bagitau camne nak implement...

Share this post


Link to post
Share on other sites

it's how the compiler evaluate the expression, terutamanya yang ader side effect cam ++ dan --. dan kalau bacer standard, ader lagi benda2 yang bergantung kepada compiler dan standard tak bagitau camne nak implement...

Setuju... sumber rujukan programming SANGAT bergantung dgn compiler; lain compiler, lain plak cara implementation... buku hanyalah programming method resource for beginners; bukan manual utk compiler implementation!

Share this post


Link to post
Share on other sites

Bila compile coding kat bawah, terasa pening kepalaku mencari jawapan kenapa outputnya sebegitu rupa sekali...  blink.gif

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
        int i = 1;
        cout  << i++ << i++ << i++;

        return 0;
}
sebelum compile, aku expect outputnya: 123 tapi bila dah compile outputnya 321 dah try google, x dpt dah...
sorry aku tak baca semua post yg org reply kat sini.. maybe ada org yg dah jwp.. 321 is the correct answer. (using Visual studio 7.3/6.0) TAPI... 1st of all, this is BAD programming style. 1. u are confusing u're self . 2. different compilers have different ways of evaluating. MOST c compilers have the same standard.. example printf("\nHello World\n"); the compiler will NORMALLY read from right to left, then printf. it doesn't prinf first.. In VS this also applies to "cout << i++ << i++ << i++;" (NOTE: other compilers might not do this)
cout << i++;
cout << i;
if u cout i++ u'll get 1 if u cout i, u'll get 2. i++ only adds to the value AFTER the statement. so kalau kau betul nak output 123. u should do it this way.
void main()
{
      int i = 1;
      cout << i++;
      cout << i++;
      cout << i;
}

This should work on ALL compilers.

hope this helps.

Edited by da^hype

Share this post


Link to post
Share on other sites

da^hype.. ko cuma menambah kekeliruan.. bacalah semua post sebelum tambah satu lagi ok..

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...