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

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

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

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

05.06.2009, 23:53. Просмотров 7524. Ответов 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17279 / 5533 / 345
Регистрация: 30.03.2009
Сообщений: 15,049
Записей в блоге: 26
06.06.2009, 19:07     Приведите 10 примеров непереносимого кода #21
Нет, тут вроде бы как всё по стандарту
Рассмотрим с конца:
++a - понятно
&++a = &(++a) - т.е. сначала увеличить на 1 переменную, а затем взять на неё адрес (теперь у нас тип выражения - int*)
*&++a = *(&++a) - разыменование только что взятого адреса (теперь у нас тип выражения - int)
!*&++a = !(*&++a) - применение логического отрицания к предыдущему выражению (результат - int)
Ну а дальше унарные минус и плюс. Никаких side effect'ов тут нет
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 19:12  [ТС]     Приведите 10 примеров непереносимого кода #22
Хочешь сказать,что операторы с одинаковым приоритетом,стоящие рядом,выполняются в порядке написания,справа налево?
Evg
Эксперт CАвтор FAQ
17279 / 5533 / 345
Регистрация: 30.03.2009
Сообщений: 15,049
Записей в блоге: 26
06.06.2009, 19:15     Приведите 10 примеров непереносимого кода #23
Не совсем понял, при чём тут приоритеты. Операции у тебя унарные (т.е. с одним аргументом справа от операции), а потому всё то, что стоИт справа от операции является её аргументом. С ходу не соображу, при чём тут приоритет операций (если он при чём-то), но приоритет операций чётко прописан в стандарте и не является undefined behaviour
korisk
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49
06.06.2009, 19:37     Приведите 10 примеров непереносимого кода #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;
На машинах с разным машинным словом результат будет разным
Удач.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
06.06.2009, 19:44     Приведите 10 примеров непереносимого кода #25
мой вечный
C++
1
2
3
4
for(int i=0;i<10;i++){
...
}
int i=10; //на некоторых компиляторах будет ошибка Multiple declaration of a variable
Evg
Эксперт CАвтор FAQ
17279 / 5533 / 345
Регистрация: 30.03.2009
Сообщений: 15,049
Записей в блоге: 26
06.06.2009, 22:52     Приведите 10 примеров непереносимого кода #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
Phantom
Эксперт C++
3161 / 843 / 15
Регистрация: 29.12.2008
Сообщений: 952
06.06.2009, 23:11     Приведите 10 примеров непереносимого кода #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.
Осталось только простенькие примеры придумать.
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
06.06.2009, 23:20     Приведите 10 примеров непереносимого кода #28
Цитата Сообщение от Evg Посмотреть сообщение
А разве тест корректный с точки зрения стандарта? Мне казалочь что объявление переменной внутри for - это всё равно что вне for
Данный код абсолютно корректный с точки зрения действующего Стандарта. Область видимости (scope) переменной, объявленной внутри цикла, ограничена телом цикла.
Тем не менее, этот код может выдать ошибку на устаревших компиляторах.

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

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

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

Добавлено через 5 минут 33 секунды
Цитата Сообщение от alex_x_x Посмотреть сообщение
внутри
Однако...
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
07.06.2009, 00:42     Приведите 10 примеров непереносимого кода #31
Совершенно верно. Ссылочка 53 на странице 65 (2003) гласит: 53)
The precedence of operators is not directly specified, but it can be derived from the syntax.
Evg
Эксперт CАвтор FAQ
17279 / 5533 / 345
Регистрация: 30.03.2009
Сообщений: 15,049
Записей в блоге: 26
07.06.2009, 00:49     Приведите 10 примеров непереносимого кода #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
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
07.06.2009, 00:59     Приведите 10 примеров непереносимого кода #33
Это действующий Стандарт С++ ANSI/ISO 14882-2003 (точнее, draft Стандарта, но от окончательного варианта он почти не отличается). Кинь в ЛС адрес почты, пришлю сам текст (pdf, 2.7 Мбайт).... по тексту там много всякого.....
Драфт действующего Стандарта C (ANSI/ISO 9899-1999) тоже имеется. Хотя используется не в пример реже.
Evg
Эксперт CАвтор FAQ
17279 / 5533 / 345
Регистрация: 30.03.2009
Сообщений: 15,049
Записей в блоге: 26
07.06.2009, 01:06     Приведите 10 примеров непереносимого кода #34
Да в общем в инете уже нарыл дискуссии по поводу этого. ПРавда ни черта не понял. Всё-таки это относится к Си++ или ещё и к Си. Потому как всю жизнь считал, что приоритет операций в Си строго регламентирован. Если это не так, можешь привести конкретный пример, который мог бы работать по-разному на разных компиляторах (на каких конерктено - понятное дело не спрашиваю, ибо попросто можно и не знать)
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
07.06.2009, 10:57     Приведите 10 примеров непереносимого кода #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
17279 / 5533 / 345
Регистрация: 30.03.2009
Сообщений: 15,049
Записей в блоге: 26
07.06.2009, 11:44     Приведите 10 примеров непереносимого кода #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  [ТС]     Приведите 10 примеров непереносимого кода #37
Да,и я нашёл у Страуструпа что все унарные операторы правоассоциативны.
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
08.06.2009, 09:38     Приведите 10 примеров непереносимого кода #38
Цитата Сообщение от Evg Посмотреть сообщение
Таким образом получается, что приоритет исполнения всё-таки строго определён, но зависит от записи конкретного выражения. Так? [.....]
Посмотри, есть ли такие слова по поводу приоритетов операций?
1. Именно так. Тем не менее, прямо в Стандарте приоритеты не определены. А разнообразные "таблицы приоритетов", кочующие из одного учебника в другой - не более, чем плод фантазии их авторов.
2. Разумеется, нет.
Evg
Эксперт CАвтор FAQ
17279 / 5533 / 345
Регистрация: 30.03.2009
Сообщений: 15,049
Записей в блоге: 26
08.06.2009, 10:41     Приведите 10 примеров непереносимого кода #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;
Разницу между ними что-то не почувствовал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2009, 11:41     Приведите 10 примеров непереносимого кода
Еще ссылки по теме:

C++ Приведите пример,вывод
Задача с решением примеров C++
C++ Приведите простейший пример реализации диалога
C++ Приведите пример класса в классе
C++ Приведите пример использования оператора switch

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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
08.06.2009, 11:41     Приведите 10 примеров непереносимого кода #40
Непереносимый код должен использовать не трактовку приоритетов операций в различных ситуациях (поскольку она будет одинаковой для одного и того же выражения независимо от компилятора и платформы - если компилятор, конечно, более-менее соответствует Стандарту), а - использовать платформенно-зависимые фичи и/или функции или компиляторо-зависимые фичи реализации. Например, то, что в MSDN явно описано как "Microsoft-specific".
Yandex
Объявления
08.06.2009, 11:41     Приведите 10 примеров непереносимого кода
Ответ Создать тему
Опции темы

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