请教一个C语言问题(在线等……)

zhailiwo 2011-11-26 11:20:02
请教一个C语言问题:
int i=j=k=-1;
i++&&++j||++k||i++;的执行顺序是怎样的?
最后输出i,j,k的值各是多少呢?
...全文
141 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
duke56 2011-11-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 keiy 的回复:]
日经贴:编译器有关的(不同编译器结果不同)
参考:
http://topic.csdn.net/u/20110826/09/601EBE9C-C2AE-4D63-A4E2-506C618BB654.html
[/Quote]

有的编译是从左往右的,而有的却是从右往左...编译器才是关键...
zhailiwo 2011-11-27
  • 打赏
  • 举报
回复
谢谢各位的帮助!结果i=1,k=0,j=0是正解!
发霉饼干 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhailiwo 的回复:]
请教一个C语言问题:
int i=j=k=-1;
i++&&++j||++k||i++;的执行顺序是怎样的?
最后输出i,j,k的值各是多少呢?
[/Quote]
逻辑与,逻辑或都是 左右结合性的,逻辑与的特点是,左右都为真就为真,逻辑或是有一个为真就为真,
所以,当左边的为真时,右边的是不会去在理会它的,也就是,
i++&&++j||++k||i++可以分成
i++&&++j
这个由于++j为假,所以,这个表达式为假
然后,就是假&&++k同样为假,
假&&i++ i=0;
所以,这个表达式为假,i=1,j=0,k=0。
树无影 2011-11-26
  • 打赏
  • 举报
回复

#include <stdio.h>

int main()
{
int i,j,k;

i = j = k = -1;

i ++ && ++ j || ++ k || i ++;
//首先i++的值为-1,++j的值为0,所以&&后为0,此时i的值0, ++k的值为0,和上面的结果0取或,结果
//还是为0,此时 j = k = 0, 再和0取或,结果为0,最后i= 1

printf("%d %d %d\n", i , j , k); //1 0 0

return 0;
}
flowingfirefly 2011-11-26
  • 打赏
  • 举报
回复
1. i++, i = 0;
2. ++j, j = 0;
3. i && j --> 0, 记作T, T=0;
4. ++k, k = 0;
5. T || k --> 0, 记作T1, T1=0;
6.i++, i = 1;
7.T1 || i --> 0;
所以这个式子的最重结果是0, i = 1, j = 0, k = 0
hondely 2011-11-26
  • 打赏
  • 举报
回复
int i=j=k=-1;
if (i++&&++j||++k||i++);
此时i++=-1为假 &&后面的不执行 直接到|| 后面 ++k=-1 再运行后面的 i++=0

故 i=1 j=-1, k=0
flowingfirefly 2011-11-26
  • 打赏
  • 举报
回复
i = 1 , j = 0, k = 0
yaoxinchao 2011-11-26
  • 打赏
  • 举报
回复
输出: 1 -1 0
猪头小哥 2011-11-26
  • 打赏
  • 举报
回复
说的通俗点就是:
1、逻辑与:当左边的表达式是真的时候 右边的表达式也要运算,因为你这是还不确定这整个逻辑与表达式的运算结果是真是假;当左边的表达式是假的是错误的时候 右边的表达式就不要运算了,因为不管右边的表达式是真是假 这个整的逻辑与运算结果肯定是假。

2、逻辑或:当左边的表达式是真的时候 ,右边的表达式就不要运算了,因为不管右边的表达式是真是假,这个逻辑或的运算结果最后肯定是真的;当左边的表达式是假的时候 ,右边的表达式也要运算,因为你这时候不知道整个逻辑或的表达式的运算结果是真是假。
猪头小哥 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hondely 的回复:]

int i=j=k=-1;
if (i++&&j++||k++||i++); /////////////////////
这个 -1&&-1 怎么 为真????? 求解释
[/Quote]
&&是逻辑与 非0既真 ,只要不是0就是真的。明白没??
SVKING 2011-11-26
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
int i,j,k;

i = j = k = -1;

if (i++&& ++ j || ++ k || i ++)
;
printf("%d %d %d\n", i , j , k);

return 0;
}
输出 1,0,0
柯本 2011-11-26
  • 打赏
  • 举报
回复
日经贴:编译器有关的(不同编译器结果不同)
参考:
http://topic.csdn.net/u/20110826/09/601EBE9C-C2AE-4D63-A4E2-506C618BB654.html
hondely 2011-11-26
  • 打赏
  • 举报
回复
int i=j=k=-1;
if (i++&&j++||k++||i++); /////////////////////
这个 -1&&-1 怎么 为真????? 求解释
炎热的夏季已经过去,家乡想必也要开始落叶了。如果我是小学生,让我以《秋》为题目作文,开头一定是“秋天是收获的季节”。是的,经过了春天的骚动,夏季的彷徨,来到了秋。这是新生报到的季节,动物贮藏食物的季节,马上就到十一长假的季节,这个季节更是收获的季节。 我们在播种时,势必首先考虑收成。种庄稼如此,学习语言更是如此。于是,“语言之争”是各个编程论坛必定讨论的话题,很多甚至是“X经”话题。对此,我的观点是:语言没有好坏之分,只有顺手不顺手和你能发挥到什么程度的问题。我们没有必要追求最新,“最先进”的编程方式,只需要学习好力所能及的语言。 VC的无所不能缺点是繁杂,稍有不慎就不知道什么地方出了包;VB常常被人耻笑过于简单,发布之后要带上一个“仓库”;Delphi虽然有快速开发的优势,但却姥姥不疼舅舅不爱的日渐西山…… 其实对于大多数人来说,我们使用什么应该是需求决定而不是语言本身决定需求,比如:我们希望自动根据数据生成表格,没有必要非用Delphi VC 调用 COM ,我们用用VBA就好了。因此,眼中只有那三种基本结构:判断 循环 跳转就差不多了,再高级一点,弄清楚什么是面向对象面向过程,随便一门语言都不会逃出这点东西。 我很佩服俄罗斯的软件,他们就是将语言工具发挥到极致的例子。比如:我在网上搜索到DOS下硬盘速度测试软件,竟然是Pascal编写的。 至于“学习好力所能及的语言”,我的意思是如果你身边有C语言的高手不妨向他请教或者同他切磋;如果你有学好数据结构的理想,不妨买一本Java描述数据结构的图书慢慢啃;如果你有网络数据库+界面的需求不妨考虑一下Delphi…… 因此,我的观点就是“语言没有好坏之分”,关键是你能掌握到什么程度。 当然,如果你能掌握汇编语言,这一切就更不在话下了。我很希望各位能够将学习语言当作乐趣,我们的杂志也将会以如何让读者在阅读中感到快乐感到成就感为目的。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧