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

Почему операторы инкремента действуют по разному для стандартных и нестандартных типов? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Чтение данных из файла http://www.cyberforum.ru/cpp-beginners/thread766630.html
Здравствуйте. Возникла проблемка с чтением данных из файла. Собственно, в файл я записываю данные структуры, а вот при чтении читается не совсем то, что я записал(( Код записи в файл: void List ::SaveFile() { FILE *fw; fw=fopen("file1.dat","w+b"); if (pHead==NULL) {
C++ Компилятор шутит. Как его успокоить? Ниже приведён код, который по алгоритму Фано должен строить коды. В функции Fano компилятор сам по себе, там где это отмечено в коментарии изменят совершенно не то, что ему говорят. В чём может быть дело? Вот код: #define MAX_CODE 8 //функция вычисления медианы массива freq //отсортирвоанного по убыванию int Median(const int freq, int start, int end){ int sumL, sumR; http://www.cyberforum.ru/cpp-beginners/thread766625.html
Перегрузка функций C++
Задание: Написать перегруженные функции и основную программу, которая их вызывает. а) для массива целых чисел находит количество нечетных элементов; б) для строки находит количество слов в ней. Вот код: #include <iostream> #include <conio.h> // #include <stdio.h> using namespace std; int func (char S )
Поиск ключа в бинарном дереве поиска C++
Здравствуйте! Помогите ещё с задачками) 1.Поиск ключа в бинарном дереве поиска (точное соответствие). 2. Поиск ключа в бинарном дереве поиска (меньше или равно). 3. Поиск ключа в бинарном дереве поиска (строго меньше). Если возможно - с кодом
C++ Параллельное программирование: нахождение интеграла http://www.cyberforum.ru/cpp-beginners/thread766602.html
Нужно распараллелить метод средних прямоугольников. Долго не мучаясь, решил воспользоваться OpenMP, вот что получилось: // intagral_omp.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <omp.h> #include <iostream>
C++ перевести число в масив символів двійкового коду Покажите пример пожалуйста как это сделать ? и как его словами можно описать? Добавлено через 35 минут И вот ответьте на вопрос пожалуйста. що повертає рядок з одного символу по інший с++? подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.01.2013, 23:33     Почему операторы инкремента действуют по разному для стандартных и нестандартных типов?
Потому что для пользовательских типов перегруженные операторы — это вызовы функций, а для встроенных их родные операторы — нет.

Есть такая вещь — sequence point (точка следования). Это точка в коде, до которой должны выполниться все побочные эффекты (все присваивания, которые по каким-то причинам отложили, например; в частности, присваивания, неявно возникающие при инкрементах). Точками следования, в частности, являются вызовы функций (для внутренних побочных эффектов и вычислений в аргументах), а также полные операторы (грубо, точки с запятой).

Так вот, в вашей строке 34 всего одна точка следования — аккурат на точке с запятой. Компилятор может извращаться со значением переменной как хочет, но после точки с запятой она должна быть увеличена на два. Не факт, правда, что увеличение будет происходить в два этапа. Ваш компилятор, например, сначала подставил старые значения, а потом вписал увеличение на два. А чей-то другой может вычислять по шагам: запомнить старое, увеличить на один, прибавить увеличенное на один к старому, увеличить ещё раз на единицу. В результате выведет 201 и будет прав. Это, что называется, неопределённое поведение.

А вот в строке 35 точек следования три: по одной на каждом инкременте, так как m++ + m++ это на самом деле operator++(m) + operator++(m), ну и одна в конце выражения. Поэтому здесь компилятор просто обязан выполнять инкременты последовательно: сначала выдать старое значение, потом увеличить его на 7, потом прибавить к старому значению увеличенное на 7 и снова увеличить на 7, выдавая в итоге 207.
 
Текущее время: 11:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru