Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
ValeryS
Модератор
7527 / 5702 / 738
Регистрация: 14.02.2011
Сообщений: 19,513
Завершенные тесты: 1
1

Баг или фича

19.12.2012, 07:05. Просмотров 1318. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

20
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
19.12.2012, 07:13 2
А что именно смущает? Последний пример?
0
ValeryS
Модератор
7527 / 5702 / 738
Регистрация: 14.02.2011
Сообщений: 19,513
Завершенные тесты: 1
19.12.2012, 07:34  [ТС] 3
Цитата Сообщение от Smetanka Посмотреть сообщение
А что именно смущает?
смущает то что в if идет сравнение (==) и если написать присвоение(=)
компилятор должен заверещать "обрати внимание не ошибся ли ты" но при этом код скомпилировать
а это молчит как партизан
0
0x10
2641 / 1794 / 299
Регистрация: 24.11.2012
Сообщений: 4,457
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
19.12.2012, 07:42
ValeryS
Модератор
7527 / 5702 / 738
Регистрация: 14.02.2011
Сообщений: 19,513
Завершенные тесты: 1
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
511 / 463 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 07:51 7
ValeryS, а этот пример типа

C++
1
2
int i;
if(i=5);
Тоже ворнинг не выдает?
0
ValeryS
Модератор
7527 / 5702 / 738
Регистрация: 14.02.2011
Сообщений: 19,513
Завершенные тесты: 1
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
Модератор
7527 / 5702 / 738
Регистрация: 14.02.2011
Сообщений: 19,513
Завершенные тесты: 1
19.12.2012, 08:21  [ТС] 10
Цитата Сообщение от Smetanka Посмотреть сообщение
Просто компания microsoft пытается сделать так, чтобы программист допускал меньше ошибок
ага а это вот не ошибка?
C++
1
k==10;
происходит сравнение а результат не куда не присваивается (хотя формально это не ошибка, эта строка ничего не делает)




Цитата Сообщение от Smetanka Посмотреть сообщение
Предупреждение warning C4553: ==: оператор не имеет результата; возможно, имелся в виду "="
очень информативно
оператор == как раз имеет результат просто мы его потеряли
вот так ведь вопросов не возникает
C++
1
bool b=k==10;
0
Schizorb
511 / 463 / 82
Регистрация: 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
Модератор
7527 / 5702 / 738
Регистрация: 14.02.2011
Сообщений: 19,513
Завершенные тесты: 1
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
511 / 463 / 82
Регистрация: 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
++Ͻ
15316 / 8689 / 1659
Регистрация: 27.09.2012
Сообщений: 21,416
Записей в блоге: 2
Завершенные тесты: 1
19.12.2012, 10:29 15
Цитата Сообщение от ValeryS Посмотреть сообщение
компилятор должен заверещать "обрати внимание не ошибся ли ты" но при этом код скомпилировать
Это абсолютно лекальная инструкция по мнению компилятора и предупреждать о ней нет необходимости, ибо тогда
C++
1
if(a=strlen(x))
также будет выдавать варнинг.
и то не ошибка(!!!) а предупреждение
Это само собой, ибо инструкция сама по себе должна использоваться внутри выражения. Иначе она просто не имеет смысла (скорее всего, при компиляции она будет удалена из кода)
0
ValeryS
Модератор
7527 / 5702 / 738
Регистрация: 14.02.2011
Сообщений: 19,513
Завершенные тесты: 1
19.12.2012, 11:25  [ТС] 16
Цитата Сообщение от Croessmah Посмотреть сообщение
Это абсолютно лекальная инструкция по мнению компилятора и предупреждать о ней нет необходимости,
хорошо тогда почему CodeVisionAVR
выдает
possibly incorrect assignment
пытался найти в стандарте как должен вести себя компилятор, но не нашел( заблудился в 800 страницах)

Цитата Сообщение от Croessmah Посмотреть сообщение
Это само собой, ибо инструкция сама по себе должна использоваться внутри выражения. Иначе она просто не имеет смысла
здесь я погорячился насчет ошибки
действительно с точки зрения языка все нормально
Цитата Сообщение от ValeryS Посмотреть сообщение
с точки зрения языка конечно не ошибка, а с точки зрения алгоритма
0
defer
574 / 252 / 18
Регистрация: 29.11.2010
Сообщений: 859
19.12.2012, 11:28 17
Цитата Сообщение от ValeryS Посмотреть сообщение
хорошо тогда почему CodeVisionAVR выдает
Потому что так захотели его разработчики
0
ForEveR
В астрале
Эксперт С++
8005 / 4762 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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)
0
ValeryS
Модератор
7527 / 5702 / 738
Регистрация: 14.02.2011
Сообщений: 19,513
Завершенные тесты: 1
19.12.2012, 11:43  [ТС] 19
Цитата Сообщение от defer Посмотреть сообщение
Потому что так захотели его разработчики
это я должен на каждого разработчика оглядываться
Цитата Сообщение от ForEveR Посмотреть сообщение
Полагаю нечто подобное этой опции есть и в MSVC.
есть как выяснилось 4 уровень
но все таки стандарт регламентирует поведение компилятора при присвоении в if или нет?
0
ForEveR
В астрале
Эксперт С++
8005 / 4762 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.12.2012, 11:45 20
ValeryS, Стандарт вообще не регламинтирует warning-и. Если это не ошибка однозначно - значит не регламентировано.
1
19.12.2012, 11:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 11:45

Ввод/вывод баг или нет?
#include <iostream> #include <iterator> #include <string> using namespace std; ...

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

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


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

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

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