⑴ c語言在void函數中改變外部變數的值為什麼無效啊
要注意變數的作用域
定義一個全局變數a
你在changValue(int a, int b)函數中有參數, 變數名也為a, 和全局變數同名, 在此函數中, 所有a變數均是參數傳遞來的, 並不是全局變數a
解決方法為 改變函數參數的變數名: changValue(int aaa, int b)
如果你不想用全局變數, 那麼傳送a的地址到函數中, 也可改變a的值
⑵ 緊急求救!C語言編譯中提示:參數中有錯誤字元
是<>號,不是""
要加#include<conio.h>
而不是#include"conio.h"
少#include<conio.h>頭文件
⑶ c語言~~~哪位高手幫忙看看~~為什麼說是左值無效~~
w=360-w
在printf里後面的變數以前面對應的形式輸出,應該不可以放表達式吧?
⑷ 【C語言,變數賦值無效問題,進來看看】
c=a++&&(b=1);這個復合語句是一個邏輯判斷表達式關鍵就在於中間的這個&&符號,當判斷到該符號的第一個條件為假時,後面無論是什麼條件,整個表達式的結果都為假,因此,該符號後面的條件都不會再進行計算,也就是b=1實際不會被執行。當然,這里也要說明一下為什麼a++為假,a的值為0,而a++表示先用a進行計算,然後再把a進行自增運算,因此,參與計算的a的值為0,所以導致整個表達式的結果為假。如果你將這里的&&符號修改為||或者是把a++改為++a,那麼b的值都會變成1.⑸ c語言為什麼輸出值 是錯誤,大神看一下是哪裡錯了
第一個if 改成
score<60&&score>0
⑹ c語言中srand函數為什麼報錯說類型轉換無效,調用參數過多
圖片模糊,啥也看不清。
srand()函數的原型聲明為:
void srand (unsigned int seed);
所以在調用時只需要傳入一個隨機數種子就可以了,不要加別的參數。例如:
srand (time(NULL));
也就是將當前時間作為隨機數種子傳入。之後調用rand()函數才能獲取基於該種子生成的偽隨機數。
⑺ 怎麼我的二級C語言上機題提示說無效的過程調用或參數
語法錯誤。可能是形參與實參類型不匹配,或者是調用格式不正確。建議貼出代碼來。
⑻ C語言基礎知識
C語言具有簡潔緊湊,靈活方便,運算符豐富,數據類型豐富,表達方式靈活實用等特點,所以C語言程序設計更主動、靈活。很多人從C語言入門編程,下面整理了一些C語言基礎知識,希望對大家有所幫助!
1.C語言中,變數必須先聲明後使用,即一個程序塊(花括弧對)中所有臨時變數必須在第一條可執行語句之前全部聲明,而不能像C++那樣隨用隨聲明;
2.C語言中參數傳值傳遞形參,即為參數的拷貝,此與C++/JAVA相同,同時值得注意,ANSI C不支持引用,此與C++/JAVA有區別,那麼要對參數進行修改只能使用指針方式(指針傳值指針本身仍是形參,要修改指針本身那必須使用雙重指針);
3.C語言默認類型為int,即參數無類型或函數無返回值類型聲明,則認為是int(貌似一些編譯器不支持),同時不建議使用該特性;
4.無參數的函數聲明應當使用void表明,否則C語言按照老式聲明方法忽略參數類型檢查;
5.全局變數建議全大寫,局部變數建議全小寫,內部變數31個字元有效,外部變數不區分大小寫,僅6個字元有效,所以必須保持唯一性;
6.ANSI C是按照多位元組實現的,UNICODE是後來發展的,所以有char/WCHAR,與.NET中char直接是雙位元組有區別,在C#中導入dll時值得注意;
7.C語言支持枚舉,並且枚舉和int直接強制類型轉換即可,比.NET方便;
8.#define聲明宏定義直接在編譯時替換,不進行類型檢查,const聲明常量則可以進行類型檢查;
9.運算符的優先順序記憶比較麻煩,還是()可靠;
10.goto並不是一無是處,在不考慮程序可讀性的情況下可能獲得更高的效率;
11.函數實際也可以與特殊的類型相對應,那樣對於理解函數指針比較方便,函數為外部類型;
12.static用於全局變數和函數則限定該變數和函數的使用范圍僅為該源文件(從而無需考慮與其他源文件不得重名),用於函數內部變數則該變數的內存分配和回收不再同於普通臨時變數(調用函數生成,函數返回銷毀),而是一直存在於靜態變數區,從而可以保存一些狀態;
13.頭文件的作用體現在調用其他源文件時不需要再次寫函數定義,所以實現函數是不需要頭文件的,調用時才需要,可以採用富頭文件定義一大組介面,然後使用多個源文件分別實現;
14.寄存器變數使用register聲明,僅適用於使用頻率高的局部變數(含形參)(受限於底層硬體,不一定會被分配到寄存器,但是這么寫不影響效率);
15.全局變數和靜態變數默認初始化為全零且僅初始化一次,局部變數默認初始化為未定義且每次都會重新初始化;
16.遞歸調用的方法一般比較緊湊,但是每次調用會單獨維護調用的`堆棧,所以效率不是最高;
17.#include的作用體現於將一些內容避免重新寫一遍(主要是類型、函數和外部變數定義),所以實際上不一定為h文件;
18.表示一行尚未結束,對於定義長的字元串和define比較有用;
19.函數調用的執行順序不確定,所以對於a()+b()這樣函數中使用相同變數並且改變其值的需要藉助臨時變數處理,防止不同實現的調用順序不一致;
20.##用於宏定義中連接前後兩個部分,如cat(a, b) a ## b;
21.指針是C/C++的重要內容,當然也是雙面刃,用好了很方便而且高效,用不好那就造成程序不穩定;
22.使用va_list, va_start, va_arg, va_end來定義可變參數的函數,通過va_start函數中的第一個不變參數將va_list指向參數列表(函數調用的棧中),然後通過va_arg獲取每個參數並將va_list移動指定類型的長度,最後則通過va_end完成必要的回收工作,需要指出的是va_arg沒有結束邊界,所以比較有效的方式有兩種,一種對於參數類型一致,則可以第一個參數指出後續參數的總數,然後依次獲取,另一種對於不同類型的參數混用,則可以通過類型標識+參數配對的方式進行使用(第一個參數依然可以指定數量,當然也可以檢查標識),從而避免最後讀取無效的參數,對於可變參數僅支持int和double兩種類型(參數未限定類型,故按照舊式聲明理解)以及指針類型;
23.函數指針是用來在C語言中實現動態調用的比較有效的方式
24.結構體用作參數依然是拷貝為形參傳遞,這點與JAVA中全部對象都是類有區別(類的對象通過引用傳值,C#支持struct),所以對於大的結構體事宜使用指針傳遞,而對於小的結構體拷貝傳值效率並不低;
25.代碼中字元數組為靜態常量,對其操作無效,程序塊中數組的聲明是可以自動回收的,通過malloc/calloc分配的內存為堆內存,需要自行通過free回收;