http://cocre.com/?p=873
前两天,Neo写了一篇《语言的歧义》其使用C语言讨论了一些语言的歧义。大家应该也顺便了解了一下C语言中的很多不可思异的东西,可能也是你从未注意到的东西。
是的,C语言并不简单,让我们来看看下面这些示例:
-
为什么下面的代码会返回0?(这题应该很简单吧)
int x;
return x == (1 && x);
本题主要是关于C/C++中变量初始化的问题。
-
为什么下面的代码会返回0而不是-1?
return ((1 - sizeof(int)) >> 32);
答案:sizeof 是一个unsigned的类型,所以……
-
代码作用域是一件很诡异的事,下面这个函数返回值是什么?
int x = 5;
int f() {
int x = 3;
{
extern int x;
return x;
}
}
答案:5
-
函数和函数指针可以相互转换。下面的语句哪些是合法的?
int (*pf)(void);
int f(void)
{
pf = &f; // 没问题
pf = ***f; // 取址?
pf(); // 函数指针可以调用?
(****pf)(); // 这又是什么?
(***************f)(); // 这个够变态了吧?
}
答案:全部合法。
-
初始化可能是ISO C中最难的部分了。无论是MSVC 还是GCC 都没有完全实现。GCC 可能更接近标准。在下面的代码中,i.nested.y 和i.nested.z的最终值是什么?
struct {
int x;
struct {
int y, z;
} nested;
} i = { .nested.y = 5, 6, .x = 1, 2 };
答案:2和6
-
下面这个示例是C语言的痛,main函数返回值是什么?
typedef struct
{
char *key;
char *value;
} T1;
typedef struct
{
long type;
char *value;
} T3;
T1 a[] =
{
{
"",
((char *)&((T3) {1, (char *) 1}))
}
};
int main() {
T3 *pt3 = (T3*)a[0].value;
return pt3->value;
}
答案:1(你知道为什么吗?)
-
下面这个例就更变态了。在GCC的文档中,这个语法是合法的,但是不知道为什么GCC并没有实现。下面的代码返回 2.
return ((int []){1,2,3,4})[1];
-
在下面的这个示例中,有一个“bar” 函数及其函数指针 “pbar” 的两个拷贝(static 类型一般作用于语句块或文件域).
int foo() {
static bar();
static (*pbar)() = bar;
}
static bar() {
return 1;
}
static (*pbar)() = 0;
-
下面的这个函数返回值是什么?取决于编译器是先处理unsigned long转型,还是负号。
unsigned long foo() {
return (unsigned long) - 1 / 8;
}
如果是:((unsigned long) - 1) / 8,那将是一个很大的数。
如果是: (unsigned long) (- 1 / 8 ), 那将是 0
是的,这样使用C语言可能很奇怪,不过我们可以从另一方面了解C语言的很多我们不常注意的特性。C语言其实并不容易。
分享到:
相关推荐
谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说...
掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it...
因此,学习C语言推荐大家可以从《C Primer Plus》开始入门,系统地了解C语言的基础语法和简单应用。 对C语言有一定认知之后,就可以通过《C和指针》和《C专家编程》以及《C陷阱与缺陷》等高阶图书学习C语言中最重要...
c语言入门很简单, 从入门到精通 ,学习c语言不在难
用C语言编的一个简单的计算器程序,大家可以看看。
C语言实现简单动画,C语言实现简单动画C语言实现简单动画
最近有刚开始学习编程的同学问我:“C语言是什么?C语言是怎么来的?C语言用来干什么?”。 对,在学习C语言之前,首先了解C语言的发展例程,这应该是每一个刚刚开始学习C语言的人应该 了解的,并且还要了解为什么要...
C语言入门很简单,C语言的简要资料,可以参考
C语言实现简易文本编译器--附源码
C语言编程技巧,不错的C语言书籍,书中的很多技巧都很实用
简易文本编译器, 基于c语言编写的。很基础
基于C语言的简易连连看,通过二维坐标选择将消除的字母。
c语言程序简单的入门介绍c语言程序简单的入门介绍
掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去 开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it...
C语言基础 简单C语言应用程序 大学 计算机专业 计算机科学与技术
c语言实现简单日历 int dayNum(int year,int month) { if(month==2) { if(judgeYear(year)==0) return 29; else return 28; } else { switch(month) { case 1: return 31;break; case 3: return 31;...
c语言程序简单的入门介绍 c语言程序简单的入门介绍
实现简单的C语言的网络通信,很好的基础例子,实现客户端服务器的通信。
c语言简单小题目
使用C语言编写的简单的图书管理系统 ,实现一般图书管理资源鉴定的功能