驗證工程師經常犯的錯誤(2) --- 運算符優先級

2022-01-02 路科驗證


前言:

晶片驗證不僅是一個良心活,也是一個細心活。做一個項目,寫代碼的時間,遠遠趕不上調試的時間。Q哥最抓狂的就是被一個菜鳥的錯誤耽誤半天工夫。

今天就跟大家來聊一聊運算符的優先級問題,下面所有的錯誤都是Q哥曾經犯過的,說多了都是淚啊。。。

 


Q哥最開始寫代碼的時候,還是按照數學上從左到右的思維來運算,所以把a左移1位再加b,誤寫成了 xyz = a << 1  +  b; 還特意加了空格想區分開來。

殊不知這樣實際等效於 xyz = a << (1+b) ; 而且,加空格完全不能改變優先級,新手一定要明白這一點! 正確的寫法應該是 xyz = (a << 1) + b;。

 


如果是if(a+b == c), 那麼+的優先級高於==,所以等效於if((a+b) == c)。

但是Q哥在修改代碼的時候,只是把+改成^,忘了加括號,變成if(a&b == c)。

由於&的優先級低於==,所以等效於if(a&(b==c)),與原本的期望不符,從而引入了bug。

 


分支運算符?:是一個三目運算符,xyz = mode ? b : c ;等價於

if(mode)

xyz=b;

else

xyz = c;

使用?:這種寫法簡潔明了,老司機的最愛。

需要注意的是,分支運算的優先級是低於算術運算的。

比如:

xyz = a + mode ? b : c ;  實際等效於 xyz = (a+mode) ? b : c;

xyz = mode ? b : c + d;  實際等效於 xyz = mode ? b : (c + d);

在修改代碼的時候,尤其要注意。

 


SystemVerilog的inside運算可以表示變量被一個集合、數組、隊列所包含,相當於數學上元素和集合的包含關係,如 a inside {[0:9]},或者 a inside my_queue (my_queue是一個隊列)。 

Q哥本來是想判斷a不在[0:9]之內,於是寫了if(!a inside {[0:9]}) 。

但是因為!運算優先級高於 inside,所以等效於 if((!a) inside {[0:9]}),事與願違。正確的寫法應該是if(! (a inside {[0:9]}) ) .

 

表達式裡面的運算符是有優先級的,不能想當然的按照從左到右的思維來進行運算和判斷。

運算符優先級問題通過加括號是完全可以避免的,但是實際中往往因為嫌麻煩或者嫌括號加太多影響代碼可讀寫就省略掉。

尤其在修改代碼的時候,必須格外謹慎。比如上面第2個例子,本來if(a+b == c)不加括號是OK的,但是把+改成^的時候忽略了這一點,結果引入了bug。

來源| 傑瑞IC驗證(ID:Jerry_IC) 



往期回顧:

驗證工程師經常犯的錯誤(1)

相關焦點

  • MATLAB運算符優先級一覽表
    原則規定:MATLAB 首先執行具有較高優先級的運算,其次執行具有較低優先級的運算;如果兩個運算的優先級相同,則按從左到右的順序執行。一般情況下,在一個表達式中,算術運算符優先級最高,其次是關係運算符,最後是邏輯運算符。如果需要,可以通過括號來改變運算順序。MATLAB 中具體的運算符優先級排列如下表所示。
  • C/C++運算符優先級和結合性
    運算過程存在優先級和結合性兩個問題。在數學的四則運算中規定,先算括號,再算乘除,最後算加減,不同運算符具有不同的計算順序,這就是運算優先級問題;同時,還規定同級運算從左往右依次計算,這是計算的結合性問題。
  • 我被運算符優先級坑了......
    這裡我給大家列出其中的一種public int bsearch(int[] a, int n, int value) {  int low = 0;  int high = n - 1;  while (low <= high) {    int mid = (low + high) / 2;
  • C語言基礎7-運算符優先級和結合性一覽表
    但是C語言中的運算符已經遠不止四則運算中的加減乘除了,還有其他很多運算符。當它們出現在同一個表達式中時先計算誰後計算誰呢?所以本節還是有必要講一下的。特別最後還會將所有運算符總結展示出來,然後告訴大家哪個優先級高、哪個優先級低。首先不需要專門記憶,也沒有必要。因為作為初學者,哪個優先級高、哪個優先級低我們很難記住。就算死記硬背記住了,時間長不用也會忘記。
  • python運算符優先級,加減乘除只是基礎,學習python第2天
    在計算機編程中少不了運算,而python運算符有哪些呢?python運算符優先級順序又是怎麼樣的?就像數學一樣,加減乘除只是基礎,了解python運算符才能解決實際性的問題。python運算符及其優先級python運算符及其優先級python
  • C語言運算符優先級(超詳細)
    每當想找哪個運算符優先級高時,很多時候總是想找的就沒有,真讓人氣憤!現在,終於有個我個人覺得非常全的,分享給大家,歡迎拍磚!
  • Excel運算符優先級全面解析,值得收藏(三)
    Excel公式的計算順序與運算符優先級有關,如果一個公式中的多個運算符具有相同的優先順序,那麼應該按照等號開始從左向右的順序進行計算,如果公式中的多個運算符屬於不同的的優先順序,則按照運算符的優先級進行運算。
  • C語言運算符優先級列表(超詳細)--C語言入門必學
    C語言運算符優先級優先級運算符
  • Java 算術運算及其優先級講解,可以說很詳細了
    可以通過以下的實例驗證:1):兩個數求最大值/最小值;int a = 13;int b = 14;int maxValue = (a > b) ?a : b ;2):判斷一個數的是奇數還是偶數;int i = 13;String result = (i % 2) == 0 ?
  • 什麼是運算符和表達式,在python中是如何處理數學運算的?
    其作用是讓計算機做一些事情(如數學運算)並返回結果:如1+2=3;運算符包括算術運算符和邏輯運算符。算術運算符指的是用來進行加法+、減法-、乖法*、除法/、地板除//、求餘%、冪運算**,在python語言中,運算完成跟我們數學當中的含義完全相同。如圖注意:在python當中,除法得到的結果是浮點數,不會丟棄小數部分。
  • 單片機c語言教程第七章--運算符和表達式(關係運算符)
    單片機c語言教程第七章--運算符和表達式(關係運算符) 佚名 發表於 2009-04-15 09:37:37 關係運算符,同樣我們也並不陌生。
  • Python運算符及優先級順序
    來自:https://www.cnblogs.com/hepeilinnow/p/9737590.htmlPython語言是一門腳本語言,支持面向對象、面向過程編程,兼具編譯性和解釋性的動態語言,整理出學習過程中一些基本Python運算符和運算符的優先級順序
  • 跟我學java編程—Java運算符的優先級
    Java表達式可能存在多個運算符,運算符之間存在優先級的關係,級別高的運算符先執行運算,級別低的運算符後執行運算算,下表列出了運算符的優先級。表中優先級欄,數字越小優先級越高,運算符每個運算符用中文頓號分割。
  • 運算符重載(多態):最通俗易懂的「重載」解釋(附代碼)
    運算符重載什麼是重載?——以C++為例以運算符「+」為例,通常情況下,我們使用加號的方式如下:int a=2, b=3, c=4;a=b+c;功能就是將int類型的兩個變量b,c算術相加,返回int類型的值並賦值給變量a。「+」運算符重載就是將運算符擴展到能夠把用戶自定義的兩種類型相加,一般情況下都是重載「+」把兩個對象相加。
  • c++運算符重載
    算符重載,就是對已有的運算符重新進行定義,賦予其另一種功能,以適應不同的數據類型。<返回類型說明符>  operator  <運算符符號>  (<參數表>) {      <函數體>  }重載運算符的方式有哪幾種?
  • Excel公式中的運算符及優先級:這些基礎知識不可不知!
    90本電子書:Excel、Word、PPT、職場必備,總有一本是你需要的……運算符是用來對公式中的元素進行運算而規定的特殊符號。Excel的4種運算符類型:算術運算符、比較運算符、文本運算符和引用運算符。
  • EXCEL基礎教程5-比較運算符與文本連接符
    EXCEL基礎教程5-比較運算符與文本連接符作者:陳飛老師EXCEL公式中比較運算符主要是用來比較大小,比較是否相等,返回一個正確(true),或者返回一個錯誤(false),而比較運算符也經常用來結合函數進行判斷使用
  • 面試題7(考察運算符的優先級)
    public static void main(String[]args){int x=5;int y=3;x=x+(x++)+(++x)+y;System.out.print(x) ;(a) 20(b) 21(c) 18(d) 19考點: 考察求職者對Java 運算符優先級的掌握。
  • C語言之·操作符
    ,因為x*y本身不是可修改的左值2.遞增和遞減操作符具有很高的結合優先級,只有圓括號的優先級比它們高x*y++ 應此理解為 x*(y++)先進行y++ ,再相乘注意:不要對自增、自減操作符太過關注!操作符的優先級y= 6 * 12 + 5 * 20; 當操作符共享一個操作數時,優先級決定了求值順序,例如上面語句中的12是 * 和 + 的操作數,根據操作符的優先級,乘法的優先級比加法高,所以先進行乘法運算,同理上述語句的 5 也是如此。
  • Python學習筆記:Python中的條件運算符和條件語句
    布爾運算符又稱為邏輯運算符,Python中常用的布爾運算符如下表所示:圖2 布爾運算符and和or都有個有趣的特徵:只做必要的計算,也就是說,Python先評估其左側的語句,如果滿足布爾邏輯則直接返回值,不滿足才繼續評估其右側的語句。