Форум программистов, компьютерный форум CyberForum.ru

Дана программа из 7 строк. Почему y,z не увеличивают свои значения на 1? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ dev с++ Отправка на мыло файла http://www.cyberforum.ru/cpp-beginners/thread916670.html
Помогите пожалуста нужно отправить письмо с приклепленым файлом на мыло, отправить письмо я могу но как прикрепить файл работаю в dev c++ вот мой код: #include <windows.h> #include <winsock.h> #include <stdio.h> WSADATA ws; SOCKET s; struct sockaddr_in addr; hostent *d_addr; char text; int main()
C++ Целочисленная таблица умножения дробей Используйте преимущество ООП, заключающееся в том, что однажды созданный класс можно помещать в другие программы. Создайте новую программу, которая будет включать класс fraction, созданный в упраж-нении 11. Программа должна выводить аналог целочисленной таблицы умножения для дробей. Пользователь вводит знаменатель, а программа должна подобрать всевозможные целые значения числителя так,... http://www.cyberforum.ru/cpp-beginners/thread916655.html
Как использовать указатели? C++
проблемы с указателями как правильно использовать, подскажите? #include <iostream> using namespace std; template <class T> struct Node { T value; Node *son; Node *brother; Node()
Графика: Узор образован 20 вложенными квадратами C++
Добрый вечер! На практике дали такое задание. Начертить узор. Узор образован 20 вложенными квадратами. Стороны первого квадрата параллельны осям координат экрана и равны 60. Вершины каждого последующего квадрата - это точки на сторонах предыдущего квадрата, делящие эти стороны в отношении 1 к 1. Я изучал только делфи и си не знаю.И написал код на делфи. Мне нужно перевести этот код на...
C++ Как написать программу под эти условия http://www.cyberforum.ru/cpp-beginners/thread916644.html
Суть в чём: есть список товара (багет 150 видов) с указанной ценой и шириной за метр, все цены разные, так же как и ширина непосредственно багета. Необходимо, чтобы в программе можно было ввести номер или код багета, а так же размеры будущей рамки длина - ширина, а в результате получить стоимость рамки + ширина багета умноженная на 10 (отходы). + как доп. опция отметить стекло. На сколько я...
C++ Задача "Железнодорожный узел" Железнодорожный сортировочный узел устроен так, как показано на ри-сунке. На правой стороне собрано в произвольном порядке несколько вагонов обоих типов по N штук. Тупик может вмещать все 2N вагонов. Пользуясь тремя сортировочными операциями: В, ИЗ, МИМО, собрать вагоны на левой стороне так, чтобы типы чередовались. Для решения задачи достаточно 3N-1 сортировочных операций. Не понимаю даже с... подробнее

Показать сообщение отдельно
nxtech
77 / 59 / 2
Регистрация: 26.06.2013
Сообщений: 198
03.07.2013, 07:44     Дана программа из 7 строк. Почему y,z не увеличивают свои значения на 1?
По большому счету здесь дело не в оптимизации, а в стандарте.
5.15 Logical OR operator
1 The || operator groups left-to-right. The operands are both contextually converted to bool (Clause 4). It returns true if either of its operands is true, and false otherwise. Unlike |, || guarantees left-to-right evaluation; moreover, the second operand is not evaluated if the first operand evaluates to true.

Думаю, это было бы уже слишком, если бы компилятор позволял себе такую оптимизацию вопреки стандартам.
Кстати, в данном случае VC2008++ создает честный код для дебаг-версии

Замечание

Для инкремента целых чисел VC++ создает подобный код:
MOV EAX, DWORD PTR[VAR]
ADD EAX, 1 ; Если результат 0, то ZF будет установлен, иначе - сброшен.
MOV DWORD PTR[VAR], EAX

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
;...
    int x = 1, y = 1, z = 1, u;
004113BE  mov         dword ptr [x],1 
004113C5  mov         dword ptr [y],1 
004113CC  mov         dword ptr [z],1 
 
    u = ++x || ++y && ++z;
; Инкремент x. 
004113D3  mov         eax,dword ptr [x]
004113D6  add         eax,1
004113D9  mov         dword ptr [x],eax
; Переход (true), если ZF==0 (если x!=0)
004113DC  jne         main+60h (411400h)
 
; Инкремент y.
004113DE  mov         ecx,dword ptr [y]
004113E1  add         ecx,1
004113E4  mov         dword ptr [y],ecx
; Переход (false), если ZF==1 (если y==0).
004113E7  je          main+54h (4113F4h)
 
; Инкремент z.
004113E9  mov         edx,dword ptr [z]
004113EC  add         edx,1
004113EF  mov         dword ptr [z],edx
; Переход (true), если ZF==0 (если z!=0).
004113F2  jne         main+60h (411400h)
 
; Результат false, запись в стек.
004113F4  mov         dword ptr [ebp-0F4h],0
 
; Переход (сохранение результата в u).
004113FE  jmp         main+6Ah (41140Ah)
 
; Результат true, запись в стек.
00411400  mov         dword ptr [ebp-0F4h],1
 
; Сохранение результата в u.
0041140A  mov         eax,dword ptr [ebp-0F4h] 
00411410  mov         dword ptr [u],eax 
 
    printf("x=%d, y=%d, z=%d, u=%d",x,y,z,u);
;...


В релизе конечно же оптимизирует и выкидывает все вычисления вообще, сразу заталкивая значения в стек для вызова функции.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main ()
{
    int x = 1, y = 1, z = 1, u;
    u = ++x || ++y && ++z;
    printf("x=%d, y=%d, z=%d, u=%d",x,y,z,u);
00401000  push        1    
00401002  push        1    
00401004  push        1    
00401006  push        2    
00401008  push        offset string "x=%d, y=%d, z=%d, u=%d" (402104h) 
0040100D  call        dword ptr [__imp__printf (4020A0h)] 
00401013  add         esp,14h 
    return 0;
00401016  xor         eax,eax 
}
00401018  ret
 
Текущее время: 17:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru