亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【帶你刷系列】?c陷阱與缺陷(一)

wpw / 3403人閱讀

詞法陷阱介紹

探討符號(hào)和組成符號(hào)的字符間的關(guān)系,以及有關(guān)符號(hào)含義的一些常見誤解

1 =不同于==

=:賦值操作符,將右操作數(shù)的值放到左操作數(shù)的空間里面。
==:關(guān)系操作符,用來比較左右兩個(gè)數(shù),若相等則為1,若不相等則為0。

  • 當(dāng) == 寫成 = 的后果?

?栗子1:

if (x = y);//本來應(yīng)該是x==ybreak;

寫成這樣意思就變成了將y的值放到x的空間里然后判斷該值是否為0,這樣就與我們?cè)瓉淼南敕ú灰粯恿耍猿绦蜻\(yùn)行結(jié)果就會(huì)跟我們想的不一樣。

?栗子2:

while (c = " " || c == "/t" || c == "/n");c = gets(f);

因?yàn)?= 的優(yōu)先級(jí)比 || 低,所以循環(huán)判斷里面實(shí)際上是將表達(dá)式" " || c == "/t" || c == "/n"的值賦給了c,因?yàn)椤?"不為0(ASCII值為32),所以" " || c == "/t" || c == "/n"的值始終為1,循環(huán)條件始終滿足,結(jié)果導(dǎo)致程序死循環(huán)。

  • 當(dāng) = 寫成 == 的后果?

?栗子1:

if ((filedesc == open(argv[i],0)) < 0)error();

在本例中如果函數(shù)open執(zhí)行成功則返回0或者正數(shù),如果執(zhí)行失敗將返回-1。這段代碼是用來檢測(cè)open函數(shù)是否執(zhí)行成功。但是如果是 == 操作符,那么該表達(dá)式的值只有0和1兩種可能(相等為1不等為0),條件始終都不會(huì)滿足,所以就沒有機(jī)會(huì)執(zhí)行error函數(shù),這個(gè)時(shí)候程序看上去沒什么問題,但是執(zhí)行的結(jié)果會(huì)跟我們?cè)O(shè)計(jì)的有偏差。

2 & 和 | 不同于 && 和 ||

1.運(yùn)算符性質(zhì)不同。

&是一個(gè)位運(yùn)算符
&&是一個(gè)邏輯運(yùn)算符。

2.作用不同。

&是將兩個(gè)二進(jìn)制的數(shù)逐位相與,結(jié)果是相與之后的結(jié)果。
&&就是判斷兩個(gè)表達(dá)式的真假性,只有兩個(gè)表達(dá)式同時(shí)為真才為真,有一個(gè)為假則為假,具有短路性質(zhì)。

3.用途限制。

&除了是一個(gè)位運(yùn)算符,也是取地址符。
&&就是一個(gè)單純的邏輯運(yùn)算符,沒有任何其他含義。

?栗子1:

2 & 4;2 && 4;

分析:
2的二進(jìn)制位:00000000000000000000000000000010
4的二進(jìn)制位:00000000000000000000000000000100
&是位與操作符,每一位相與后結(jié)果為0。
&&是邏輯操作符,只要兩邊操作數(shù)都為真結(jié)果就為真,否則為0。

3 詞法分析中的“貪心法”

什么叫“貪心法”:

每一個(gè)符號(hào)應(yīng)該包含盡可能多的字符,也就是說編譯器把程序分解為符號(hào)的方法是,從左到右一個(gè)字符一個(gè)字符的讀入,如果該字符可能組成一個(gè)符號(hào),那么再讀入下一個(gè)字符,判斷已經(jīng)讀入的兩個(gè)字符組成的字符串是否可能是一個(gè)符號(hào)的組成部分,如果可能重復(fù)上述判斷,直到讀入的字符組成的字符串已不再可能組成一個(gè)有意義的符號(hào),這個(gè)策略被稱為“貪心法”

?舉個(gè)栗子:

a---b;a -- - b;方法一a - -- b;方法二

結(jié)果是按方法一去進(jìn)行計(jì)算的,編譯器在讀取—的時(shí)候先讀取最左邊的-,該字符可以組成一個(gè)符號(hào),在讀下一個(gè)字符,這時(shí)兩個(gè)字符–仍然可以組成一個(gè)符號(hào),再讀最右邊的字符發(fā)現(xiàn)此時(shí)三個(gè)字符不能組成一個(gè)符號(hào),這個(gè)時(shí)候編譯器就會(huì)把前兩個(gè)字符作為一個(gè)符號(hào),然后后面一個(gè)字符作為一個(gè)符號(hào)。

注意:如果/是為判斷下一個(gè)字符而讀入的第一個(gè)字符,而/后面跟著*,那么無論前后如何,這兩個(gè)字符都被視作是符號(hào)/*,表示一段注釋的開始。
在a =/* b中/是讀入的第二個(gè)字符,由于在老版編譯器有 =/這樣的符號(hào),所以這段代碼會(huì)被編譯器認(rèn)為是 a =/ *b。

?栗子2:

y = x/*p;

這里/*被視作是一段注釋的開始,編譯器將不斷讀字符,直到遇到*/,所以這條語句的功能是將x的值賦給y,不會(huì)管后面的p。
如果我們需要這樣計(jì)算可以寫成y = x / (*p)。

4 整形常量問題

如果一個(gè)整形常量的第一個(gè)字符是0,那么該常量會(huì)被視作為八進(jìn)制數(shù)。

?舉個(gè)栗子:

#define _CRT_SECURE_NO_WARNINGS 1#include int main(){	int a = 10;	int b = 010;	printf("%d %d/n", a, b);	//printf("%d/n", 2 && 4);	return 0;}

結(jié)果:

這里的010被視作是八進(jìn)制,所以結(jié)果是8。

5 字符與字符串問題

如果"yes"被寫成了’yes’,編譯器不會(huì)報(bào)錯(cuò),但是運(yùn)行結(jié)果會(huì)變得難以預(yù)料。

?舉個(gè)栗子:

#define _CRT_SECURE_NO_WARNINGS 1#include int main(){	int a = "yes";	printf("%d/n", a);	return 0;}

結(jié)果:

大多數(shù)編譯器會(huì)將’yes’視作為一個(gè)整數(shù)值,由’y’,‘e’,"s’所代表的的整數(shù)值按照特定編譯器實(shí)現(xiàn)中定義的方式組合而成,所以最后的結(jié)果是我們不可預(yù)測(cè)的。

作者水平有限,若文章有任何問題歡迎私聊或留言,希望和大家一起學(xué)習(xí)進(jìn)步?。?!
創(chuàng)作不易,希望大家?支持下,謝謝大家?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/118809.html

相關(guān)文章

  • 【手把手你刷好題】——29.從大到小輸出(非力扣,作業(yè))

    摘要:前言今天是刷題打卡第天加油啦。原題從大到小輸出題目描述寫代碼將三個(gè)整數(shù)數(shù)按從大到小輸出。 【前言】 今天是刷題打卡第29天! 加油啦。 原題:從大到小輸出 題目描述: 寫代碼將三個(gè)整數(shù)數(shù)按從大到小輸出。 示例: 輸入:12 23 22輸出:23 22 12 思路: 本題主要記住...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • 【手把手你刷LeetCode】——15.劍指offer之不用加減乘除做加法(位運(yùn)算)

    摘要:前言今天是力扣打卡第天天天做遞歸做煩了,換換腦子,嘿嘿。原題不用加減乘除做加法題目描述寫一個(gè)函數(shù),求兩個(gè)整數(shù)之和,要求在函數(shù)體內(nèi)不得使用四則運(yùn)算符號(hào)。補(bǔ)碼的優(yōu)勢(shì)加法減法可以統(tǒng)一處理只有加法器。 【前言】 今天是力扣打卡第15天! 天天做遞歸做煩了,換換腦子,嘿嘿。 原題: 不用加減...

    QLQ 評(píng)論0 收藏0
  • 【手把手你刷好題】——30.楊輝三角(作業(yè))

    摘要:聲明這里只是作業(yè)上面的內(nèi)容,后續(xù)還會(huì)更新更好的方法。前言今天是刷題打卡第天蕪湖,堅(jiān)持一個(gè)月咯,蟹蟹大家的陪伴哈原題楊輝三角題目描述在屏幕上打印楊輝三角。 【聲明】 這里只是作業(yè)上面的內(nèi)容,后續(xù)還會(huì)更新更好的方法。? 【前言】? 今天是刷題打卡第30天! 蕪湖,堅(jiān)持一個(gè)月咯,蟹蟹大...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • 【手把手你刷LeetCode】——11.二叉搜索樹的范圍和(DFS)

    摘要:大家簡(jiǎn)單看一下純遞歸的解法原題二叉搜索樹的范圍和解法題目描述給定二叉搜索樹的根結(jié)點(diǎn),返回值位于范圍之間的所有結(jié)點(diǎn)的值的和。 【前言】 今天是力扣打卡第11天! 感謝鐵汁們的陪伴,一起加油鴨!! 在第9天的時(shí)候?qū)戇^這道題的遞歸解題方法,其實(shí)DFS使用的解題思想就是遞歸,所以大同小異啦...

    HelKyle 評(píng)論0 收藏0
  • 【手把手你刷好題】——21.道筆試題(非力扣)

    摘要:前言今天是刷題打卡第天可能有鐵汁會(huì)問,為什么變成刷好題,而不是刷了呢因?yàn)樽罱P者遇到很多經(jīng)典的筆試題,想著記錄下來,方便大家和自己學(xué)習(xí),所以今后筆者會(huì)在標(biāo)題上注明是不是力扣題。 【前言】 今天是刷題打卡第21天! 可能有鐵汁會(huì)問,為什么變成刷好題, 而不是刷LeetCode 了呢?因?yàn)?..

    騫諱護(hù) 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<