บันทึกความเข้าใจเกี่ยวกับเครื่องหมายเท่ากับ (=)

เครื่องหมายเท่ากับ(=) มีหน้าที่กำหนดค่า address ไม่ใช่กำหนดค่าในทุกกรณี

เป็นต้นว่ากำหนด a=b หมายถึง ให้ตัวแปร a ชี้ address ไปที่ตำแหน่งของตัวแปร b ดังนั้นตัวแปร a กับ b เป็นตัวเดียวกัน

โดยโปรแกรมจะไม่ไม่สร้าง object ใหม่ให้หากเราไม่กำหนด ในกรณีที่ตัวแปรอื่นมีค่าซ้ำกับอีกตัวแปรหนึ่ง มันจะชี้ไปที่เดียวกันเช่น
a=3
b=4
c=a+1
จากคำสั่งข้างต้นจะได้ว่า b จะมี address เท่ากับ c เพราะค่าเท่ากัน

แล้วทำไมกรณีที่สั่ง
a=3
b=a
a=4
ทำไม b ถึงไม่เป็น 4 เพราะตามลำดับจะทำจากขวามาซ้ายคือ สร้างตัวเลข 4 ใน ram ก่อน(หรือหาจากใน ram) แล้วให้ a ชี้ไปตำแหน่งนั้น โดยไม่ไปยุ่งกับตัวแปร b ดังนั้นค่า b จึงชี้ที่เดิม คือ 3

อยากเขียนโปรแกรมเริ่มจากภาษาอะไรดี?

วันนี้เรามาคุยกันเรื่องการเขียนโปรแกรม เราควรเริ่มจากภาษาอะไรดีนะครับ โดยในปัจจุบันภาษาที่ใช้เขียนโปรแกรมมีอยูมากมายเช่นเวลาเขียนโปรแกรมทั่วไป ก็ C, C++, C#, Java, Visual Basic, Delphi และอื่นๆเป็นต้น ถ้าเขียนบนใช้บนเว็บก็มีพวก PHP, ASP, Python, Ruby, Javascript เป็นต้น

โดย ทั่วไปถ้าเราไปถามตามเว็บบอร์ดหรือใครๆมักได้รับคำแนะนำว่าควรเริ่มจากภาษา C เพราะในปัจจุบันภาษาใหม่ๆ มักจะมีรูปแบบ syntax เป็น C-Style คือมีความคล้ายคลึงภาษา C ดังนั้นเมื่อเราศึกษาภาษา C จนเชี่ยวชาญแล้วการไปเรียนต่อภาษาอื่นจึงไม่ใช่เรื่องยาก ยกเว้น Visual Basic กับ Delphi ที่ 2 ภาษานี้จะเหมือนกัน แต่ไม่เหมือนภาษา C ซึ่งผมเห็นว่าไม่จำเป็นเท่าไหร่นัก เพราะภาษา C นั้นค่อนข้างจะยุ่งยากพอสมควร ซึ่งภาษาใหม่ๆที่พัฒนามามีการพัฒนาให้ลดการยุ่งยากในเรื่องนี้ไปได้ เช่นตัวแปรชนิด String(สายอักขระ หรือข้อความต่างๆ) ที่มีใน Java, C++, C# แต่ใน C ไม่มี มีแต่ตัวแปรชนิด char(ตัวอักษร 1 ตัว) แต่ประกาศแบบ Array(แถวลำดับหรืออะไรหว่า ลืมชื่อภาษาไทย แต่ลักษณะคล้ายๆสายอักขระ แต่จำกัดขนาด) ซึงยุ่งยากต่อการใช้ เพราะมีการจำกัดขนาดเช่น เราประกาศตัวแปรรับได้แค่ 200 ตัว แต่ผู้ใช้ดันใส่มา 300 ตัว โปรแกรมก็มีโอกาศพังสูง ซึ่งภาษาใหม่ๆได้มีการแก้ปัญหานี้ด้วยตัวแปร String

แต่การเรียนภาษา C มีข้อดีคือ ฝึกกระบวนการคิดได้ดี เช่นการเขียนโปรแกรมหาคำๆหนึ่งในข้อความที่ได้รับเข้าไป โดยสมมุติว่าคำที่หามีขนาดไม่เกิน 10 ตัว และข้อความทั้งหมดมีขนาดไม่เกิน 200 ตัว

ภาษา C# เขียนดังนี้

 using System;
 namespace C_TEST{
     class Program{
         public static void Main(string[] args){
             string input;
             string find; 
             Console.Write("String: ");
             input = Console.ReadLine();
             Console.Write("Find: ");
             find = Console.ReadLine();
             if(input.IndexOf(find) > -1){
                 Console.WriteLine("Found.");
             }else{
                 Console.WriteLine("Not found.");
             }
         }
     }
 }

แต่ถ้าเป็นภาษา C จะเขียนแบบนี

#include <stdio.h>

int my_strlen(char *str){
    int i = 0;
    while(str[i] !='\0'){ //ใช้ str[i] == 0 ก็ได้
        i++;
    }
    return i;
}

int main(){
    char str[201]; //ใช้กี่ตัว ต้องประกาศเพิ่ม 1 ตัว เพราะช่องสุดท้ายจะใช้เก็บ \0 เพื่อบอกว่าจบ String
    char find[11];
    int len_str;
    int len_find;
    int i,j;
    int found = 0;
    int bool_in_loop = 0;

    printf("String: ");
    gets(str);
    printf("Find: ");
    gets(find);

    len_str = my_strlen(str);
    len_find = my_strlen(find);
    //ใช้ strlen ของ string.h ก็ได้ เป็นการนับว่ามีกี่ตัวอักษร

    for(i = 0;i<len_str;i++){        // วนให้ครบทุกตัว
        bool_in_loop = 1;             //กำหนดให้ผ่านเงื่อนไข
        for(j=0;j<len_find;j++){   // วนเพื่อตรวจว่ามีคำที่หาไหม
            if(i+j >= len_str){         //ตรวจว่าไม่เกินความยาวของ String หลัก
                bool_in_loop = 0;    //ถ้าเกิน ไม่ผ่าน
                break;                      //จบ Loop นี้
            }
            if(str[i+j] != find[j]){     //ตรวจว่าตรงกันไหม
                bool_in_loop = 0;    //ถ้าไม่ตรง กำหนดให้ไม่ผ่าน
                break;                      //จบ Loop นี้
            }
        }
        if(bool_in_loop == 1){    //ตรวจว่าผ่านไหม
            found++;                   //ถ้าผ่าน ให้เพิ่มตัวนับ
        }
    }

    if(found == 0){                  //ถ้าเจอไม่เจอ
        printf("Not found.");
    }else{                                 //ถ้าเจอ
        printf("Found.");
    }
    return 0;
}

 

จะเห็นได้ว่า Code ยาวและยุ่งยากกว่ามาก ซึ่งถ้ามองในแง่การใช้ถือว่าเสียเวลาเขียน แต่ในแง่ของการฝึก เป็นการฝึกให้คิดได้ดีพอสมควร ต้องใช้ loop 2 ชัั้นเพื่อตรวจเลยทีเดียว แถมยังต้องกำหนดขนาดของ char array ด้วย

ดังนั้นผมเห็นว่าการที่เราจะเลือกเรียนภาษาใดๆ ควรเลือกให้เหมาะสมกับงานไปเลยดีกว่าครับ เช่น

  • Java งานที่ต้องใช้แบบ Cross Platform(ใช้งานได้ทั้ง Windows Linux หรืออื่นๆ) และเขียนโปรแกรมบน Android ภาษานี้ผมว่ามันมีข้อเสียคือถ้ามี GUI มันจะทำงานได้ค่อนข้างช้า(หรือผมเขียนแย่เองหว่า)
  • C# เขียนโปรแกรมใช้บน Windows เท่านั้น ทำงานได้เร็วกว่า Java ที่มี GUI แต่ถ้าต้องการเขียนแบบข้าม Platform ต้องใช้ GTK+ ช่วย ซึ่งทำให้ช้าลง
  • C, C++ ใช้สำหรับงานที่ต้องการประสิทธิภาพสูงมากๆ เช่นพวกเกมส์ หรือโปรแกรมคำนวนใหญ่ๆ
  • PHP, ASP, Javascript สำหรับเป็น Web Programmer โดยเฉพาะเลย
  • ภาษาอื่นๆ ไม่รู้ครับ ที่ใช้หลักๆมีแค่นี้

ส่วนภาษา Visual Basic, Delphi นั้นไม่แนะนำให้เรียนครับ เพราะมันไม่ค่อยคล้ายภาษาอื่นๆ เวลาไปเรียนรู้ใหม่มันจึงยาก

อนึ่ง การเขียนโปรแกรมบน iOS (พวก iPhone, iPad) นั้นต้องใช้ภาษา Objective-C ซึ่งผมได้ยินมาว่า เหมือนต้องเรียนใหม่หมด คิดว่าไม่คล้าย C-Style แต่เท็จจริงเป็นอย่างไรไม่ทราบ