程序猿之---C语言细节1(==与=、函数指针、数组字符串printf、int ((b));、char b =‘abcd’)

来源:互联网 发布:linux 查看gpu显存 编辑:程序博客网 时间:2024/05/16 11:30

此系列使用编译器为mingw5,cfree,win7 64位

主要内容:==与=、函数指针、数组字符串printf、int  ((b));、char b =‘abcd’

一、==与=

见代码给出易出错之处


二、函数指针

如何理解(*(void(*)())0)();


三、数组字符串printf、int  ((b))

在求值时((b))是整型,则b也是整型,如函数int b(); 表达式b()求值结果为整型


四、char b =‘abcd’

char test = 'abcd'; // 编译器以后一个字符覆盖前一个字符处理,最终输出d


#include <stdio.h>int main(int argc, char *argv[]){char c;int ((b)) = 1;   // 在求值时((b))是整型,则b也是整型,如函数int b(); 表达式b()求值结果为整型/*  引申如int *ff();  int (*ff)(); ()优先级高于* , <*ff()和*(ff())含义一样>第一个为函数ff,返回int型指针 *  第二个为ff函数指针,返回int类型 ;调用此函数的方法为(*ff)();  *  (float (*)()) 表示一个“指向返回值为浮点类型的函数的指针”的类型转换符  *  *  如何理解(*(void(*)())0)(); *  1、(void (*)())0  表示将常数0转型为“指向返回值为void的函数的指针” 类型 *  2、(void (*)())0  可以用来代替函数指针ff ,则 (*(void(*)())0)();是对函数的调用 * 可以typedef void (*func)();  (*(func)0)(); */int a = 0622;   // 8进制 char hello[] = {'gke'/*只输出e*/,'a','d','\n','\0'}; // '\0'为字符串结束符 char test = 'abcd';  // 编译器以后一个字符覆盖前一个字符处理,最终输出d printf("test = %c\n",test);printf("b = %d\n",b); //这里如果我写成 printf("b = %d\n");输出b=100,为什么? while(c = " " || c == '\t' || c == "\n")// 始终为真,小心‘=’和‘==’ ,如果写成while( c == '\t' ||c = " "|| c == "\n")则出错,因为=优先级比while                                            //里的其它运算符都低,可解释为while((c=='\t' || c) = (" " || c == "\n")) c == '\t' || c 不能出现在赋值运算                                            //符左边,常常我们写成while('\t' == c || " " == c || "\n" == c)这样==写成=编译器能检测出错误{printf("Hello C-Free!%d\n",a);printf(hello);  // 输出字符串 printf(&a);  //直接使用a出错,使用&a则没有什么反应,有警告但没出错 }return 0;}
参考书籍《c陷阱与与缺陷》

输出:


0 0
原创粉丝点击