Video Ngôn Ngữ C - 07 - Biến là gì? Có ăn được không?

c
video

(Lê Trần Đạt) #1
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x = 10;
    int y = 2;
    int z = x - y;
    printf("z = %d\n", z);

    float a = 10;
    float b = 3;
    float c = a / b;
    printf("c = %f\n", c);

    char * sua = "gau gau";
    char * keu = "meo meo";
    printf("cho sua %s, meo keu %s", sua, keu);
    return 0;
}

#Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây :
#Thông tin về khóa học xem tại đây :

-Sự khác biệt giữa 2 khóa học cũ và mới :
+Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả.
+Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại… Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học cũ giúp đỡ việc lắng nghe và hiểu được tốt hơn.


Tổng hợp các video hướng dẫn lập trình C của Lê Trần Đạt
(Nguyễn Đình Dũng) #2

A ơi, tại sao lại là char * sua = "gau gau". Trong khi đó float và int lại không có dấu * ạ?


(Lê Trần Đạt) #3

@DungJun ơi, hôm sau em nhớ viết đầy đủ là “tại sao” chứ đừng viết “tại s” nhé, a đọc hoài mới hiểu. Vì nhiều khi mình lập trình đặt tên biến là s.

char * sua có * là vì đó là con trỏ. floatint cũng có dấu *. Khi nó là con trỏ. Trong bài này anh muốn giới hạn độ phức tạp nên anh chỉ nói tới mức đó thôi em.


(Nguyễn Đình Dũng) #4

Dạ anh, tại em viết quen rồi nên nó vậy. Giờ tập không viết tắt nữa.
Vậy là xong phần C này, sang phần C++ e sẽ học phần con trỏ sau để hiểu hơn.


(Thực tế khắc nghiệt) #5

khi nào viết mật ngôn vs gái ( mật ngôn là lời đườn mật hay còn gọi là kẹo đường ) thì hay hơn! :wink: bài con trỏ a đạt giải thích rất kỹ bạn nên xem lại 2 3 lần sau đó từ từ bạn sẽ hiểu à! hỳ


(Nguyễn Đình Dũng) #6

tks bạn :blush:
“này thì 20 ký tự”


(Triệu Đức) #7

tại sao int không chia được float hả anh? Em thấy code này chạy vẫn được mà? Khi nào thì nó sai ạ?

int main()
{
    int a = 7;
    float b = 3.5;
    float c = a/b;
    printf("c=%f\n", c);
    return 0;
}

(Lê Trần Đạt) #8

int chia được float chứ. Chỉ khi nào em lấy int chia int thì mới không được thôi.


(Triệu Đức) #9

:confused: đoạn cuối video kia anh bảo: chỉ có float mới chia đc float còn ko được lấy int chia float mà :confused:


(there're only 10 types of people in the world: Those who understand binary & those who dont) #10

int nếu chia nó sẽ lấy phần nguyên. Bác thử đoạn code sau sẽ hiểu

int a = 5; 
float kq1 = a / 2, 
float kq2 = a/2.0;
cout << kq1 << "          " << kq2;

Nó sẽ xuất ra 2 giá trị là 2 và 2.5, đó là vì 2 thuộc int và 2.0 thuộc kiểu float.

Còn tại sao nó lại ra 2 kết quả khác nhau thì tiếp tục:
Trong máy tính, máy tính nó sẽ thực hiện phép toán từ phải qua trái, nghĩa là nó sẽ lấy 5 và chia cho 2 (trường hợp 1) thì cả 2 đều là int, nó sẽ lấy nguyên, kết quả sau khi chia mà trước khi gán sẽ là 2. Vậy khi gán vào kq1 nó sẽ là 2.

Trong trường hợp 2, máy tính thấy được rằng 2.0 không phải là int, vì thế nó sẽ ép qua kiểu phù hợp và kết quả trước khi gán vào kq2 sẽ là 2.5. Nếu kq2 ta để là int thì nó sẽ làm tròn về thành phần nguyên và kết quả sẽ ra 2 :smile:

Vì thế int thuòng hay dùng trong các phép toán lấy dư (phép %) vì nó có dư, còn những cái kia nó không dư :smiley:

Trong một số trường hợp, nếu dùng visual thì sẽ bị warning khi sử dụng kiểu dữ liệu không phù hợp. Mình không nhớ rõ là gì, nhưng có lẽ là warrning maybe lost data when convert double to int hay đại loại là vậy :smiley:


(Lê Trần Đạt) #11

Đúng là như vậy, đó là bản chất của vấn đề.

int x;
float y;
float z;
z = x / y;

Ở đây không phải là int chia float, mà chính ra là float chia float. Bởi vì để thực hiện phép chia này, x được ép sang kiểu float trước khi chia.

C sẽ tự động ép kiểu cho các phép toán dạng này, cho một ví dụ khác trong sách “C Primer Plus 6th Edition”

#include <stdio.h>
int main(void)
{
	char ch;
	int i;
	float fl;
	fl = i = ch = 'C'; /* line 9 */
	printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 10 */
	ch = ch + 1; /* line 11 */
	i = fl + 2 * ch; /* line 12 */
	fl = 2.0 * ch + i; /* line 13 */
	printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 14 */
	ch = 1107; /* line 15 */
	printf("Now ch = %c\n", ch); /* line 16 */
	ch = 80.89; /* line 17 */
	printf("Now ch = %c\n", ch); /* line 18 */
	return 0;
}
  • dòng 12: ch được ép kiểu sang kiểu int, để nhân với 2
  • dòng 13: ch được ép kiểu sang kiểu float, để nhân với 2.0

(VirginsTv) #13
#include <stdio.h>
int main()
{
    int a;
    float b, c;

    a = 14;
    b = a / 3;
    c = a / 3.0f;


    printf("%.2f\n", b); // result: 4.00
    printf("%.2f", c);   // result: 4.67

    return 0;
}

(Triệu Đức) #14

e hiểu thế này ko biết đúng ko ạ?

int a;
float b, c;
c = a/b;

chương trình sẽ ép các số ở phép tính a/b về cùng dạng trước(a sang float), được kết quả bao nhiêu thì mới ép về dạng của kết quả (c cũng là float nên thôi, còn nếu c dạng int thì lại ép ngược về dạng int)
Khi nào thì ép từ float sang int hay từ int sang float ạ? hay mặc định là từ int sang float ạ?


(Lê Trần Đạt) #15

Đúng, chỉ thiếu một điều là khi ép kiểu, C có quy tắc ép kiểu chứ không ép kiểu ngẫu nhiên. Đọc bài này

Hoặc xem hình này:

Thứ tự như cái hình trên


(Minh Nguyen) #16

anh cho em xin cái hình mới được ko ạ, nó die mất rồi :sweat_smile:


(Lê Đình Huy) #17

Nếu em thấy hình nào die thì bấm vào cây bút ở dưới bài rồi bấm “Save Edit” là được :sunglasses:


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?