『壹』 c語言中,這個語句是先執行裡面的賦值語句再判斷while的真假,還是相反
相當於以下順序:
*t = *s
*s++
*t != 0
『貳』 C語言文件指針問題
賦值運算符的優先順序低於邏輯運算符。
fp = fopen (argv[1], "r") == NULL
實際上是這樣的:
fp = ( fopen (argv[1], "r") == NULL),
即先計算後面的邏輯運算,再把邏陵旁輯運算尺薯橡的值賦給fp,所以是錯手正誤的。
應該修改為:
(fp = fopen (argv[1], "r") )== NULL
『叄』 C語言字元串賦值與比較問題
#include <string.h>
char szString[10] = "0X9000";
unsigned uiResult = strcmp(str, szString);
返回值若是相等則相同攔飢,若大於0或小於0則是前者大或者後者大
字元串轉敗衡絕換為整形數用atoi()函數即可轉換察姿,貌似是在ctype.h頭文件里,需要包含。
『肆』 C語言,比較操作和賦值操作哪個更快
這個告喊應該這么說,相同的情況下,賦值比比較快.再者:
如果是兩個寄存器變數塵友掘相互賦值或派核比較的話,比內存快很多(陪) .
『伍』 c語言中,邏輯運算和賦值運算哪個優先順序高
邏輯運算符的級別高
運算符中具有最高優先順序的是那些不參與運算的操作符:例如下標運算符( [] ),函數調用,結構體變數運算符(. ->),顫滲它們的結合方向是自左向右。<別的書沒說過。>
接著就是一元運算符,它們在參與運算的操作符中具有最高優先順序。因老升為函數調用的優先順序高於一元運算符,因此當p為一函數指針時,必須用(*p)( )來調用函數,*p( )則表明p為返回一指針的函數。<C語言就是如此奧妙>一元運算符的結合方向是自右向左,<跟上面相反>因此*p++應與*(p++)<p指針的地址+1里的內容>相同,而不與(*p)++相同。
再接著就是二元運算符,算術運算符在裡面具有最高的優先順序,再下面是移位運算符,關系運算符,邏輯運算符,條件運算符,賦值運算符,最後是逗號運算符,當判斷這些運算符的優先順序時,有兩點要記住:
1、每個邏輯運算符的優先順序低於關系運算符的優先順序
2、移位運算符的優先順序高於關系運算符,但是低於算術運算符
在不同運算符類別中,沒有特別需要注意的地方。乘法、除法、取余具有相同的優侍洞老先級,加法、減法具有相同的優先順序,兩個移位運算符具有相同的優先順序。
有一點要注意的是六個關系運算符具有不相同的優先順序:「==」和「!="的優先順序比其他四個要低。因此下面的表達式的意思是判斷a和b比較結果和c和d的比較結果是否相等。
a < b == c < d <(a<b)==(c<d)>
三元條件運算符的優先順序比上面提及的運算符的都要低,這就允許在選擇表達式中有關系運算符的邏輯組合,如下所示:
z = a < b && b < c ? d : e
<if((a<b>&&(b<c))
{
Z=d;
}
Else
{
Z=e;
}
上面語句同時也說明了賦值運算符的優先順序比關系運算符的低,而且所有的復合賦值運算符具有相同的優先順序,並且它們的運算方向是從右到左。因此:
a = b = c
等同於
b = c; a = b;
優先順序最低的是逗號運算符,這比較容易理解,因為當一條語句由多個表達式組成時,逗號在這里相當於分號的功能。
在混合優先順序判斷中,賦值運算符是比較棘手的。考慮下面的例子,它執行的功能是拷貝一個文件:
while (c=getc(in) != EOF)<加個括弧>
putc(c,out);
「while」語句中要實現的功能是給變數c賦值,然後與EOF進行比較來終止循環,不幸的是,賦值操作的優先順序低於比較操作的優先順序,因此c的值是getc(in)與EOF比較的結果,getc(in)的值將被棄掉,因此拷貝生成的文件將是一連串的1。
想實現以上的功能並不困難,可以簡單修改如下:
while ((c=getc(in)) != EOF)
putc(c,out);
然而,在復雜語句中,這種優先順序混淆的問題是很難被發現的。在UNIX系統下面的幾個不同版本的連接程序中曾經出現過如下的錯誤語句:<賦值在別的地方,為什麼在這個地方賦>
if( (t=BTYPE(pt1->aty)==STRTY) || t==UNIONTY ){
此條語句要實現的功能是給變數t賦值,然後判斷是否與STRTY相等或者與UNIONTY相等,但是這條語句真正實現的功能並不是這樣。
C語言中,邏輯運算符的優先順序分配有其歷史的原因。B語言,也就是C語言的前身,也有相當於C語言中的 & 和 | 操作符,盡管它們被定義用作位運算符,但是當用於條件上下文時,編譯器會自動將它們當作 && 和 || 運算。
C++/C語言的運算符有數十個,運算符的優先順序與結合律如表所示。注意一元運算符+ - *的優先順序高於對應的二元運算符。
下表中包括了C++所有的操作符,共有16級優先順序。表中的操作符如果重復出現,則第1次出現的是單目運算符,第二次出現的的雙目運算符。
優先順序
運算符
結合律(從高到低排列)
1
() [] -> :: .
左→右
2
! ~ + - ++ -- & * (強制轉換類型) sizeof new delete
右→左
3
.* -> *
左→右
4
* / %
左→右
5
+ -
左→右
6
<< >>
左→右
7
< <= >= >
左→右
8
== !=
左→右
9
&
左→右
10
^
左→右
11
|
左→右
12
&&
左→右
13
||
左→右
14
?:
右→左
15
= *= /= += -= |= <<= >>= %= &= ^= &&= ||=
右→左
17
'
左→右
『陸』 c語言先賦值還是先求和
我回答了前者是先++再賦值,後者是先賦值再
†to
『柒』 c語言是先賦值再比較嗎
else a=c ;(這里是已經把b賦值給a了嗎)
是
『捌』 C語言問題。如何判斷賦值和表示比較相等
第一個,是賦值,第二個也就是兩個等號,才表示相等,對於本題目,肯定是第一個
『玖』 C語言中同等級運算的先後順序
同等級的運算符,先後順序按結合性來進行。下面的代碼有利於理解結合性。
int a,b=1,c=2;
a=b=c;上面的代碼是先執行b=c呢?還是先執行a=b。如果按前者,a=結果為2,如果按後者,a的結果為1。所有的賦值符(包括復合賦值)都具有右結合性,就是在表達式中最右邊的操作最先執行,然後從右到左依次執行。這樣,c先賦值給b,然後b在賦值給a,最終a的值是2。
所有優先順序相同的操作符,它們的結合性也相同。這是必須如此的,否則結合性依然無法消除歧義,如果在計算表達式的值時需要考慮結合性,那麼最好把這個表達式一分為二或者使用括弧。
例:
a=b+c+d=是右結合的,所以先計算(b+c+d),然後再賦值給a
+是左結合的,所以先計算(b+c),然後再計算(b+c)+d
在C語言中有少數運算符在C語言標准中是有規定表達式求值的順序的:
1:&&
和
||
規定從左到右求值,並且在能確定整個表達式的值的時候就會停止,也就是常說的短路。
2:條件表達式的求值順序是這樣規定的:
test
?
exp1
:
exp2;
條件測試部分test非零,表達式exp1被求值,否則表達式exp2被求值,並且保證exp1和exp2兩者之中只有一個被求值。
3:逗號運算符的求值順序是從左到右順序求值,並且整個表達式的值等於最後一個表達式的值,注意逗號','還可以作為函數參數的分隔符,變數定義的分隔符等,這時候表達式的求值順序是沒有規定的!
『拾』 我在自學C語言的過程中遇到這么一個問題:a=b>c,是先賦值還是先比較
a=b>c是先比較後賦值,而(a=b)>c是先賦值後比較