读书人

腾讯的主管面试小弟我了个联合体的有关

发布时间: 2012-04-01 17:23:46 作者: rapoo

腾讯的主管面试我了个联合体的问题,我答不上来,怎么感觉下面的答案都不对,是选择题,能帮忙细细分析下吗?
union data
{
int i;
char c;
float f;
}a;
int n;
语句表达正确的是
A a =5;
B a ={2,'a',1.2};
C printf("%d\n",a);
D n =a :

1 关于单目运算符下面错误的是()
A ++ -- 都是单目运算符
B 单目运算符和操作数的结合是从右到左的
C一个表达式的单目操作符执行顺序是从左至右
D 一个表达式的单目操作符执行顺序是由编译器决定的

2 在函数中定义的变量默认是 ()
A auto
B 静态局部
C 全局
D ...记不清楚了


[解决办法]
C D A 吧
[解决办法]
大概是C,编译大概没问题,执行真的不清楚是不是想要的
[解决办法]
B是无论如何不可能对的,C99都没这种写法
[解决办法]
第一,这个是联合体,不是结构体,直接只能初始化第一个元素,编译器就算不报错也会忽略后面的内容,想初始化c得写{.c = 'a'}
第二,这个是表达式,根本不是初始化,要用{}你得写a = (union data){...};表达式是不可能根据=左边的内容决定右边的类型的。
[解决办法]

探讨

引用:
B是无论如何不可能对的,C99都没这种写法

为什么啊

[解决办法]
单目选择C
[解决办法]
探讨
union data
{
int i;
char c;
float f;
}a;
int n;
语句表达正确的是
A a =5;
B a ={2,'a',1.2};
C printf("%d\n",a);
D n =a :

1 关于单目运算符下面错误的是()
A ++ -- 都是单目运算符
B 单目运算符和操作数的结合是从右到左的
C一个表达式的单目操……

[解决办法]
第0题把union当不定长参数没原则性问题

第1题a++ <- 这是后缀运算符不是单目运算符,B是对的。
[解决办法]
cca
[解决办法]
探讨
cca

[解决办法]
探讨

第0题把union当不定长参数没原则性问题

第1题a++ <- 这是后缀运算符不是单目运算符,B是对的。

[解决办法]
0. 传参是未定义行为,还是用%d显示一个32位长度的数是未定义行为?

1. 很神奇,规范里前缀++ --也不算单目运算符
unary-operator: one of
&*+-~!

另外Expressions with unary operators group right-to-left.

不过仔细想想问题倒不是后缀运算符算不算单目运算符,而是后缀运算符优先级都比前缀运算符高,规定结合关系其实没实质意义。
[解决办法]
探讨

0. 传参是未定义行为,还是用%d显示一个32位长度的数是未定义行为?

1. 很神奇,规范里前缀++ --也不算单目运算符
unary-operator: one of
&*+-~!

另外Expressions with unary operators group right-to-left.

不过仔细想想问题倒不是后缀运算符算不算单目运算符,而是后缀运算符优先级都……

[解决办法]
更正9楼的答案..

1.根据单目运算符的意义..可能是 AC 或者 BC
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。


任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!

[解决办法]

探讨

引用:

0. 传参是未定义行为,还是用%d显示一个32位长度的数是未定义行为?

1. 很神奇,规范里前缀++ --也不算单目运算符
unary-operator: one of
&*+-~!

另外Expressions with unary operators group right-to-left.

不过仔……

[解决办法]
a.i 才是 int ;

a 本身的类型就是联合体.


printf要求格式控制符与参数类型严格匹配.
[解决办法]
探讨

a.i 才是 int ;

a 本身的类型就是联合体.


printf要求格式控制符与参数类型严格匹配.

[解决办法]
a怎么传的?
[解决办法]
C# code
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc, char* argv[]) {        union {                int a;                float b;                double c;        }test = {                .c = 1.3,                .b = 1.2,        };        return 0;} 

读书人网 >C语言

热点推荐