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

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

05.06.2009, 23:53. Показов 14957. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru