Jump to content

    
Sign in to follow this  
artemkad

Откель такие приоритеты операций в Си?

Recommended Posts

Вот скажите, что думали создатели Си делая побитные логические операции менее приоритетными чем операции сравнения? Можете привести хоть один пример где это принесло-бы пользу?

Share this post


Link to post
Share on other sites
2 minutes ago, Arlleex said:

А в чем, собственно, неудобство? Зачем, например, в выражении


if(a == 10 || b == 20)

кучи лишних скобок?

У вас операция логическая. И здесь всё логично. Вопрос был про побитовые операции.

Share this post


Link to post
Share on other sites
16 минут назад, Arlleex сказал:

Зачем, например, в выражении


if(a == 10 || b == 20)

кучи лишних скобок?

Само собой я говорил о побитовых операциях. К примеру, вот такое выражение

if(a & mask == 0) 

ошибочно и требует скобок в то время как 

if(a-b==0)

корректно?

Share this post


Link to post
Share on other sites
20 minutes ago, artemkad said:

Само собой я говорил о побитовых операциях. К примеру, вот такое выражение


if(a & mask == 0) 

ошибочно и требует скобок в то время как 


if(a-b==0)

корректно?

Нет. Первое не ошибочно, и второе - не корректно. Вы упускаете то, что в них никак не выражено намерение разработчика, а оно выражается однозначно именно скобками, вне зависимости от приоритета операций. Я от своих ребят всегда требую ставить скобки, спрашивая: "Как мне узнать, что именно ты тут хотел сделать? Как проверить, ты правильно скобки опустил или ошибочно?"

Share this post


Link to post
Share on other sites
37 минут назад, one_eight_seven сказал:

Вы упускаете то, что в них никак не выражено намерение разработчика,

По-моему там все вполне однозначно. Я не могу представить разработчика который рискнет выполнять арифметическую или побитную операцию с результатом сравнения. Вы сможете однозначно сказать что является результатом успешного сравнения? К примеру чему равно 

3 == 3

?

Share this post


Link to post
Share on other sites
37 минут назад, one_eight_seven сказал:

..."Как мне узнать, что именно ты тут хотел сделать? Как проверить, ты правильно скобки опустил или ошибочно?"

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

Share this post


Link to post
Share on other sites
8 minutes ago, Arlleex said:

Приоритеты операций от зубов должны отскакивать, особенно в мелких выражениях и когда программируешь более менее часто

Глупость несусветная. Вы никогда не работали в коллективах с длинной цепочкой, верно? В разных языках приоритеты операций разные. И, если вы производите что-то посложнее драйвера светодиодов, то лучше думать над решением задачи в проблемной области, а не над приоритетами операций. Более того, ваш код могут пользовать люди, которые пишут, например, на SystemVerilog или Python. И у них от зубов отлетает совем другая прецедентность операций.

 

10 minutes ago, Arlleex said:

. Если выражение сложное, то я, например, стараюсь ставить скобки только там, где необходимо отделить одну крупную группу от другой (дабы глаза не замыливались). Иначе на каждый чих (на каждую операцию) рисовать скобки - получится синтаксический лес, за которым сосен не видно

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

Share this post


Link to post
Share on other sites
4 минуты назад, one_eight_seven сказал:

В разных языках приоритеты операций разные.

Мы щас про Си говорим, так то.

Цитата

Более того, ваш код могут пользовать люди, которые пишут, например, на SystemVerilog или Python...

Ну раз пользуют - пусть именно пользуют, а не пытаются что-то там понять или исправить. Когда пытаешься исправить - будь добр знать инструментарий.

Share this post


Link to post
Share on other sites
28 minutes ago, artemkad said:

По-моему там все вполне однозначно. Я не могу представить разработчика который рискнет выполнять арифметическую или побитную операцию с результатом сравнения. Вы сможете однозначно сказать что является результатом успешного сравнения? К примеру чему равно 

Переформулируйте. Вообще непонятно, что вы сказать хотели.

Just now, Arlleex said:

Ну раз пользуют - пусть именно пользуют, а не пытаются что-то там понять или исправить. Когда пытаешься исправить - будь добр знать инструментарий.

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

2 minutes ago, Arlleex said:

Мы щас про Си говорим, так то.

Да, про C. И что? Именно в Си делают ошибки с прецедентностью операций. И именно в Си скобки решают эти проблемы.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this