学生来看这8道C语言谜题你能答对几个
C语言8个语言谜题答对几个
1、下面的程序并不见得会输出"hello-std-out"你知道为什么吗?
参考答案:stdout和stderr是不同设备描述符。stdout是块设备,stderr则不是。对于块设备,只有当下面几种情况下才会被输入:遇到回车; 缓冲区满;flush被调用。而stderr则不会。
2、下面的程序看起来是正常的,使用了一个逗号表达式来做初始化。可惜这段程序是有问题的。你知道为什么吗?
参考答案:这个程序会得到编译出错(语法出错)。逗号表达式是没错可是在初始化和变量声明时,逗号并不是逗号表达式的意义。这点要区分,要修改上面这个程序,你需要加上括号:"int a=(1,2);"。
3、下面的程序会有什么样的输出呢?
参考答案:程序会输出4321,你知道为什么吗?要知道为什么,你需要知道printf的返回值是什么。printf返回值是输出的字符个数。
4、下面的程序会输出什么?
参考答案:该项程序输出:"0121095237632"。原因是:浮点数是4个字节,12.5f转成二进制是:
01000001010010000000000000000000,十六进制是:0x41480000,十进制是:1095237632。所以,第二和第三个输出相信大家也知道是为什么了。
5、下面,我们再来看一个交叉编译的事情,下面的两个文件可以编译通过吗? 如果可以通过,结果是什么?
参考答案:该程序可以编译通过,但运行时会出错。为什么呢? 原因是在另一个文件中用 extern int *arr来外部声明一个数组并不能得到实际的期望值,因为他们的类型并不匹配。所以导致指针实际并没有指向那个数组。
6、请问下面的程序会有什么潜在的危险?
参考答案:本题很简单了。这个程序的潜在问题是,如果用户输入了超过80个长度的字符,那么就会有数组越界的问题了,你的程序很有可能会crash了。
7、请问下面的程序输出是什么?(绝对不是10)
参考答案:本题输出的是100。为什么呢?问题就出在"y = y/*p;"上了我们本来想的是"y /(*p)”,然而,我们没有加入空格和括号,结果"y/*p“中的"/*"被解释成了注释的开始。于是,这也是整个恶梦的开始。
8、下面的输出是什么?
参考答案:本题并不简单的是考前缀++或反缀++,本题主要考的是&&和|1的短路求值的问题。
所谓短路求值:对于(条件1 && 条件2),如果“条件1”是false,那“条件2”的表达式会被忽略了。对于(条件1条件2),如果“条件1”为true,而“条件2”的表达式则被忽略了