[C++] Funkcja getch();
Ostatnio zmodyfikowano 2009-08-04 14:31
manfred |
» 2009-07-26 16:28:20 O to chodzi? #include <cstdio> #include <conio.h>
int main() { do { std::puts( "Wcisnij ESC aby zamknac" ); } while( getch() != '\x1B' ); } |
|
manfred |
» 2009-07-30 15:12:19 Bo nie ma literałów znakowych, to trzeba robić magic numbers, tja... Hehehe, mogę jeszcze krócej: #include<conio.h> int main() { while( getch() - 27 ); } Da ktoś wię... mniej? |
|
manfred |
» 2009-08-03 20:24:00 Da się. Goto. Czyli już prawie jak pisanie w języku asemblera. Hm... eu? Fajny dyftong. Jako skrót oznacza tą nowoczesną wersję ZSRR. Jednak w moim imieniu jest ae, i tego się trzymajmy ;) |
|
manfred |
» 2009-08-04 11:32:21 No bo piszesz, że się nie da bez pętli, to udowadniam, że się da :P. po co bawić się w te etykiety, tylko zmniejszają wydajność. |
Idę o zakład, że ten kod który podałeś wygeneruje identyczny kod maszynowy co pętla. |
|
manfred |
» 2009-08-04 14:31:49 Aż z ciekawości sprawdziłem. Kod: #include <conio.h>
int main() { foo: if( getch() != 27 ) goto foo; for(; getch() != 27; ); } Wynikowy asm (składnia MASMa, tak, jak to wygenerował cl z opcją /FAs): _main PROC ; 4 : { $foo$2966: ; 5 : // 1 ; 6 : foo: ; 7 : if(getch()!=27)goto foo; call _getch cmp eax, 27 ;porównujemy wartość zwracaną z 27 ; 0000001bH jne SHORT $foo$2966 ;jeśli nie równe to skaczemy do etykiety $foo$2966, czyli foo npad 6 ;align, żeby pętla była sobie szybsza, ten wyżej nie ma, bo początek _main i tak jest na granicy 16 bajtów. $LL2@main: ; 8 : // 2 ; 9 : for(;getch()!=27;); call _getch cmp eax, 27 ;to samo co wyżej ; 0000001bH jne SHORT $LL2@main ; 10 : } xor eax, eax ret 0 _main ENDP Czyli kod jest raczej taki sam, różnią się tylko cele skoków. |
|
1 « 2 » |