1.short, float, double在局部变变量还是全局变量时,都会被編譯器初始化為0,int, long只有在全局变量时才会被初始化為0。
2.弱符号与强符号(對於以下程序編譯器報錯的解釋)
(实验(3)
将头文件全部赋值源文件myext1.c 1 #include "my1.h" 2 #include "my2.h" 3 #include <stdio.h> 4 int main() 5 { 6 printf("i = %d\n", i); 7 8 return 1; 9 }一个头文件 my1.hint i = 5;一个头文件 my2.hint i = 2;)对于C++来说,弱符号通常来源于未初始化的全局变量。而默认情况下,编译器将函数和初始化了的全局变量作为强符号。
可以通过gcc的 __attribute__((weak)) 来定义任何一个强符号为弱符号。
不同的目标文件中不能有同名的强符号,否则不能链接在一起。
如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么该名称在链接时选择强符号。
如果一个符号在所有的目标文件中都是弱符号,则选择占用空间(字节数)最大的一个。
3.用static来声明一个变量的作用有二:
(1) 对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在(2) 外部变量用static来声明,则该变量的作用只限于本文件模块4.注意自己不要犯如下所提示的错误:
在该程序中,绝大部分工作都是在循环体中完成的。循环体中的赋值语句:
1 | celsius = 5 * (fahr - 32) / 9; |
用于计算与指定华氏温度相对应的摄氏温度值,并将结果赋值给变量 celsius。在该语句中,之所以把表达式写成先乘 5 然后再除以 9 而不是直接写成 5 / 9,其原因是在 C 语言及许多其它语言中,整数除法操作将执行舍位,结果中的任何小数部分都会被舍弃。由于 5 和 9 都是整数,5 / 9 相除后经截取所得的结果为 0,因此这样求得的所有摄氏温度都将为 0。
5.由于输出的数不是右对齐的,所以输出的结果不是很美观。这个问题比较容易解决:如果在 printf 语句的第一个参数的%d 中指明打印宽度,则打印的数字会在打印区域内右对齐。例如,可以用语句
1 | printf ( " %3d %6d\n" , fahr, celsius); |
打印 fahr 与 celsius 的值,这样,fahr 的值占 3 个数字宽,celsius 的值占 6 个数字宽,输出的结果如下所示:
1 | 0 -17 |
2 | 20 -6 |
3 | 40 4 |
4 | 60 15 |
5 | 80 26 |
6 | 100 37 |
若,在printf的字符串中出現%3.1f,則表示該數至少需要三個字符的寬度,並且帶有一位小數,且小數部分將會四捨五入,比如需要三位小數,那麼3.6666將被表示成3.667;若為%3.0f,則表示至少需要三個字符的寬度,並且不帶小數部分.另外,在數字的前面加上正負號可以讓數字左對齊與右對齊,加負號為左對齊,如果記不住正負號分錶代表哪個對齊,可以記住數軸上的數字在左邊的為負數就可以了.在右對齊的情況下,如果實際數字寬度超過指定的數字寬度,那麼數字在顯示的時候將向右延伸.
6.如果某个算术运算符的所有操作数均为整型,则执行整型运算。但是,如果某个算术运算符有一个浮点型操作数和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮点型。例如,在表达式 fahr – 32(fahr為浮點型) 中,32 在运算过程中将被自动转换为浮点数再参与运算。不过,即使浮点常量取的是整型值,在书写时最好还是为它加上一个显式的小数点,这样可以强调其浮点性质,便于阅读。
7.#define 指令可以把符号名(或称为符号常量)定义为一个特定的字符串:
#define 名字 替换文本
在该定义之后,程序中出现的所有在 #define 中定义的名字(既没有用引号引起来,也不是其它名字的一部分)都将用相应的替换文本替换。其中,名字与普通变量名的形式相同:它们都是以字母打头的字母和数字序列;替换文本可以是任何字符序列,而不仅限于数字。
8.标准库提供的输入/输出模型非常简单。无论文本从何处输入,输出到何处,其输入/输出都是按照字符流的方式处理。文本流是由多行字符构成的字符序列,而每行字符则由 0 个或多个字符组成,行末是一个换行符。标准库负责使每个输入/输出流都能够遵守这一模型。使用标准库的 C 语言程序员不必关心在程序之外这些行是如何表示的。
9.下列语句 nl = nw = nc = 0; 将把其中的 3 个变量 nl、nw 与 nc 都设置为 0。这种用法很常见,但要注意这样一个事实:在兼有值与赋值两种功能的表达式中,赋值结合次序是由右至左。所以上面这条语句等同于 n1 = (nw = (nc = 0));
10.若一個常量帶有0前綴,這其為八進制數,例如:037表示十進制的31.
11.常量表達式是僅僅只包含常量的表達式.這種表達式在編譯的時候求值而不再運行的時候求值.
12.編譯時可以將多個字符串常量連接起來,例如"hello"" world"等價于"hello world"字符串常量的連接為將較長的字符串分散在若干個源文件中提供了支持.
13.位操作符只能運用于整型操作數,無符號或則有符號均可.
14.表達式x<<2將把x的值左移2位,右邊突出的2位用0填補,該表達式等價于對左操作數乘以4對無符號數右移時,左邊突出的空白將用0填補,對有符號數右移時,將根據具體機器進行用符號位填補或則用0填補.
15.C标准没有规定有符号数的右移如何处理。那么对于有符号数的右移处理,就由编译器决定。右移一个带符号数在某些机器上会用符号位进行填充(“算数移位”)而在其他机器上会用0进行填充(“逻辑移位”)。 在使用移位操作时,一定要注意操作数的类型,一定要保证为无符号数。这样结果才是我们所期待的结果。整数右移一位,就等于除于二,并且右移操作比除法运算要高效的多,但要注意有符號數和無符號數.
16.同大多数语言一样,C语言没有指定同一运算符中多个操作数的计算顺序(&&、||、?:和,运算符外)。例如,在形如 x = f() + g();的这句语句中,f()可以在g()之前计算,也可以在g()之后计算。因此,x的值依賴編譯器的具體實現.若想保證特定的計算順序,可以把中間結果保存在臨時變量中.類似的,c語言也沒有指定函數各參數的求職順序因此,下列語句printf("%d%d\n".++n,power(2,n));在不同的編譯器中可能會產生不同的結果,取決於n的自增運算在power調用之前還是調用之後.注意避免寫代碼時可能隱含的該類有爭議的代碼
17.函数中每个局部变量只在函数被调用时存在,在函数执行完毕退出时消失。
由于自动变量只在函数调用执行期间存在,因此,在函数的两次调用之间,自动变量不保留前次调用的赋值,且在每次进入函数时都要显式为其赋值。如果自动变量没有赋值,则其中存放的是无效值。
18.(該段轉自csdn)如果是const的全局变量,如果想要被其他文件访问,需要在定义的时候,加上extern关键字,表示它可以在其他文件被声明使用的,即可以被整个程序(一个程序可能包括多个源文件)访问,否则的话,这个变量只能在它被定义的文件里面被访问,其他文件不能访问。
//1.cpp
extern const int bufsize=10;
//2.cpp
extern const int bufsize;
这时候你也许会问,为什么非const变量定义的时候为什么没有extern?
答:非const变量默认为extern。而const变量默认为文件内作用域,如果想要在其他文件里被访问,必须显示的指定它为extern。
19.宏定義也可以帶參數,但要注意表達式存在副作用.
比如#define max(A,B) ((A)> (B)?(A):(B))
x=max(i++,j++);
展開後他將對每個參數執行兩次自增操作.