определение True / False - PullRequest
       8

определение True / False

0 голосов
/ 09 июня 2010

следующий код

#include <iostream>
using namespace std;

int main(){
    char greeting[50] = "goodmorning everyone";
    char *s1 = greeting;
    char *s2 = &greeting[7];

    bool test = s2-s1;

    cout << "s1 is: " << s1 << endl;
    cout << "s2 is: " << s2 << endl;
    if (test == true ){
        cout << "test is true and is: " << test << endl;
    }

    if (test == false){
        cout<< "test is false and is: " << test << endl;
    }

    return 0;
}

выходы:

s1 is: goodmorning everyone
s2 is: ning everyone
test is true and is: 1

вот что на самом деле оценивает строка bool test = s2-s1;, это длина строки ?. Если это так, то, учитывая, что s2 меньше s1, он должен быть отрицательно корректным?

Также, если я изменю его на bool test = s1-s2;, я все равно получу тот же результат. Таким образом, не имеет значения, будет ли он отрицательным или положительным, true? и только ложь, когда 0?.

что означает s2-s1?

-чисток (пытается избавиться от сомнений :))

Ответы [ 4 ]

7 голосов
/ 09 июня 2010

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

Любое значение числового типа, типа перечисления или указателя может быть преобразовано в логическое значение; если значение равно нулю (или null, для указателей), результат равен false; в противном случае результат верен.

5 голосов
/ 09 июня 2010

Целочисленные типы, типы с плавающей запятой и типы указателей могут быть преобразованы в bool.Для всех них значение 0 преобразуется в false, а ненулевое значение преобразуется в true.

Итак, если s2 - s1 оценивается как 0, тогда test равно false.В противном случае test является истинным.

Поскольку s1 и s2 являются указателями, s2 - s1 дает разницу между ними (насколько далеко друг от друга находятся адреса).Если они указывают на один и тот же адрес, то разница будет равна 0. Если они указывают на разные адреса, результат будет отличен от нуля.Таким образом, все, что указывает test, указывает на то, указывают ли s1 и s2 на разные адреса.s1 != s2 даст точно такой же результат и, вероятно, будет иметь больше смысла.

Однако, учитывая, что значения для s1 и s2 жестко запрограммированы и гарантированно указывают на разные адреса,тест не имеет никакого смысла.Это может иметь смысл в другой программе, особенно в той, где s1 и s2 передаются в функцию, и у вас нет возможности заранее узнать, действительно ли они одинаковы.

2 голосов
/ 09 июня 2010

Строка bool test = s2-s1 выполняет вычитание указателя, давая число char s, отделяющих s2 от s1. Затем этот результат преобразуется в логическое значение путем преобразования в false тогда и только тогда, когда результат равен 0, в противном случае выполняется преобразование в true.

Подробное описание того, что происходит при добавлении / вычитании указателей, см. В: http://www.cs.umd.edu/class/spring2003/cmsc311/Notes/BitOp/pointer.html

1 голос
/ 09 июня 2010

C ++ допускает неявные преобразования, поэтому он вычитает значения указателей одного массива из другого, и если результат равен нулю, то он неявно преобразует ноль в ложь. Все остальное будет верным, так как bool работает так, что либо ноль (ложь), либо истина.

Спасибо Натану С. и отдельному человеку за поправку.

...