符號的技巧
專題二:符號的技巧。包括以下章節:
- 註釋符號
- 接續符和轉義符
- 單引號和雙引號
- 邏輯運算符使用分析
- 位運算符分析
- ++、–操作符使用分析
- 優先級和類型轉換分析
問題
- int = 3; (++i)+(++i)+(++i)=?
- c語言灰色地帶
6-1.c
#include<stdio.h>
int main()
{
int i = 3;
//(++i)+(++i)+(++i)=?
//編譯器1:三個小括號計算一遍,得到i=6,然後6+6+6=18
//編譯器2:前兩個小括號計算,得到5+5;然後計算最後一個小括號,5+5+6=16
//一般編譯器是按照編譯器2來編譯的
//在編程中儘量不要這樣寫,因爲可能得到的不是我們想要的結果。
printf("%d\n", (++i)+(++i)+(++i));
return 0;
}
結果:
- 逗號表達式
#include<stdio.h>
int main()
{
int x;
int i = 3;
//(++i, i++, i+10)=?
//從左到右的順序求值,最後一個表達式的值就是逗號表達式的值
//++i=4,i++=4(i=5,表達式的值=4),i+10=15
x = (++i, i++, i+10);
printf("%d\n", x);
return 0;
}
結果:
c語言中的貪心法
- 編譯器處理每個字符應該儘可能多的包含字符
- 編譯器以從左到右的順序一個一個儘可能多的讀入字符
- 當即將讀入的字符不可能和已讀入的字符組成合法字符爲止
實例分析6-1
#include<stdio.h>
int main()
{
int i = 0;
//編譯器讀到++i++,懵逼了,出錯。
int j = ++i+++i+++i;
//++i++,編譯器編譯錯誤相同
//1++,編譯器編譯錯誤相同
int a = 1;
int b = 2;
int c = a+++b;
int* p = &c;
//b=b/*p;
return 0;
}
結果:
#include<stdio.h>
int main()
{
int i = 0;
//編譯器讀到++i++,懵逼了,出錯。
//int j = ++i+++i+++i;
//++i++,編譯器編譯錯誤相同
//1++,編譯器編譯錯誤相同
int a = 1;
int b = 2;
//a+++b,編譯器編譯正確。即a++ + b
int c = a+++b;
printf("%d\n", c);
int* p = &c;
//b=b/*p;
return 0;
}
結果:
#include<stdio.h>
int main()
{
int i = 0;
//編譯器讀到++i++,懵逼了,出錯。
//int j = ++i+++i+++i;
//++i++,編譯器編譯錯誤相同
//1++,編譯器編譯錯誤相同
//int a = 1;
//int b = 2;
//a+++b,編譯器編譯正確。即a++ + b
//int c = a+++b;
//printf("%d\n", c);
int* p = &c;
//編譯出錯。根據貪心法規則,編譯器會認爲/*爲註釋符號。
b=b/*p;
return 0;
}
正確的寫法應該是加上空格
#include<stdio.h>
int main()
{
int i = 0;
//相當於(++i)+ (++i)+ (++i):先計算前2個括號,i=2,2+2;計算後一個括號,2+2+3=7
int j = ++i+ ++i+ ++i;
printf("%d\n", j);
int a = 1;
int b = 2;
int c = a+++b;
printf("%d\n", c);
int* p = &c;
//2/3=0,取整數等於0
b = b / *p;
printf("%d\n", b);
return 0;
}
結果: