Những điều mình đã học được về ngôn ngữ lập trình C qua những câu hỏi về nó trên Geeksforgeeks

Có nhiều bạn có thể thắc mắc là khi có một chút kiến thức nền tảng không chỉ có C, C++,… thì nên tìm một nguồn ở đâu để có thể tiếp tục học tập hay nghiên cứu về ngôn ngữ đó. Một trong những câu trả lời mà mình sẽ đưa ra cho mọi người đó chính là Geeksforgeeks. Tại đây có rất nhiều chủ để không chỉ liên quan tới cụ thể một ngôn ngữ lập trình nào đó mà còn có rất nhiều bài viết về các tip nho nhỏ về công nghệ, công việc,.. Ngoài ra, tại đây cũng có rất nhiều các quiz liên quan tới nhiều chủ đề khác nhau giúp bạn có thể kiểm tra một phần nào đó kiến thức của mình không chỉ về ngôn ngữ lập trình mà còn về kiến thức về máy tính, khoa học máy tính,… Dưới đây mình sẽ chia sẻ một vài điều mà mình đã học được qua việc trả lời các quiz về ngôn ngữ lập trình C của geeksforgeeks nhé.

scanf trả về 1 nếu việc nhập vào từ bàn phím là thành công và ngược lại là 0

Có thể do bạn không để ý nhiều đến hàm scanf. Tuy nhiên, hàm scanf có trả về giá trị và nó trả về giá trị 1 nếu việc nhập của chúng ta là thành công và ngược lại là 0. Điều này có thể hỗ trợ ta trong việc kiểm tra xem việc nhập vào từ bàn phím đã thành công hay chưa bằng cách

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 0;
if(!scanf("%d", &n)) //check if scanf work successfully or not
{
printf("Something went wrong! Please try again.");
}
else
{
printf("%d", n);
}
//if you enter 'a' it will print the message
return 0;
}
view raw valid-scanf.c hosted with ❤ by GitHub

printf trả về giá trị số lượng ký tự được in ra số lượng ký tự mà nó in ra trong hàm

Cũng giống như scanf ở trên, do mọi người cũng ít để ý đến nên có thể mọi người cũng biết ít được rằng printf sẽ trả về giá trị là số lượng ký tự mà nó in ra.

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 0;
if(!scanf("%d", &n)) //check if scanf work successfully or not
{
printf("Something went wrong! Please try again.");
}
else
{
printf(" has %d digit(s).", printf("%d", n));
}
return 0;
}
view raw count-digits.c hosted with ❤ by GitHub

( ) cũng là một loại toán tử

Khi sử dụng toán tử ( ) bạn có thể thực hiện nhiều biểu thức khác nhau từ trái qua phải và được ngăn cách bởi dấu , và khi thực hiện phép gán với toán tử ( ) nó sẽ gán cho biến đó giá trị của biểu thức cuối cùng mà nó thực hiện

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a = (1 + 1, 2 + 5, 3 + 8);
printf("%d", a);
//OUTPUT: 11
return 0;
}

Phép toán logic OR(||) chỉ thực hiện biểu thức thứ 2 khi biểu thức thứ nhất có giá trị là FALSE(0)

Điều này mình cũng mới rút ra được là với phép toán logic OR nó sẽ chỉ thực hiện biểu thức thứ 2 nếu biểu thức thứ nhất của nó là FALSE. Điều này giúp mình có thêm một kinh nghiệm khi viết code đó là khi thực hiện các biểu thức liên quan đến logic, phép toán nó có độ phức tạp thấp hơn mình sẽ ưu tiên viết nó là biểu thức thứ nhất.

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
int expression1(void)
{
printf("expression 1\n");
return TRUE;
}
int expression2(void)
{
printf("expression 2\n");
return FALSE;
}
int expression3(void)
{
printf("expression 3\n");
return TRUE;
}
int main(void)
{
printf("The first one:\n");
if(expression1() || expression2());
printf("The second one:\n");
if(expression2() || expression3());
//OUTPUT:
//The first one:
//expression 1
//The second one:
//expression 2
//expression 3
return 0;
}
view raw or-example.c hosted with ❤ by GitHub

Các biểu thức nằm bên trong sizeof sẽ không được thực hiện

Có thể, có một số bạn vẫn đang lầm tưởng rằng sizeof là một hàm trong C/C++. Tuy nhiên, thực tế sizeof lại là một toán tử và là toán tử một ngôi chính vì điều đó nên các biểu thức nằm trong sizeof đều không được thực hiện

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int k = 5;
printf("%d %d", sizeof(++k), k);
//OUTPUT: 4 5
//4 because I use gcc for 64bit so int variable has 4 byte
return 0;
}

Sự khác nhau giữa struct và union

struct và union đều là 2 kiểu dữ liệu cho phép người dùng tự định nghĩa. Điểm khác nhau của chúng là struct sẽ có kích thước bằng tổng kích thước của tất cả các thành viên trong struct đó cùng với một lượng byte đệm sao cho tổng của chúng là bội của 8 và lượng byte đệm là ít nhất còn union có kích thước bằng với thành viên có kích thước lớn nhất trong các thành viên của nó và tất cả các thành viên đó sẽ dùng chung không gian nhớ đó

#include <stdio.h>
#include <stdlib.h>
struct mystruct
{
int var;
double otherVar;
};
union myunion
{
int var;
double otherVar;
};
int main(void)
{
printf("%d %d", sizeof(struct mystruct), sizeof(union myunion));
//OUTPUT: 16 8
//Because sizeof(struct mystruct) = sizeof(int) + sizeof(double) + padding_byte = 4 + 8 + 4 = 16
// sizeof(union myunion) = max(sizeof(int), sizeof(double)) = max(4, 8) = 8
return 0;
}
view raw struct-union.c hosted with ❤ by GitHub

Nối tên của các identifier lại với nhau bằng ##

Các tiền xử lý trong C hay thậm chí là C++ là những thứ rất hay ho và thú vị. Chủ đề này rất rộng với rất nhiều các macro khác nhau tuy nhiên trong bài viết này chúng ta sẽ nói đến

#include <stdio.h>
#include <stdlib.h>
#define COMBINE(X, Y) X##Y
int main(void)
{
int hello = 1;
int world = 2;
int helloworld = hello + world;
printf("%d", COMBINE(hello, world));
//OUTPUT: 3
//because now the printf function is printf("%d", helloworld);
return 0;
}

Biến static trong hàm

Từ khóa static khi khai báo biến giúp cho biến đó không bị giải phóng sau khi kết thúc hàm.

#include <stdio.h>
#include <stdlib.h>
int fun(void)
{
static int count = 0;
count++;
return count;
}
int main(void)
{
printf("%d ", fun());
printf("%d ", fun());
//OUTPUT: 1 2
return 0;
}

Trên đây là một vài điều mà mình đã học được qua việc trả lời một số quiz nho nhỏ trên Geeksforgeeks. Tuy việc có thể hiểu được hết về một ngôn ngữ lập trình nào đó là điều không thể nhưng mỗi khi tìm hiểu về chúng ta lại có thể nhìn thấy được những điều thú vị về nó. Ngoài những quiz về C còn rất nhiều những quiz khác về nhiều chủ đề khác nhau liên quan đến máy tính bạn có thể thử tại đây

2 thoughts on “Những điều mình đã học được về ngôn ngữ lập trình C qua những câu hỏi về nó trên Geeksforgeeks”

  1. scanf() là nó trả về giá trị tùy vào số input có trong 1 hàm cơ, ví dụ scanf(%d%d, &a, &b); thì giá trị trả về của nó sẽ là 2.với cả scanf() còn làm người dùng nhập dư 1 ký tự newline '\\n' vì lúc input ngta nhấn enter :v, giá trị này thường dôi ra bộ nhớ đệm. bổ sung cho idol thế thoii :vv

    Like

Leave a reply to Ninh nè Cancel reply