探討符號和組成符號的字符間的關系,以及有關符號含義的一些常見誤解
=
:賦值操作符,將右操作數的值放到左操作數的空間里面。
==
:關系操作符,用來比較左右兩個數,若相等則為1,若不相等則為0。
- 當 == 寫成 = 的后果?
?栗子1:
if (x = y);//本來應該是x==ybreak;
寫成這樣意思就變成了
將y的值放到x的空間里然后判斷該值是否為0
,這樣就與我們原來的想法不一樣了,所以程序運行結果就會跟我們想的不一樣。
?栗子2:
while (c = " " || c == "/t" || c == "/n");c = gets(f);
因為 = 的優先級比 || 低,所以循環判斷里面實際上是將表達式
" " || c == "/t" || c == "/n"
的值賦給了c,因為’ "不為0(ASCII值為32),所以" " || c == "/t" || c == "/n"
的值始終為1,循環條件始終滿足,結果導致程序死循環。
- 當 = 寫成 == 的后果?
?栗子1:
if ((filedesc == open(argv[i],0)) < 0)error();
在本例中如果函數open執行成功則返回0或者正數,如果執行失敗將返回-1。這段代碼是用來檢測open函數是否執行成功。但是如果是 == 操作符,那么該表達式的值只有0和1兩種可能(相等為1不等為0),條件始終都不會滿足,所以就沒有機會執行error函數,這個時候程序看上去沒什么問題,但是執行的結果會跟我們設計的有偏差。
1.運算符性質不同。
&是一個
位運算符
。
&&是一個邏輯運算符
。
2.作用不同。
&是將兩個二進制的數逐位相與,結果是相與之后的結果。
&&就是判斷兩個表達式的真假性,只有兩個表達式同時為真才為真,有一個為假則為假,具有短路性質。
3.用途限制。
&除了是一個位運算符,也是取地址符。
&&就是一個單純的邏輯運算符,沒有任何其他含義。
?栗子1:
2 & 4;2 && 4;
分析:
2的二進制位:00000000000000000000000000000010
4的二進制位:00000000000000000000000000000100
&是位與操作符,每一位相與后結果為0。
&&是邏輯操作符,只要兩邊操作數都為真結果就為真,否則為0。
什么叫“貪心法”:
每一個符號應該包含盡可能多的字符,也就是說編譯器把程序分解為符號的方法是,
從左到右一個字符一個字符的讀入
,如果該字符可能組成一個符號,那么再讀入下一個字符,判斷已經讀入的兩個字符組成的字符串是否可能是一個符號的組成部分,如果可能重復上述判斷,直到讀入的字符組成的字符串已不再可能組成一個有意義的符號,這個策略被稱為“貪心法”
?舉個栗子:
a---b;a -- - b;方法一a - -- b;方法二
結果是按方法一去進行計算的,編譯器在讀取—的時候先讀取最左邊的-,該字符可以組成一個符號,在讀下一個字符,這時兩個字符–仍然可以組成一個符號,再讀最右邊的字符發現此時三個字符不能組成一個符號,這個時候編譯器就會把前兩個字符作為一個符號,然后后面一個字符作為一個符號。
注意
:如果/是為判斷下一個字符而讀入的第一個字符
,而/后面跟著*,那么無論前后如何,這兩個字符都被視作是符號/*
,表示一段注釋的開始。
在a =/* b中/是讀入的第二個字符,由于在老版編譯器有 =/這樣的符號,所以這段代碼會被編譯器認為是 a=/
*b。
?栗子2:
y = x/*p;
這里/*被視作是一段注釋的開始,編譯器將不斷讀字符,直到遇到
*/
,所以這條語句的功能是將x的值賦給y,不會管后面的p。
如果我們需要這樣計算可以寫成y = x / (*p)。
如果一個整形常量的第一個字符是0,那么該常量會被視作為八進制數。
?舉個栗子:
#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;}
結果:
這里的010被視作是八進制,所以結果是8。
如果"yes"被寫成了’yes’,編譯器不會報錯,但是運行結果會變得難以預料。
?舉個栗子:
#define _CRT_SECURE_NO_WARNINGS 1#include int main(){ int a = "yes"; printf("%d/n", a); return 0;}
結果:
大多數編譯器會將’yes’視作為一個整數值,由’y’,‘e’,"s’所代表的的整數值按照特定編譯器實現中定義的方式組合而成,所以最后的結果是我們不可預測的。
作者水平有限,若文章有任何問題歡迎私聊或留言,希望和大家一起學習進步!!!
創作不易,希望大家?支持下,謝謝大家?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/118809.html
摘要:前言今天是刷題打卡第天加油啦。原題從大到小輸出題目描述寫代碼將三個整數數按從大到小輸出。 【前言】 今天是刷題打卡第29天! 加油啦。 原題:從大到小輸出 題目描述: 寫代碼將三個整數數按從大到小輸出。 示例: 輸入:12 23 22輸出:23 22 12 思路: 本題主要記住...
摘要:前言今天是力扣打卡第天天天做遞歸做煩了,換換腦子,嘿嘿。原題不用加減乘除做加法題目描述寫一個函數,求兩個整數之和,要求在函數體內不得使用四則運算符號。補碼的優勢加法減法可以統一處理只有加法器。 【前言】 今天是力扣打卡第15天! 天天做遞歸做煩了,換換腦子,嘿嘿。 原題: 不用加減...
摘要:聲明這里只是作業上面的內容,后續還會更新更好的方法。前言今天是刷題打卡第天蕪湖,堅持一個月咯,蟹蟹大家的陪伴哈原題楊輝三角題目描述在屏幕上打印楊輝三角。 【聲明】 這里只是作業上面的內容,后續還會更新更好的方法。? 【前言】? 今天是刷題打卡第30天! 蕪湖,堅持一個月咯,蟹蟹大...
摘要:大家簡單看一下純遞歸的解法原題二叉搜索樹的范圍和解法題目描述給定二叉搜索樹的根結點,返回值位于范圍之間的所有結點的值的和。 【前言】 今天是力扣打卡第11天! 感謝鐵汁們的陪伴,一起加油鴨!! 在第9天的時候寫過這道題的遞歸解題方法,其實DFS使用的解題思想就是遞歸,所以大同小異啦...
摘要:前言今天是刷題打卡第天可能有鐵汁會問,為什么變成刷好題,而不是刷了呢因為最近筆者遇到很多經典的筆試題,想著記錄下來,方便大家和自己學習,所以今后筆者會在標題上注明是不是力扣題。 【前言】 今天是刷題打卡第21天! 可能有鐵汁會問,為什么變成刷好題, 而不是刷LeetCode 了呢?因為...
閱讀 2268·2021-11-23 09:51
閱讀 5656·2021-09-22 15:39
閱讀 3343·2021-09-02 15:15
閱讀 3492·2019-08-30 15:54
閱讀 2354·2019-08-30 15:53
閱讀 1396·2019-08-30 14:04
閱讀 2445·2019-08-29 18:33
閱讀 2363·2019-08-29 13:08