Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
MAGNET

07. Switch, skrócony tryb warunkowy

Recommended Posts

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.

  • Lubię to! 5
  • Kocham to! 1
  • Wow! 1

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

 

  • Lubię to! 1

Share this post


Link to post
Share on other sites

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

 

  • Kocham to! 1

Share this post


Link to post
Share on other sites

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

  • Lubię to! 1
  • Kocham to! 1
By 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"

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

Nasza historia

Na początku byliśmy małą grupą internetowych znajomych, którzy stwierdzili, że potrzebne jest solidne forum, na którym znajdą się ludzie z dużą wiedzą programistyczną ukierunkowaną na CS:GO. Pomysł powstał na początku 2018 roku, a parę miesięcy później, 19 kwietnia, powstała ta strona internetowa. Jako alternatywna odpowiedź na inne tego typu miejsca, poważnie podeszliśmy do tematu, najpierw tłumacząc angielską dokumentację SourceMod'a na język polski, a potem pisząc rozległe poradniki i wypełniając forum najpotrzebniejszymi rzeczami dla właścicieli serwerów i programistów. Cała nasza Ekipa jest dumna z pracy jaką w to włożyliśmy i cieszymy się że zbierają się wokół nas zarówno ludzie znający tematy sourcepawn'a i konfiguracji, jak i również nowe twarze w tym "biznesie", którym z chęcią niesiemy wiedzę oraz pomoc w rozwiązywaniu problemów.

Największe modyfikacje serwerowe

×
×
  • Create New...