任何代碼的美麗不僅在於找到一個給定的問題的解決方案,但在它的簡單性,有效性,緊湊性和效率(記憶體)。設計的代碼比實際執行更難 。因此,每一個程式員當用C語言開發時,都應該保持這些基本的東西在頭腦中。本文向你介紹規範你的C代碼的10種方法。1.避免不必要的函數調用考慮下面的2個函數:複製代碼 代碼如下:void str_print( char *str ) { int i;
快速排序:複製代碼 代碼如下:#include <stdlib.h>#include <stdio.h>#include <string.h>#define LENGTH(x) sizeof(x)/sizeof(x[0])/**輸出數組元素*\param arr:指向數組的指標*\param len:數組元素的個數*/void print(char (*arr)[10],int len){ int
當未用 #pragma 指令指定編譯器的對齊位元時,結構體按最長寬度的資料成員的寬度對齊;當使用了 #pragma 指令指定編譯器的對齊位元時,結構體按最長寬度的資料成員的寬度和 #pragma 指令指定的位元中的較小值對齊。#pragma 指令格式如下所示:#pragma pack(4) // 或者 #pragma pack(push, 4)舉例如下:(機器字長為 32 位)
發了好幾天編了個解線性方程組的小程式,可第一次實戰就大敗而歸。經過半天的調試,仍找不出糾正的方法。因為並不是演算法的問題,而是因為自己對編譯器處理 浮點函數的方法不是很理解。明明D=0的方陣解出來不等於0了,跟蹤調試發現,計算過程程式對資料進行了捨去處理,導致最終結果不對。不過如果沒有浮點型 的話,這個程式應該算不錯了 。複製代碼 代碼如下:#include<stdio.h>#include<math.h>#include<mem.h>#define NUM
mac下clang編譯後函數的參數先儲存在寄存器中(以一定的規則儲存),然後在函數中壓入棧裡,以待後用。例如上篇例子,紅色部分:複製代碼 代碼如下:.global _decToBin _decToBin: pushq %rbp movq %rsp,%rbp
c部分很簡單,檔案名稱隨便,如main.c:複製代碼 代碼如下:#include <stdio.h>#include <stdlib.h>void decToBin(long dec,char *b); //聲明外部彙編函數int main(){ long
比如:int (*foo)(int arg),記住要和另一個指標函數區分開來,類似這樣:int *foo(int arg).比如我們可以這樣聲明一個變數和函數:複製代碼 代碼如下:int (*pfun)(int arg)=0;int fun(int arg); //這個函數實現隨便啦,我就不寫了。如果我們想利用函數指標操作函數,就和指標變數使用一樣:複製代碼 代碼如下:pfun=fun;int
首先dynamic_cast:複製代碼 代碼如下:#include <iostream>using namespace std;class A{ public: virtual ~A(){} //使用dynamic_cast時,必要!};class B:public A{
先看代碼複製代碼 代碼如下:printf(“hello,world!”);其參數個數為1個。printf(“a=%d,b=%s,c=%c”,a,b,c);其參數個數為4個。如何編寫可變參數函數呢?我們首先來看看printf函數原型是如何定義的。在linux下,輸入man 3 printf,可以看到prinf函數原型如下:複製代碼 代碼如下:SYNOPSIS#include <stdio.h>int printf(const char *format,
沒學過線性代數,但是很多演算法都和矩陣相關,所以就硬著頭皮學。最近就想自己能不能先寫個算線性方程組的程式呢?後來就想了這麼個方法,暫時只能算3元的,任意元的接下來繼續想。有太多寫入程式碼,希望有興趣的讀者可以給點修改建議!複製代碼 代碼如下:#include "stdafx.h"//VS2010需要#include "stdio.h"#include "stdlib.h"#include "math.h"double x[3];//存放解x,y,z,使用數組便於輸出//x=1,y=2,z=3//
問題開燈問題 有n盞燈,編號為1~n,第1個人把所有燈開啟,第2個人按下所有編號為2 的倍數的開關(這些燈將被關掉),第3 個人按下所有編號為3的倍數的開關(其中關掉的燈將被開啟,開著的燈將被關閉),依此類推。一共有k個人,問最後有哪些燈開著?輸入:n和k,輸出開著的燈編號。k≤n≤1000複製代碼 代碼如下:#include <stdio.h> #include <math.h> int main() { int a[1001],n,k,i,
模式雖然精妙,卻難完美,比如觀察者模式中觀察者生命週期的問題;比如訪問者模式中循環相依性的問題等等;其它很多模式也存在這樣那樣的一些不足之處,如使用情境受限、實現複雜、不夠簡潔、不夠通用等。但我覺得不足之處大都是可以採取一些手法去彌補去改進的,比如用c++11的新特性來改進。因此,便有了c++11改進我們的模式這個系列。這次我要講的是如何使用c++11改進命令模式。關於命令模式 命令模式的作用是將請求封裝為一個對象,將請求的發起者和執行者解耦,支援對請求排隊以及撤銷和重做。它的類圖如下:
標準C++類std::string的記憶體共用和Copy-On-Write技術 陳皓1、概念 Scott Meyers在《More Effective
具體來說:能像 int 類型那樣定義變數,並且支援賦值、複製。 能用作函數的參數類型及傳回型別。 能用作標準庫容器的元素類型,即 vector/list/deque 的 value_type。(用作 std::map 的 key_type 是更進一步的要求,本文從略)。 換言之,你的 String 能讓以下代碼編譯運行通過,並且沒有記憶體方面的錯誤。複製代碼 代碼如下:void foo(String x) { } void bar(const String&
複製代碼 代碼如下:/*** @brief C語言實現的順序結構類型的棧* @author wid* @date 2013-10-29** @note 若代碼存在 bug 或程式缺陷, 請留言反饋, 謝謝!*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define TRUE 1#define FALSE 0typedef struct Point2D{
1. const變數聲明中帶有關鍵詞const,意味著不能通過賦值,增量或減量來修改該變數的值,這是顯而易見的一點。指標使用const則要稍微複雜點,因為不得不把讓指標本身成為const和指標指向的值成為const區別開來、下面的聲明表示pf指向的值必須是不變的constfloat *pf;而pf則是可變的,它可以指向另外一個const或非const值;相反,下面的聲明說明pf是不能改變的,而pf所指向的值則是可以改變的:float* const
題目內容:斐波那契數定義為:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n>1且n為整數)如果寫出菲氏數列,則應該是:0 1 1 2 3 5 8 13 21 34
題目內容:將十進位整數轉換成位元。輸入描述:輸入資料中含有不多於50個的整數n(-231<n<231)。輸出描述:對於每個n,以11位的寬度靠右對齊輸入n值,然後輸出“-->”,再然後輸出位元。每個整數n的輸出,獨立佔一行。題目分析:將某個數從十進位轉為二進位的具體方法是,該數對2取餘,結果要麼為1要麼為0,此為該數對應二進位的末位;然後該數除以二,得到的商再次對2取餘,結果為對應二進位的倒數第二位……以此類推,知道除以2的結果為0。參考代碼:複製代碼
system()函數功能強大,很多人用卻對它的原理知之甚少先看linux版system函數的源碼:複製代碼 代碼如下:#include <sys/types.h>#include <sys/wait.h>#include <errno.h>#include <unistd.h>int system(const char * cmdstring){ pid_t pid; int
傳回值的作用 main函數的傳回值用於說明程式的退出狀態。如果返回0,則代表程式正常退出;返回其它數位含義則由系統決定。通常,返回非零代表程式異常退出。下面我們在winxp環境下做一個小實驗。首先編譯下面的程式:int main( void ){ return