Skocz do zawartości
MAGNET

07. Switch, skrócony tryb warunkowy

Rekomendowane odpowiedzi

int a = 5;
if (!a) {
 	// akcja dla a = 0
}
else if (a == 1) {
 	 // akcja dla a = 1
}
else if (a == 2) {
 	// akcja dla a = 2
}
else {
 	// akcja dla a nie będącego 0, 1 ani 2 
}

Tak długi i nadmiarowy kod można zastąpić używając funkcji switch:

int a = 5;

switch(a) {
	case 0: {
		// akcja dla a = 0;
	}
	case 1: {
		// akcja dla a = 1;
	}
	case 2: {	// akcja dla = 2; 
  }
  default: {
    // akcja dla a innego niż 0, 1 i 2
  }
}

 

 

Skrócony tryb warunkowy

warunek ? co robić, gdy warunek==true : co robić, gdy warunek==false;

 

przydatny, gdy mamy do czynienia z sytuacją if-else. Możemy wówczas ograniczyć się do formuły podanej wyżej. 

Przykład zastosowania:

int hpGracza = 50;

SetEntityHealth(client, hpGracza > 40 ? 100 : 70);

Zasada działania: jeżeli HP gracza jest większe niż 40, zmień zdrowie na 100. W przeciwnym razie (HP mniejsze bądź równe 40) - 70.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie chce mi się sprawdzać, ale na 99,(9)% jestem pewny, że jeśli zmienna ma 0 lub liczbę ujemną, to wartość tego wynosi false, więc if się nie wykonuje. Nie tylko w SourcePawnie ale w innych językach też

if(!a)
	//tutaj wykona się coś gdy a <= 0
else
	//tutaj wykona się coś gdy a > 0

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kod:

#include <sourcemod>

public void OnPluginStart() {
    RegConsoleCmd("sm_tt", test);
}

public Action test(int client, int args) {
    int a = 5;
    int b = 0;
    int c = -5;
    sprawdz(client, a);
    sprawdz(client, b);
    sprawdz(client, c);
}

void sprawdz(int client, int x) {
    if (x) {
        PrintToChat(client, "%d wchodzi do \"if(X)\"", x);
    } else {
        PrintToChat(client, "%d wchodzi do \"if(!X)\"", x);
    }
}

 

Output:

5 wchodzi do "if(X)"
0 wchodzi do "if(!X)"
-5 wchodzi do "if(X)"

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Okej, cofam wszystko. Mój światopogląd się wali XD

 

Python:

Cytat

Mamy podany kod:

for i in range(-2, 3):
    print(i, ' - ', i == True)


"i == True" zwraca True tylko i wyłącznie gdy i = 1;

"i == False" zwraca True tylko i wyłącznie gdy i = 0;

 

Dokładnie ta sama reakcja dzieje się z "if (i)"

 

PHP:

Cytat

Mamy podany kod:

<?php
	foreach (array(-2,-1,0,1,2) as $i)
		echo $i == true ? true : false;
?>

 

"$i == true" zwraca 1 dla każdej wartości oprócz 0

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W przypadku Pythona zapewne dochodzi do jakiejś zakulisowej konwersji na typ bool. W przypadku wartości większych o 1 może do takiego czegoś nie dochodzić, i w efekcie mamy swoisty konflikt typów, co zwraca false (tylko domysły, prawda leży pewnie pośrodku)

 

Jeśli spojrzymy na sytuację bardziej globalnie to powód, dla którego !a jest prawdziwe dla wartości ujemnych staje się dość oczywisty - chodzi tutaj o reprezentację bitową . Dla niewtajemniczonych: 

 

Nie bez powodu maksymalna wartość, jaką może osiągnąć unsigned int jest 2x większa od zwykłego inta (nie mylić z przedziałem).

W zwykłym int'ie poświęcany jest jeden bit, aby określać, czy liczba jest dodatnia bądź ujemna. Możemy to sobie prosto zwizualizować. Na potrzeby tego wyjaśnienia przyjmijmy, że integer ma 8 bitów (aby nie musieć pisać 32 liczb...). Bitowa reprezentacja liczby 5 będzie wyglądać następująco:

00000101

Natomiast -5 będzie wyglądać tak:

10000101

Funkcję "minusa" pełni właśnie jedynka z lewej strony

 

Jak widać obydwie liczby posiadają w swoim zapisie przynajmniej jedną jedynkę. Kiedy używamy if'a sprawdza on, czy wyrażenie w środku jest prawdą. Kiedy podajemy mu samą liczbę dedukuje on, że podana wartość musi mieć "coś" - i jak widać, zarówno 5 jak i -5 "coś" posiadają ;D

 

Ot, cała zagadka

Przez MAGNET,

Z tego też powodu negacja liczby (!a) robi coś odwrotnego - sprawdza, czy w środku jest "nic". Dlatego można używać tej formy zapisu zamiennie za "a == 0"

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...