Can a simple a==b 'hang' in and endless loop?
Dave Hansen
iddw at hotmail.com
Wed Jan 18 16:06:44 EST 2006
On 18 Jan 2006 08:41:00 -0800 in comp.lang.python, bonono at gmail.com
wrote:
>
>Fuzzyman wrote:
>> I'm not familiar with the C basic datatypes - I assume it has an array
>> or list like object.
>>
>> Would it contain a sequence of poitners to the members ? In which case
>> they would only be equal if the pointers are the same.
>>
>> In this case :
>>
>> a = ['some string']
>> b = ['somestring']
>> a == b
>> False (probably)
>>
>> Incorrectly using Python syntax for a C example of course :-)
>>
>That depends, the C syntax is like this :
>
>char *a="hello";
>char *b="hello";
>
>assert(a==b);
>
>// true, the compiler knows the two hello are the same and assign the
>same address(sort of id() in python) to a and b
No. The C standard says the compiler is _allowed_ to re-use character
literal constants, but is not _required_ to do so. So it may be true,
or maybe not, depedning ont he compiler (and, probably, the options
used in its invocation).
>
>But the following is not
>
>char *a="hello";
>char *b="_hello";
>char *c=b+1;
>
>assert(a==c); //false, even the content they point to are the same
Ditto. The compiler is allowed to re-use the end of "_hello" to
implement "hello", in which case a == b+1, so a==c.
Just to confuse matter slightly, if you change the declarations to
something like
char a[] = "hello";
char b[] = "_hello";
char c[] = "hello";
then a, b, and c are three different strings in three different
locations. Always. In this case, the user is allowed to write code
like
a[0] = 'j';
to change the first string to "jello" without affecting the other
strings.
The essential difference is that in the first two cases, you're
declaring _pointers_ to char, and initializing them to point to string
constants, while in the second case, you're declaring _arrays_ of
char, and setting their initial value using a special initialization
syntax.
>
>However, string in the above are not basic types of C and if you want
>to compare the value(like comparing integer), you need to use function
>like strcmp() which again compare byte by byte in the above example and
>give true.
Yes, indeed.
Regards,
-=Dave
--
Change is inevitable, progress is not.
More information about the Python-list
mailing list