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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.97
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Приведите 10 примеров непереносимого кода - C++

05.06.2009, 23:53. Просмотров 7776. Ответов 52
Метки нет (Все метки)

Задача:
Приведите 10 различных примеров непереносимого кода на С++.
Ну первый пример сразу мне бросился в глаза,при регистрации на форуме.(Если я правильно понимаю смысл задачи)
C++
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
#include <iostream>
#include <clocale>
#include <math.h>
using namespace std;
int main()
{
        system("Color 1A");
            ....... 
        if (choose == 1) {
            .......
                system("cls");
            .......
                if (choose1 == 1) {
                        system("cls");
            ......
                }
                if (choose1 == 2) {
                        system("cls");
            ......
                }
                if (choose1 == 3) {
            ......
                        system("pause");
                }
            ......
        }
        if (choose == 2) {
            ......
                system("pause");
        }
}
Помогите с девятью,благо(или нет) их должно быть море..
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2009, 23:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приведите 10 примеров непереносимого кода (C++):

Приведите пример. - C++
Программа с использованием функции без параметров. Можете разьяснить все как есть

Приведите пример инвариантности - C++
Если можно, то объясните на конкретном примере(желательно лёгком в понимании) что такое инвариантность. На словах понятно, что это...

Приведите пример,вывод - C++
Привет,можете пожалуйста привести пример вывода всех файлов txt из папки,и лежащих в этой папке подпапок. Добавлено через 58 минут ...

Решение 4х примеров - C++
Здравствуйте у меня есть небольшая проблема. Необходимо решить 4 задачи по Си - Автор Богатырев. Номер заданий : 1,86; 2,3; ...

Приведите пример класса в классе - C++
Приведите пожалуйста пример класса в классе, так что бы в классе a были свойства и методы класса b.

Приведите пример реализации списка - C++
как я понял по своей сути список отличается от массива тем что список исспользует не фиксированный размер памяти и располагается в...

52
EnzoMatrix
120 / 120 / 5
Регистрация: 14.03.2009
Сообщений: 462
06.06.2009, 12:53 #16
Битовые операции
тут примерчик висит

Добавлено через 2 минуты 50 секунд
Цитата Сообщение от Evg Посмотреть сообщение
Неа
а можно объянить почему? а то я не понял
1
Evg
Эксперт CАвтор FAQ
17955 / 6186 / 415
Регистрация: 30.03.2009
Сообщений: 16,977
Записей в блоге: 27
06.06.2009, 13:03 #17
Скажу тебе даже более того. Когда у тебя есть выражение, которое вроде бы как вообще ничего не делает, типа

C
1
2
float f1, f2;
f1 + f2;
То в "нормальном" случае компилятор невправе его выкинуть, потому как плавающая операция может выдать исключительную ситуацию (по сути дела сигнал). Но реально многие компиляторы по умолчанию работаю в так называемом режиме -fsimple (опция правда у всех по разному), при котором считается, что прерывания нам не нужны, всякие NaN'ы и прочая ересь - тоже. При таком допущении получается более быстрый код. Но это, мягко говоря, режим работы, противоречащий стандарту. Правда уже не стандарту языка Си, а стандарту плавающей ариметики IEEE-754

Добавлено через 4 минуты 37 секунд
Цитата Сообщение от CartmanRules Посмотреть сообщение
а можно объянить почему? а то я не понял
Такова семантика операции "&&" в языке Си
Т.е. "expr1 && expr2" означает вычислить expr1 и если оно не равно нулю (и только тогда) вычисляить expr2. Т.е. "expr1 && expr2" НЕ эквивалентно "expr2 && expr1"

В итоге для выражения "(a[i]>max)&&(max=a[i]);" сначала делается первая проверка (т.е. вычисляется expr1) и если она истинная, то только в том случае выполняется второе выражение. Т.е. семантически этот код эквивалентен "if (a[i] > max) max = a[i];", который, сам понимаешь, отработает одинаково независимо от оптимизаций

Я точно не уверен, но возможно в паскале (или это в бэйсике было) AND устроен по другому. Т.е. для "expr1 AND expr2" ВСЕГДА вычисляются оба выражения и только потом над ним делается AND

Добавлено через 2 минуты 38 секунд
Не знаю, как правильно это называется по научному, но в Си вычисление логического выражения пркращается сразу же, как только можно вычислить его значение. Операция "&&" обладает тем свойством, что если первое выражение ложь, то результат равен ложь независимо от второго выражения. Для "||" наоборот - если первое выражение равно истине, то второе уже не выполняется
2
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 13:10  [ТС] #18
Evg, -спасибо огромное,респект,этаж надо было столько написать ))
0
Evg
Эксперт CАвтор FAQ
17955 / 6186 / 415
Регистрация: 30.03.2009
Сообщений: 16,977
Записей в блоге: 27
06.06.2009, 14:42 #19
Цитата Сообщение от #pragma Посмотреть сообщение
этаж надо было столько написать ))
Ну... "Пи$деть - не мешки ворочать"
0
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 18:39  [ТС] #20
А это
C++
1
2
3
4
void f(int a)
{
    if(+-~!*&++a){}
}
подпадает под данную категорию:
3. Undefined behaviour?У этих операторов одинаковый приоритет,выполнение зависит от реализации?У меня компилируется без ошибок и предупреждений.
0
Evg
Эксперт CАвтор FAQ
17955 / 6186 / 415
Регистрация: 30.03.2009
Сообщений: 16,977
Записей в блоге: 27
06.06.2009, 19:07 #21
Нет, тут вроде бы как всё по стандарту
Рассмотрим с конца:
++a - понятно
&++a = &(++a) - т.е. сначала увеличить на 1 переменную, а затем взять на неё адрес (теперь у нас тип выражения - int*)
*&++a = *(&++a) - разыменование только что взятого адреса (теперь у нас тип выражения - int)
!*&++a = !(*&++a) - применение логического отрицания к предыдущему выражению (результат - int)
Ну а дальше унарные минус и плюс. Никаких side effect'ов тут нет
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 19:12  [ТС] #22
Хочешь сказать,что операторы с одинаковым приоритетом,стоящие рядом,выполняются в порядке написания,справа налево?
0
Evg
Эксперт CАвтор FAQ
17955 / 6186 / 415
Регистрация: 30.03.2009
Сообщений: 16,977
Записей в блоге: 27
06.06.2009, 19:15 #23
Не совсем понял, при чём тут приоритеты. Операции у тебя унарные (т.е. с одним аргументом справа от операции), а потому всё то, что стоИт справа от операции является её аргументом. С ходу не соображу, при чём тут приоритет операций (если он при чём-то), но приоритет операций чётко прописан в стандарте и не является undefined behaviour
1
korisk
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49
06.06.2009, 19:37 #24
Вот, еще пример:
C
1
2
3
4
5
6
7
double c = 0;
long  i = 1; //или int i = 1;
      do{
                i++;
                c++;
      }while(i!=0);
std::cout << c;
На машинах с разным машинным словом результат будет разным
Удач.
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.06.2009, 19:44 #25
мой вечный
C++
1
2
3
4
for(int i=0;i<10;i++){
...
}
int i=10; //на некоторых компиляторах будет ошибка Multiple declaration of a variable
1
Evg
Эксперт CАвтор FAQ
17955 / 6186 / 415
Регистрация: 30.03.2009
Сообщений: 16,977
Записей в блоге: 27
06.06.2009, 22:52 #26
Цитата Сообщение от alex_x_x Посмотреть сообщение
мой вечный
C++
1
2
3
4
for(int i=0;i<10;i++){
...
}
int i=10; //на некоторых компиляторах будет ошибка Multiple declaration of a variable
А разве тест корректный с точки зрения стандарта? Мне казалочь что объявление переменной внутри for - это всё равно что вне for
1
Phantom
Эксперт С++
3164 / 846 / 16
Регистрация: 29.12.2008
Сообщений: 952
06.06.2009, 23:11 #27
К сожалению, сейчас не вспомню конкретных примеров, но посоветую копнуть в сторону книги "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" Джефри Рихтера. Там он приводит некоторые примеры API-шных функций работы с потоками и т.п. привязанных к различным семействам Windows и только к ним. Например, там можно найти устаревшие команды под Win 95, написанные программы с их использованием тоже будут непереносимыми, т.к. будут работать только в Win 95.

Можно там что-то подобное найти:
Для тех, кто ведет счет в борьбе Unicode против ANSI, я решил сделать краткий обзор История Unicode в Microsoft:

Windows 2000 поддерживает Unicode и ANSI — Вы можете использовать любой стандарт;
Windows 98 поддерживает только ANSI — Вы обязаны программировать в расчете на ANSI;
Windows CE поддерживает только Unicode — Вы обязаны программировать в расчете на Unicode.
Несмотря на то что Microsoft пытается облегчить написание программ, способных работать на всех трех платформах, различия между Unicode и ANSI все равно создают проблемы, и я сам не раз с ними сталкивался.
или
Классы приоритета BELOW_NORMAL_PRIORITY_CLASS и ABOVE_NORMAL_ PRIORITY_CLASS введены лишь в Windows 2000; они не поддерживаются в Win dows NT 4.0, Windows 95 или Windows 98.
Осталось только простенькие примеры придумать.
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,382
06.06.2009, 23:20 #28
Цитата Сообщение от Evg Посмотреть сообщение
А разве тест корректный с точки зрения стандарта? Мне казалочь что объявление переменной внутри for - это всё равно что вне for
Данный код абсолютно корректный с точки зрения действующего Стандарта. Область видимости (scope) переменной, объявленной внутри цикла, ограничена телом цикла.
Тем не менее, этот код может выдать ошибку на устаревших компиляторах.

Это, кстати, не есть пример непереносимого кода. Код - абсолютно переносимый.

Добавлено через 3 минуты 7 секунд
Цитата Сообщение от Evg Посмотреть сообщение
..... но приоритет операций чётко прописан в стандарте.....
Ссылочку на соответствующий пункт Стандарта не приведешь?
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.06.2009, 23:39 #29
Цитата Сообщение от Evg Посмотреть сообщение
А разве тест корректный с точки зрения стандарта? Мне казалочь что объявление переменной внутри for - это всё равно что вне for
внутри, но и правда возможно это уже стандарт

Добавлено через 18 минут 26 секунд
Ссылочку на соответствующий пункт Стандарта не приведешь?
кстати как ни смешно бы это было, но насколько я помню, стандарт по си++, как созданный ANSI - институтом стандартизации, не является свободным и собственно текст стандарта не распространяется бесплатно
1
Evg
Эксперт CАвтор FAQ
17955 / 6186 / 415
Регистрация: 30.03.2009
Сообщений: 16,977
Записей в блоге: 27
07.06.2009, 00:31 #30
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ссылочку на соответствующий пункт Стандарта не приведешь?
Скептицизм означает, что в стандарте приоритеты операций не прописаны?

Добавлено через 5 минут 33 секунды
Цитата Сообщение от alex_x_x Посмотреть сообщение
внутри
Однако...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2009, 00:31
Привет! Вот еще темы с ответами:

Море примеров кода! - Java
The Java Developers Almanac 1.4: http://javaalmanac.com/egs/index.html

приведите примеры программ питона (не кода) - Python
слышал много где что если хочешь что то быстро написать пиши на питоне и пр. собственно интересны сами идеи, чего такого быстрого можно...

В чем разница двух примеров кода - C#
Здравствуйте! while (Connected == true) { if (srReceiver.ReadLine() != &quot;&quot;) { ...

Приведите примеры кода с комментариями (asm или debug) - Assembler
1. Вывести на экран текст 2. Рассчитать сумму всех элементов массива 3. Найти минимальный элемент массива 4. Найти максимальный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
07.06.2009, 00:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru