Почему делает код ниже, возвращают true только для = 1?

Урк. Во-первых, никогда, никогда, НИКОГДА не делайте этого:

$session_id = $_REQUEST['session_id'];  

Это приводит к тому, что ящик безопасности называется «фиксацией сеанса» (подробнее: http://en.wikipedia.org / wiki / Session_fixation ).

Кажется, вы довольно тяжелы в безопасности. Если вам необходимо обмениваться данными с сайта 1 на сайт 2, вы должны сделать это через один мост потребления:

1). Нажмите ссылку на сайт 1 в файл обработчика, назовем его redir.php.

2). Redir.php сначала проверяет существующие данные сеанса.

3). Redir.php записывает соответствующую информацию в строку DB вместе с каким-то идентификатором (например, хеш MD5 идентификатора пользователя + '_' + текущее время), плюс флаг «потребляемый», устанавливает false.

4). Redir.php перенаправляет 301 на сайт 2 вместе с идентификатором.

5). Сайт 2 читает соответствующую строку из БД.

6). Если данные хороши и еще не «поглощены», верните успех и отметьте данные как потребленные.

7). Если данные были уничтожены, введите какую-то ошибку.

Есть более сложные способы сделать это, но я думаю, что это обрабатывает то, что вы пытаетесь сделать.

13
задан GEOCHET 1 June 2009 в 20:06
поделиться

11 ответов

Когда верный Bool преобразовывается в интервал, он всегда преобразовывается в 1. Ваш код таким образом, эквивалентен:

main(){
   int a = 10;
   if (1 == a)
      cout<<"y i am not getting executed";
   }

Это - часть стандарт C++ , таким образом, это - что-то, что Вы ожидали бы происходить с каждым C++ стандарты совместимый компилятор.

37
ответ дан 1 December 2019 в 17:17
поделиться

в C и C++, 0 ложь, и что-либо кроме нуля верно:

if ( 0 )
{
// never run
}

if ( 1 )
{
// always run
}

if ( var1 == 1 )
{
// run when var1 is "1"
}

, Когда компилятор вычисляет булево выражение, он обязан произвести 0 или 1. Кроме того, существует пара удобных определений типов и определяет, которые позволяют Вам использовать "верный" и "ложный" вместо 1 и 0 в Ваших выражениях.

, Таким образом, Ваш код на самом деле похож на это:

main(){
int a = 10;
if (1 == a)
     cout<<"y i am not getting executed";
}

Вы, вероятно, хотите:

main(){
int a = 10;
if (true == (bool)a)
     cout<<"if you want to explicitly use true/false";
}

или действительно просто:

main(){
int a = 10;
if ( a )
     cout<<"usual C++ style";
}
3
ответ дан 1 December 2019 в 17:17
поделиться

Причина Ваш оператор печати не становится выполняемым, состоит в том, потому что Ваша булевская переменная становится неявно преобразованной в число вместо наоборот. Т.е. Ваш, если оператор эквивалентен этому: если (1 == a)

Вы могли бы обойти это первым явно преобразование его к булевской переменной:

main(){
int a = 10;
if (((bool)a) == true)
     cout<<"I am definitely getting executed";
}

Во лжи C/C++ представлен как 0.

Все остальное представлено как не нуль. Это равняется иногда 1, иногда что-либо еще. Таким образом, Вы никогда не должны тестировать на равенство (==) к чему-то, что верно.

Вместо этого необходимо протестировать на равенство чему-то, что является ложью. Так как ложь имеет только 1 допустимое значение.

Здесь мы тестируем на все не ложные значения, любой из них в порядке:

main(){
int a = 10;
if (a)
     cout<<"I am definitely getting executed";
}

И пример одной трети только, чтобы доказать, что безопасно сравнить любое целое число, которое считают ложью ко лжи (который является только 0):

main(){
int a = 0;
if (0 == false)
     cout<<"I am definitely getting executed";
}
26
ответ дан 1 December 2019 в 17:17
поделиться

Ваша булевская переменная продвинута на целое число и становится 1.

5
ответ дан 1 December 2019 в 17:17
поделиться

Поскольку верный 1. Если Вы хотите протестировать на ненулевое значение, просто запишите если (a).

2
ответ дан 1 December 2019 в 17:17
поделиться

Я предлагаю, чтобы Вы переключились на компилятор, который предупреждает Вас об этом... (VC ++ приводит к этому: предупреждение C4806: '==': небезопасная операция: никакое значение типа 'bool' продвинутый для ввода 'интервала' не может равняться данной константе; у меня нет другого компилятора под рукой.)

я соглашаюсь с Lou Franco - Вы хотите знать, больше ли переменная, чем нуль (или неравна ему), тест для этого.

Все это сделано неявно компилятором, опасно, если Вы не знаете последнюю деталь.

1
ответ дан 1 December 2019 в 17:17
поделиться

Вот способ, которым большинство людей пишет такой код:

main(){
int a = 10;
if (a) // all non-zero satisfy 'truth'
     cout<<"y i am not getting executed";
}

я также видел:

main(){
int a = 10;
if (!!a == true) // ! result is guaranteed to be == true or == false
     cout<<"y i am not getting executed";
}
0
ответ дан 1 December 2019 в 17:17
поделиться

Я не ожидал бы, что код, который будет определен, и Вы не должны зависеть от любого поведения, которое Ваш компилятор дает Вам. Вероятно, истинное преобразовывается в интервал (1), и не преобразованного в bool (верный), как Вы ожидаете. Лучше для записи то, что Вы имеете в виду (a! = 0) затем для зависимости от этого (даже если это оказывается определенным).

-1
ответ дан 1 December 2019 в 17:17
поделиться

Поскольку булевская переменная находится немного в C/C++, и верный представлен 1, ложь 0.

Обновление: как сказано в комментарии мой исходный Ответ является ложью. Так обойдите его.

-2
ответ дан 1 December 2019 в 17:17
поделиться

Поскольку верный равно 1. Это определяется в pre-proccesor директиве, таким образом, весь код с истинным в нем является turnbed в 1 перед временем компиляции.

-2
ответ дан 1 December 2019 в 17:17
поделиться

что-то другое от 0 (который является ложью) не необходимо верный (который равняется 1)

-1
ответ дан 1 December 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: