Урк. Во-первых, никогда, никогда, НИКОГДА не делайте этого:
$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). Если данные были уничтожены, введите какую-то ошибку.
Есть более сложные способы сделать это, но я думаю, что это обрабатывает то, что вы пытаетесь сделать.
Когда верный Bool преобразовывается в интервал, он всегда преобразовывается в 1. Ваш код таким образом, эквивалентен:
main(){
int a = 10;
if (1 == a)
cout<<"y i am not getting executed";
}
Это - часть стандарт C++ , таким образом, это - что-то, что Вы ожидали бы происходить с каждым C++ стандарты совместимый компилятор.
в 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";
}
Причина Ваш оператор печати не становится выполняемым, состоит в том, потому что Ваша булевская переменная становится неявно преобразованной в число вместо наоборот. Т.е. Ваш, если оператор эквивалентен этому: если (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";
}
Ваша булевская переменная продвинута на целое число и становится 1.
Поскольку верный 1. Если Вы хотите протестировать на ненулевое значение, просто запишите если (a).
Я предлагаю, чтобы Вы переключились на компилятор, который предупреждает Вас об этом... (VC ++ приводит к этому: предупреждение C4806: '==': небезопасная операция: никакое значение типа 'bool' продвинутый для ввода 'интервала' не может равняться данной константе; у меня нет другого компилятора под рукой.)
я соглашаюсь с Lou Franco - Вы хотите знать, больше ли переменная, чем нуль (или неравна ему), тест для этого.
Все это сделано неявно компилятором, опасно, если Вы не знаете последнюю деталь.
Вот способ, которым большинство людей пишет такой код:
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";
}
Я не ожидал бы, что код, который будет определен, и Вы не должны зависеть от любого поведения, которое Ваш компилятор дает Вам. Вероятно, истинное преобразовывается в интервал (1), и не преобразованного в bool (верный), как Вы ожидаете. Лучше для записи то, что Вы имеете в виду (a! = 0) затем для зависимости от этого (даже если это оказывается определенным).
Поскольку булевская переменная находится немного в C/C++, и верный представлен 1, ложь 0.
Обновление: как сказано в комментарии мой исходный Ответ является ложью. Так обойдите его.
Поскольку верный равно 1. Это определяется в pre-proccesor директиве, таким образом, весь код с истинным в нем является turnbed в 1 перед временем компиляции.
что-то другое от 0 (который является ложью) не необходимо верный (который равняется 1)