2010-06-09 3 views
0

следующий кодопределяющие True/False

#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? и только false, когда 0 ?.

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

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

ответ

7

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

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

+0

АХК, а также то, что делает s2-s1 на самом деле оценить? длина строки? – silent

+6

@ sil3nt: Он возвращает разницу между двумя указателями. 's1' и' s2' - только указатели. В этом случае 's2 - s1 = 7', потому что' s2' указывает на седьмой элемент массива char, а 's1 указывает на нулевой элемент (начало) массива char. –

+0

И только для того, чтобы прояснить немного больше, указатели - это целые числа, которые содержат адрес (смещение байта) в ячейку памяти. Поэтому, если вы выполняете арифметику указателей, это действительно делает арифметику с базовыми адресами памяти, которые являются числами. Результатом является другой указатель (целое число), который затем неявно преобразуется в bool и присваивается 'test'. – Cameron

1

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

Благодаря Нафану С. и indiv для исправления меня.

+5

Обратите внимание, что он не вычитает символы в строках, он вычитает указатели, как это прокомментировал @James McNellis. –

+3

Это, конечно, не отличает значение null до ascii zero, а ascii zero не false, это 0x30. Здесь много дезинформации. – indiv

5

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

Таким образом, если s2 - s1 оценивает на 0, то test не соответствует действительности. В противном случае - test.

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

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

+0

Если этот тест используется для определения того, указывают ли два указателя на одно и то же местоположение, было бы гораздо более разборчивым просто сказать: bool test = (s1! = S2); ':-) – Cameron

2

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

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

Смежные вопросы