?:

Moderator: tilz0R

?:

OdgovorNapisal/-a s54mtb » 02 Maj 2016, 21:31

Kakšen zapis uporabljaš?

Koda: Izberi vse
   if (CoefAdr < 8)
     return ZSC50_ReadRAM(I2Cadr, CoefAdr, coeff);   
   else
      return -1;


ali

Koda: Izberi vse
   return (CoefAdr < 8) ? ZSC50_ReadRAM(I2Cadr, CoefAdr, coeff) : -1;


Pomen in izvajanje je isto, drugi pa je vsaj za moje pojme bolj pregleden.
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a damo » 02 Maj 2016, 21:40

uh profiči.... ;)

nam hobistom je sigurno prvi način bolj čitljiv.
Dobrga štromarja samo slab šnops strese.
damo
 
Prispevkov: 1058
Pridružen: 18 Jan 2015, 08:18
Kraj: okolica KK
Zahvalil se je: 69 krat
Prejel zahvalo: 239 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 50

Re: ?:

OdgovorNapisal/-a Kroko » 02 Maj 2016, 21:44

Uporabljam oboje. Čeprav v varianti z "return" največkrat prvi zapis.

Pri drugi varjanti je treba biti pozoren na vrstni red izvajanja.

c = a < b ? a++ : a = b

Znate pravilno določiti vrstni red izvajanja (postaviti oklepaje)?
Namig: C in C++ tole obravnavata različno
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6153
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 770 krat
Prejel zahvalo: 2445 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a s54mtb » 02 Maj 2016, 21:46

Saj stvra je enostavna. Kar je pred ? je pogoj. Pred : je "then", za : pa "else".

Največja prednost takega kompaktnega zapisa je, da ga lahko uporabiš znotraj stavka.

Primer:

Koda: Izberi vse
if (pogoj)
  spremenljivka = izracun(123);
else
  spremenljivka = izracun(456);


to v eni vrstici zapišeš kot:

Koda: Izberi vse
spremenljivka = pogoj ? izracun(123) : izracun(456);


Ali pa še daljši primer:
Koda: Izberi vse
if (pogoj)
  spremenljivka = izracun(123);
else
  if (pogoj2)
    spremenljivka = izracun(456);
  else
    spremenljivka = izracun(789);


ali krajše:
Koda: Izberi vse
spremenljivka = pogoj ? izracun(123) : izracun(pogoj2 ? 456 : 789 );
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a VolkD » 02 Maj 2016, 21:52

Vse je v poznavanju. Če poznaš je enostavno, drugače pa :shock: :_CR
Velja predvsem za branje programa.
Pri zapisu je pa stvar taka, da uporabiš to, kar največkrat vidiš v tutorialih. Zakaj tako? Zato, ker je pri programu bistveno kaj hočeš narediti, torej algoritem, sintaksa je pa potem itak za vsak jezik drugačna. In tega se pač moraš naučiti ali pa iskati reference na netu.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 68037
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 20949 krat
Prejel zahvalo: 10681 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a tilz0R » 02 Maj 2016, 22:05

Jaz tako (zaviti oklepaji vedno!):

Koda: Izberi vse
   if (CoefAdr < 8) {
      return ZSC50_ReadRAM(I2Cadr, CoefAdr, coeff); 
   }
   
   return -1;
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2403
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 264 krat
Prejel zahvalo: 767 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a s54mtb » 02 Maj 2016, 22:14

VolkD je napisal/-a:Vse je v poznavanju. Če poznaš je enostavno, drugače pa :shock: :_CR
Velja predvsem za branje programa.
Pri zapisu je pa stvar taka, da uporabiš to, kar največkrat vidiš v tutorialih. Zakaj tako? Zato, ker je pri programu bistveno kaj hočeš narediti, torej algoritem, sintaksa je pa potem itak za vsak jezik drugačna. In tega se pač moraš naučiti ali pa iskati reference na netu.


Ternary operator pozna večina normalnih jezikov:
https://en.wikipedia.org/wiki/%3F:
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a VolkD » 02 Maj 2016, 22:20

s54mtb je napisal/-a:Ternary operator pozna večina normalnih jezikov:
Odvisno čemu rečeš normalen jezik. Glede na to v katerem forumu pišemo so to C in njemu sorodni jeziki.
Če pa zanemarimo to v katerem podforumu pišemo, potem so normalni jeziki lahko tudi taki, ki tega ne poznajo. Recimo Pascal, fortran , cobol, PLII, RPG,...
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 68037
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 20949 krat
Prejel zahvalo: 10681 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a s54mtb » 02 Maj 2016, 22:43

C:
Koda: Izberi vse
result = a > b ? a : b


Če pod pascal šteješ delphi:
Koda: Izberi vse
result := IfThen(a>b, a, b);


Fortran (1995 - to, kar se ga uporablja v sodobni finančni matematiki):
Koda: Izberi vse
result = merge(x,y,a>b)


v vsakem se da kaj najti...
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a matjazkariz » 02 Maj 2016, 22:48

Ternary operator poznam. Če v kodi to vidim, razumem kaj pomeni. Da bi pa sam kdaj to uporabil v lastni kodi, se še ni zgodilo. Mnogo bolj pregledno mi je uporabiti if/else. In to z oklepaji, kot je tilz0R rekel (čeprav me je enkrat en softver programer skušal prepričat, da če napišeš oklepaje vzame izvedba več urinih ciklov, kot brez oklepajev. Nisem pa šel preverjat, če je to res...)
matjazkariz
 
Prispevkov: 302
Pridružen: 21 Feb 2015, 11:24
Zahvalil se je: 25 krat
Prejel zahvalo: 48 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 4

Re: ?:

OdgovorNapisal/-a s54mtb » 02 Maj 2016, 22:55

Predlagam, da tule damo še kake uporabne primere....

Recimo, da imamo nek števec i in bi hoteli vsakič, ko se poveča za 30 (natančneje, ko je števec deljiv s 30) izpisati znak z ascii kodo 10 (line feed):
Koda: Izberi vse
putchar( (i % 20) ? ... :10 );
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a tilz0R » 02 Maj 2016, 22:56

Ta primer je drugače kot prvotni primer, kjer je bil return iz funkcije.
V tem primeru ima ternary operator smisel, definitivno.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2403
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 264 krat
Prejel zahvalo: 767 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a tilz0R » 02 Maj 2016, 23:01

Veliko delam tudi v PHP, in tam uporabljam ternary operator v spodnjem kontekstu:
Koda: Izberi vse
$var = isset($_GET['var']) ? $_GET['var'] : 'nekaj';


PHP7 mi to omogoča še lažje (nadgradnja ternary operatorja v null coalescing operator):
Koda: Izberi vse
$var = $_GET['var'] ?? 'nekaj';


Obe kodi sta identični.

Če te zanima še globje, lahko narediš tako:
Koda: Izberi vse
$var = $_GET['var'] ?? $_POST['var'] ?? 'nekaj';
//Prevod:
$var = isset($_GET['var']) ? $_GET['var'] : (isset($_POST['var'] ? $_POST['var'] : 'nekaj');
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2403
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 264 krat
Prejel zahvalo: 767 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a Kroko » 03 Maj 2016, 00:05

Kroko je napisal/-a:c = a < b ? a++ : a = b;


Vidim, da nihče ni zagrizel. Tole nikakor ni enostaven primer.

s54mtb je napisal/-a:Saj stvra je enostavna. Kar je pred ? je pogoj. Pred : je "then", za : pa "else".


Za C jezik ne bo držalo in je zgornji zapis celo sintaktična napaka. V C++ pa je res, kot je s54mtb zapisal in izraz deluje "po pričakovanjih".

Zna kdo obrazložiti, zakaj je v C jeziku to sintaktična napaka?
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6153
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 770 krat
Prejel zahvalo: 2445 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a tilz0R » 03 Maj 2016, 00:07

Kroko, pri tebi pomeni:

če je a manjši od b, potem bo c enak a, a pa kasneje povečan za 1.
Če je a večji ali enak b, potem bo pa a enak b, ter posledično c enak a in b.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2403
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 264 krat
Prejel zahvalo: 767 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a Kroko » 03 Maj 2016, 00:16

VolkD je napisal/-a:... so normalni jeziki lahko tudi taki, ki tega ne poznajo...


Od bolj znanih jezikov tega ne podpirajo samo Go, MATLAB, Pascal, Rust in XProfan.
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6153
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 770 krat
Prejel zahvalo: 2445 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a Kroko » 03 Maj 2016, 00:17

tilz0R je napisal/-a:Kroko, pri tebi pomeni:

če je a manjši od b, potem bo c enak a, a pa kasneje povečan za 1.
Če je a večji ali enak b, potem bo pa a enak b, ter posledično c enak a in b.


Poskusi prevesti.
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6153
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 770 krat
Prejel zahvalo: 2445 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a VolkD » 03 Maj 2016, 00:20

Kroko je napisal/-a:Od bolj znanih jezikov tega ne podpirajo samo Go, MATLAB, Pascal, Rust in XProfan.

RPG, PLII, Cobol, in konec koncev vsi assemblerji.
Hmm,.. Basic bo kar znan.
Fortran77 in Fortran90 tudi ne. Naprej ga pa nisem spremljal.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 68037
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 20949 krat
Prejel zahvalo: 10681 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a tilz0R » 03 Maj 2016, 00:21

Kroko, tako je kot sem povedal.

Testni podatki so bili:
1. a = 4, b = 10. Rezultat: a = 5, b = 10, c = 4
2. a = 4, b = 3. Rezultat: a = b = c = 3
3. a = 4, b = 4. Rezultat: a = b = c = 4
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2403
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 264 krat
Prejel zahvalo: 767 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a Kroko » 03 Maj 2016, 00:23

@tilz0R - tako naredi C++ prevajalnik. Prevedi s C prevajalnikom.
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6153
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 770 krat
Prejel zahvalo: 2445 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a tilz0R » 03 Maj 2016, 00:25

Negre, ker je error tvoja koda. Ni pa error, če imaš tako:

Koda: Izberi vse
c = a < b ? a++ : (a = b);
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2403
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 264 krat
Prejel zahvalo: 767 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a Kroko » 03 Maj 2016, 00:34

Pa saj o temu govorim. V C je error, v C++ pa ne. Razlog je v tem, da imata C in C++ različen operator precedence.

Ne dodajati oklepajov tam kjer jih ni tako, da se izraz spremeni. Poskusi dodati oklepaje tako, kot C prevajalnik razume vrstni red in bo povsem jasno, zakaj je napaka.
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6153
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 770 krat
Prejel zahvalo: 2445 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a tilz0R » 03 Maj 2016, 00:37

Moja razlaga je, da C ne podpira assign spremenljivke na desni.

a = 5*3
5*3 = a //error je, ker tega ne podpira C

Kot pravim, moje mnenje samo.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2403
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 264 krat
Prejel zahvalo: 767 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a s54mtb » 03 Maj 2016, 00:45

VolkD je napisal/-a:in konec koncev vsi assemblerji.


Morda vsi, ki jih ti poznaš. Si kaj pogledal arm cortex asembler zadnje čase? TBB in TBH sta že taka.
Always going the extra mile.
https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 14710
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 2183 krat
Prejel zahvalo: 6096 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: ?:

OdgovorNapisal/-a Kroko » 03 Maj 2016, 00:46

C razume vrstni red takole:
Koda: Izberi vse
c = (((a < b) ? a++ : a) = b)

Kar lahko pripelje do situacije:
a++ = b
To pa v C ni dovoljeno (modifiable lvalue)

C++ razume vrstni red takole:
Koda: Izberi vse
c = ((a < b) ? a++ : (a = b))

S tem seveda ni nič narobe.

Celotna poanta mojega posta je bila, da tudi tistim, ki stvari dobro poznajo, dam malce za misliti. Ko sem jaz tole spoznal sem bil kar presenečen.
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6153
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 770 krat
Prejel zahvalo: 2445 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na C in sorodni jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost