腾讯的主管面试我了个联合体的问题,我答不上来,怎么感觉下面的答案都不对,是选择题,能帮忙细细分析下吗? 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){...};表达式是不可能根据=左边的内容决定右边的类型的。 [解决办法]
[解决办法] 单目选择C [解决办法]
[解决办法] 第0题把union当不定长参数没原则性问题
第1题a++ <- 这是后缀运算符不是单目运算符,B是对的。 [解决办法] cca [解决办法]
[解决办法]
[解决办法] 0. 传参是未定义行为,还是用%d显示一个32位长度的数是未定义行为?
1. 很神奇,规范里前缀++ --也不算单目运算符 unary-operator: one of &*+-~!
另外Expressions with unary operators group right-to-left.
1.根据单目运算符的意义..可能是 AC 或者 BC [解决办法] VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”