A. c語言 實現輸入跳轉
用最簡單的Windows下的多線程可以實現你的想法,可能時間不是太精確,不過還是可以用。
一會我把代碼發給你看看。
------------------------------------------------------
這是我以前做到一個例子:
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <stdio.h>
char p = 0,in = 0; //全局變數
DWORD WINAPI Thread1Proc( LPVOID lpParameter);//線程的執行函數
void main()
{
clock_t start, finish;
srand((int)time(0)); //這個不要忘記,隨機種子初始化
p=rand()%26+97;
putchar(p);/*在屏幕上顯示一個隨機小寫字母*/
printf("\n");
/*如果5秒內輸入的字母與p相同,則顯示Great!如果5秒到了或者輸入字母與p不同,則顯示Miss!*/
start = clock(); //記下初始時間
HANDLE hThread1=CreateThread(NULL,0,Thread1Proc,NULL,0,NULL);
CloseHandle(hThread1); //關閉線程函數句柄
while(true)
{
finish = clock(); //當前時間
/*如果超過了5秒
in != 0 說明已經進行了輸入
*/
if(finish >= (start+5*CLOCKS_PER_SEC) || ((in != 0) && (in != p)))
{
printf("Miss!\n");
break;
}
if(in == p) //如果相同就列印"Great!"
{
printf("Great!\n");
break;
}
}
}
DWORD WINAPI Thread1Proc( LPVOID lpParameter) //線程函數的定義
{
scanf("%c", &in);
return 0;
}
--------------------------------------------------------------
滿意請採納,謝謝您!
B. C語言如何進行子程序的跳轉
c 語言要復雜得多。這需要開課。幾句話是說不完的。
簡單來說,可以通過 子程序調用(c 語言統稱 子程序和函數為「函數」)和 返回,實現 一個子程序 調用和執行另一個子程序。數據,變數地址,可以通過 子程序 的 參數項 來交流(參考),也可以通過全局量 來 參考,也可以通過 數據文件 來交流。
main() 與其它 子程序一樣,也是一個 「函數」,只不過是 預先約定了名字叫 main() 的子程序,它有一些特權,例如,程序執行從它開始,它的 參數項 能傳遞 命令行拍入的位置參數。
main() 調用 nono() 很簡單:
void main(){ nono(); }
如果nono 有參數:
void main(){ nono(p1,p2,p3,p4); }
void nono( int c1, float c2, double c3, char *c4){....}
若有多個 子程序,它們互相之間都可以 「調用」,都可以互相交流數據。
C. c語言代碼執行的速度是多快
c語言執行的快。因為java其實是運行在虛擬機之上,同樣的代碼c直接被調用執行,java的代碼是需要在虛擬機上跑。虛擬機執行代碼又會增加其他代碼。到最後當然是c語言執行的快了
D. 哪一種C語言編寫的程序運行速度最快
C語言只有一種,不過同一個C程序在不同的編譯器中編譯出來的結果是不一樣的。速度我沒做過比較,我想是和編譯器的優化策略有關,選用「速度最優」的策略會比默認的"體積最小"要快吧。如果你需要加快程序的運行速度,把最佔用時間的那些代碼改用匯編來編寫,另外可以考慮採用多線程,可以達到不錯的效果。
E. c語言常用的關鍵字試題及解析
額,這個不難吧 常用的 關鍵字
C語言關鍵字解析
C語言關鍵字有32個,如表1所示。雖然簡單,但還是讓一些初學者犯錯,譬如sizeof,好多初學者都認為是函數,其中包括我的一些同學,他們學過有好多年了,如此看來,有時我們追求高深的內容,往往會忽略基礎的簡單的內容!
表1 C語言標準定義的 32個關鍵字
關鍵字 意義
auto 聲明自動變數,預設時編譯器一般默認為 auto
int 聲明整型變數
double 聲明雙精度變數
long 聲明長整型變數
char 聲明字元型變數
float 聲明浮點型變數
short 聲明短整型變數
signed 聲明有符號類型變數
unsigned 聲明無符號類型變數
struct 聲明結構體變數
union 聲明聯合數據類型
enum 聲明枚舉類型
static 聲明靜態變數
switch 用於開關語句
case 開關語句分支
default 開關語句中的「其他」分支
break 跳出當前循環
register 聲明寄存器變數
const 聲明只讀變數
volatile 說明變數在程序執行中可被隱含地改變
typedef 用以給數據類型取別名(當然還有其他作用)
extern 聲明變數是在其他文件正聲明(也可以看
return 子程序返回語句(可以帶參數,也可不帶
void 聲明函數無返回值或無參數,聲明空類
continue 結束當前循環,開始下一輪循環
do 循環語句的循環體
while 循環語句的循環條件
if 條件語句
else 條件語句否定分支(與 if 連用)
for 一種循環語句(可意會不可言傳)
goto 無條件跳轉語句
sizeof 計算對象所佔內存空間大小
在這里我們也不一一講解每個關鍵字,只是講講比較容易被人忽略的或者易出錯的關鍵字說明一下。
在講之前,先說明一下,定義和聲明的區別:
定義:編譯器在創建一個對象時,為該對象申請開辟的內存空間,這個空間的的名字就是變數名或者對象名。同一個變數名在摸個區域內只能定義一次,重復定義會出現錯誤的。
聲明:有兩種作用,
1. 告訴編譯器,這個變數或者函數,我已經定義了(開辟空間了),但是在別的地方,我先說明一下,免得編譯器報錯。當然,聲明可以多次出現。
2. 告訴編譯器,這個變數名或者對象名,我先預定了,其他地方不可以用了。和在飯館吃飯(人多)要提前預約一樣的道理。
定義和聲明最本質的區別在於,聲明沒開辟空間,而定義則創建對象(變數)並開辟了空間。這是最重要的一點。
一. auto,register,extern,static,四種關鍵字
C語言說明變數的時,同時給出了兩個方面的信息:數據類型和存儲類。C語言中提供了存儲說明符auto,register,extern,static說明的四種存儲類別。
1. auto 是變數是C語言最常用的。編譯器在默認的預設情況下,所有變數都是auto的。對於函數的形參,也是auto型的。
2. extern, 語言中存在這樣的一種變數,在一個函數中合法出現的同時,又可以在其他的函數中合法出現,這就是外部變數。它的生命周期是整個程序的執行周期。
3. register,寄存器變數,其值存放在寄存器中,訪問速度快。有最快的關鍵字的稱呼。雖然寄存器的速度非常快,但是使用 register修飾符也有些限制的:register變數必須是能被 CPU寄存器所接受的類型。意味著 register變數必須是一個單個的值,並且其長度應小於或等於整型的長度。而且register變數可能不存放在內存中, 所以不能用取址運算符 「&」來獲取 register變數的地址。
4. static 靜態變數,兩個作用。第一個作用:修飾變數,都存在內存的靜態區。
靜態局部變數:出現在函數體內,生命周期是整個程序的執行過程,由於被 static修飾的變數總是存在內存的靜態區,即使該函數生命結束,其值不會被銷毀,同樣要修改該變數,就要到函數內部完成,所以用起來比較安全,起到信息屏蔽的作用。
靜態全局變數:出現在函數體外,作用域僅限於變數被定義的文件中,其他文件即使用 extern聲明也沒法使用他。
第二個作用,修飾函數,函數前加 static使得函數成為靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件(所以又稱內部函數)。使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
二. 基本數據類型----short、int、 long、char、float、double
這些關鍵字都是基本的數據類型,每種類型占據的內存空間不一樣,其實每種類型相當於一個模型,再通俗點就是一個模子。具體佔多少個位元組,可以用關鍵字sizeof去測一下。另外就就是存儲問題。不論是float還是double在存儲方式上都遵從IEEE的規范,float遵從的是IEEE R32.24 ,而double 遵從的是R64.53。
#include <stdio.h>
int main()
{
float a=999.999;
float b=0.005;
printf("%lf/n",a+b-1000.004);
return 0;
}
看看得到的結果並不是0,按數學計算本來應該是0,但由於浮點數的存儲有微小的誤差從而導致計算結果不是0
double m=3.3;
cout<<m;
你輸入3.3,再調試監測m的值你會發現存儲的是3.2999999999999998,而不是3.3.這就是本來是3.3而經過存儲卻變的不是3.3.
對計算機來說,實數是不存在的東西。一般,計算機除了認識「整數」——這個整數和數學中的整數也不是一個東西。
還認識的一種數就是「浮點數」——和數學中的實數更是兩碼事。
三.最冤枉的關鍵字sizeof
經常被我們當成函數來使用,雖然造型很像函數,其實是關鍵字,
int i=0;
A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i;
以上四種寫法都是正確的,結果為4.可以在VC6.0編譯器watch窗口下觀察,前兩種寫法很常見,但後面的也正確。從c和d正確可以排除sizeof是函數的說法,當然我們在使用的時候還是加上括弧,披著函數皮的關鍵字吧!
請看下面的例子:
struct Test
{ int Num;
char*Pc;
short sDtate;
char ch[2];
short S[4];
}*p;
那麼這個結構體的大小多少呢?他與共同體的區別很明顯,共同體所有成員變數都共用同一塊內存,而結構體每個元素都佔用相應地內存。
共同體的最大的成員所佔內存為共同體佔用內存。
int:佔4個位元組(32系統)。
char*pc:4個:指針相當於地址,地址就是你當前操作系統的位數。如果是指針數組即存放指針的數組,佔用的空間是4*數組的個數。
如果是數組指針即指向數組的指針,指針指向的是數組的地址,佔用4個位元組。
short sDtate:2個
char ch[2]:2個
short S[4]:2*4=8 short型數組
所以一起:4+4+2+2+8=20位元組。VC下驗證是正確的,不要以為這樣就沒事了,其實還是有問題的:位元組對齊的問題。
struct S1
{
char c;
int i;
};
S1 s1={'a',0xFFFFFFFF};
問sizeof(s1)等於多少?char佔1個位元組,int佔4個位元組,那麼加起來就應該是5。這樣算對嗎?VC6中按默認設置得到的結果卻是為8。
我們來好好琢磨一下sizeof的定義——sizeof的結果等於對象或者類型所佔的內存位元組數,好吧,那就讓我們來看看S1的內存分配情況:
以我的VC6.0為例,s1的地址為0x0012FF74,使用memory窗口觀察,其數據內容如下:
0012FF74: 61 CC CC CC FF FF FF FF
你會發現中間夾雜了3個位元組的CC?看看MSDN上的說明:
When applied to a structure type or variable, sizeof returns the actual size,which may include padding bytes inserted for alignment.
原來如此,這就是傳說中的位元組對齊啊!那麼為什麼需要位元組對齊?計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令周期了。各個硬體平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。其他平台可能沒有這種情況, 但是最常見的是如果不按照適合其平台的要求對數據存放進行對齊,會在存取效率上帶來損失。這也是空間和時間的博弈。
F. C語言 如何像匯編一樣跨函數跳轉
額,你這個問題有點糾結
你可以想像下函數間的跳轉。。。
函數的調用是一個壓棧和彈棧的過程,假如以在函數間隨意跳轉,而不返回的話,那麼就是不停的壓棧,而不彈棧,而調轉到另一函數的堆棧區間也將被破壞,這樣就會產生一些不確定的詭異錯誤,我想這個你是可以想像的到的
但是你說想無條件跳轉,那麼函數間的跳轉時不現實的,只能嵌套。
我推薦的方法是使用狀態機,在單片機的while中檔函數返回後判斷當前狀態決定下一個執行的函數。這種方法在程序設計中很常用
但是你假如是在想實現那種無條件跳轉,其實也是可以的,不過需要使用C的宏來代替函數
比如有這樣個函數
void set_val(int* a , int val)
{
*a = val;
}
void main()//對於單片機main的返回沒啥意義
{
int a = 0;
while(1)
{
set_val(&a, 1);
}
}
可以改成這樣
#define set_val( a , val)\
a = val;\
goto jump;\
void main()//對於單片機main的返回沒啥意義
{
int a = 0;
while(1)
{
jump:
set_val(a, 1);
}
}
用宏而不適用函數這樣基本可以滿足你的需要,就是任意跳轉,不過這種結構我十分不推薦。。。
這個程序我都沒調試過,不過意思是這個意思
你可能匯編寫的比較多,對C語言了解可能不多,我以前寫單片機的時候也是用C寫的,沒啥實現不了的功能,慢慢你就習慣了哈
G. C語言如何實現跳轉
不要使用goto語句。把你的邏輯拆分封裝成三個函數,根據輸入的不同執行不同的函數。
H. 哪種計算機語言的執行速度最快、哪種最慢為什麼
針對性調優過的匯編速度是最快的。所有的語言最終都到匯編 匯編再到機器語言。 語言編譯的時候都有優化,所以好的匯編是最快的。但是差的匯編也不少MSP430上的程序都有一個判斷執行15秒的。
程序設計語言中匯編語言速度最快,c語言效率最高,執行效率高。程序設計語言(ProgrammingLanguage):是一組用來定義計算機程序的語法規則。它是一種被標准化的交流技巧,用來向計算機發出指令。
一種計算機語言讓程序員能夠准確地定義計算機所需要使用的數據,並精確地定義在不同情況下所應當採取的行動。程序設計語言特點不同,適用領域也不同。
(8)c語言跳轉速度最快擴展閱讀:
如今通用的編程語言有兩種形式:匯編語言和高級語言。匯編語言和機器語言實質是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,容易識別和記憶。源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。
高級語言是絕大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。同時,由於省略了很多細節,編程者也就不需要有太多的專業知識。
I. C語言中怎麼實現函數之間的跳轉
最簡單的方式就是在你調用的函數後面加跳轉語句
例如
goto
a;
然後你在你MAIN函數的定義變數的後面加上a:就行了
雖然不推薦用這種方式
但這是最簡單的。
你也可以用其他的例如
while
for
do
while
等循環語句寫這個
J. 為什麼C語言編寫的系統程序執行速度比用其他語言編寫的快
C語言是高級語言,編譯後生成可執行程序。
它的執行速度一般來說,比要通過解釋執行的語言快。但比匯編語言慢。
不一定比其它高級語言快,例如,數學運算方面,可能不如fortran快,當然,假定兩者用的演算法完全一樣。
如果演算法不同,兩種語言就不好比較了。例如,對整篇輸入文章進行語句結構或片語結構替代,用Perl 腳本比C快。
計算機語言其實是人的工具,例如,菜刀,斧頭,螺絲刀,各有所長,各有各的用途。菜刀切菜,斧頭劈柴,換過來用也不是不是可以,斧頭切菜,菜刀劈柴,效率差。
C語言同C語言比,速度也不一樣。MS VC++ 同 TB不一樣.
同一種C語言,編譯時用了優化1,優化2,執行程序快慢不同。