Почему делает условие испытания “для (; ;)” успешно выполнитесь?

Поскольку я понимаю "для (; ;)", не имеет никакого начального условия, никакого условия испытания и никакого инкрементного условия и поэтому циклов навсегда, мне любопытно, почему условие испытания следует за каждым циклом.

Делает пустое выражение""; оценить как верные в C? Или действительно ли это - особый случай, обработанный компиляторами?

Подобный, но несвязанный вопрос.

9
задан Community 23 May 2017 в 11:55
поделиться

2 ответа

Для этого можно использовать инструменты, доступные из xdg , в частности xdg-mime query .

Чтобы узнать тип файла, например, файл index.html , необходимо

$ xdg-mime query filetype index.html

Вернуть миметтип. Чтобы узнать, какое приложение связано с этим mimetye, используйте, например,

$ xdg-mime query default text/html

Здесь возвращается epiphany.desktop , т.е. $ APPNAME.desktop , поэтому легко получить из него имя приложения. Если вы просто хотите открыть файл в приложении по умолчанию, вы можете, конечно, просто запустить

$ xdg-open index.html

, что приведет к прозрению.

Функции запроса для ресурсов значков, по-видимому, недоступны в xdg-utils , но можно написать небольшой скрипт python с помощью pyxdg , который также предлагает множество дополнительных функциональных возможностей.

Для привязок C, вероятно, потребуется просмотреть код portland , связанный со страницей xdg .

EDIT:

Что касается libmagic и друзей, вам нужно будет определиться с вашими предпочтениями: хотя libmagic кажется более полным (и точным) с точки зрения охвата типов файлов, совершенно не заботит о приложениях по умолчанию или значках. Он также не предоставляет средства для установки дополнительных миметипов.

-121--1582335-

Позвольте мне задать вопрос: Учитывая программный код (скажем, это однопоточное приложение), каково правильное выполнение? Интуитивно выполнение CPU в порядке указания кода будет правильным . Эта иллюзия последовательного выполнения является тем, что есть у программистов.

Однако современный ЦП не подчиняется такому ограничению. Если не нарушены зависимости (зависимость от данных, управляющая зависимость и зависимость от памяти), ЦП выполняют команды в неупорядоченном режиме. Однако он полностью скрыт для программистов. Программисты никогда не видят, что происходит внутри процессора.

Компиляторы также используют такой факт. Если можно сохранить семантику программы (т.е. присущие вашему коду зависимости), компиляторы переупорядочат любую возможную инструкцию для достижения лучшей производительности. Одной из примечательных оптимизаций является подъем кода: компиляторы могут поднимать команду загрузки, чтобы минимизировать задержку памяти. Но, не волнуйтесь, компиляторы гарантируют его правильность; В любом случае компиляторы НЕ аварийно завершают работу программы из-за такого изменения порядка, так как компиляторы должны сохранять зависимости, по крайней мере. (Но компиляторы могут иметь ошибки: -)

Если вы рассматриваете только однопоточное приложение, вам не нужно беспокоиться о таком неупорядоченном выполнении либо компиляторами, либо ЦП, для однопоточного случая.

(Для получения дополнительной информации рекомендуется ознакомиться с концепцией ILP (параллелизм на уровне инструкций) . Производительность одного потока в основном зависит от того, сколько ILP можно извлечь из одного потока. Таким образом, и ЦП, и компиляторы делают все возможное для повышения производительности.)

при рассмотрении многопоточного выполнения возникает потенциальная проблема согласованности памяти . Интуитивно программисты имеют концепцию последовательной согласованности . Однако современные многоядерные архитектуры выполняют грязную и агрессивную оптимизацию (например, кэши и буферы). Трудно реализовать последовательную согласованность с низкими накладными расходами в современной компьютерной архитектуре. Так, могла возникнуть очень запутанная ситуация из-за неупорядоченных исполнений нагрузок и хранилищ памяти. Можно наблюдать, что некоторые партии и хранилища были выполнены в неупорядоченном состоянии. Прочитайте некоторые статьи, относящиеся к моделям памяти с пониженным энергопотреблением , например модель памяти Intel x86 (см. главу 8, Порядок размещения памяти, тома 3A Руководства разработчика ПО Intel 64 и IA-32 Architectures). Барьеры памяти необходимы в этой ситуации, когда для корректности необходимо обеспечить выполнение инструкций по памяти.

ОТВЕТ НА ВОПРОС : Коротко ответить на этот вопрос непросто. Нет хороших инструментов, которые обнаруживали бы такое неупорядоченное и проблемное поведение из-за модели согласованности памяти (хотя есть исследовательские работы). Короче говоря, вам даже трудно найти такие ошибки в вашем коде. Однако настоятельно рекомендую прочитать статьи о перепроверенной блокировке и ее подробном документе . При перепроверенной блокировке, из-за ослабленной согласованности памяти и переупорядочивания компиляторов (обратите внимание, что компиляторы не знают многопоточного поведения, если не указать явно с барьерами памяти), это может привести к неправильному поведению.

Суммируя:

  • Если вы работаете только над однопоточной программой, то вам не нужно беспокоиться о неупорядоченном поведении.
  • При работе с многоядерными процессорами может потребоваться рассмотреть проблемы согласованности памяти. Но это на самом деле редкость, когда вам действительно нужно беспокоиться о проблеме согласованности памяти. В основном гонки данных , взаимоблокировки и нарушения атомарности убивают многопотоковую программу.
-121--2579277-

Это по определению оператора для на языке C. 6,8,5,3/2 "Оператор для ":

Можно опустить как выражение-1, так и выражение-3. Опущенное выражение-2 заменяется на ненулевая константа .

17
ответ дан 4 December 2019 в 09:36
поделиться

Это по определению оператора для на языке C. 6,8,5,3/2 «Оператор для »:

Можно опустить как выражение-1, так и выражение-3. Опущенное выражение-2 заменяется на ненулевая константа .

-121--3266157-

Последнюю редакцию, объединенную из багажника в ветвь, можно найти, выполнив эту команду в каталоге рабочей копии:

svn log -v --stop-on-copy
-121--849506-

Язык C не имеет типа «пустое выражение». Если какое-либо выражение отсутствует в операторе для , синтаксически это означает, что все выражение опущено , не то что оно там, но пустое.

Цикл для с пропущенным вторым выражением закольцовывается вечно, потому что спецификация для оператора говорит об этом. Т.е. это специальная функция, специфическая для только для , а не для чего-то более общего.

Дополнительно (терминологический нитпик) только второе выражение действительно является условием . Первый и третий на самом деле не «условия».

5
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: