iOS開發入門 ☞ C語言系列二

来源:http://www.cnblogs.com/bossren/archive/2017/01/30/6358010.html
-Advertisement-
Play Games

常量 C語言有豐富的數據類型,在開發中,一般用常量或者變數來表示這些數據 "量"表示數據。常量,則表示一些固定的數據,也就是不能改變的數據。 10.1;// 雙精度double 5.2f; //單精度float 'a'; // 字元型常量 'ab'; // 錯誤 '李'; // 錯誤寫法, 因為一個 ...


常量

C語言有豐富的數據類型,在開發中,一般用常量或者變數來表示這些數據

""表示數據。常量,則表示一些固定的數據,也就是不能改變的數據。

10.1;// 雙精度double

5.2f; //單精度float

'a'; // 字元型常量

'ab'; // 錯誤

''; // 錯誤寫法, 因為一個漢字占3個位元組

'\n';//字元型常量(轉義字元,表示單個字元)

  

定義常量的方法:

const int a=100;

變數

變數:代表了記憶體的一個空間,用來存放經常變化的數據。(變數名就是空間的名稱,變數的類型決定著變數占用多大的記憶體空間)

變數名:是我們操作數據(存放數據)的依據。

初始化:就是清空(賦初值,0/NULL)的意思,清理一些垃圾數據。

變數的使用:存值和取值。

  int a; //定義一個變數,未初始化。

  a的值的可能性:1) 系統的數據; 2) 上一個程式遺留的數據; 3) 垃圾數。

變數的作用域:(變數的使用範圍)

局部變數(內部變數):在函數的內部或者代碼塊的內部定義的變數。

  ※ 作用域:從局部變數定義的位置開始,到它所在的代碼塊或函數體的“}”為止。

  ※ 註意:在代碼塊的內部可以定義和塊外部同名的變數,塊內部的會暫時屏蔽(外部的不起作用)塊外部的變數的作用域。  

#include <stdio.h>

 

int main() {

    int age=20;

    //代碼塊代表一個空間,與age的空間併列

    {//代碼塊開始

        int a=5;

        printf("a=%d\n", a); //a=5

        int age=25; //在代碼塊內部可以定義和代碼塊外部同名的變數

        printf("age=%d\n",age); //age=25;

    }//代碼塊結束(此時代碼塊內部所有的空間會釋放)

    printf("age=%d\n", age);//age=20;

    return 0;

}

變數的命名:命名需要符合標識符語法要求。

  • 必須以字母或下劃線開頭
  • 包含字母、下劃線或數字
  • 大小寫敏感的
  • 不能與關鍵字衝突
  • 標識符理論上講,長度無限制,但太長了會被編譯器截斷

變數的聲明(定義):在相同的作用域內變數不可重覆定義!

語法格式:變數類型  變數名;

  如: int age;

    float result;

    double x,y,z;

  變數類型:表示我所定義的這個變數可以存放什麼樣類型的常量

  變數名稱:它一個標示符,來標識我們在記憶體中開闢這塊存儲區域,方便我們以後使用

  變數的作用域:從定義那一行開始直到其所在大括弧結束為止

//1.定義變數(即在記憶體中開闢一塊空間,空間的大小跟定義的類型有關,空間的名字就是變數名)

int age//這一行代碼就在記憶體中開闢一塊4個位元組的存儲區域,它名字叫age;這塊存儲區域是用來存放int類型的數據的

//2.初始化:變數第一次賦值稱為初始化。

age=22; //這行代碼是把22,放到名字為age的這塊存儲區域中

   

  • 未經聲明的變數不能使用;變數在使用之前要聲明,且只聲明一次。
  • 變數用來保存程式執行過程產生的臨時值,可以多次賦值,但只會保存最後一次的值。

 

變數的存儲

  • 變數所占的存儲空間(位元組數):跟變數的類型和編譯器環境有關。
  • 變數存儲單元的第一個位元組的地址就是該變數的地址(詳細地址/首地址)
  • 任何變數在記憶體中都是以二進位的形式存儲:

   一個負數的二進位形式,其實就是對它的正數的二進位形式進行取反再加1

1. 不同的數據類型占用不同的存儲空間:

  

2. 不同數據類型表示的範圍:

  

  

變數在記憶體中怎麼儲存?(變數為什麼要有類型)

  • 只要定義變數,系統就會開闢一塊存儲空間給我們的變數存儲數據
  • 越先定義的變數,記憶體地址越大(從位元組地址最大的開始找)
  • 記憶體定址是從大到小,高位放在高位元組上,低位放在低位元組上
  • 變數的地址就是變數所占的存儲空間最小的位元組地址(即首地址:&變數名稱)

  電腦中最小儲存單元是位元組,每個位元組都有一個地址。

    

// 擴展:獲取每個位元組中存儲的數據

    char *p = &value;

    for (int i = 0; i < sizeof(value); i++) {

        printf("%i\n", *(p + i));// 取出每個位元組中存儲的數據(88 2 0 0)

    }

註意:在這裡,地址(int型指針)+1 相當於 char型指針+4

  

//  當定義變數的時候,這個變數裡面究竟有什麼東西是不確定的

    int score;//垃圾值

 

//  printf函數列印 % 字元要用 %% 才能列印

printf("5%%2=%d\n",5%2);//結果為:5%2=1

 

 

交換整型變數ab的值:

  比如:a=10b=11;交換後:a=11b=10。用兩種方式實現:

  1. 使用第三方變數

    int temp;

    temp = a;

    a = b;

    b = temp;

  1. 不使用第三方變數

    a = b - a;

    b = b - a;

    a = b + a;

printf 函數:

printf函數稱為格式輸出函數,其關鍵字最末一個字母f即為“格式”(format)之意

printf函數調用的一般形式為:(其中格式控制字元串用於指定輸出格式)

  printf(“格式控制字元串”, 輸出表列); 

格式字元串的一般形式為:(其中方括弧[]中的項為可選項)

  %[標誌][輸出最小寬度][.精度][長度]類型。

//利用printf函數可以計算字元串的長度

int length = printf("iOS開發\n");

printf("共占%i個位元組\n", length);// 10 (1+1+1+3+3+1)

1. 類型(格式控制符)

  

 2. 標誌

  標誌字元為 -、+、# 和空格四種,其意義下表所示:

  

  • 指定位寬:
    1. %0nd:在%與d之間,0n,n表示輸出的數字的寬度,如果不夠就用0補齊左邊(重點)
    2. %nd:在%與d之間n,n表示輸出的數字的寬度,如果不夠就用空格補齊左邊
    3. %-nd:在%與d之間 -n,n表示輸出的數字的寬度,如果不夠就用空格補齊右邊
  • 指定位數:

      %m.nf:在%與f之間,可以有m.n,m表示輸出數字所占的寬度,m表示小數點後面的位數,如果不夠會用空格補齊左邊

#include <stdio.h>

 

int main() {

    float m=3.141592f;

    printf("m=%8.4f\n", m);//預設空格補在左邊

//  %-m.nf 輸出共占m位,其中小數占n位,如果數值寬小於m右端補空格

    printf("m=%-8.4f\n", m);//-號表示空格補右邊

//  %*.*特殊用法:

    printf("m=%*.*f\n",6,2,m);//m=  3.14

    printf("%.*s\n",4,"abcdkkkkkkk");//abcd

    return 0;

}

%g:自動選f格式或e格式中較短的一種輸出,且不輸出無意義的零。

%p:輸出地址(指針)

/**

 *  %f預設會保留6位小數

 *  指定保留多少位小數: %.nf, 其中n就是需要保留多少位小數, f用於輸出實型

 */

float value = 3.14;

printf("%f\n", value);//3.140000

printf("%.2f\n", value);//3.14

 

/**

     *  floatdouble的有效位數:

     *  float最多表示7位有效數據。double最多表示16位有效數據。

     *

     *  float類型要點:

     *  1.小數末尾要加f/F,指定為float類型

     *  2.預設情況保留6位小數

     *  3.精度為7位有效數字(左邊第一個不為零的數開始,除小數點外7位數字有效,超出7位的是垃圾數據)

     *

         1bit(符號位) 8bits(指數位) 23bits(尾數位)

         精度是由尾數的位數來決定的

         float2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,

         但絕對能保證的為6位,也即float的精度為6~7位有效數字;

     */

    float value = 3.1415926525;

    printf("%f\n", value);//3.141593 (預設情況保留6)

    //float有效數字是7位,多餘位數則會顯示垃圾數據(不准確)

    printf("%.10f\n", value); //3.1415927410

 

    // 如何想完整的輸出那麼必須將數據保存double類型, 因為double類型的有效位是15

    double value = 3.1415926525;

    printf("%.10lf\n", value);

    

    //如何提高逼格(保留幾位小數不確定時)

    //指定保留多少位小數時,可以通過*號占位,以後賦值具體保留的小數位

    float value = 3.1415926;

    printf("%.*f\n", 5, value);

    &C語言中的一個地址運算符,可以用來獲取變數的地址

    &可以獲取變數的地址,例如:&num

    *可以根據地址數據找到變數,例如:*(&num)

scanf 函數

  scanf函數是一個阻塞式函數

  程式會停在scanf函數出現的地方,直到接收到數據才會執行後面的代碼

//  使用scanf接收用戶從鍵盤上輸入

    scanf("%d", &a);//註意: 必須告訴scanf函數變數的詳細地址, 才能存儲用戶輸入的數據

//  %d之間可以有數字n,這個n表示接受數據的寬度

    scanf("%2d",&a);

scanf 函數要點:

  1. 鍵盤輸入的數據與格式化字元串中的要匹配, 不匹配時scanf函數就會自動終止。
  2. scanf接收多個數據時,為了防止出錯一般加一個分隔符(例如:,

    (空格、回車、Tab可以做%c除外的分隔符,因為空格、回車、Tab是字元)

  1. 不能在scanf的格式化字元串末尾寫上\n

    

    

// \n代表換行

// 如何告訴scanf函數我們輸入完畢? 回車(\n)

// 因為回車是scanf的結束符, 所以不能在scanf的格式化字元串末尾寫上\n。(如果加在末尾,會永遠結束不了輸入,即scanf函數不會終止)

// 如果不小心把\n放到了scanf格式化字元串的末尾,也可以破,原樣輸入(輸 \n或輸入一個不匹配的類型(如:輸 a)

scanf("%i%i\n", &num1, &num2);

 

scanf函數實現原理

scanf函數的運行原理:

    系統會將用戶輸入的內容放入輸入緩衝區

    scanf函數會從輸入緩衝區中逐個取出內容賦值給格式符,如果類型不一致不會修改原有數據。

  

  

scanf錄入數據的時候,錄入格式必須與格式化字元串中格式一致

  1. scanf("%d-%d-%d", &a, &b, &c);

    註意:scanf占位符中間分割符可以是任意的,不一定要用中劃線-,可以是逗號、空格、星號*、井號#等等,甚至是英文字母

  1. scanf("%d %d %d", &a, &b, &c);

    3%d之間是用空格隔開的,我們在每輸入一個整數後必須輸入一個分隔符,分隔符可以是空格、tab、回車

    scanf格式字元串最後面不要加\n,比如scanf("%d\n", &a);這將導致scanf函數無法結束。

   

面試題

  int  a;

  請問a裡面有值嗎,是多少? 垃圾值

//判斷一個年份是否是閏年

    //能被4整除,但(並且)不能被100整除,或者能被400整除

    int year;//保存年份

    printf("請輸入一個年份:");

    scanf("%d", &year);

    if((year%4==0 && year%100!=0) || year % 400 == 0){

        printf("是閏年\n");

    }else{

        printf("不是閏年");

    }

 

  ※ 變數分析題:(註意變數的作用域)

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在某些項目中會需要載入大量的圖片,包括含有圖片的資源,或是網站製作時需要用到的圖片。會大大的影響載入速度。這裡總結了幾種前端關於圖片優化的方法: 1 使用恰當的圖片格式: 常見的圖片格式有png\jpg\gif等,有的修飾圖片或者有特殊要求的圖片例如背景要求透明可能更適合無損壓縮的png,而絕大多數 ...
  • 在項目中經常會遇到設置元素水平垂直居中的需求。而且具體的場景也不同,所以將個人總結的方法做個彙總,希望對瀏覽者有用。 以下所舉的例子都以一個html為準,這裡規定好一些公用樣式。 body { background color: efefef; } main { background color: ...
  • 嗯,昨天忙了一天沒來及發,過年啊,打掃啊,什麼搽窗戶啊,拖地啊,整理柜子啊,什麼亂七八糟的都有,就是一個字,忙。 好了,廢話也不多說,把自己學到的放上來吧。嗯,說什麼好呢,就說原型鏈啊 原型對象 每個javascript對象都有一個原型對象,這個對象在不同的解釋器下的實現不同。比如在firefox下 ...
  • 沒有設置width/height的時候,absolute元素自動填滿容器 ...
  • Node.js 博客搭建 一. 學習需求 Node 的安裝運行 會安裝node,搭建node環境 會運行node。 基礎模塊的使用 Buffer:二進位數據處理模塊 Event:事件模塊 fs:文件系統模塊 Net:網路模塊 Http:http模塊 ... NPM(node包管理工具) 第三方nod ...
  • $(document).ready(function(){ function time(){ var date=new Date(); var h=date.getHours(); var m=date.getMinutes(); var s=date.getSeconds(); $('div'). ...
  • ▓▓▓▓▓▓ 大致介紹 前面一片博客介紹了Git到底是什麼東西,如果有不明白的可以移步 Git學習之路(1)-Git簡介 ,這篇博客主要講解在Windows上安裝Git和創建一個版本庫 ▓▓▓▓▓▓ 安裝Git 因為我是用的Windows,所以就介紹一下在Windows上怎樣安裝,Linux、Mac ...
  • 一、簡介 Android的消息機制主要是指Handler的運行機制,那麼什麼是Handler的運行機制那?通俗的來講就是,使用Handler將子線程的Message放入主線程的Messagequeue中,在主線程使用。 二、學習內容 學習Android的消息機制,我們需要先瞭解如下內容。 平常我們接 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...