求教关于C语言的问题

小沈C 2012-08-02 10:47:43
main()
{
int x,y,z;
x=y=y=2;
++x||++y&&++z;
printf("x=%d,y=%d,z=%d\n",x,y,z);

}

为什么参考书上结果是 3,2,2啊,我自己是这样算的++y&&++z结果为1,后面的或不用算了,故 y=3,z=3,x=2啊,为什么啊?
...全文
198 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-08-20
  • 打赏
  • 举报
回复
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
baichi4141 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

&&的优先级高于||所以1楼解释明显错误了!
[/Quote]
有自己的主见是好事
固执于自己那点知识,那旁人也没资格说三道四

只说一句,这年头会去记操作符优先级的真不多……
baichi4141 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

&&的优先级高于||所以1楼解释明显错误了!
[/Quote]

Logical AND and OR Operators
逻辑与、逻辑或操作符
The logical operators treat their operands as conditions (Section 1.4.1, p. 12). The operand is evaluated; if the result is zero the condition is false, otherwise it is true. The overall result of the AND operator is TRue if and only if both its operands evaluate to TRue. The logical OR (||) operator evaluates to true if either of its operands evaluates to true. Given the forms

逻辑操作符将其操作数视为条件表达式(第 1.4.1 节):首先对操作数求值;若结果为 0,则条件为假(false),否则为真(true)。仅当逻辑与(&&)操作符的两个操作数都为 true,其结果才得 true 。对于逻辑或(||)操作符,只要两个操作数之一为 true,它的值就为 true。给定以下形式:

expr1 && expr2 // logical AND
expr1 || expr2 // logical OR



expr2 is evaluated if and only if expr1 does not by itself determine the result. In other words, we're guaranteed that expr2 will be evaluated if and only if

仅当由 expr1 不能确定表达式的值时,才会求解 expr2。也就是说,当且仅当下列情况出现时,必须确保 expr2 是可以计算的:

In a logical AND expression, expr1 evaluates to TRue. If expr1 is false, then the expression will be false regardless of the value of expr2. When expr1 is true, it is possible for the expression to be true if expr2 is also TRue.

在逻辑与表达式中,expr1 的计算结果为 true。如果 expr1 的值为 false,则无论 expr2 的值是什么,逻辑与表达式的值都为 false 。当 expr1 的值为 true 时,只有 expr2 的值也是 true ,逻辑与表达式的值才为 true。

In a logical OR expression, expr1 evaluates to false; if expr1 is false, then the expression depends on whether expr2 is true.

在逻辑或表达式中,expr1 的计算结果为 false。如果 expr1 的值为 false,则逻辑或表达式的值取决于 expr2 的值是否为 true。

The logical AND and OR operators always evaluate their left operand before the right. The right operand is evaluated only if the left operand does not determine the result. This evaluation strategy is often referred to as "short-circuit evaluation."

逻辑与和逻辑或操作符总是先计算其左操作数,然后再计算其右操作数。只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数。我们常常称这种求值策略为“短路求值(short-circuit evaluation)”。

——《C++ Primer》第四版
Jadenmai 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

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


哪里都看到这段话,实在没有心情看下去了。。
小沈C 2012-08-06
  • 打赏
  • 举报
回复
9楼不是和我算的一样,没有解决问题啊,关键结果是3,2,2啊
小沈C 2012-08-06
  • 打赏
  • 举报
回复
&&的优先级高于||所以1楼解释明显错误了!
smartsecuri 2012-08-02
  • 打赏
  • 举报
回复
多加括号,少一些这种容易混淆的代码
wshn13 2012-08-02
  • 打赏
  • 举报
回复
++x||++y&&++z;
这样的东西不要纠结了
N_Sev7 2012-08-02
  • 打赏
  • 举报
回复
我自己是这样算的++y&&++z结果为1,后面的或不用算了,
你是这样想的,但是++y&&++z在||的右边,左边的++X已经是真了,这个++y&&++z才是真正的不用算了
baichi4141 2012-08-02
  • 打赏
  • 举报
回复
逻辑运算符严格从左到右进行短路

++x返回3,非零为真,||左边为真值则不执行右边语句,因此++y与++z都未执行
ppsharp 2012-08-02
  • 打赏
  • 举报
回复
裘宗燕:C/C++ 语言中的表达式求值
ppsharp 2012-08-02
  • 打赏
  • 举报
回复
不要再纠结这些无聊的东西了,看看这个:
http://topic.csdn.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?8209
laoyu001 2012-08-02
  • 打赏
  • 举报
回复
在C语言中有这样的例子
a||b||c只要a为真(非0),就不必判断b和c,只有a为假,才判断b.a和b都为假,才判断c.
因为&&的优先级高于||,所以先算++y&&++Z,y=3,z=3,只有++y为真,++Z为真,++y&&++Z才为真. x=y=y=2;(z=2?)++y&&++Z为真.
就不要算++x,x=2,y=3,z=3.
HLLajyy 2012-08-02
  • 打赏
  • 举报
回复
这个只是一个优先级的问题,并且跟编译器有关系,这种问题纠结没啥用啊
赵4老师 2012-08-02
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

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

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

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!
MC_LoveX 2012-08-02
  • 打赏
  • 举报
回复
对于这种问题就没必要纠结了 关注些其他的会更好 跟编译器有关
夏天__ 2012-08-02
  • 打赏
  • 举报
回复
纠结这些没意思。
++x||++y&&++z;

把这个分开写,什么问题都解决了。

69,373

社区成员

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

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