tek4

[Lập trình C từ 0 đến 1] Bài 9. Biểu thức và toán tử

by - September. 26, 2021
Kiến thức
Học
<h1>[Lập tr&igrave;nh C từ 0 đến 1] B&agrave;i 9. Biểu thức v&agrave; to&aacute;n tử</h1> <p>B&agrave;i viết &ldquo;[Lập tr&igrave;nh C từ 0 đến 1]B&agrave;i 9. Biểu thức v&agrave; to&aacute;n tử&rdquo; l&agrave; b&agrave;i viết tiếp theo nằm trong series hướng dẫn học lập tr&igrave;nh C của <a href="https://tek4.vn/" target="_blank" rel="noopener">tek4.vn</a>.</p> <p>Độc giả c&oacute; thể tham khảo c&aacute;c b&agrave;i viết kh&aacute;c trong series b&agrave;i viết n&agrave;y&nbsp;<a href="https://tek4.vn/lap-trinh-c-co-ban-den-nang-cao/" target="_blank" rel="noopener">tại đ&acirc;y</a></p> <p>B&agrave;i viết n&agrave;y sẽ cung cấp đến độc giả những c&aacute;ch thức l&agrave;m việc với biểu thức v&agrave; to&aacute;n tử trong C. Trong loạt b&agrave;i hướng dẫn [Lập tr&igrave;nh C từ 0 đến 1], IDE được sử dụng l&agrave; Code::Blocks</p> <h1>1. To&aacute;n Tử (Operators)</h1> <h3>To&aacute;n tử quan hệ (Relational Operators)</h3> <p>Trong C c&oacute; c&aacute;c to&aacute;n tử quan hệ sau</p> <table style="width: 25.9959%; height: 144px;"> <tbody> <tr class="alt" style="height: 24px;"> <td style="height: 24px; width: 2.7933%;" width="186">&gt;<strong>&nbsp;</strong></td> <td style="height: 24px; width: 69.9717%;" width="281">lớn hơn</td> </tr> <tr style="height: 24px;"> <td style="height: 24px; width: 2.7933%;" width="186">&gt;=</td> <td style="height: 24px; width: 69.9717%;" width="281">lớn hơn hoặc bằng</td> </tr> <tr class="alt" style="height: 24px;"> <td style="height: 24px; width: 2.7933%;" width="186">&lt;</td> <td style="height: 24px; width: 69.9717%;" width="281">nhỏ hơn</td> </tr> <tr style="height: 24px;"> <td style="height: 24px; width: 2.7933%;" width="186">&lt;=</td> <td style="height: 24px; width: 69.9717%;" width="281">nhỏ hơn hoặc bằng</td> </tr> <tr class="alt" style="height: 24px;"> <td style="height: 24px; width: 2.7933%;" width="186"><strong>==</strong></td> <td style="height: 24px; width: 69.9717%;" width="281">bằng</td> </tr> <tr style="height: 24px;"> <td style="height: 24px; width: 2.7933%;" width="186">!=</td> <td style="height: 24px; width: 69.9717%;" width="281">kh&ocirc;ng bằng</td> </tr> </tbody> </table> <p>Ch&uacute;ng thường được d&ugrave;ng để thể hiện một ph&eacute;p so s&aacute;nh (một điều kiện) cho một cấu tr&uacute;c rẽ nh&aacute;nh hoặc một v&ograve;ng lặp.</p> <p>V&iacute; dụ:<br />Cho đề b&agrave;i nhập v&agrave;o 2 số nguy&ecirc;n a, b in ra số lớn hơn . Ch&uacute;ng ta cần sử dụng to&aacute;n tử n&agrave;y v&agrave; cấu tr&uacute;c rẽ nh&aacute;nh mới giải quyết được b&agrave;i to&aacute;n:<br />Nếu a &gt; b th&igrave; in ra a. Ngược lại th&igrave; in ra b</p> <h3>To&aacute;n tử luận l&yacute; (Logical Operators)</h3> <p>Trong C c&oacute; c&aacute;c to&aacute;n tử luận l&yacute; sau. Ch&uacute;ng thường được sử dụng để kết hợp nhiều điều kiện, nhiều ph&eacute;p to&aacute;n logic lại với nhau</p> <table style="width: 40.3663%;"> <tbody> <tr class="alt"> <td style="width: 18.1488%;" width="265"><strong>To&aacute;n tử</strong></td> <td style="width: 80.3993%;" width="265"><strong>&Yacute; nghĩa</strong></td> </tr> <tr> <td style="width: 18.1488%;" width="265">&amp;&amp;</td> <td style="width: 80.3993%;" width="265">AND: trả về kết quả l&agrave;&nbsp;<strong>true</strong>&nbsp;khi cả 2 to&aacute;n hạng đều&nbsp;<strong>true</strong></td> </tr> <tr class="alt"> <td style="width: 18.1488%;" width="265">||</td> <td style="width: 80.3993%;" width="265">OR : trả về kết quả l&agrave;&nbsp;<strong>true</strong>&nbsp;khi chỉ một trong hai to&aacute;n hạng&nbsp; đều&nbsp;<strong>true</strong></td> </tr> <tr> <td style="width: 18.1488%;" width="265">!</td> <td style="width: 80.3993%;" width="265">NOT: Chuyển đổi gi&aacute; trị của to&aacute;n hạng duy nhất từ&nbsp;<strong>true</strong>&nbsp;th&agrave;nh&nbsp;<strong>false</strong>&nbsp;v&agrave; ngược lại.</td> </tr> </tbody> </table> <h3>To&aacute;n tử luận l&yacute; nhị ph&acirc;n (Bitwise Logical Operators)</h3> <p>Tương tự như to&aacute;n tử luận l&yacute; trong nhị ph&acirc;n cũng c&oacute; c&aacute;c ph&eacute;p to&aacute;n AND,OR,NOT v&agrave; th&ecirc;m ph&eacute;pXOR được m&ocirc; tả như sau:</p> <table style="width: 68.4959%; height: 186px;"> <tbody> <tr class="alt" style="height: 24px;"> <td style="width: 19.4002%; height: 24px;" width="216"><strong>To&aacute;n tử</strong></td> <td style="width: 147.95%; height: 24px;" width="289"><strong>M&ocirc; tả</strong></td> </tr> <tr style="height: 34px;"> <td style="width: 19.4002%; height: 34px;" width="216">Bitwise AND ( x &amp; y)</td> <td style="width: 147.95%; height: 34px;" width="289">Mỗi vị tr&iacute; của bit trả về kết quả l&agrave; 1 nếu bit tại vị tr&iacute; tương ứng của hai to&aacute;n hạng đều l&agrave; 1.</td> </tr> <tr class="alt" style="height: 35px;"> <td style="width: 19.4002%; height: 35px;" width="216">Bitwise OR ( x | y)</td> <td style="width: 147.95%; height: 35px;" width="289">Mỗi vị tr&iacute; của bit trả về kết quả l&agrave; 1 nếu bit tại vị tr&iacute; tương ứng của một trong hai to&aacute;n hạng l&agrave; 1.</td> </tr> <tr style="height: 32px;"> <td style="width: 19.4002%; height: 32px;" width="216">Bitwise NOT ( ~ x)</td> <td style="width: 147.95%; height: 32px;" width="289">&ETH;ảo ngược gi&aacute; trị c&aacute;c bit của to&aacute;n hạng (1 th&agrave;nh 0 v&agrave; ngược lại).</td> </tr> <tr class="alt" style="height: 61px;"> <td style="width: 19.4002%; height: 61px;" width="216">Bitwise XOR ( x ^ y)</td> <td style="width: 147.95%; height: 61px;" width="289">Mỗi vị tr&iacute; của bit trả về kết quả l&agrave; 1 nếu bit tại vị tr&iacute; tương ứng của một trong hai to&aacute;n hạng l&agrave; 1 chứ kh&ocirc;ng phải cả hai c&ugrave;ng l&agrave; 1.</td> </tr> </tbody> </table> <h3>Độ ưu ti&ecirc;n của to&aacute;n tử (Precedence)</h3> <p>Ngo&agrave;i c&aacute;c thứ tự ưu ti&ecirc;n nh&acirc;n chia</p> <p>Dưới đ&acirc;y l&agrave; bảng ưu ti&ecirc;n của c&aacute;c loại to&aacute;n tử trong C</p> <table> <tbody> <tr> <td width="173"><strong>Loại to&aacute;n tử</strong></td> <td width="173"><strong>To&aacute;n tử</strong></td> <td width="173"><strong>T&iacute;nh kết hợp</strong></td> </tr> <tr class="alt"> <td width="173">Một ng&ocirc;i</td> <td width="173">&ndash; , ++, &mdash;</td> <td width="173">Phải sang tr&aacute;i</td> </tr> <tr> <td rowspan="4" width="173"> <p>Hai ng&ocirc;i</p> <p>&nbsp;</p> </td> <td width="173">^</td> <td rowspan="3" width="173"> <p>Tr&aacute;i sang phải</p> <p>&nbsp;</p> </td> </tr> <tr class="alt"> <td width="173">*, /, %</td> </tr> <tr> <td width="173">+, &ndash;</td> </tr> <tr class="alt"> <td width="173">=</td> <td width="173">Phải sang tr&aacute;i</td> </tr> <tr> <td>NOT</td> <td>AND</td> <td>OR</td> </tr> </tbody> </table> <p>Ngo&agrave;i ra nếu c&oacute; nhiều to&aacute;n tử th&igrave; thứ tự ưu ti&ecirc;n Số học, Quan hệ, Luận l&yacute;</p> <p>&nbsp;</p> <h1>2. Biểu thức (Expressions)</h1> <h4>Biểu thức số học</h4> <p>C&aacute;c ph&eacute;p to&aacute;n thường được thực hiện theo một thứ tự cụ thể (hoặc ri&ecirc;ng biệt) để cho ra gi&aacute; trị cuối c&ugrave;ng. Thứ tự n&agrave;y gọi l&agrave; độ ưu ti&ecirc;n (sẽ n&oacute;i đến sau).</p> <p>C&aacute;c biểu thức to&aacute;n học trong C được biểu diễn bằng c&aacute;ch sử dụng to&aacute;n tử số học c&ugrave;ng với c&aacute;c to&aacute;n hạng dạng số v&agrave; k&yacute; tự. Những biểu thức n&agrave;y gọi l&agrave; biểu thức số học (<strong>Arithmetic Expressions)</strong>. V&iacute; dụ về biểu thức số học l&agrave; :</p> <p>a * (b+c/d)/22;<br />++i % 7;<br />5 + (c = 3+8);</p> <p>Như ch&uacute;ng ta thấy ở tr&ecirc;n, to&aacute;n hạng c&oacute; thể l&agrave; hằng, biến hay kết hợp cả hai. Hơn nữa, một biểu thức c&oacute; thể l&agrave; sự kết hợp của nhiều biểu thức con. Chẳng hạn, trong biểu thức đầu,&nbsp;<strong>c/d&nbsp;</strong>l&agrave; một biểu thức con, v&agrave; trong biểu thức thứ ba&nbsp;<strong>c = 3+8&nbsp;</strong>cũng l&agrave; một biểu thức con.</p> <h4>&Eacute;p kiểu (Casts)</h4> <p>Một biểu thức dạng hỗn hợp l&agrave; một biểu thức m&agrave; trong đ&oacute; c&aacute;c to&aacute;n hạng của một to&aacute;n tử thuộc về nhiều kiểu dữ liệu kh&aacute;c nhau. Những to&aacute;n hạng n&agrave;y th&ocirc;ng thường được chuyển về c&ugrave;ng kiểu với to&aacute;n hạng c&oacute; kiểu dữ liệu lớn nhất. Điều n&agrave;y được gọi l&agrave; tăng cấp kiểu. Sự ph&aacute;t triển về kiểu dữ liệu theo thứ tự sau :</p> <p>char &lt; int &lt; long &lt; float &lt; double</p> <p>Chuyển đổi kiểu tự động được tr&igrave;nh b&agrave;y dưới đ&acirc;y nhằm x&aacute;c định gi&aacute; trị của biểu thức:</p> <ol> <li><strong>char</strong>&nbsp;v&agrave;&nbsp;<strong>short&nbsp;</strong>được chuyển th&agrave;nh&nbsp;<strong>int&nbsp;</strong>v&agrave;&nbsp;<strong>float&nbsp;</strong>được chuyển th&agrave;nh&nbsp;<strong>double.</strong></li> <li>Nếu c&oacute; một to&aacute;n hạng l&agrave;<strong>&nbsp;double</strong>, to&aacute;n hạng c&ograve;n lại sẽ được chuyển th&agrave;nh&nbsp;<strong>double</strong>, v&agrave; kết quả l&agrave;&nbsp;<strong>double</strong>.</li> <li>Nếu c&oacute; một to&aacute;n hạng l&agrave;<strong>&nbsp;long</strong>, to&aacute;n hạng c&ograve;n lại sẽ được chuyển th&agrave;nh&nbsp;<strong>long</strong>, v&agrave; kết quả l&agrave;&nbsp;<strong>long.</strong></li> <li>Nếu c&oacute; một to&aacute;n hạng l&agrave;<strong>&nbsp;unsigned</strong>, to&aacute;n hạng&nbsp; c&ograve;n lại sẽ được chuyển th&agrave;nh&nbsp;<strong>unsigned</strong>&nbsp;v&agrave; kết quả cũng l&agrave;&nbsp;<strong>unsigned</strong>.</li> <li>Nếu tất cả to&aacute;n hạng kiểu&nbsp;<strong>int,&nbsp;</strong>kết quả l&agrave;</li> </ol> <p>Ngo&agrave;i ra nếu một to&aacute;n hạng l&agrave;<strong>&nbsp;long</strong>&nbsp;v&agrave; to&aacute;n hạng kh&aacute;c l&agrave;&nbsp;<strong>unsigned&nbsp;</strong>v&agrave; gi&aacute; trị của kiểu&nbsp;<strong>unsigned&nbsp;</strong>kh&ocirc;ng thể biểu diễn bằng kiểu&nbsp;<strong>long</strong>. Do vậy, cả hai to&aacute;n hạng được chuyển th&agrave;nh&nbsp;<strong>unsigned long</strong>.Sau khi &aacute;p dụng những quy tắc tr&ecirc;n, mỗi cặp to&aacute;n hạng c&oacute; c&ugrave;ng kiểu v&agrave; kết quả của mỗi ph&eacute;p t&iacute;nh sẽ c&ugrave;ng kiểu với hai to&aacute;n hạng.</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">char ch; int i; float f; double d; result = (ch/i) + (f*d) &ndash; (f+i);</pre> <p>&nbsp;</p> <p>Trong v&iacute; dụ tr&ecirc;n, trước ti&ecirc;n,&nbsp;<strong>ch c&oacute; kiểu k&yacute; tự&nbsp;</strong>được chuyển th&agrave;nh&nbsp;<strong>integer&nbsp;</strong>v&agrave;&nbsp;<strong>float f&nbsp;</strong>được chuyển th&agrave;nh&nbsp;<strong>double</strong>. Sau đ&oacute;, kết quả của&nbsp;<strong>ch/i&nbsp;</strong>được chuyển th&agrave;nh&nbsp;<strong>double&nbsp;</strong>bởi v&igrave;&nbsp;<strong>f*d&nbsp;</strong>l&agrave;&nbsp;<strong>double</strong>. Kết quả cuối c&ugrave;ng l&agrave;&nbsp;<strong>double</strong>&nbsp;bởi v&igrave; c&aacute;c to&aacute;n hạng l&uacute;c n&agrave;y đều l&agrave;&nbsp;<strong>double</strong>.</p> <p>Th&ocirc;ng thường, ta n&ecirc;n đổi tất cả hằng số nguy&ecirc;n sang kiểu float nếu biểu thức bao gồm những ph&eacute;p t&iacute;nh số học dựa tr&ecirc;n số thực, nếu kh&ocirc;ng th&igrave; v&agrave;i biểu thức c&oacute; thể mất đi gi&aacute; trị thật của n&oacute;.Ta xem v&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">int x,y,z; x = 10; y = 100; z = x/y;</pre> <p>Trong trường hợp n&agrave;y,&nbsp;<strong>z</strong>&nbsp;sẽ được g&aacute;n&nbsp;<strong>0</strong>&nbsp;khi ph&eacute;p chia diễn ra v&agrave; phần thập ph&acirc;n (0.10) sẽ bị cắt bỏ.</p> <p>Do đ&oacute; một biểu thức c&oacute; thể được &eacute;p th&agrave;nh một kiểu nhất định. C&uacute; ph&aacute;p chung của&nbsp;<strong>cast</strong>&nbsp;l&agrave;:</p> <p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>(kiểu dữ liệu) biểu thức</p> <p>V&iacute; dụ, để đảm bảo rằng biểu thức<strong>&nbsp;a/b,</strong>&nbsp;với&nbsp;<strong>a</strong>&nbsp;v&agrave;&nbsp;<strong>b</strong>&nbsp;l&agrave; số nguy&ecirc;n, cho kết quả l&agrave; kiểu&nbsp;<strong>float,</strong>&nbsp;d&ograve;ng m&atilde; sau được viết:</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">(float) a/b;</pre> <p>&nbsp;</p> <p>&Eacute;p kiểu c&oacute; thể &aacute;p dụng cho c&aacute;c gi&aacute; trị hằng, biểu thức hay biến, v&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">(int) 17.487; (double) (5 * 4 / 8); (float) (a + 7);</pre> <p>&nbsp;</p> <p>Trong v&iacute; dụ thứ hai, to&aacute;n tử &eacute;p kiểu kh&ocirc;ng đạt mục đ&iacute;ch của n&oacute; bởi v&igrave; n&oacute; chỉ thực thi sau khi to&agrave;n biểu thức trong dấu ngoặc đ&atilde; được t&iacute;nh. Biểu thức&nbsp;<strong>5 * 4 / 8</strong>&nbsp;cho ra gi&aacute; trị l&agrave;&nbsp;<strong>2</strong>&nbsp;(v&igrave; n&oacute; c&oacute; kiểu l&agrave; số nguy&ecirc;n n&ecirc;n đ&atilde; cắt đi phần thập ph&acirc;n), v&igrave; vậy, gi&aacute; trị kết quả với kiểu&nbsp;<strong>double</strong>&nbsp;cũng l&agrave;&nbsp;<strong>2.0</strong>.</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">int i = 1, j = 3; x = i / j;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* x = 0.0 */ x = (float) i/(float) j;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* x = 0.33 */</pre> <p>&nbsp;</p> <p>&nbsp;</p> <p>Ch&uacute;ng ta sẽ kết th&uacute;c &ldquo;[Lập tr&igrave;nh C từ 0 đến 1] B&agrave;i 9. Biểu thức v&agrave; to&aacute;n tử&rdquo; trong series [Lập tr&igrave;nh C từ 0 đến 1] ở đ&acirc;y. H&atilde;y c&ugrave;ng đ&oacute;n xem &ldquo;B&agrave;i 10. C&aacute;c cấu tr&uacute;c điều khiển if&hellip;else, switch&hellip;case v&agrave; goto&rdquo;.</p> <p>H&atilde;y để lại b&igrave;nh luận v&agrave; theo d&otilde;i series b&agrave;i viết: &ldquo;<a href="https://tek4.vn/tu-khoa/lap-trinh-c-tu-0-den-1/">Lập tr&igrave;nh C từ 0 đến 1</a>&rdquo; để tiếp tục cập nhật những th&ocirc;ng tin mới nhất.</p> <p>&nbsp;</p>