Насколько компилятор продвинут?

на мой взгляд это неправильное выражение , т.к после применения маски , по идее справа остаются 0 , а это не то , что мне нужно , но часто такое выражение встречал в форуме в скетче, и причем на него никто не обращал внимания. Поэтому и спросил
почему мое выражение которое правильное - трешь , а вот на это которое неправильное ИМХО( ну или я что-то не понял в нем) никто не обращает внимания…
ТАк в чем же все таки трешь у меня … вроде я все правильно написал ,?

Пиз-ец, Вы знаете, что ОНО неправильно и лезете с ЭТИМ к народу. Извращение.
А почитать? Подумать? Не Ваш метод?

Хорошо , объясните пожалуйста почему мое выражение считается трешем? оставим в покое чужое , то отдельнаея тема… меня интересует , то что я написал … что там не так ?и как тогда ?

Прошу прощения, я перепепутал отрицание и НЕ … я решил , что это одно и тоже … оказывается разное…
if (~PINA & (1<<6)) это должно быть if (!PINA & (1<<6)) с отрицанием работает . но все равно непонятно чем !(PINA & (1<<6)) лучше !(PINA >> 6) & 1) или , что имеется ввиду под трешем

Нет, это уже какой-то зашквар!

Значит, слушайте внимательно. Вы ОЧЕНЬ много болтаете и ни хера не делаете.!

Давайте, Вы не будете НИЧЕГО здесь отвечать пока не:

  1. попробуете это выражение в маленьком примере;
  2. убедитесь в том, что здесь написан бред сивой кобылы
  3. разберётесь, что не так

и только после этого ответите постом в котором объясните почему здесь написан бред и как надо.

Только в этом случае я готов ответить на Ваш другой вопрос, про другое выражение. Учить же чему-то того, кто НИ ХЕРА не делает сам а только спорит до хрипоты, о том в чём ни бельмесы - увольте, я не буду.

И да, вставляйте код нормально. Вот так if (!PINA & (1<<6)), а не так, как у Вас. На неправильно вставленный код ответов от меня не будет никаких. Замечаний уже сделано много, больше их делать нет смысла. Просто не будет ответов.

я попробовал…
!(PINA & (1<<6))
вот так конечно работает , извините в первой части предложения проглядел ошибку, отрицание ко всему выражению надо.!PINA действительно ерунда

Спойлер

Может быть тем, что первое синтаксически правильно, а во втором не соблюдён баланс скобок?

:face_with_symbols_over_mouth: вставка фрагментов кода!

не ругайтесь … просмотрел закрепленный раздел не нашел как вставлять именно фрагмент , там только про 3 апострофа… :slight_smile: решил , что это иммели ввиду… ошибся…(протанопия ) посмотрел содержание Вашего сообщения как у Вас сделано - исправил …

Итишкин кот!!! Да точно так же три апострофа перед и три апострофа после. И точно так же апострофы должны быть отдельными строками.

А если это неподъёмная задача, воспользуйтесь кнопкой </>. Вот ведь проблема-то, прямо двух высших образований требует :sweat_smile:

я и делал 3 апострофа а он вставляет как обычный код - за это и поругали…

if (t=0)

а понял надо так
if (t=0)

Рома! До тебя просто докопались.
Отправляй всех запускать пример.

void setup() {
Serial.begin(115200);

  uint16_t a;
  // put your setup code here, to run once:
  for (a = 0; a < 256; a++) {
    if (  (!(a & (1 << 6))) !=  (!((a >> 6) & 1)) )
    {
      Serial.println("Oopsss..");
      break;
    }
  }
  if (a == 256)
    Serial.println("Я прав! Идите в жопу!");

Serial.println("Dixi");
}

void loop() {
  // put your main code here, to run repeatedly:

}

это, как уже сказал Влад - ничем.

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

Вы, похоже, считаете что это “просто опечатки и не влияют на суть”. Нет, опечатки. это когда вы пишете “копьютер” вместо “компьютер”. А когда вы путаете знаки или скобки в выражениях С - это грубые ошибки, каждая из которых вам может стоить неделю отладки в крупном проекте.

romansochi
Что в AVR подразумевается под PINA ???

У Меги есть порт А

Вот именно что это порт и его значение будет известно только на момент выполнения.
Потом это значение надо крутнуть вправо 6 раз и это при отсутствии в системе команд сдвига на произвольное число бит. И только потом уже наложится маска.
А что у нас есть 1<<6 - это константа времени компиляции. Следовательно просто считается значение порта и наложится маска.

Я только в этом смысле ужаснулся …

1 лайк

Да, это ценное замечание. Насчет оптимизации я редко вперед задумываюсь.

Тогда да, выражения неравноценны. Но с точки зрения языка оба корректны.

вспомнилось про “…но есть нюанс…

1 лайк

Обратите внимание, в каждом Вашем посте выражение написано неправильно. То, Вы скобки не там поставите, то баланс не соблюдёте. Такая небрежность записи несовместима с программированием. Вы очень торопитесь что-нибудь сказать и от своей торопливости пишете бред.

Наконец, по поводу двух выражений.

image

Я Вам не говорил, что это плохо, и мне неоткуда знать, что имел в виду тот, кто говорил. Я лишь выскажу своё предположение о том, что он мог иметь в виду.

С точки зрения общей логики, а также любого современного компилятора, эти два выражения идентичны. (хотя, давайте, заменим «любого» на «всех известных мне», чтобы не говорить «за всю Одессу»). А вот, с точки зрения программиста - нет, правое режет глаз и вызывает неприятие.

Почему?

Обратите внимание на внутренние скобки - выделено жёлтым фоном.

В левом выражении, содержимое внутренних скобок - константа, которая, очевидно, будет вычислена компилятором и в код пойдёт уже готовое значение 0x40.

А вот в правом выражении в скобках находится не константа и компилятор не имеет никакой возможности вычислить выражение в скобках заранее и подставить в код готовое значение. Поэтому «на вид» выглядит так, что компилятор может оставить вычисление этого значения на время выполнения (т.е. сгенерирует код, который прочитает регистр и начнёт его реально сдвигать). На самом деле, он этого не сделает, т.к. достаточно «умный» - он сам преобразует правое выражение к левому и скомпилирует именно левое. Но, повторяю, «на вид» это выглядит ужасно и режет глаз любому профессионалу.

Это как если бы Вы моряку расстояние в километрах написали. Правильное, но в километрах - ему бы это резануло по глазам.

2 лайка

Спасибо…

Спасибо

постараюсь исправиться:)

В Общем решил посмотреть , что же на самом деле компилятор пихает в мой код , все как Вы сказали…Тут вопросов нет, вопрос в другом…
почему компилятор делает такую простыню кода , когда можно обойтись 3 командами для того , чтобы проверить пин ? (если не брать команды работы со стеком и команды возврата данных).
Зачем такие сложности ?
Код использовал один и тот -же , чтобы сравнить , так что на неиспользуемые переменные внимания не обращайте…

Спойлер

#include <avr/io.h>
int t = 0;
int main(void) {
  DDRA = 0x00;
  PORTA |= 1 << 6;
  Serial.begin(9600);
  while (1) {
    t = f();
    Serial.println(t);
  }
}

int f() {
  int a = 0, b = 0;
  b = !(PINA & (1 << 6));
  return b;
}

код компилятора , который определяет пин занимает с 021A-238

и мой код , который делает абсолютно тоже самое (проверенно в ATMEL STUDIO и PROTEUS) , правда в ардуино среде (и VS miсro тоже) единицу не возращает , всегда 0, но возможно я где-то, чего-то не поставил в настройках…

3 команды 18.19.20 причем 20 постольку поскольку :slight_smile: он даже не нужен

Спойлер

#include <avr/io.h>
int t=0;
int main(void)
{
	DDRA=0x00;
	PORTA |= 1<<6;
	Serial.begin(9600);
    while (1) 
    {
	t=	f();
	Serial.println(t);
    }	
}

int f() {
	int a = 0, b=0;
	asm volatile (
		"sbis 0x00,0x6\n\t"
		"ldi %0,0x1\n\t"
		"nop\n\t"
		: "=r"(b)
		: "r"(a) 	
	);
	return b;
}

Этот текст будет скрыт

P/S извините , что дизассемблированный листинг скрином, не нашел как сохранить или выделить …