Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2011, 02:16   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию объясните пожалйуста почему if работает неправильно

Код:
		for (j = 0; j < buffer->Width; j++)
		{
		if (j<3 & j>-1)
			{
				*ptr=150;
				ptr++;
				*ptr=50;
				ptr++;
				*ptr=75;
			}
			else
			{
				ptr++;
				ptr++;
			}
		}
пропускается первое условие! когда j=0!
P.S. Разобрался сам. Описал j как int))) (было unsigned int) Бывает...)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 11.02.2011 в 02:24.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 11.02.2011, 02:21   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
	unsigned int j = 0;
	if (j > -1)
		;// this code will never be executed
чьорт, надеюсь хоть в С# и Go это не так..
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 11.02.2011 в 02:45.
veniside вне форума Ответить с цитированием
Старый 11.02.2011, 02:50   #3
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

На твой вопрос ответили в предыдущем сообщении, а я дам совет по стилю.

Лучше так делай:
Код:
for(j = 0; j < buffer->m_width; ++j) {
    if(j<3 & j> -1) {
        *ptr = 150;
        ++ptr;
        *ptr = 50;
        ++ptr;
        *ptr = 75;
    } else {
        ++ptr;
        ++ptr;
    }
}
4 пробела и открывающая скобка на одной строке везде, кроме function definitions и классов. И else на одной строке. Так читается лучше, ИМХО.
А ++v лучше видно глазами и в некоторых случаях выполняется быстрее.

А что касается именования полей классов, лучше использовать что-то типа m_width. И вообще, открытые атрибуты класса это плохо.

Больше тут: http://techbase.kde.org/Policies/Kdelibs_Coding_Style http://qt.gitorious.org/qt/pages/QtCodingStyle

Вот так вот приятно именовать:
Код:
Class MyClass;
void MyClass::scroll();
void MyClass::doSomething();
bool MyClass::isScrollable();
double MyClass::scrollValue();
bool is_scrollable;
double some_value;
int some_counter;
void MyClass::setScrollValue(double scroll_value);
Ну и поля типа int m_scroll_counter, bool m_is_scrollable.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 11.02.2011 в 02:57.
Obey-Kun вне форума Ответить с цитированием
Старый 11.02.2011, 09:06   #4
optimator
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 92
По умолчанию

Цитата:
Сообщение от ImmortalAlexSan
if (j<3 & j>-1)
А ведь логическое И это ж вроде &&
optimator вне форума Ответить с цитированием
Старый 11.02.2011, 09:53   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от optimator
ведь логическое И это ж вроде &&
+1

а я бы ещё и в скобки операции взял. Даже если в данном случае это не обязательно, но красивее, нагляднее и, главное, надежнее!
Цитата:
Код:
if ((j<3) && (j>-1))
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.02.2011, 10:10   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от optimator Посмотреть сообщение
А ведь логическое И это ж вроде &&
Согласен, но работать будет и так. Особой разницы нет. Как-то проводил исследования на эту тему, с двойным и одинарным амперсандом, разницы так и не нашёл. Что двойной, что одинарный работают одинаково .
Хотя в документации рекомендуется в if использовать именно двойной амперсанд.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 11.02.2011, 10:27   #7
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

bitwise and и and это одинаковые операции, только когда дело касается булёвых.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 11.02.2011, 10:28   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

В большинстве случаев компилер достаточно умный, чтобы сообразить, что притулить побитовое И тут просто некуда.

А вот то, что никакого ворнинга не выдается на превращение (j > -1) в (j > 0xFFFFFFFF) — это чистое безумие. С# такое просто не компилирует. До Go ещё не добрался.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.02.2011, 10:33   #9
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Код:
	unsigned int j = 0;
	if (j > -1)
		;// this code will never be executed
чьорт, надеюсь хоть в С# и Go это не так..
А тут компилятор ругнётся, если варнинги включены. А вообще забавно:
Код:
#include <stdio.h>

int main()
{
    unsigned j = 12;
    printf("j > -1: %i\n", j > -1);
    printf("j < -1: %i\n", j < -1);
    printf("j >  1: %i\n", j > 1);
}
Выводит такое:
Код:
j > -1: 0
j < -1: 1
j >  1: 1
Но и компилятор не молчит.

Код:
obey@damnbook tmp % g++ -Wall ./main.c
./main.c: В функции ‘int main()’:
./main.c:6:33: предупреждение: сравнение знакового и беззнакового целых выражений
./main.c:7:33: предупреждение: сравнение знакового и беззнакового целых выражений
А разгадка в том, что -1 при приведении к unsigned равно UINT_MAX.
Вот, сами проверьте:
Код:
#include <stdio.h>
#include <limits.h>

int main()
{
    printf("%u\n", (unsigned)(-1));
    printf("%u\n", (unsigned)(-10));
    printf("%u\n", (unsigned)(-10000));
    printf("%u\n", INT_MAX);
    printf("%u\n", UINT_MAX);
}
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 11.02.2011 в 10:59.
Obey-Kun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему на чужем ПК неправильно работает программа Coder01 Общие вопросы Delphi 10 24.08.2010 19:34
TextRect работает неправильно bbk_serg БД в Delphi 16 10.08.2010 21:11
sscanf() неправильно работает BioS Общие вопросы C/C++ 7 06.02.2010 22:36
Java Script - объясните почему не работает код. fidger JavaScript, Ajax 0 10.05.2009 18:01
Спецы!! Проверьте прогу почему работает неправильно?? SanSanblch Общие вопросы Delphi 2 05.12.2008 18:17