Citat:
Ursprungligen postat av Eh Whatever
Kod:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
int i;
for (i=10;i>0;i--)
{
cout << i["*"];
Sleep(1000);
}
system("pause");
return 0;
}
Den koden skriver ut " esuap ".
Den tar alltså pause baklänges. WHY?
Det gör den inte.
Om den råkar göra så, beror det på din kompilator, t.ex. skrivs lite slumpmässig text ut om du använder MSVC, det kraschar om du använder ICC.
Antagligen är det som händer att din kompilator lägger "pause" och "*" bredvid varandra i minnet, varje string konstant string sparas någonstans och avslutas med \0, så någonstans i minnet, låt oss säga adress 0x10000000, sparas strängarna.
(adress) = (innehåll)
0x10000000 = '*';
0x10000001 = '\0';
0x10000002 = 'p';
0x10000003 = 'a';
0x10000004 = 'u';
0x10000005 = 's';
0x10000006 = 'e';
0x10000007 = '\0';
I C (och C++) så är [] kommutativt, så p[i] och i[p] är samma sak.
i["*"] betyder alltså, ta minnesaddressen där strängen "*" ligger (0x10000000 i detta fall), och lägg till
i till den.
Loopen börjar på 10 och går till 1, alltså kommer programmet för titta på adressen 0x1000000a och skriva ut vad som nu ligger där som en bokstav (eftersom det inte finns något där kan det bli lite vad som helst). Sedan skriver den ut vad som ligger på 0x10000009 osv. ner till 0x10000001. \0 skrivs ut som ett mellanslag av std::cout normalt, så där blir ett mellanslag. Detta kommer ju strängen "pause" backlänges.