第三章 簡單的算術運算和表達式
算數運算符:一元、二元、三元(條件運算符)
1/2是整型除法,1.0/2是浮點數除法
求余運算(%)限定參與運算的兩個操作數必須為整數,不能對兩個實型數據進行求余運算
余數的符號與被除數的符號相同
C語言中沒有冪運算符!
//L3-1
#include <stdio.h>
main()
{
int x = 153, b0, b1, b2, sum; b2 = x / 100; /* 計算百位數字 */ b1 = (x - b2 * 100) / 10; /* 計算十位數字 */ b0 = x % 10; /* 計算個位數字 */ sum = b2 + b1 + b0; printf("b2=%d, b1=%d, b0=%d, sum=%d\n", b2, b1, b0, sum); }
//運行結果 b2=1, b1=5, b0=3, sum=9
復合的賦值運算符
- +=:a+=b; 等價於 a=a+b;
- -=
- *=
- /=
- %=
增1和減1運算符(一元運算符)
- ++x:前綴運算符,在變量使用之前對其執行加1操作
- m=++n; 等價於 n=n+1;m=n;
- x++:后綴運算符,先使用變量的當前值,然后對其進行加1操作
- m=n++; 等價於 m=n;n=n+1;
良好的程序設計風格提倡在一行語句中一個變量最多只出現一次增1或者減1運算
不建議在程序中使用復雜的增1和減1運算符,過多的增1和減1運算符會導致程序的可讀性變差
宏常量和宏替換
//L3-2
#include <stdio.h>
main()
{
double r = 5.3; /* 圓的半徑 */ printf("circumference = %f\n", 2*3.14159*r); printf("area = %f\n", 3.14159*r*r); }
//運行結果
circumference = 33.300854
area = 88.247263
//L3-3
#include <stdio.h>
main()
{
double r; printf("Input r:"); /* 提示用戶輸入半徑的值*/ scanf("%lf", &r); /* 以雙精度實型格式從鍵盤輸入半徑的值 */ //scanf()函數也是C的標准輸入/輸出函數 //&稱為取地址運算符,&r指定了用戶輸入數據存放的變量的地址 printf("circumference = %f\n", 2*3.14159*r); printf("area = %f\n", 3.14159*r*r); }
//運行結果
Input r:6
circumference = 37.699080 area = 113.097240
幻數:在程序中直接使用的常數
- 導致程序的可讀性變差
- 容易發生書寫錯誤
- 難以修改
把幻數定義為宏常量或const常量,用一個簡單易懂的名字來代替一個長字符串
能提高程序的可讀性
//L3-4
#include <stdio.h>
#define PI 3.14159 /* 定義宏常量PI */
main()
{
double r; printf("Input r:"); scanf("%lf", &r); printf("circumference = %f\n", 2*PI*r); /*編譯時PI被替換為3.14159*/ printf("area = %f\n", PI*r*r); /*編譯時PI被替換為3.14159*/ }
宏定義中的標識符被稱為宏名
習慣上用字母全部大寫的單詞來命名宏常量
將程序中出現的宏名替換為字符串的過程稱為宏替換
宏定義的宏名與字符串之間可有多個空白符,無需加等號
字符串后不以分號結尾
宏定義不是C語句,而是一種編譯預處理命令
宏常量沒有數據類型,const常量可以聲明數據類型
//L3-5
#include <stdio.h>
main()
{
const double PI = 3.14159; /* 定義實型的const常量PI */
double r; printf("Input r:"); scanf("%lf", &r); printf("circumference = %f\n", 2*PI*r); printf("area = %f\n", PI*r*r); }
表達式中的自動類型轉換:
- C編譯器在對操作數進行運算之前將所有操作數都轉換為取值范圍較大的操作數類型,稱為類型提升。
- 類型提升可以避免數據信息丟失的情況發生。
在一個賦值語句中,若賦值運算符左側的變量的類型與右側的表達式的類型不一致,則賦值時會發生自動類型轉換
類型轉換的規則是:將右側表達式的值轉換為左側變量的類型
//L3-6
#include <stdio.h>
main()
{
int n = 256; float f = 3.6; double d = 2.5; n = f; f = n; d = f; printf("n = %d\n", n); printf("f = %f\n", f); printf("d = %f\n", d); }
//運行結果
n = 3
f = 3.000000 d = 3.000000
將取值范圍小的類型轉換為取值范圍大的類型是安全的,而反之則是不安全的
盡量避免使用這種自動的類型轉換,建議使用強制類型轉換運算符
強制類型轉換就是明確地表明程序打算執行哪種類型轉換,有助於消除因隱式的自動轉換而導致的程序隱患
//L3-7
#include <stdio.h>
main()
{
int m = 5; printf("m/2=%d\n", m/2); printf("(float)(m/2) = %f\n", (float)(m/2)); printf("(float)m/2 = %f\n", (float)m/2); printf("m = %d\n", m); }
//運行結果
m/2=2
(float)(m/2) = 2.000000 (float)m/2 = 2.500000 m = 5
常用的標准數學函數
//L3-8
#include <stdio.h>
#include <math.h>//C的標准數學函數庫提供了豐富的數學函數
//使用這些數學函數時,只要在程序的開頭加上如下的編譯預處理命令即可
main() { float a, b, c, s, area; printf("Input a,b,c:"); scanf("%f,%f,%f", &a, &b, &c); s = (float)(a + b + c) / 2; area = sqrt(s * (s - a) * (s - b) * (s - c)); printf("area = %f\n", area); }
//運行結果
Input a,b,c:3,4,5
area = 6.000000
常用的標准數學函數
sqrt(x) | 平方根 |
fabs(x) | 絕對值 |
log(x) | 自然對數 |
log10(x) | 以10為底的對數 |
exp(x) | 指數 |
pow(x,y) | x的y次方 |
sin(x) | 正弦 |
cos(x) | 余弦 |