1樓:匿名使用者
union體是看最後一次存進去的資料,與裡面具體的那個變數無關的。
變數a的最後一次賦值是0,所以結果也是0。
2樓:
#include
int main(void)
union myunu;
int k;
}a;a.u.x=4;
a.u.y=5;
a.u.z=6;
a.k=0;
printf("%d\n",sizeof(a));
printf("%d\n",a.u.x);
return 0;
可見,x,y,z,k每個佔4位元組,x和k,共用同一個地址,這是union的特性
3樓:匿名使用者
這裡結構體四位元組對齊,第一個元素,就是x和k是同一個記憶體空間。所以改了k就相當於改了x。
int *p=(int *)&a+1;
*p=0;
這樣就修改了y的值
同理int *p=(int *)&a+1;
*p=0;
這樣就修改了z的值
記憶體佈局你就明白了
4樓:程式猿3號
這個可以幫助你
「聯合」與「結構」有一些相似之處。但兩者有本質上的不同。在結構中各成員有各自的記憶體空間, 一個結構變數的總長度是各成員長度之和(空結構除外,同時不考慮邊界調整)。
而在「聯合」中,各成員共享一段記憶體空間, 一個聯合變數的長度等於各成員中最長的長度。應該說明的是, 這裡所謂的共享不是指把多個成員同時裝入一個聯合變數內, 而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。
下面舉一個例了來加對深聯合的理解。
例4:#include
void main()
half;
}num;
num.i=0x4241; /*聯合成員賦值*/
printf("%c%c\n", num.half.first, num.half.second);
num.half.first='a'; /*聯合中結構成員賦值*/
num.half.second='b';
printf("%x\n", num.i);
getchar();
}輸出結果為:
ab 6261
從上例結果可以看出: 當給i賦值後, 其低八位也就是first和second的值; 當給first和second賦字元後, 這兩個字元的ascii碼也將作為i 的低八位和高八位。
5樓:偉創
因為a.k和a.u.x在記憶體中佔用相同的地址空間
你要不看看a.u.y和a.
u.z是什麼,聯合體在記憶體中佔用的空間是以union中需要記憶體最大的變數為準的,你的程式中a需要3個int的空間(一個結構體),所以你看a.k的話,因為a.
k是最後寫進去的,而且和a.u.x一樣是int型,並且在記憶體中佔用相同的地址空間,所以讀出來資料是相同的
6樓:
因為union體是共享記憶體的,後一次的賦值會將前面的賦值覆蓋掉
7樓:匿名使用者
聯合體共享記憶體 a.k=0;已經修改了x的值。去掉就ok了
8樓:
聯合(共用體)是後進先出
c語言,為什麼最後結果是7呢。。我看不出來
9樓:祥
define 是原樣替換的 遇到f(x)就替換程x*x 也是說 k=f(1+2)/f(2+1)替換後為1+2*1+2/2+1*2+1=7,所以是7 不要人為加括號!
10樓:豆小筆
k=f(1+2)/f(2+1);
f(1+2)中x為1+2
f(2+1)中x為2+1
#define f(x) x*x這為替換,你把對應的x替換數字就出來了
f(1+2) 1+2*1+2
f(2+1) 2+1*2+1
f(1+2)/f(2+1);
1+2*1+2/2+1*2+1
這是赤裸裸的替換,f(3)不等於f(1+2)有點類似與字串的型別
11樓:匿名使用者
define的語句只會替換。
如果你上面所寫。
k=f(1+2)/f(2+1),編譯的時候會替換成k=1+2*1+2/2+1*2+1;這樣就等於7;
你如果要讓他正確執行。你應該這樣define;
#define f(x) (x)*(x)
這樣就不會出錯了。
12樓:
如果不加括號,表示式就會被,因此上面會被成k=1+2*1+2/2+1*2+1,因此是7,所以要注意定義巨集的時候要給變數加括號
13樓:匿名使用者
你定義f(x) 為x * x, 你的k=f(1+2)/f(2+1), 相當於x=1+2,但是x * x並沒有用括號所以變成了
1+2*1+2/2+1*2+1=7,系統不會自動幫你識別並加括號。
14樓:
用x*x把f(1+2)/f(2+1)是:k = 1+2*1+2/2+1*2+1 ;算算是多少就ok了
15樓:
f(x)是帶引數的巨集,只做簡單的替換,不自動進行算術運算。
16樓:匿名使用者
int main()
看看這就知道了。巨集定義記得加括號,得小心用。
在c語言中,為什麼1/2的運算結果為0;1.0/2.0的結果為0.5謝謝了,大神幫忙啊
17樓:白諾大好人
因為除號兩邊都是整數,1/2的結構是0.5,取整數以後就是0 第二個是因為除數與被除數有一個是小數結果不會取整數,就是0.5
18樓:久野杏子
1和2是整型,1/2也是整型,0.5取整為0; 1.0和2.0是浮點型,所以1.0/2.0也是浮點型,等於0.5
19樓:景愉玉幼霜
輸出*#pq
下面為程式,偽碼為解釋
void
main()
case
2://由於case
1沒有break,故繼續case
2switch(z)
//即switch(3)
}switch(k)
//即switch(1)}
求下列c語言程式的正確執行結果 為什麼結果兩行都是0 2 4...18,不應該第一行012345
20樓:小豬佩熊
你的**寫的好雞兒差啊,不知道你用的什麼編譯器,標頭檔案沒有加,然後全域性變數什麼的一點不懂。我給你稍微改了一下。你看看
#define max 10
#include
int a[max],i;
void sub1();
void sub2();
void sub3();
int main()
void sub2()
}void sub1()
void sub3()
21樓:老猴子不會胖
第一 sub1 sub2沒有執行任何操作,因為沒有實參形參,應該和sub3一樣有引數才對。
第二 sub3的引數也有錯誤,max作為裡面的一個引數,沒有值!你意思應該是將max 10這個值傳給它,但是形參裡沒有,無法傳遞
c語言 下面程式執行結果為什麼是0 而不是1 main() {int n[5]={0,0,0},
22樓:與子如初見
因為迴圈的時候當i等於k的時候退出迴圈了,根本沒有執行迴圈體n[i] = n[i]+1;這一句,所以n[k]的值為初始化的值,初始化的值為0.故輸出0,。
23樓:匿名使用者
因為當i=k時,for迴圈的條件已經不滿足,不會執行n[i]=n[i]+1。故n[k]還是0.
24樓:殷明明孫楓
選cn=4;
相當於是這樣
intn=0;
while(n++<=2)
//先進行
n<=2判斷,再進行n++自增運算。n=3的時候,n>2,但還是會進行++自增運算,所以為回4
printf("%d",n);
c語言如何計算除法,保留兩位小數。下邊程式的結果為什麼是 0.00
25樓:幻翼高達
需要準備的材料分別有:電腦、c語言編譯器。
1、首先,開啟c語言編譯器,新建一個初始.cpp檔案,例如:test.cpp。
2、在test.cpp檔案中,調整c語言**:double c;c=1.0 * a/b;。
3、編譯器執行test.cpp檔案,此時成功將除法保留2位整數輸出。
26樓:匿名使用者
c語言做除法,只需要使用標準c的語法即可,各個作業系統均為提供浮點運算的,一般cpu上也都會有單獨的浮點運算單元(為了提高效率),顯示0.00只不過是列印函式的格式化輸出而已(你使用了.2f,說明打兩位浮點數)
27樓:匿名使用者
你的c要定義成float 才行還有就是這樣 c = 1.0*a/b
28樓:匿名使用者
printf("c=%.2d\n",c);
29樓:
把c定義成float或者double型就對了
30樓:匿名使用者
整型除法中,a/b,如果a
31樓:尋風
你定義的是整形,c=a/b;結果是c=0;
32樓:無情有義
把int a,b,c換成float a,b,c
33樓:匿名使用者
1, int a,b,c; 改為 float a,b,c;
c語言中,這道題的輸出結果為什麼是70呢
x string x 所以sizeof x 7 因為strlen 以判斷到 0 也就是0 作為字串結尾標識,所以x 0 0,導致strlen在判斷x 0 時就認為到字串末尾了,因此返回0 d d 列印出來就是 70 阿爾邁凡 sizeof是求變數戰勝記憶體大小的 char x string 記憶體中...
c語言中!10的值為0,為什麼,c語言中a 1 0 的值是什麼
ch陳先生 計算機記憶體儲存的時候認為規定了,只有0,沒有 0。c語言是一門程序導向的 抽象化的通用程式設計語言,廣泛應用於底層開發。c語言之所以命名為c,是因為c語言源自kenthompson發明的b語言,而b語言則源自bcpl語言。1967年,劍橋大學的martinrichards對cpl語言進...
C語言中 0x11是什麼意思,C語言中 0x11是什麼意思
小夏在深圳 0x11是十六進位制的11的意思。11前面的0是忽略的。十六進位制的一位就是二進位制的四位。在c語言中,十六進位制的數字常常以 0x 或者 0x 字首開頭,c語言中的八進位制是以字首 0 開頭的,例如04524 就表示一個八進位制數字,它等於十進位制的 2388。在上世紀 60 年代,流...