|
| 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".
| |
|
|