Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/72: Рейтинг темы: голосов - 72, средняя оценка - 4.81
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

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

05.06.2009, 23:53. Показов 14967. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:
Приведите 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2009, 23:53
Ответы с готовыми решениями:

Приведите пару примеров использования QValidator
Всем привет! Приведите, пожалуйста, парочку примеров использования QValidator в Qt Creator. Применимо к textEdit желательно. Что-то...

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

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

53
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.06.2009, 19:07
Студворк — интернет-сервис помощи студентам
Нет, тут вроде бы как всё по стандарту
Рассмотрим с конца:
++a - понятно
&++a = &(++a) - т.е. сначала увеличить на 1 переменную, а затем взять на неё адрес (теперь у нас тип выражения - int*)
*&++a = *(&++a) - разыменование только что взятого адреса (теперь у нас тип выражения - int)
!*&++a = !(*&++a) - применение логического отрицания к предыдущему выражению (результат - int)
Ну а дальше унарные минус и плюс. Никаких side effect'ов тут нет
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.06.2009, 19:12  [ТС]
Хочешь сказать,что операторы с одинаковым приоритетом,стоящие рядом,выполняются в порядке написания,справа налево?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.06.2009, 19:15
Не совсем понял, при чём тут приоритеты. Операции у тебя унарные (т.е. с одним аргументом справа от операции), а потому всё то, что стоИт справа от операции является её аргументом. С ходу не соображу, при чём тут приоритет операций (если он при чём-то), но приоритет операций чётко прописан в стандарте и не является undefined behaviour
1
12 / 12 / 1
Регистрация: 06.06.2009
Сообщений: 49
06.06.2009, 19:37
Вот, еще пример:
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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.06.2009, 19:44
мой вечный
C++
1
2
3
4
for(int i=0;i<10;i++){
...
}
int i=10; //на некоторых компиляторах будет ошибка Multiple declaration of a variable
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.06.2009, 22:52
Цитата Сообщение от 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
3189 / 869 / 39
Регистрация: 29.12.2008
Сообщений: 951
06.06.2009, 23:11
К сожалению, сейчас не вспомню конкретных примеров, но посоветую копнуть в сторону книги "Создание эффективных 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
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.06.2009, 23:20
Цитата Сообщение от Evg Посмотреть сообщение
А разве тест корректный с точки зрения стандарта? Мне казалочь что объявление переменной внутри for - это всё равно что вне for
Данный код абсолютно корректный с точки зрения действующего Стандарта. Область видимости (scope) переменной, объявленной внутри цикла, ограничена телом цикла.
Тем не менее, этот код может выдать ошибку на устаревших компиляторах.

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

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

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

Добавлено через 5 минут 33 секунды
Цитата Сообщение от alex_x_x Посмотреть сообщение
внутри
Однако...
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.06.2009, 00:42
Совершенно верно. Ссылочка 53 на странице 65 (2003) гласит: 53)
The precedence of operators is not directly specified, but it can be derived from the syntax.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.06.2009, 00:49
Цитата Сообщение от 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" как-то непонятно что означает. Да и то, что до этого предложения неплохо бы почитать
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.06.2009, 00:59
Это действующий Стандарт С++ ANSI/ISO 14882-2003 (точнее, draft Стандарта, но от окончательного варианта он почти не отличается). Кинь в ЛС адрес почты, пришлю сам текст (pdf, 2.7 Мбайт).... по тексту там много всякого.....
Драфт действующего Стандарта C (ANSI/ISO 9899-1999) тоже имеется. Хотя используется не в пример реже.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.06.2009, 01:06
Да в общем в инете уже нарыл дискуссии по поводу этого. ПРавда ни черта не понял. Всё-таки это относится к Си++ или ещё и к Си. Потому как всю жизнь считал, что приоритет операций в Си строго регламентирован. Если это не так, можешь привести конкретный пример, который мог бы работать по-разному на разных компиляторах (на каких конерктено - понятное дело не спрашиваю, ибо попросто можно и не знать)
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.06.2009, 10:57
Тут суть не в том, что будет по разному работать на разных компиляторах (это называется 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...
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.06.2009, 11:44
Этот пример я уже видел. Пояснить его можешь? Фишка в том, что для в таких случаях приоритет операций строится исходя из здравого смысла, нежили формально? Т.е. типа если не получается так, то делаем вот так, иначе необорот. Т.е. получается, что по стандарту приоритет операций вроде бы как не определён (правда не знаю, с которой из трёх формулировок, при этом для Си++ вроде бы как есть четвёртая), но тем не менее код в каждом случае работает так, как будто бы приоритет определён (при этом для каждого примера разный). Или всё-таки даннй код разные компиляторы могут отработать по разному? Т.е. к чему я веду. Даже если приоритет операций жёстко не прописан, то формулировка "but it can be derived from the syntax" означает, что из написания выражения всё-таки можно вывести приоритет операций. Таким образом получается, что приоритет исполнения всё-таки строго определён, но зависит от записи конкретного выражения. Так?

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

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

(to pragma)
Если тебе не впадлу было это читать и ты всё-таки дочитал до сюда, то к твоему примеру это не относится. В твоём конкретном случае имеется цепочка подряд идущих УНАРНЫХ операций, которые исполняются справа налево (и физически не могут исполниться никак по другому)
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.06.2009, 21:19  [ТС]
Да,и я нашёл у Страуструпа что все унарные операторы правоассоциативны.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
08.06.2009, 09:38
Цитата Сообщение от Evg Посмотреть сообщение
Таким образом получается, что приоритет исполнения всё-таки строго определён, но зависит от записи конкретного выражения. Так? [.....]
Посмотри, есть ли такие слова по поводу приоритетов операций?
1. Именно так. Тем не менее, прямо в Стандарте приоритеты не определены. А разнообразные "таблицы приоритетов", кочующие из одного учебника в другой - не более, чем плод фантазии их авторов.
2. Разумеется, нет.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.06.2009, 10:41
Цитата Сообщение от 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;
Разницу между ними что-то не почувствовал
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
08.06.2009, 11:41
Непереносимый код должен использовать не трактовку приоритетов операций в различных ситуациях (поскольку она будет одинаковой для одного и того же выражения независимо от компилятора и платформы - если компилятор, конечно, более-менее соответствует Стандарту), а - использовать платформенно-зависимые фичи и/или функции или компиляторо-зависимые фичи реализации. Например, то, что в MSDN явно описано как "Microsoft-specific".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2009, 11:41

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

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

приведите пример
мне подсказали, как составить программу, но не могу 8( приведите пример хоть на языке C#, пожалуйста Вот алгоритм: 1) составить...

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

Приведите пример
С арифметическими операциями и управляющими операторами(цикл for) над примитивными типами данных


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru