/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Borland C++ og '||'
Fra : Soeren Sandmann


Dato : 13-12-03 21:53

Borland C++ tillader åbenbart dette:

unsigned char x;

x = '||';

Er der nogen som ved hvad det betyder?

 
 
Soeren Sandmann (13-12-2003)
Kommentar
Fra : Soeren Sandmann


Dato : 13-12-03 21:58

Soeren Sandmann <sandmann@daimi.au.dk> writes:

> unsigned char x;

Jeg mente "long x;"

Bertel Brander (14-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 14-12-03 00:19

Soeren Sandmann wrote:
> Soeren Sandmann <sandmann@daimi.au.dk> writes:
>
>
>> unsigned char x;
>
>
> Jeg mente "long x;"

Hvis jeg compiler dette med gcc (cygwin ) får jeg:

long x = '||';

w.c:2: warning: multi-character character constant

Så det er nok det det betyder.

/b


Soeren Sandmann (14-12-2003)
Kommentar
Fra : Soeren Sandmann


Dato : 14-12-03 00:48

Bertel Brander <bertel@post4.tele.dk> writes:

> long x = '||';
>
> w.c:2: warning: multi-character character constant
>
> Så det er nok det det betyder.

Hvordan besvarer det spørgsmålet: "Hvad mener _Borland C++_ det
betyder?" Hvordan bevarer det spørgsmålet: "Hvad _bør_ en C-oversætter
mene det betyder?".

Jeg spørger, fordi jeg har fundet noget kode som er skrevet til
Borland C++ og som jeg gerne vil oversætte med gcc på Linux. Det
benytter sig af '||', og jeg ved ikke hvad det betyder.

long x = '||';

printf ("%d %d %d\n", x, ((int)'|' << 8) + '|', (int)'|');

giver resultatet

31868 31868 124,

hvilket vel er rimeligt nok. Er Borland C++ enig i det?

Bertel Brander (14-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 14-12-03 01:17

Soeren Sandmann wrote:
> Bertel Brander <bertel@post4.tele.dk> writes:
>
>
>>long x = '||';
>>
>>w.c:2: warning: multi-character character constant
>>
>>Så det er nok det det betyder.
>
>
> Hvordan besvarer det spørgsmålet: "Hvad mener _Borland C++_ det
> betyder?" Hvordan bevarer det spørgsmålet: "Hvad _bør_ en C-oversætter
> mene det betyder?".
Rolig nu...
>
> Jeg spørger, fordi jeg har fundet noget kode som er skrevet til
> Borland C++ og som jeg gerne vil oversætte med gcc på Linux. Det
> benytter sig af '||', og jeg ved ikke hvad det betyder.
>
> long x = '||';
>
> printf ("%d %d %d\n", x, ((int)'|' << 8) + '|', (int)'|');
>
> giver resultatet
>
> 31868 31868 124,
>
> hvilket vel er rimeligt nok. Er Borland C++ enig i det?

Jeg ved ikke noget om hvad '||' kan betyde, men det ser ud
til at Borland C++ er enig:

D:\Program\NG>cat w.c
#include <stdio.h>

int main(void)
{
long x = '||';

printf ("%d %d %d\n", x, ((int)'|' << 8) + '|', (int)'|');

return 0;
}

D:\Program\NG>bcc32 w.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
w.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

D:\Program\NG>w.exe
31868 31868 124

D:\Program\NG>

/b


Byrial Jensen (13-12-2003)
Kommentar
Fra : Byrial Jensen


Dato : 13-12-03 23:36

Soeren Sandmann wrote:
> Borland C++ tillader åbenbart dette:
>
> unsigned char x;
>
> x = '||';
>
> Er der nogen som ved hvad det betyder?

C-standarden tillader det, men betydningen er implementationsafhængig.
Jeg ved ikke hvad det betyder i Borland C++.

The value of an integer character constant containing more
than one character (e.g., 'ab'), or containing a character
or escape sequence that does not map to a single-byte
execution character, is implementation-defined.


Per Abrahamsen (14-12-2003)
Kommentar
Fra : Per Abrahamsen


Dato : 14-12-03 16:55

Soeren Sandmann <sandmann@daimi.au.dk> writes:

> Borland C++ tillader åbenbart dette:
>
> unsigned long x;
>
> x = '||';
>
> Er der nogen som ved hvad det betyder?

Typen af 'x' er int, det har nogen compilere brugt til at tillade at
man specificerer mere end en byte med 'x' syntaksen, som ovenfor. Det
var populært på Amigaen til at lave en slags implicite symbolske
konstanter.

Mit gæt er at ovenstående er den af lexer til et C-lignende sprog, og
at ovenstående assignment betyder at x er et "||" (logisk eller)
token.

I Lisp ville man skrive

(setq x '||)

for en tilsvarende effekt. I portabelt C ville man være nødt til lave
noget i stil med

#define LOGICAL_OR 500 /* Note: must be unique! */

eller

static const int LOGICAL_OR = 500; /* Note: must be unique! */

eller

enum token_t
{ LAST_CHAR = 255, LOGICAL_OR /* other tokens her */ };

De to første er problematiske fordi man selv skal sikre unikthed, den
sidste er besværlig fordi den kræver en central liste, og fordi enum
har nogen besynderlige type-egenskaber.

Ole Nielsby (14-12-2003)
Kommentar
Fra : Ole Nielsby


Dato : 14-12-03 17:13


Per Abrahamsen <abraham@dina.kvl.dk> skrev:

> Soeren Sandmann <sandmann@daimi.au.dk> writes:
>
> > Borland C++ tillader åbenbart dette:
> >
> > unsigned long x;
> >
> > x = '||';
> >
> > Er der nogen som ved hvad det betyder?
>
> Mit gæt er at ovenstående er den af lexer til et C-lignende sprog, og
> at ovenstående assignment betyder at x er et "||" (logisk eller)
> token.

Jeg tør godt vove at påstå at Borland-compileren ikke lexer noget
der står i ''. Formentlig tager den simpelthen tegnkoderne og kombinerer -

x = 'ab'

svarer så til:

x = 'a' + ('b' << 8)

Hvilket af de to tegn der shiftes, afhænger af om maskinen er big-endian
(Mac) eller little-endian (Intel).


Per Abrahamsen (15-12-2003)
Kommentar
Fra : Per Abrahamsen


Dato : 15-12-03 14:15

"Ole Nielsby" <ole.nielsby@snailmail.dk> writes:

> Per Abrahamsen <abraham@dina.kvl.dk> skrev:
>
>> Mit gæt er at ovenstående er den af lexer til et C-lignende sprog, og

Her skulle stå:

Mit gæt er at ovenstående er del af en lexer til et C-lignende sprog, og

> Jeg tør godt vove at påstå at Borland-compileren ikke lexer noget
> der står i ''.

Det var heller ikke pointen, pointen var at man kunne bruge 'abcd'
syntaksen til at lave symbolske tokens når man selv implementerer en
lexer.

Nicolai Hansen (15-12-2003)
Kommentar
Fra : Nicolai Hansen


Dato : 15-12-03 11:13

Soeren Sandmann <sandmann@daimi.au.dk> wrote in message news:<ye8llpgfnj0.fsf@horse01.daimi.au.dk>...
> Borland C++ tillader åbenbart dette:
>
> unsigned char x;
>
> x = '||';
>
> Er der nogen som ved hvad det betyder?

Jeg ville mene at der er tre muligheder. Hvilken der bruges afhænger
100% af compileren.
[jeg går ud fra at x er en 16 bit unsigned]

x='ab';

1) x for værdien for ASCII tegnet "a".
2) x for værdien for ASCII tegnet "a"*256+værdien for ASCII tegnet
"b".
3) x for værdien for ASCII tegnet "b"*256+værdien for ASCII tegnet
"a".

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste