鍍金池/ 問答/C  C++  網(wǎng)絡(luò)安全/ 變量已經(jīng)是可修改的左值了為什么還是報(bào)錯(cuò)?

變量已經(jīng)是可修改的左值了為什么還是報(bào)錯(cuò)?

報(bào)錯(cuò)
warning C4244: “=”: 從“l(fā)ong double”轉(zhuǎn)換到“l(fā)ong”,可能丟失數(shù)據(jù)
warning C4800: “l(fā)ong”: 將值強(qiáng)制為布爾值“true”或“false”(性能警告)
error C2106: “=”: 左操作數(shù)必須為左值
圖片描述

變量b不是可修改的嗎?
還是說sqrt函數(shù)用錯(cuò)了
求大神指教
把long double去了的話sqrt又會(huì)提示多個(gè)重載函數(shù)

回答
編輯回答
陪我終

前 2 個(gè)是警告,如果你執(zhí)意要這樣用(也就是你明白你在做什么)可以不用理會(huì)。鑒于你可能不太明白,給你解釋下為什么警告:第一個(gè),你使用的編譯器的 sqrt 函數(shù)返回的是 long double 類型,而你把它賦值給了 long 類型的變量 b,改正方法要么把 b 改成 long double 類型,要么把 sqrt 的結(jié)果改成 long 類型;第二個(gè),你把 long 類型的值用在了邏輯表達(dá)式里面,雖然事實(shí)上是允許的(要不就報(bào) error,而不是 warning 了),但可能對(duì)性能有影響,不建議這樣用。

下面的那個(gè) error,先說為什么錯(cuò):現(xiàn)在這個(gè)階段,你可以簡單把左值理解為賦值號(hào)( = )的左邊的東西,你寫的 b*b=a+100 中就是 b*b,這種寫法是不對(duì)的。

再說你的程序本意:從程序里面看,你應(yīng)該是要比較 b*b 和 a+100,而不是賦值,所以應(yīng)該寫成 b*b == a+100。

最后再談?wù)勀愕膶W(xué)習(xí)方法:猜測你可能沒有系統(tǒng)學(xué)習(xí)過計(jì)算機(jī)知識(shí)(或者單純的編程知識(shí)),可能還可能是在自學(xué),我個(gè)人是不建議直接學(xué) C 的,可以學(xué)下 Python 等動(dòng)態(tài)語言。雖然現(xiàn)在大學(xué)計(jì)算機(jī)系都是用 C 作為入門課程的,因?yàn)樗麄冇X得大家在高中都已經(jīng)有可計(jì)算機(jī)系統(tǒng)的知識(shí)(高中說我也很無奈?。6愦_實(shí)要學(xué)習(xí) C 的話,我建議你先寫正確語法(就是編譯器不報(bào) error),再寫正確語意(連 warning 也沒有了)。語法的話,每一本 C 語言教材都會(huì)說,語意的話除了自己領(lǐng)會(huì),像 C 陷阱與缺陷、你必須知道的495個(gè)C語言問題 等書也會(huì)講很多案例。

2017年7月28日 20:06