找 C/C++ 考题

我见过最难的当属是一大堆type cast后问你什么意思的了!
 
what does the expression x^=y^=x^=y do?

What is the output:
printf( "[%c]-[%c]", a[++i], a[i++] )
a = "ABCDE"
i = 2;
 
最初由 sable93 发布
what does the expression x^=y^=x^=y do?

What is the output:
printf( "[%c]-[%c]", a[++i], a[i++] )
a = "ABCDE"
i = 2;
第一个,找抽
第二个,编译错误

要是有人问我这个问题,我得告诉他,这些skill只能骗小孩,么有什么用处。这样写程序大大地不行,这样的程序员良心大大地坏了,公司迟早倒闭地干活。
 
当处在被面试者的地位时说话的底气可能就不会那么足了。
如果说第一个有点胡搅蛮缠的话,后面的则是看似简单其实看有多少编译原理经验的东东了。
 
最初由 sable93 发布
当处在被面试者的地位时说话的底气可能就不会那么足了。
如果说第一个有点胡搅蛮缠的话,后面的则是看似简单其实看有多少编译原理经验的东东了。
第二个问题除了i++/++i地执行顺序以外,还后什么高深的“编译原理”东东西西的,愿闻其祥。
 
最初由 sable93 发布
what does the expression x^=y^=x^=y do?

What is the output:
printf( "[%c]-[%c]", a[++i], a[i++] )
a = "ABCDE"
i = 2;

两个都与编译器有关. 不同的编译器结果会不同.

第一题有编译器先把表达式保存,中间结果不影响初始变量:
结果就应为:
y = y^(x^y);
x = x^(y^(x^y));

. 多数编译器中间结果影响变量:
x = x^y;
y = y^x;
x = x^y;

第二题, VC 是从后往前取参数(LIFO). 所以,在 VC 上的结果是 D,C. 在 cc 上和ac,gcc 上结果都不同.
 
最初由 dragonLinux 发布
我见过最难的当属是一大堆type cast后问你什么意思的了!

贴出来让大伙开开眼界吧!
 
看来你还真是个高手,熟识各种编译器!
我会找找,然后你解释一下!

what does the expression x^=y^=x^=y do?
我也没记住它的优先级,是从左到右,还是反之,可以反汇编看一下就知道了是不是中间结果被影响。

What is the output:
printf( "[%c]-[%c]", a[++i], a[i++] )
a = "ABCDE"
i = 2;
这个也依赖于它的使用场景,如使用什么调用方式,如:stdcall,c, pascal,fastcall...,但一般来说printf是应该遵循C调用规则的,否则会出问题。
所以可能是:[E]-[C]
 
最初由 老兵新手 发布


两个都与编译器有关. 不同的编译器结果会不同.

第一题有编译器先把表达式保存,中间结果不影响初始变量:
结果就应为:
y = y^(x^y);
x = x^(y^(x^y));

. 多数编译器中间结果影响变量:
x = x^y;
y = y^x;
x = x^y;

第二题, VC 是从后往前取参数(LIFO). 所以,在 VC 上的结果是 D,C. 在 cc 上和ac,gcc 上结果都不同.
第二题,再想想
 
最初由 dragonLinux 发布
看来你还真是个高手,熟识各种编译器!
我会找找,然后你解释一下!

what does the expression x^=y^=x^=y do?
我也没记住它的优先级,是从左到右,还是反之,可以反汇编看一下就知道了是不是中间结果被影响。

What is the output:
printf( "[%c]-[%c]", a[++i], a[i++] )
a = "ABCDE"
i = 2;
这个也依赖于它的使用场景,如使用什么调用方式,如:stdcall,c, pascal,fastcall...,但一般来说printf是应该遵循C调用规则的,否则会出问题。
所以可能是:[E]-[C]
所有ANSI c language 支持的函数调用,入栈都是从右到左,所不同的是谁清栈。告诉我从左到右入栈怎么实现...参数传递?至于__pascall calling convension, 是BCB为了支持delphi的搞的,完全破坏了C的初衷。
实际上求值和入栈并不一定同样顺序,所以我说这样写程序的人是找抽。以这样“技巧”为荣的程序员只能被列为junior.
 
最初由 mooncake 发布

所有ANSI c language 支持的函数调用,入栈都是从右到左,所不同的是谁清栈。告诉我从左到右入栈怎么实现...参数传递?至于__pascall calling convension, 是BCB为了支持delphi的搞的,完全破坏了C的初衷。
实际上求值和入栈并不一定同样顺序,所以我说这样写程序的人是找抽。以这样“技巧”为荣的程序员只能被列为junior.
同意mooncake的看法,真的在程序里写出这样的代码来只会自找麻烦。我最近遇到一个笔试题,要求使用模版编写一个双向链表来实现栈和队列的功能,要求所有函数异常透明并且异常安全(比如说在Pop函数里有可能会间接调用到实例化类的拷贝构造函数,而该拷贝构造函数有可能会抛出异常,要求Pop函数必须继续抛出该异常而且不能损坏内部数据结构),然后写一个针对特定类的偏特化实现。另外一个题目则仍然是实现一个string类,但是要求实现类似于MFC中CString的内存实例共享。
 
最初由 mooncake 发布

所有ANSI c language 支持的函数调用,入栈都是从右到左,所不同的是谁清栈。告诉我从左到右入栈怎么实现...参数传递?至于__pascall calling convension, 是BCB为了支持delphi的搞的,完全破坏了C的初衷。
实际上求值和入栈并不一定同样顺序,所以我说这样写程序的人是找抽。以这样“技巧”为荣的程序员只能被列为junior.

这个我不能完全同意,libc的函数调用使用什么规则完全可以自己定,只不过你用了特殊的后,其它软件可能不知道就不能用了,就象windows一些api必须是winapi一样,大家必须遵守一个共同的规定而已。
至于 pascal的调用规范,我不知道是谁发明的,至少它也有它的优势相对C调用规范,就是节省代码空间。
实际上求值和入栈并不一定同样顺序,是可以这样,也不至于找抽吧,至少人家也懂些东西,总比不懂强。虽然这样的题没什么大意义,但至少这代表了一个人的知识宽度。
告诉我从左到右入栈怎么实现...参数传递?什么意思?
 
只是不知道咱们几个,谁有工作啊?介绍介绍
 
最初由 dragonLinux 发布
看来你还真是个高手,熟识各种编译器!
我会找找,然后你解释一下!

what does the expression x^=y^=x^=y do?
我也没记住它的优先级,是从左到右,还是反之,可以反汇编看一下就知道了是不是中间结果被影响。

What is the output:
printf( "[%c]-[%c]", a[++i], a[i++] )
a = "ABCDE"
i = 2;
这个也依赖于它的使用场景,如使用什么调用方式,如:stdcall,c, pascal,fastcall...,但一般来说printf是应该遵循C调用规则的,否则会出问题。
所以可能是:[E]-[C]

偶用过几种 C 编译器,但都没能深究,半吊子而已.
至于 x^=y^=x^=y, 根据赋值表达式先计右值的原则,
可如此解释吧: x^=y^=x^=y
--> x = x^(y^=x^=y)
--> x = x^(y = y^(x^=y))
--> x = x^(y = y^(x = x^y))
所以这条语句应该是从右到左计值.

第二题: 有编译器是表达式结束后即计算 i++ 的值, 而不是整条语句. 所以
输出 [E]-[C] 也是对的. C 标准里对此没规定, 所以编译器设计者可自由发挥.

第二题, 如果出题者不是想考考生对编译知识的了解, 而是想考 ++i, i++, 和一般参数传递过程, 只能说出题的人自己面太窄.
 
后退
顶部