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

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

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

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

05.06.2009, 23:53. Просмотров 7694. Ответов 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");
        }
}
Помогите с девятью,благо(или нет) их должно быть море..
Лучшие ответы (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++
как я понял по своей сути список отличается от массива тем что список исспользует не фиксированный размер памяти и располагается в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
07.06.2009, 00:42 #31
Совершенно верно. Ссылочка 53 на странице 65 (2003) гласит: 53)
The precedence of operators is not directly specified, but it can be derived from the syntax.
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,160
Записей в блоге: 26
07.06.2009, 00:49 #32
Цитата Сообщение от CheshireCat Посмотреть сообщение
Совершенно верно. Ссылочка 53 на странице 65 (2003) гласит: 53)
The precedence of operators is not directly specified, but it can be derived from the syntax.
Фигасе. Это стандарт Си или Си++? И если стандарт под рукой, то можешь переписать, что дальше написано? А то окончание в виде "but it can be derived from the syntax" как-то непонятно что означает. Да и то, что до этого предложения неплохо бы почитать
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
07.06.2009, 00:59 #33
Это действующий Стандарт С++ ANSI/ISO 14882-2003 (точнее, draft Стандарта, но от окончательного варианта он почти не отличается). Кинь в ЛС адрес почты, пришлю сам текст (pdf, 2.7 Мбайт).... по тексту там много всякого.....
Драфт действующего Стандарта C (ANSI/ISO 9899-1999) тоже имеется. Хотя используется не в пример реже.
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,160
Записей в блоге: 26
07.06.2009, 01:06 #34
Да в общем в инете уже нарыл дискуссии по поводу этого. ПРавда ни черта не понял. Всё-таки это относится к Си++ или ещё и к Си. Потому как всю жизнь считал, что приоритет операций в Си строго регламентирован. Если это не так, можешь привести конкретный пример, который мог бы работать по-разному на разных компиляторах (на каких конерктено - понятное дело не спрашиваю, ибо попросто можно и не знать)
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
07.06.2009, 10:57 #35
Тут суть не в том, что будет по разному работать на разных компиляторах (это называется implementation-defined), а - в том, что приоритет по разному трактуется в различных ситуациях. Вот примеры кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
int main()
{
    bool a = true;
    int b = 0;
    int c = 0;
    int d = 1;
    // If assignment had lower precedence, this should be the equivalent of "(a ? b : c) = d".  But it's not!
    a ? b : c = d;
    std::cout << b << ", " << c << std::endl;
    return 0;
}
 
// Вот еще примеры:
 
// Does ?: have higher or lower precedence than assignment or the comma operator?  Consider:
 
    a = c ? x : y;             // assignment higher than ?:
    c ? x : a = y;             // ?: higher than assignment
    a, c ? x : y;              // ?: before comma
    c ? a, x : y;              // comma before ?:
 
// You can't establish a precedence ordering between these operators...
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,160
Записей в блоге: 26
07.06.2009, 11:44 #36
Этот пример я уже видел. Пояснить его можешь? Фишка в том, что для в таких случаях приоритет операций строится исходя из здравого смысла, нежили формально? Т.е. типа если не получается так, то делаем вот так, иначе необорот. Т.е. получается, что по стандарту приоритет операций вроде бы как не определён (правда не знаю, с которой из трёх формулировок, при этом для Си++ вроде бы как есть четвёртая), но тем не менее код в каждом случае работает так, как будто бы приоритет определён (при этом для каждого примера разный). Или всё-таки даннй код разные компиляторы могут отработать по разному? Т.е. к чему я веду. Даже если приоритет операций жёстко не прописан, то формулировка "but it can be derived from the syntax" означает, что из написания выражения всё-таки можно вывести приоритет операций. Таким образом получается, что приоритет исполнения всё-таки строго определён, но зависит от записи конкретного выражения. Так?

> Тут суть не в том, что будет по разному работать на разных компиляторах (это называется implementation-defined).

Implementation defined (которую я ошибочно назвал implementation specified) - это когда эти слова в стандарте прописаны чёрным по белому. Вот у тебя есть стандарт перед глазами. Посмотри, есть ли такие слова по поводу приоритетов операций?

(to pragma)
Если тебе не впадлу было это читать и ты всё-таки дочитал до сюда, то к твоему примеру это не относится. В твоём конкретном случае имеется цепочка подряд идущих УНАРНЫХ операций, которые исполняются справа налево (и физически не могут исполниться никак по другому)
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
07.06.2009, 21:19  [ТС] #37
Да,и я нашёл у Страуструпа что все унарные операторы правоассоциативны.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
08.06.2009, 09:38 #38
Цитата Сообщение от Evg Посмотреть сообщение
Таким образом получается, что приоритет исполнения всё-таки строго определён, но зависит от записи конкретного выражения. Так? [.....]
Посмотри, есть ли такие слова по поводу приоритетов операций?
1. Именно так. Тем не менее, прямо в Стандарте приоритеты не определены. А разнообразные "таблицы приоритетов", кочующие из одного учебника в другой - не более, чем плод фантазии их авторов.
2. Разумеется, нет.
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,160
Записей в блоге: 26
08.06.2009, 10:41 #39
Цитата Сообщение от CheshireCat Посмотреть сообщение
1. Именно так. Тем не менее, прямо в Стандарте приоритеты не определены. А разнообразные "таблицы приоритетов", кочующие из одного учебника в другой - не более, чем плод фантазии их авторов.
2. Разумеется, нет.
Учебники, Страуструпы и прочее, понятное дело в расчёт не бурется
Просто речь зашла об этом применительно к написанию непереносимого тестового примера.

Сентенция в итоге такая, что на приоритетах операций в выражениях такого примера не построить, потому как в каждом случае порядок вычисления операций регламентирован стандартом. При этом строго заданный приоритет, судя по всему, есть для всех операций, кроме "=", "?:" и ",". А для этих трёх операций приоритет вычисляется исходя из вида выражения

Причём это касается Си++. Для Си возможно всё-таки порядок определён. Надо будет это уточнить. По крайней мере на такую конструкцию "c ? x : a = y;" компилятор Си ругается

Что касается примера:
C++
1
a, c ? x : y;              // ?: before comma
То варианты с разными приоритетами вопросительного знака и запятой выглядят так

C++
1
2
a, (c ? x : y);
(a, c) ? x : y;
Разницу между ними что-то не почувствовал
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
08.06.2009, 11:41 #40
Непереносимый код должен использовать не трактовку приоритетов операций в различных ситуациях (поскольку она будет одинаковой для одного и того же выражения независимо от компилятора и платформы - если компилятор, конечно, более-менее соответствует Стандарту), а - использовать платформенно-зависимые фичи и/или функции или компиляторо-зависимые фичи реализации. Например, то, что в MSDN явно описано как "Microsoft-specific".
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,160
Записей в блоге: 26
08.06.2009, 12:29 #41
Цитата Сообщение от CheshireCat Посмотреть сообщение
Непереносимый код должен использовать не трактовку приоритетов операций в различных ситуациях (поскольку она будет одинаковой для одного и того же выражения независимо от компилятора и платформы - если компилятор, конечно, более-менее соответствует Стандарту), а - использовать платформенно-зависимые фичи и/или функции или компиляторо-зависимые фичи реализации. Например, то, что в MSDN явно описано как "Microsoft-specific".
В общем так. Изначально речь шла о примерах непереносимого кода. Далее pragma привёл код, который ему казался непереносимым. Я на это сказал, что там всё по стандарту, а так же сказал, что приоритет операций в стандарте жёстко зафиксирован. Собственно в этом месте была моя ошибка, поскольку мне казалось, что применительно к выражениям в Си и Си++ различиё в стандарте нет. Оказалось, что в Си++ в этом месте стандарт работает по-другому. Т.е. с приоритетмами операций, насколько я понимаю, к консенсусу мы всё-таки пришли

Теперь по поводу изначальной постановки задачи. Возможно, что тут дело в терминологии, но на мой взгляд "непереносимый код" и "ОС-зависимый" ("CPU-зависимый") код - это всё-таки разные вещи, юридической различие между которыми я членораздельно объяснить не могу (из разряды "жо$ой чую, что литр, но доказать не могу"). Т.е. условно говоря, попытавшись перетащить линуховый код на винду, мы получим ошибку компиляции/линковки по причине того, что какая-то фича для данной ОС отсуствует.

На мой взгляд, говорить о непереносимости можно тогда, когда у тебя нет физических проблем для переноса кода (например, с linux-i386 на linux-ia64 или linux-sparc). И именно в этом месте на реальном софте возникает куча гемора:
- Код изначально был написан под 32-битную платформу, а потому на 64-битной платформе работает неправильно. Не потому, что он физически не можетработаь на 64-битной платформе, а птому что написан "неаккуратно" - т.е. в предположении неких 32-битных соглашений (например, размер int'а совпадает с размером указателя)
- Код изначально был написан под little-endian, а потому неправильно работает на big endian'е. Не потому, что он физически не может работатьна big-endian'е, а потому что шла работа с битовыми образами значений, жёстко предполагающих, что у нас такой-то порядок расположения байтов в памяти

Ну и тому подобное. Т.е. отсуствие чего-то в библиотеках на мой взгляд НЕ является непереносимостью, а является "ОС-зависимостью" и т.п.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
08.06.2009, 13:39 #42
Хм, вот я глянул в (драфт) действующего стандарта С (ANSI/ISO 9899-1999), и там тоже (6.5/3) есть аналогичное утверждение: "The grouping of operators and operands is indicated by the syntax."
Ну хорошо, тем не менее, к консенсусу о приоритетах операций мы все-таки пришли.

Относительно переносимости:
я вполне согласен с твоими доводами. Я, однако, все-таки добавил бы в понятие "непереносимого" кода еще и то, что ты называешь "ОС-зависимость" или "CPU-зависимость". Бо мне в последнее время приходится писать код под несколько различных аппаратных платформ, и я (к сожалению) по опыту знаю, что такое "взять уже готовую библиотеку в исходниках и всунуть ее в свой проект" - это легко только на словах и так оно кажется менеджерам..... а перелопачивать груду кода этак в полста десятков килострок - удовольствие много ниже среднего, да еще и ошибок насажать можно лехко.....
Впрочем, все изложенное - это мое имхо, поэтому не настаиваю на своем утверждении. В остальном же консенсус достигнут
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,160
Записей в блоге: 26
08.06.2009, 13:45 #43
Почитал стандарт. В разделе 6.5 стандарта Си чётко описаны приоритеты всех операций. В Си++ прориоритеты нет ничего кроме фразы "The precedence of operators is not directly specified, but it can be derived from the syntax". Мы тут сидели и долго пытались втыкнуть, что же сие означает. Наткнулись на статью в википедии http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Теперь более-менее в голове утряслось. В стандарте Си есть строгое понятие приоритета операций. В стандарте Си++ понятия приоритета операций как такового нет. Вместо этого говорится, что порядок вычислний следует из формального описания синтаксических правил языка. В указанной статье приводится пример конкретных синтаксических правил и объяснения, почему одно и тоже выражение в Си и Си++ трактуется по разному

Добавлено через 5 минут 31 секунду
Цитата Сообщение от CheshireCat Посмотреть сообщение
Я, однако, все-таки добавил бы в понятие "непереносимого" кода еще и то, что ты называешь "ОС-зависимость" или "CPU-зависимость". Бо мне в последнее время приходится писать код под несколько различных аппаратных платформ, и я (к сожалению) по опыту знаю, что такое "взять уже готовую библиотеку в исходниках и всунуть ее в свой проект"
Просто тут скорее из разряда "кривые руки", т.е. автор изначально не пытался написать код так, чтобы он мог работать на другой платформе. Неформально я бы тоже это назвал "непереносимый", хотя формально он "ОС-зависимый". В контексте реальной задачи по переносу кода на другую платформу, конечно же, в данном случае куда весомее оказывается неформальное название "непереносимый". В общем по данному пункту у нас полное взаимопонимание. А что и как назвать формально - это уже крючкотворство и буквоедство
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
08.06.2009, 14:27 #44
А чего ссылка ведет не на статью?
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,160
Записей в блоге: 26
08.06.2009, 21:29 #45
Промазал. Ссылка
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Добавлено через 6 часов 55 минут 39 секунд
pragma, хорош на каждом посте "спасибо жать". А то я уже начинаю чувствовать, что где-то рядом штангенциркуль появляется
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2009, 21:29
Привет! Вот еще темы с ответами:

Море примеров кода! - 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. Найти максимальный...


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

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

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