Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7275[/thread]

PERL vs. C: gleicher Code, anderes Ergebnis (Seite 2)



<< |< 1 2 3 4 5 >| >> 48 Einträge, 5 Seiten
esskar
 2005-09-14 18:53
#57969 #57969
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=vayu,14.09.2005, 15:47]achja hab grad mal das C-Snippet übersetzt und bei mir hier in der Firma kommt 0 raus.[/quote]
welchen compiler hast du genutzt?
esskar
 2005-09-14 19:00
#57970 #57970
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
aber ich versteh die klammer nicht
zerlegen wir mal das ganze.
entwerder

Code: (dl )
1
2
$n = $n;
$n++;

oder
Code: (dl )
1
2
$n++;
$n = $n;


bei beiden müsste es 1 geben, da man ja auf dem selben scope arbeitet...

oder wie kann man es sonst zerlegen?
vayu
 2005-09-14 19:18
#57971 #57971
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
compiler war auf ner maschine auf arbeit

normal gcc kA welche version ;)
Strat
 2005-09-14 19:26
#57972 #57972
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
kann es sein, dass bei manchen C-Compilern n=n einfach wegoptimiert wird, und bei n=n++ nur n++ ueberlebt? das koennte man ueberpruefen, in dem man nicht -o3 oder so verwendet, sondern - wenn vorhanden - das Flag zur nicht-optimierung (war das -o0 ? )\n\n

<!--EDIT|Strat|1126711653-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
docsnyder
 2005-09-14 21:13
#57973 #57973
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=esskar,14.Sep..2005, 17:00]aber ich versteh die klammer nicht
zerlegen wir mal das ganze.
entwerder

Code: (dl )
1
2
$n = $n;
$n++;

oder
Code: (dl )
1
2
$n++;
$n = $n;


bei beiden müsste es 1 geben, da man ja auf dem selben scope arbeitet...

oder wie kann man es sonst zerlegen?[/quote]

@esskar

Es geht nicht darum, sauberen Code zu generieren, der keine Fragen mehr offen läßt, sondern darum, sich genau das Konstrukt "$n = $n++;" anzuschauen, bzw. sich mal zu überlegen, was da passiert bzw. passieren sollte.

Wie schon gesagt: das Bsp. ist eigentlich unsinnig. Aber ich denke, es gibt doch einiges zum Nachdenken: "Was sollte da logischerweise rauskommen" und "Warum tut es das nicht?" (oder doch?)

Gruß, Doc
docsnyder
 2005-09-14 21:15
#57974 #57974
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Strat,14.Sep..2005, 17:26]kann es sein, dass bei manchen C-Compilern n=n einfach wegoptimiert wird, und bei n=n++ nur n++ ueberlebt? das koennte man ueberpruefen, in dem man nicht -o3 oder so verwendet, sondern - wenn vorhanden - das Flag zur nicht-optimierung (war das -o0 ? )[/quote]
@Strat

Mit Deiner Vermutung des Optimierens hast Du zwar den Fall "n = n;" behandelt, aner es geht eben um "n = n++;", und der ist bis Dato eher diskussionswürdig.

Gruß, Doc
murphy
 2005-09-14 21:42
#57975 #57975
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Abgesehen davon, dass das Verhalten dieses Konstruktes im C Standard nicht definiert ist, warnt einen der GCC auch noch davor:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ cat >test.c
#include <stdio.h>

int main(void) {
int i = 0;
i = i++;
printf("%d\n", i);
return 0;
}
$ gcc-3.3 -Wall -O0 -g1 -o test test.c
test.c: In function `main':
test.c:5: warning: operation on `i' may be undefined
$ ./test
1
$ gcc-4.0 -Wall -O0 -g1 -o test test.c
test.c: In function 'main':
test.c:5: warning: operation on 'i' may be undefined
$ ./test
1
$ gcc-3.3 -Wall -O3 -g0 -o test test.c
test.c: In function `main':
test.c:5: warning: operation on `i' may be undefined
$ ./test
1
$ gcc-4.0 -Wall -O3 -g0 -o test test.c
test.c: In function 'main':
test.c:5: warning: operation on 'i' may be undefined
$ ./test
1


Wenn der Compiler schon schreit, dass er nicht weiß, was herauskommen soll, sollte man sich nicht über komische Ergebnisse wundern -- aber immerhin ist das Ergebnis konstant, wenn man die Optimierungseinstellung verändert.

Da habe ich also schon wesentlich merkwürdigeres, hässlicheres und nicht mit Compilerwarnungen versehenes Verhalten bei GCC erlebt.

Ich verstehe also gar nicht, was man damit für ein Problem haben sollte...
When C++ is your hammer, every problem looks like your thumb.
jemand
 2005-09-14 21:51
#57976 #57976
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
@n = n++;
Vielleicht speichert der compiler das zuzuweisende zwischen(wieso auch immer) weist es zu und tut dann das zwischengespeicherte inkrementieren... ^^
Effektiv wäre das dann n=n; da ja das zu zwischenspeicherne ehh ins Nirvana geht.
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
docsnyder
 2005-09-14 22:09
#57977 #57977
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=murphy,14.Sep..2005, 19:42]Abgesehen davon, dass das Verhalten dieses Konstruktes im C Standard nicht definiert ist, warnt einen der GCC auch noch davor:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ cat >test.c
#include <stdio.h>

int main(void) {
int i = 0;
i = i++;
printf("%d\n", i);
return 0;
}
$ gcc-3.3 -Wall -O0 -g1 -o test test.c
test.c: In function `main':
test.c:5: warning: operation on `i' may be undefined
$ ./test
1
$ gcc-4.0 -Wall -O0 -g1 -o test test.c
test.c: In function 'main':
test.c:5: warning: operation on 'i' may be undefined
$ ./test
1
$ gcc-3.3 -Wall -O3 -g0 -o test test.c
test.c: In function `main':
test.c:5: warning: operation on `i' may be undefined
$ ./test
1
$ gcc-4.0 -Wall -O3 -g0 -o test test.c
test.c: In function 'main':
test.c:5: warning: operation on 'i' may be undefined
$ ./test
1


Wenn der Compiler schon schreit, dass er nicht weiß, was herauskommen soll, sollte man sich nicht über komische Ergebnisse wundern -- aber immerhin ist das Ergebnis konstant, wenn man die Optimierungseinstellung verändert.

Da habe ich also schon wesentlich merkwürdigeres, hässlicheres und nicht mit Compilerwarnungen versehenes Verhalten bei GCC erlebt.

Ich verstehe also gar nicht, was man damit für ein Problem haben sollte...[/quote]
@murphy

Also mein gcc (Version kann ich erst morgen im Büro wieder nachschauen) bringt keine Warnings.

Gruß, Doc
murphy
 2005-09-14 22:25
#57978 #57978
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=jemand,14.09.2005, 19:51]@n = n++;
Vielleicht speichert der compiler das zuzuweisende zwischen(wieso auch immer) weist es zu und tut dann das zwischengespeicherte inkrementieren... ^^
Effektiv wäre das dann n=n; da ja das zu zwischenspeicherne ehh ins Nirvana geht.[/quote]
Wie kommst du denn darauf?

Das Verhalten des Codes "$n = $n++" in Perl ist doch klar definiert:

1. $n++ wird ausgewertet, $n wird dadurch inkrementiert, der Rückgabewert der Anweisung ist aber der alte Wert von $n

2. $n wird auf den Rückgabewert von Schritt 1 gesetzt, also wieder auf seinen alten Wert.

In C ist das aber anders. Wenn ich mich recht entsinne, kann es da in einem Statement nicht zweimal denselben lvalue geben...
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 3 4 5 >| >> 48 Einträge, 5 Seiten



View all threads created 2005-09-14 16:16.