printf и ++ оператор [дубликат]

7
задан Antti Haapala 28 December 2018 в 20:31
поделиться

5 ответов

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

3
ответ дан 6 December 2019 в 12:50
поделиться

vim намного эффективнее с огромными файлами (100-500MB .csv или .xml файлы в моем случае).

gvim бьет vim hands-down при использовании для сравнения файлов (gvimdiff): установка шрифта (хотите больше контента на экране?), перетаскивание линии разделения окна (хотите видеть больше одного файла, чем другого) и т.д.

Кроме того, я не видел других различий мэра и использовать gvim за исключением работы с большими файлами, потому что я считаю его более удобным в графической среде (gnome).

-121--2360717-

Параметры функции не вычисляются в определенном порядке в C. Поэтому нельзя заранее определить, будут ли a или a++ вычисляться первыми при вызове printf .

См. Порядок оценки параметров перед функцией, вызывающей в C

-121--3866217-

Неопределенное поведение вызывается путем ссылки на "a" и "a++" в списке аргументов.

Не определено, в каком порядке вычисляются аргументы. Различные компиляторы могут выбирать разные порядки. Один компилятор может выбирать различные порядки в разное время.

Не делайте этого!

2
ответ дан 6 December 2019 в 12:50
поделиться

При оценке аргументов функции ничего не происходит "справа налево". Когда оцениваются аргументы функции, порядок оценки не определен, и между оценкой отдельных аргументов нет точек последовательности. Это означает, что в этом процессе нет абсолютно никакого временного упорядочивания. Аргументы могут быть оценены в любом порядке, и процесс их оценки может быть переплетен любым образом.

Однако ваш код страдает от еще более серьезных проблем. Все три оператора, вызывающие printf, приводят к неопределенному поведению (UB), потому что они либо пытаются изменить один и тот же объект (a) дважды без точки следования между модификациями (третий вызов), либо пытаются изменить объект и прочитать его для независимой цели (первый и второй вызов). Таким образом, пока рано даже упоминать о порядке оценки. Поведение вашего кода не определено.

8
ответ дан 6 December 2019 в 12:50
поделиться

Потому что иногда у вас есть параметр, который требуется интерфейсу, но функция не использует его. Может быть, параметр больше не нужен, необходим только в других функциях, которые должны использовать ту же сигнатуру (особенно для того, чтобы их можно было вызвать через указатели) или функциональность еще не реализована. Наличие параметров, которые не используются, может быть особенно распространено в сгенерированном коде или коде рамки по этой причине (и, вероятно, поэтому сгенерированный код MFC имеет имя, закомментированное).

Что касается причины отсутствия предупреждения - я думаю, что это потому, что является ли эта проблема субъективной вещью, и другие люди (особенно исполнители компиляторов) не рассматривают ее как проблему. Как только вы на самом деле пойдете, чтобы использовать параметр, вы получите компилятор, чтобы пожаловаться, если вы забыли раскомментировать имя, так что вы получите компилятор жаловаться только, когда вам действительно нужно, чтобы (версия компилятора проворный YAGNI: «You Arn 't Gonna Neet It» философия).

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

-121--1145299-

Можно использовать пакетные файлы, выполняющиеся при загрузке , для

  • Монтирования общего сетевого ресурса ( net use\\server\share )
  • Скопируйте установщики Python и пакетов из сетевой общей папки в локальную папку
  • Проверьте версию установщика MSI по сравнению с установленной версией
  • Если она отличается, удалите Python и все зависящие от версии пакеты
  • Переустановите все пакеты

Это будет в значительной степени вашим собственным откатом

-121--4349285-

+ + a означает приращение первого, а затем обратное вычисление выражения. (a изменяется, и выражение вычисляется как a + 1)

a++ означает, что вычисляется a (так, erm, a), а затем увеличивается. Таким образом, a передается, но значение a затем (т.е. впоследствии) изменяется на a + 1.

2
ответ дан 6 December 2019 в 12:50
поделиться

Параметры функции не оцениваются в определенном порядке в C. Поэтому нельзя заранее сказать, a или a ++ будет оцениваться первым при вызове printf .

См. Порядок оценки параметров перед вызовом функции в C

1
ответ дан 6 December 2019 в 12:50
поделиться
Другие вопросы по тегам:

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