xiaoyigechaos 发表于 2014-8-16 19:04:08

发一个简单的C程序,大家觉得结果是什么呢

本帖最后由 xiaoyigechaos 于 2014-8-16 19:05 编辑

int c=9,d=0;
c=(c++)%5;
d=c;
问d最后的结果是几
标准C编译器下

wujin715 发表于 2014-8-16 19:06:43

是4吧   

lcl 发表于 2014-8-16 19:21:50

0?4?                                                         

xy8800 发表于 2014-8-16 19:23:23

0               

谢冲 发表于 2014-8-16 19:37:21

5,c++先用c的值,再执行 c++

advarx21ic 发表于 2014-8-16 19:56:25

谢冲 发表于 2014-8-16 19:37
5,c++先用c的值,再执行 c++

有可能吗?

ding_ding0304 发表于 2014-8-16 20:03:54

0                  

mo_fish 发表于 2014-8-16 20:06:14

advarx21ic 发表于 2014-8-16 19:56
有可能吗?

有括号不是先执行括号里面的吗

weijia 发表于 2014-8-16 20:07:44

0吧,得5是不可能的,就算你说它后面再++,也是10啊,怎么可能是5

aheadlead 发表于 2014-8-16 20:10:54

这种问题没意义

青春从未醒 发表于 2014-8-16 20:11:16

是4,算了一下

aheadlead 发表于 2014-8-16 20:11:30

http://www.dlifep.com/?p=338

aheadlead 发表于 2014-8-16 20:12:57

上学期学计算机语言的时候 查了些资料 写了上面一篇博客 希望对楼主有帮助

abutter 发表于 2014-8-16 20:29:44

问个问题,什么是“标准C编译器”?

笑笑我笑了 发表于 2014-8-16 20:38:22

gcc 4.9.0编译结果,编译器会警告:
test3.c:6:7: 警告:‘c’上的运算结果可能是未定义的 [-Wsequence-point]
   c = (c++)%5;
       ^

执行结果是4,如10L所说一样,讨论起来没有意义,可能换VS编译又是一种结果了。

lcofjp 发表于 2014-8-16 20:40:17

根本就没有所谓的“标准C编译器”,楼主玩这个就是觉得脑细胞太闲了吧。

tennokoe 发表于 2014-8-16 20:44:55

结果和编译器有关

青春从未醒 发表于 2014-8-16 20:44:56

本帖最后由 青春从未醒 于 2014-8-16 20:54 编辑

我用gcc4.7结果也是4

xiaoyigechaos 发表于 2014-8-16 20:46:19

renpeng009 发表于 2014-8-16 20:39
我擦。。。你竟然还在纠结这个问题。。。

{:lol:} 没有纠结,我已经理解饿了,虽然这样的语句没什么意义,但确实是知识点所在,虽然很多时候是用不上的

xiaoyigechaos 发表于 2014-8-16 20:48:56

tennokoe 发表于 2014-8-16 20:44
结果和编译器有关

对所以我说标准C用keil编译 结果是1没想出来是怎么玩的

青春从未醒 发表于 2014-8-16 20:53:21

想起来了
int c=9;
c=(c++)%5;
这是考察 c++ 与++c的问题,区别在于c++是i先不自加,在语句完后自加,++C先自加;
所以此时有伴部分(C++)%5就是相当于9%5,结果是4

zhenghe 发表于 2014-8-16 20:55:56

4.这个也只能考试和面试用

xiaoyigechaos 发表于 2014-8-16 20:58:50

abutter 发表于 2014-8-16 20:29
问个问题,什么是“标准C编译器”?

应该把编译器去掉,是吧。就是ANSI C

csmjmcc 发表于 2014-8-16 21:02:56

青春从未醒 发表于 2014-8-16 20:53
想起来了
int c=9;
c=(c++)%5;


问题是,它还需要再赋值到“C”,如何解释?

wye11083 发表于 2014-8-16 21:10:01

5。按照C语言标准,c首先赋值9%5=4,然后c自增=5。VC2010编译结果为5。VC2010除了不支持C99外,其它特性支持比较完整。回头用CLang试一下。

xiaoyigechaos 发表于 2014-8-16 21:18:17

wye11083 发表于 2014-8-16 21:10
5。按照C语言标准,c首先赋值9%5=4,然后c自增=5。VC2010编译结果为5。VC2010除了不支持C99外,其它特性支 ...

这里的括号 有没有是不是一样的呀
先执行这个c%5=4然后 把执行c=c+1 这是c是10
再然后执行赋值操作,c=4
是不是这样呢
书上说,前缀和后缀形式的增值操作符都复制一份变量值得拷贝,意思好像是 这里使用的c++和c没什么关系了

csmjmcc 发表于 2014-8-16 21:19:43

wye11083 发表于 2014-8-16 21:10
5。按照C语言标准,c首先赋值9%5=4,然后c自增=5。VC2010编译结果为5。VC2010除了不支持C99外,其它特性支 ...

“然后c自增”,然后呢?还有一条指令需要执行d=c,求的d值。这个真的好糊涂。
MDK仿真结果是4,它好像不理会“C自增”了。

lcofjp 发表于 2014-8-16 21:24:42

一群砖家居然能讨论的如火如荼,我只能说呵呵了。想起了一个坛友发的贴,越是半瓶子水越能晃悠。
楼主你也不用担心在面试或者考试中遇到这种题,遇到这种题直接骂他SB他都不敢放屁。

xiaoyigechaos 发表于 2014-8-16 21:27:05

本帖最后由 xiaoyigechaos 于 2014-8-16 21:28 编辑

lcofjp 发表于 2014-8-16 21:24
一群砖家居然能讨论的如火如荼,我只能说呵呵了。想起了一个坛友发的贴,越是半瓶子水越能晃悠。
楼主你也 ...

我真的就遇到了这个问题,笔试题,针对linux系统下的一套软件题,选项有四个 0 1 4 5

wshtyr 发表于 2014-8-16 21:30:22

这个问题没有意义

这么写的目的是什么?减少源文件的大小?还是减少可执行代码的大小?还是增加可读性?
如果这些都没有作用,那有什么意义?

不多说,上图!
attach://212802.png
attach://212803.png
attach://212804.png

lcofjp 发表于 2014-8-16 21:31:19

xiaoyigechaos 发表于 2014-8-16 21:27
我真的就遇到了这个问题,笔试题,针对linux系统下的一套软件题,选项有四个 0 1 4 5
...

我只能告诉你不必在意。中国人出的书上错误百出太正常了。我看过一些二级辅导习题什么的,错误多了去了。当然我这计算机专业是不考二级的。

xiaoyigechaos 发表于 2014-8-16 21:33:34

wshtyr 发表于 2014-8-16 21:30
这个问题没有意义

这么写的目的是什么?减少源文件的大小?还是减少可执行代码的大小?还是增加可读性?


确实没有意义,应该避免出现这样的代码

momo_li 发表于 2014-8-16 21:36:05

这个例子告诉我们,以后写程序不要用这种写法{:lol:}

activeleo 发表于 2014-8-16 21:49:28

这种写法真的不好说哦,但是从软件测评和开发角度来看++这类型的运算符是不允许轻易出现的!以前的Linux系统和驱动开发都是严格受限的,不允许出现类似的运算!

csmjmcc 发表于 2014-8-16 22:05:41

wshtyr 发表于 2014-8-16 21:30
这个问题没有意义

这么写的目的是什么?减少源文件的大小?还是减少可执行代码的大小?还是增加可读性?


这位大侠,满电脑都是C啊,佩服佩服。{:handshake:}

gamalot 发表于 2014-8-16 23:10:51

这毫无意义, 凡是这样写代码的, 都应该开除

Keep It Simple and Stupid, KISS

{:mad:}

y574924080 发表于 2014-8-16 23:31:14

看到第一眼,就想到这是序列点问题吧,结果是未定义的吧

xiaozuowei118 发表于 2014-8-17 12:01:06

是5,应该是不会错的。下次写程序还是要注意,最好是分开写;

duanll 发表于 2014-8-17 12:32:17

本帖最后由 duanll 于 2014-8-17 12:33 编辑

楼主闲得慌啊。。。

wxty 发表于 2014-8-17 18:37:34

wye11083 发表于 2014-8-16 21:10
5。按照C语言标准,c首先赋值9%5=4,然后c自增=5。VC2010编译结果为5。VC2010除了不支持C99外,其它特性支 ...

支持!

不过看这类问题,就感觉在浪费时间,。

iquer 发表于 2014-8-17 20:07:45

weijia 发表于 2014-8-16 20:07
0吧,得5是不可能的,就算你说它后面再++,也是10啊,怎么可能是5

怎么会不是5?语句的执行顺序应该是:
c=c%5;
c++;
d=c;

csmjmcc 发表于 2014-8-17 20:53:16

iquer 发表于 2014-8-17 20:07
怎么会不是5?语句的执行顺序应该是:
c=c%5;
c++;


wshtyr大侠不是把三种编译环境的结果都贴出来了吗?为什么不不劳而获呢?

wye11083 发表于 2014-8-18 12:37:42

xiaoyigechaos 发表于 2014-8-16 21:18
这里的括号 有没有是不是一样的呀
先执行这个c%5=4然后 把执行c=c+1 这是c是10
再然后执行赋值操作,c ...

C标准中,++操作符是在当前语句中执行完毕之后再执行的,不是在一开始执行的。

zhuzaixingfu 发表于 2014-8-18 12:40:33

4。c++中的++在赋值之前发生。可以看一下汇编。

wye11083 发表于 2014-8-18 12:42:06

wshtyr 发表于 2014-8-16 21:30
这个问题没有意义

这么写的目的是什么?减少源文件的大小?还是减少可执行代码的大小?还是增加可读性?


呵呵。这个还是好的。我当年改过一个算法,J8的没有一行不嵌套个十几个++,不管怎样改,结果都跟原来不一样,最后无语,不改了。

ahjg_xujianxin 发表于 2014-8-18 13:53:18

答案应该是4

yu_studio 发表于 2014-8-18 14:19:05

TC执行结果:5
C++两边括号去掉,结果一样

xiaoyigechaos 发表于 2014-8-18 18:19:12

C和指针是这么说的,这道面试题最后能得出的结论是什么呢,难道是该面试者可以被分类为哪个编译器{:lol:}

梁国俭 发表于 2014-8-18 18:35:58

有意思{:smile:}

csmjmcc 发表于 2014-8-18 19:34:20

xiaoyigechaos 发表于 2014-8-18 18:19
C和指针是这么说的,这道面试题最后能得出的结论是什么呢,难道是该面试者可以被分类为哪个编译器...

lcofjp大侠不是告诉你了吧,可以骂面试者神经病。{:lol:}
不过楼主以权威文档表述了这个命题为无解。
哈哈,可惜没人面试我,否则我也可以充满自信地骂他脑袋进水!

w534172 发表于 2014-8-18 19:54:26

结果应当为4,但是大多数程序员不这么使用,程序会比较不好阅读,还不如多写一行,看起来也直观,但是有些公司面试就会考这些偏的东西,如运算符的优先级等等。

ilikemcu 发表于 2014-8-18 20:14:44

楼主的答案其实不重要,按照标准C的语法书对照看下即可明白。

重要的是总是写这种可读性很差的代码,除了炫耀自己的语言功力以外,对代码的后续维护和差错等应用,一点好处都没有,那是给自己和后继者挖坑的节奏{:titter:}

xiaoyigechaos 发表于 2014-8-18 21:55:44

csmjmcc 发表于 2014-8-18 19:34
lcofjp大侠不是告诉你了吧,可以骂面试者神经病。
不过楼主以权威文档表述了这个命题为无解。
哈 ...

之前看书没那么认真,这道面试题让我重新注意了一下书里面的细节。算是有所收获
如果提前把这个细节注意到了,在笔试题上注明一下书里面是这么给出的答案,不知道会是什么结果 {:lol:}

默默七 发表于 2014-8-18 22:23:24

感觉是1

wshtyr 发表于 2014-10-12 07:41:50

wye11083 发表于 2014-8-18 12:42
呵呵。这个还是好的。我当年改过一个算法,J8的没有一行不嵌套个十几个++,不管怎样改,结果都跟原来不一 ...

牵一发不明原因的动全身,换个编译器就不一样,我这种有点强迫症的是不能忍的{:lol:}

对于这种情况,首先我会尝试看懂算法,然后把那个纠结的部分用正常的语言替换掉;如果实在看不懂,反汇编也要知道它是按照什么顺序算的。何必呢,要效率就直接汇编,这么整给后人留坑

default 发表于 2014-10-12 09:27:55

C缺陷与陷阱

dengnian602 发表于 2014-10-12 09:41:07

受教了 很少有人这么写吧
页: [1]
查看完整版本: 发一个简单的C程序,大家觉得结果是什么呢