Rel Если cond true то получается строка "123", в противном случае строка "321". Так или что-то путаю?
Rel Интерсно, что после выполнения *b=100, а a=10 по-прежнему, хоть и b кажет на a. Хотя может так и должно быть... Код (Text): int main(void) { const int a=10; int* b; b=const_cast<int*>(&a); *b=100; cout<<a<<" "<<*b; getchar(); getchar(); return 0; }
нет не так и вообще это баг порядок вызова func не определен может быть и 123 и 321 и 231 и 132 Код (Text): cond ? func(ptr, 1) | func(ptr, 2) | func(ptr, 3) : func(ptr, 3) | func(ptr, 2) | func(ptr, 1); Код (Text): (cond) ? (func(ptr, 1) , func(ptr, 2) , func(ptr, 3)) : (func(ptr, 3) , func(ptr, 2) , func(ptr, 1));
почему не определен, бинарные операторы выполняются слева-направо... использовать запятую без скобок в данном случае нельзя: Код (Text): int func(int t) { printf("%d ", t); return 1; } int _tmain(int argc, _TCHAR* argv[]) { (true) ? func(1), func(2) : func(3), func(4); return 0; } вывод: Код (Text): 1 2 4 совершенно очевидно почему) скорее всего это происходит вот почему: Код (Text): int _tmain(int argc, _TCHAR* argv[]) { 013C2160 55 push ebp 013C2161 8B EC mov ebp,esp 013C2163 83 EC 48 sub esp,48h 013C2166 53 push ebx 013C2167 56 push esi 013C2168 57 push edi const int x = 100; 013C2169 C7 45 FC 64 00 00 00 mov dword ptr [x],64h int* y = (int*)&x; 013C2170 8D 45 FC lea eax,[x] 013C2173 89 45 F8 mov dword ptr [y],eax *b = 200; 013C2176 8B 45 F8 mov eax,dword ptr [y] 013C2179 C7 00 C8 00 00 00 mov dword ptr [eax],0C8h printf("%d\n", a); 013C217F 6A 64 push 64h 013C2181 68 5C 8C 3D 01 push offset string "%d\n" (13D8C5Ch) 013C2186 E8 0E F6 FF FF call @ILT+1940(_printf) (13C1799h) 013C218B 83 C4 08 add esp,8 return 0; 013C218E 33 C0 xor eax,eax } то есть содержимое ячейки памяти изменилось, а константа спокойненько прописалась в коде (013С217F)...
Код (Text): 6.5.14 Logical OR operator Unlikethe bitwise | operator,the || operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares unequal to 0, the second operand is not evaluated. помимо этого операция коммутативная порядка тут вообще нет может сделать последнее | потом первое
рассмотрим несколько примеров допустим есть 4 + 5 + 8 - 4 тоесть компилятор может считать его как 4 - 4 + 5 + 8 нельзя даже знать что будет первое сложение или вычитание не то что порядок вычисления операндов одной операции дальше если имеем все коммутативные например 5 + 7 + 9 + 4 или как в вашем случае func | func | func порядок не определен как эффективней так и сделает результат не зависит от порядка и только если ассоциативные все например 10 - 10 - 4 или 100 / 10 / 2 то порядок слева направо потому что тут результат зависит от порядка и то в этом случае он не гарантирует сам порядок вычисления операндов а всего лиш то что операции по порядку будут вычислятся он может заранее вычислить значения трех операндов а потом для ассоциативных последовательно поделить или вычесть а в случае коммутативных даже этого не гарантируется полная свобода
примеры тут и перестановка коммутативных с ассоциативными и нет порядка при коммутативных и соблюдение порядка при ассоциативных + - можно заменить на * / | & Код (Text): printf("%d\n", printf("a") + printf("b") + printf("c")); 00401001 8B 35 A0 20 40 00 mov esi,dword ptr [__imp__printf (4020A0h)] 00401007 57 push edi 00401008 68 FC 20 40 00 push offset string "c" (4020FCh) 0040100D FF D6 call esi 0040100F 8B F8 mov edi,eax 00401011 C7 04 24 F8 20 40 00 mov dword ptr [esp],offset string "b" (4020F8h) 00401018 FF D6 call esi 0040101A 03 F8 add edi,eax 0040101C C7 04 24 F4 20 40 00 mov dword ptr [esp],offset string "a" (4020F4h) 00401023 FF D6 call esi 00401025 03 C7 add eax,edi printf("%d\n", printf("a") - printf("b") - printf("c")); printf("%d\n", printf("a") - printf("b") - printf("c")); 00401002 8B 35 A0 20 40 00 mov esi,dword ptr [__imp__printf (4020A0h)] 00401008 57 push edi 00401009 68 F8 20 40 00 push offset string "b" (4020F8h) 0040100E FF D6 call esi 00401010 8B D8 mov ebx,eax 00401012 C7 04 24 F4 20 40 00 mov dword ptr [esp],offset string "a" (4020F4h) 00401019 FF D6 call esi 0040101B 8B F8 mov edi,eax 0040101D 2B FB sub edi,ebx 0040101F C7 04 24 FC 20 40 00 mov dword ptr [esp],offset string "c" (4020FCh) 00401026 FF D6 call esi 00401028 2B F8 sub edi,eax printf("%d\n", printf("a") + printf("b") - printf("c")); 00401002 8B 35 A0 20 40 00 mov esi,dword ptr [__imp__printf (4020A0h)] 00401008 57 push edi 00401009 68 FC 20 40 00 push offset string "c" (4020FCh) 0040100E FF D6 call esi 00401010 8B D8 mov ebx,eax 00401012 C7 04 24 F4 20 40 00 mov dword ptr [esp],offset string "a" (4020F4h) 00401019 FF D6 call esi 0040101B 8B F8 mov edi,eax 0040101D 2B FB sub edi,ebx 0040101F C7 04 24 F8 20 40 00 mov dword ptr [esp],offset string "b" (4020F8h) 00401026 FF D6 call esi 00401028 03 C7 add eax,edi ни о каком порядке выполнения операций не может идти и речи если только в выражение не входят одни ассоциативные операции и то порядок на вычисление операндов не накладывается функции с побочными эффектами запрещены в порядке вычисления операндов можно быть уверенным только в && || , ?:
Nafanya Rel В ассемблер полез правила языка проверять, ага. Происходит это потому, что отменять константность через const_cast можно только у объектов (переменных), изначально объявленных как не-const. В остальных случаях const_cast это UB.
Откопал указатель на функцию, от которого может поехать крыша Код (Text): double* (*(*(*fp)(int*,int*,int*))[])(float*,float*,float*); Но автор гарантирует, что программист способный его понять никогда не встретит проблем с указателями на функции в реальной жизни, т.к. на практике они всегда проще...
Nafanya К счастью, C++ не зависит от твоего дилетантского мнения. Код (Text): void foo(int const& n) { const_cast<int&>(n) = 10; } int a = 20; int const b = 30; foo(a); // good foo(b); // bad
_DEN_ Так ты сразу можешь присвоить переменной a значение 10. (int a = 20;//инициализировал a=10;//присвоил). Отменять константность для переменной величины - это как отменять взлет несуществующего самолета. Ты хоть понимаешь что ты делаешь и с какой целью?
можно предположить, что это - функция указателя на массив указателей на функцию... дай ссылку на этот бред...
Rel Ссылку не могу, из книжки это... Объявление указателя на функцию, принимающую 3 аргумента-указателя на int, а возвращающая указатель на массив указателей на функцию принимающую 3 аргумента-указателя на float и возвращающую указатель на double Крыша съехать может, но тут главное понять правило по которому парсятся такие выражения...
я пытался "по спирали" обойти выражение, но чет сложно... хотя я был близок... правило "по спирали": http://microsin.ru/content/view/1195/44/
Функция, принимающая int и возвращающая указатель на функцию, принимающую int и возвращающую int. Rel Какая нафик спираль? Право, лево - щёлкается на раз.