Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,231
#1

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

19.12.2012, 07:05. Просмотров 1160. Ответов 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)
вот и думаю что это?

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2012, 07:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Баг или фича (C++):

std::regex : баг на сайте или баг компилятора? - C++
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через 35 секунд компилятор gcc 4.8

Баг компилятора или я дурак? - C++
До:http://www.cyberforum.ru/attachment.php?attachmentid=840160&stc=1&d=1496427343 ...

Ошибка или баг в 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); ...

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

20
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 07:13 #2
А что именно смущает? Последний пример?
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,231
19.12.2012, 07:34  [ТС] #3
Цитата Сообщение от Smetanka Посмотреть сообщение
А что именно смущает?
смущает то что в if идет сравнение (==) и если написать присвоение(=)
компилятор должен заверещать "обрати внимание не ошибся ли ты" но при этом код скомпилировать
а это молчит как партизан
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
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)
{
    // все ок, получили указатель на объект.
}
// Тут объект уже не нужен, но он все еще существует в области видимости.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,231
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)
уж точно даст ошибку
0
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 07:51 #6
Ну вобще то я думаю известно, что в выражении условия if не обязательно должно быть логическое выражение. Все что == 0 false, все остальное true. Ругаться компилятор не должен, на то что вы используете присваивание. Ведь результатом выражения в if будет(в вашем случае) какой то адрес, а это я так думаю true. Никакой фантастики.
P.S. Просто так придуман язык С, что можно выстрелить нечаяно себе в ногу
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 07:51 #7
ValeryS, а этот пример типа

C++
1
2
int i;
if(i=5);
Тоже ворнинг не выдает?
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,231
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, все остальные(что у меня есть) ведут себя адекватно

Не по теме:

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

0
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: ==: оператор не имеет результата; возможно, имелся в виду "="

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




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

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

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

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

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

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

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

C++
1
if(buf1=buf)
должно дать предупреждение
а вот это вот
C++
1
if((buf1=buf)!=NULL)
нет
В gcc с опцией wall так получилось. Первое - с предупреждением, второе- без.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
19.12.2012, 10:29 #15
Цитата Сообщение от ValeryS Посмотреть сообщение
компилятор должен заверещать "обрати внимание не ошибся ли ты" но при этом код скомпилировать
Это абсолютно лекальная инструкция по мнению компилятора и предупреждать о ней нет необходимости, ибо тогда
C++
1
if(a=strlen(x))
также будет выдавать варнинг.
и то не ошибка(!!!) а предупреждение
Это само собой, ибо инструкция сама по себе должна использоваться внутри выражения. Иначе она просто не имеет смысла (скорее всего, при компиляции она будет удалена из кода)
0
19.12.2012, 10:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 10:29
Привет! Вот еще темы с ответами:

Ошибка или баг Visual Studio 2015? - C++
Кто сталкивался с проблемой когда после сборки программы, зависает Visual? Даже пустой проект не может запустить, хотя раньше запускал....

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

Баг asio? или баг TCP стека? - C++
всем привет. повстречался с очень странным багом. и не могу определить кто бажит, asio, или TCP-стек. на стороне клиента,...

Баг или так задумано? Фишка с кодировкой файлов компиляции - C++
Visual C++ 2013 Express. От изменения кодировки созданных .cpp файлов будет зависеть то как выводятся русские буквы. Никогда раньше не...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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