Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
#1

Баг или фича - C++

19.12.2012, 07:05. Просмотров 1064. Ответов 20
Метки нет (Все метки)

решил проверить на своем VS 2008
присвоение в сравнении
написал
C++
1
2
3
char buf[100];
char *buf1;
if(buf1=buf)
все прошло никакого предупреждения

написал так
C++
1
2
3
char buf[100];
char *buf1;
if(buf1=0x05)
ошибка не может привести int к указателю, все правильно

написал так
C++
1
2
3
char buf[100];
char *buf1;
if(buf1=(char*)0x05)
опять все в порядке

уровень предупреждений
Уровень 3 (/W3)
вот и думаю что это?

Не по теме:

хотел создать тему в экспертах, не получилось(хотя вопрос к экспертам)

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2012, 07:05     Баг или фича
Посмотрите здесь:

Ошибка или баг в Dev C++? - C++
помогите разобраться: вот простой код #include <cstdlib> #include <iostream> using namespace std; class card { public: ...

Баг компилятора? Или я чего то не догоняю? - C++
Компилил в 2008 студии. Вопрос: ПОЧЕМУ ЭТОТ КОД КОМПИЛИРУЕТСЯ? class Bee { private: template<class Foo2> Bee&...

Ввод/вывод баг или нет? - C++
#include <iostream> #include <iterator> #include <string> using namespace std; ostream_iterator<string> oo(cout); ...

помогите определить баг или недочёт в программе. - C++
Задача ввести с клавиатуры массив и вывести на экран наибольший его элемент. Проблема заключается в if когда s<mas он всё время...

Баг VS или как? Функция в многофайловом приложении - C++
#include "function.h" int main(){ LoadFileToStack(); cout << endl; st return 0; } void LoadFileToStack() ...

баг студии? - C++
Есть такой код #include "stdio.h" void test_fun(int count, int ...) { int * arr = &count + 1; for (int i = 0; i <...

Баг компилятора? - C++
Набросал вот такой код: // <@r!er> <wtf> <26.05.2012> #include <iostream> #include <windows.h> using namespace...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 07:13     Баг или фича #2
А что именно смущает? Последний пример?
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
19.12.2012, 07:34  [ТС]     Баг или фича #3
Цитата Сообщение от Smetanka Посмотреть сообщение
А что именно смущает?
смущает то что в if идет сравнение (==) и если написать присвоение(=)
компилятор должен заверещать "обрати внимание не ошибся ли ты" но при этом код скомпилировать
а это молчит как партизан
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
19.12.2012, 07:42     Баг или фича #4
А почему он должен предупреждать о подобном? Использование присваивания в условии - обычная практика.

C++
1
2
3
4
if (const SomeClass* some_object = GetObject())
{
    // все ок, получили указатель на объект. Используем его только в текущем блоке.
}
Вместо

C++
1
2
3
4
5
6
const SomeClass* some_object = GetObject();
if (some_object)
{
    // все ок, получили указатель на объект.
}
// Тут объект уже не нужен, но он все еще существует в области видимости.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
19.12.2012, 07:49  [ТС]     Баг или фича #5
вот как например ведет себя CodeVisionAVR
C++
1
2
3
  char aaa[10];
 char * bbb; 
  if(bbb=aaa)
possibly incorrect assignment
Добавлено через 5 минут
Цитата Сообщение от 0x10 Посмотреть сообщение
Использование присваивания в условии - обычная практика.
я что то говорил об ошибке(Error) ?
я говорил о предупреждении (Warning)
Цитата Сообщение от 0x10 Посмотреть сообщение
А почему он должен предупреждать о подобном?
потому что вместо
C++
1
if(i==5)
запросто можно написать
C++
1
if(i=5)
поэтому некоторые советуют писать так
C++
1
if(5==i)
потому что
C++
1
if(5=i)
уж точно даст ошибку
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 07:51     Баг или фича #6
Ну вобще то я думаю известно, что в выражении условия if не обязательно должно быть логическое выражение. Все что == 0 false, все остальное true. Ругаться компилятор не должен, на то что вы используете присваивание. Ведь результатом выражения в if будет(в вашем случае) какой то адрес, а это я так думаю true. Никакой фантастики.
P.S. Просто так придуман язык С, что можно выстрелить нечаяно себе в ногу
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 07:51     Баг или фича #7
ValeryS, а этот пример типа

C++
1
2
int i;
if(i=5);
Тоже ворнинг не выдает?
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
19.12.2012, 08:01  [ТС]     Баг или фича #8
Schizorb,
C++
1
2
3
int k;
if(k=5)
  k=10;
молчит
вот на это вякнул
C++
1
2
3
int k;
if(k=5)
  k==10;
не понравилось k==10; и то не ошибка(!!!) а предупреждение

Добавлено через 3 минуты
Цитата Сообщение от Smetanka Посмотреть сообщение
Все что == 0 false, все остальное true. Ругаться компилятор не должен, на то что вы используете присваивание.
спасибо что объяснил
я то за пятнадцать лет работы с языком, об этом даже не догадывался
речь идет о конкретной среде VS 2008, все остальные(что у меня есть) ведут себя адекватно

Не по теме:

почему и не хотел создавать тему в начинающих

Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 08:11     Баг или фича #9
Цитата Сообщение от ValeryS Посмотреть сообщение
Schizorb,
C++
1
2
3
int k;
if(k=5)
  k=10;
молчит
вот на это вякнул
C++
1
2
3
int k;
if(k=5)
  k==10;
не понравилось k==10; и то не ошибка(!!!) а предупреждение

Добавлено через 3 минуты

спасибо что объяснил
я то за пятнадцать лет работы с языком, об этом даже не догадывался
речь идет о конкретной среде VS 2008, все остальные(что у меня есть) ведут себя адекватно

Не по теме:

почему и не хотел создавать тему в начинающих

Просто изначально неясно было О ЧЕМ ЖЕ ВСЕ ТАКИ ВОПРОС))) Ответил то что думал.
Теперь понял вопрос конкретнее)
Ну а в чем проблема то, что он выдает предупреждение? Просто компания microsoft пытается сделать так, чтобы программист допускал меньше ошибок при написании кода, для последующей простоты отладки. Вот и сделала компилятор с логикой
Например VS 2012 на

C++
1
2
3
int k;
if(k=5)
  k==10;
тоже выдает предупреждение

Предупреждение warning C4553: ==: оператор не имеет результата; возможно, имелся в виду "="

Что и логично)))
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
19.12.2012, 08:21  [ТС]     Баг или фича #10
Цитата Сообщение от Smetanka Посмотреть сообщение
Просто компания microsoft пытается сделать так, чтобы программист допускал меньше ошибок
ага а это вот не ошибка?
C++
1
k==10;
происходит сравнение а результат не куда не присваивается (хотя формально это не ошибка, эта строка ничего не делает)




Цитата Сообщение от Smetanka Посмотреть сообщение
Предупреждение warning C4553: ==: оператор не имеет результата; возможно, имелся в виду "="
очень информативно
оператор == как раз имеет результат просто мы его потеряли
вот так ведь вопросов не возникает
C++
1
bool b=k==10;
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 08:31     Баг или фича #11
ValeryS, оно?

http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

Там по идее level 4 указан.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
оператор == как раз имеет результат просто мы его потеряли
Но это же не ошибка. Можно писать что-нибудь типа:
x + y;

Результат теряется, но никто не говорил, что присваивание в выражении обязательно)
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 08:33     Баг или фича #12
ValeryS, не понятно что же все таки Вас не устраивает? Вы пытаетесь доказать что C++ несовершенен?) Или сообщить о несовершенстве компилятора? Или Вы просто пытаетесь понять почему же все таки всплывает это предупреждение?
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
19.12.2012, 08:50  [ТС]     Баг или фича #13
Цитата Сообщение от Schizorb Посмотреть сообщение
ValeryS, оно?
да
но четвертый уровень он же параноидальный
бывает что на свои собственные библиотеки ругается
Цитата Сообщение от Schizorb Посмотреть сообщение
Но это же не ошибка. Можно писать что-нибудь типа:
x + y;
с точки зрения языка конечно не ошибка, а с точки зрения алгоритма бесполезное действие

Добавлено через 7 минут
изначально то хотел проверить
что вот это
C++
1
if(buf1=buf)
должно дать предупреждение
а вот это вот
C++
1
if((buf1=buf)!=NULL)
нет, хотя смысл один
и это мне мог дать только 4 уровень
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 08:56     Баг или фича #14
Цитата Сообщение от ValeryS Посмотреть сообщение
с точки зрения языка конечно не ошибка, а с точки зрения алгоритма бесполезное действие
Видимо, поэтому и не ошибка, а именно предупреждение, причем первого уровня. http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

Почему assignment in condition четвертого уровня, вопрос к разработчикам студии, наверное...

C++
1
if(buf1=buf)
должно дать предупреждение
а вот это вот
C++
1
if((buf1=buf)!=NULL)
нет
В gcc с опцией wall так получилось. Первое - с предупреждением, второе- без.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
19.12.2012, 10:29     Баг или фича #15
Цитата Сообщение от ValeryS Посмотреть сообщение
компилятор должен заверещать "обрати внимание не ошибся ли ты" но при этом код скомпилировать
Это абсолютно лекальная инструкция по мнению компилятора и предупреждать о ней нет необходимости, ибо тогда
C++
1
if(a=strlen(x))
также будет выдавать варнинг.
и то не ошибка(!!!) а предупреждение
Это само собой, ибо инструкция сама по себе должна использоваться внутри выражения. Иначе она просто не имеет смысла (скорее всего, при компиляции она будет удалена из кода)
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
19.12.2012, 11:25  [ТС]     Баг или фича #16
Цитата Сообщение от Croessmah Посмотреть сообщение
Это абсолютно лекальная инструкция по мнению компилятора и предупреждать о ней нет необходимости,
хорошо тогда почему CodeVisionAVR
выдает
possibly incorrect assignment
пытался найти в стандарте как должен вести себя компилятор, но не нашел( заблудился в 800 страницах)

Цитата Сообщение от Croessmah Посмотреть сообщение
Это само собой, ибо инструкция сама по себе должна использоваться внутри выражения. Иначе она просто не имеет смысла
здесь я погорячился насчет ошибки
действительно с точки зрения языка все нормально
Цитата Сообщение от ValeryS Посмотреть сообщение
с точки зрения языка конечно не ошибка, а с точки зрения алгоритма
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
19.12.2012, 11:28     Баг или фича #17
Цитата Сообщение от ValeryS Посмотреть сообщение
хорошо тогда почему CodeVisionAVR выдает
Потому что так захотели его разработчики
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.12.2012, 11:38     Баг или фича #18
C++
1
2
3
4
5
int main()
{
   int i = 0;
   if (i = 5);
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp
forever@pterois:~/My_pro1/cpp_pro$ ./new
 
 
forever@pterois:~/My_pro1/cpp_pro$ clang++ -o new new.cpp
new.cpp:4:10: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
   if (i = 5);
       ~~^~~
new.cpp:4:10: note: place parentheses around the assignment to silence this warning
   if (i = 5);
         ^
       (    )
new.cpp:4:10: note: use '==' to turn this assignment into an equality comparison
   if (i = 5);
         ^
         ==
new.cpp:4:14: warning: if statement has empty body [-Wempty-body]
   if (i = 5);
             ^
new.cpp:4:14: note: put the semicolon on a separate line to silence this warning [-Wempty-body]
2 warnings generated.
Полагаю нечто подобное этой опции есть и в MSVC.
Ах ну да. Выше было же уже.
Тогда

C++
1
#pragma warning (4:4706)
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
19.12.2012, 11:43  [ТС]     Баг или фича #19
Цитата Сообщение от defer Посмотреть сообщение
Потому что так захотели его разработчики
это я должен на каждого разработчика оглядываться
Цитата Сообщение от ForEveR Посмотреть сообщение
Полагаю нечто подобное этой опции есть и в MSVC.
есть как выяснилось 4 уровень
но все таки стандарт регламентирует поведение компилятора при присвоении в if или нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 11:45     Баг или фича
Еще ссылки по теме:

Баг в программе - C++
Задание. Код. При тестировании программы 2 значения не проходят. В чем баг - не знаю. Помогайте с:

Баг в wxDev-C++ - C++
Написал короткую программу в wxDev-C++, но когда нажимаю "выполнить" после компиляции пишет "Проект не откомпилирован". Пробовал...

Баг в SDL2.0? - C++
Здравтсвуйте. Нашел сегодня странное поведение SDL2.0. Стандартный игровой цикл: #include <windows.h> #include <SDL/SDL.h> int...

Квантовый баг - C++
Нет, это не баг в программе для квантового компьютера. Это баг в программе для внешнего устройства. Блуждающий, прячущийся баг: при...

Небольшой баг - C++
Дана очень простая задачка: Даны числа a0, X, Y, M. Рассмотрим бесконечную последовательность ai = (X * ai-1 + Y) mod M, где операция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.12.2012, 11:45     Баг или фича #20
ValeryS, Стандарт вообще не регламинтирует warning-и. Если это не ошибка однозначно - значит не регламентировано.
Yandex
Объявления
19.12.2012, 11:45     Баг или фича
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru