|
warning: signed and unsigned type in conditional expression |
|
|
|
Jul 27 2010, 07:56
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 3-05-06
Из: Нижний Новгород
Пользователь №: 16 725

|
Добрый день !
Есть такое выражение:
char * s1;
px->n1 = px->prec < 0 ? strlen(px->s) : (s1 = (char *)memchr((void *)px->s, '\0', px->prec)) != 0 ? s1 - px->s : px->prec;
px->s это char *
Ругается
warning: signed and unsigned type in conditional expression
на строку : px->prec)) != 0 ? s1 - px->s : px->prec;
Где ошибка ????
|
|
|
|
|
Jul 28 2010, 10:22
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(demiurg_spb @ Jul 27 2010, 21:16)  попробуйте так: Код (xxx != 0U) ? ... : ...; У Вас в настройках компилятора, видимо, задано трактовать char как unsigned char. А не всё ли равно, знаковое число или нет, при сравнении с нулём?
|
|
|
|
|
Jul 28 2010, 10:55
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(demiurg_spb @ Jul 28 2010, 14:46)  Это не глупости. Это зависит от уровня выдачи варнинга. Задаётся ключами для ЛЮБОГО компилятора. В настройках стоит All Warnings. И, тем не менее, компилируя unsigned char != 0 никаких предупреждений не выдаётся. Вы сами подумайте, зачем в данном случае необходимо предупреждение? Совершенно нормальная запись. А вот такое - 0U - выглядит довольно странно. Разве нуль может иметь знак?  Цитата Warn when a comparison between signed and unsigned values could produce an incorrect result Ну и как при сравнении целого числа (со знаком или без) на равенство нулю можно получить неверный результат?
|
|
|
|
|
Jul 28 2010, 11:00
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(sonycman @ Jul 28 2010, 14:55)  А вот такое - 0U - выглядит довольно странно. Разве нуль может иметь знак?  Вы смешиваете тёплое с мягким  Не нуль имеет знак, а объек имеет ТИП. А типы у 0 и 0U различны. То что для Вас выглядит странно - не должно означать что этого быть не может, просто Вы ещё не сталкивались. Цитата Ну и как при сравнении целого числа (со знаком или без) с нулём можно получить неверный результат? Перечитайте внимательно цитату из моего предыдущего сообщения.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 28 2010, 18:18
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(sonycman @ Jul 28 2010, 14:55)  В настройках стоит All Warnings. И, тем не менее, компилируя unsigned char != 0 никаких предупреждений не выдаётся. Вы сами подумайте, зачем в данном случае необходимо предупреждение? Совершенно нормальная запись. А вот такое - 0U - выглядит довольно странно. Разве нуль может иметь знак?  Ну и как при сравнении целого числа (со знаком или без) на равенство нулю можно получить неверный результат? Сравнение с нулем для чисел без знака может не быть корректным в ряде случаев, например x<0, где x - данные без знака (unsigned). В таких случаях компилятор выдает предупреждение. Когда выполняется проверка на == / !=, то все выполняется корректно. То же самое относится и к сравнению чисел со знаком и без оного. Например, условие x <= -1 есть "Истина" (true), если x имеет тип unsigned.
|
|
|
|
|
Jul 28 2010, 19:05
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(_Bill @ Jul 28 2010, 22:18)  Сравнение с нулем для чисел без знака может не быть корректным в ряде случаев, например x<0, где x - данные без знака (unsigned). Конечно. В таком случае компилятор обязательно выдаст предупреждение, а то и ошибку. Но я то говорю о проверке на равенство нулю. В этом случае знак не имеет никакого значения. И вменяемый компилятор не будет пудрить мозги глупыми предупреждениями о том, чего не может быть в принципе.
|
|
|
|
|
Jul 29 2010, 03:40
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(sonycman @ Jul 28 2010, 23:05)  Конечно. В таком случае компилятор обязательно выдаст предупреждение, а то и ошибку.
Но я то говорю о проверке на равенство нулю. В этом случае знак не имеет никакого значения. И вменяемый компилятор не будет пудрить мозги глупыми предупреждениями о том, чего не может быть в принципе. Ну, да. Проверка на равенство/неравенство всегда будет выполняться корректно.
|
|
|
|
|
Jul 29 2010, 07:11
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 3-05-06
Из: Нижний Новгород
Пользователь №: 16 725

|
Попробовал
px->n1 = px->prec < 0 ? strlen(px->s) : (s1 = (char *)memchr((void *)px->s, '\0', px->prec)) != 0U ? s1 - px->s : px->prec;
все равно ругается на
px->prec)) != 0U ? s1 - px->s : px->prec;
похоже вся загвоздка в
s1 - px->s
не нравится вычитание указателей на char
char * s1; _Pft *px; typedef struct {
.......
char *s; .....
} _Pft;
может привести к какому-нибудь типу ?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|