gpt4 book ai didi

c - 需要解释输出

转载 作者:太空狗 更新时间:2023-10-29 15:52:55 24 4
gpt4 key购买 nike

代码:

#include<stdio.h>
int main()
{
int j = 7, i = 4;
j = j || ++i && printf("you can");
printf("%d %d",i,j);
return 0;
}

输出:4 1

[代码链接][1]

  1. 前缀运算符的优先级高于逻辑运算符。2.逻辑&&的优先级高于逻辑||
  2. 在逻辑 AND(&&) 中,如果第一个操作数的计算结果为 false,则不会计算第二个操作数,在逻辑 OR(||) 中,如果第一个操作数的计算结果为 true,那么 second 将不会被评估。
  3. 完整表达式的计算结果为 true,因此 j 为 1。

疑问:

  1. 为什么这里没有遵循第一条规则?不应该是正确的吗?

    j=(j||((++i) &&printf("you can")));

因此 i 的值在 printf 语句中变为 5。

为什么这里违反了一般优先规则?当两个运算符的优先级相同时,结合性开始起作用。编译器难道不应该首先查看是评估 || 还是 &&

如果 || 首先被评估,据我所知这不应该,那么结果是正确的。但是,如果不首先对其求值,则应该打印 youcan51。

最佳答案

在这个表达式中:

j = j || ++i && printf("you can");

|| 之后有一个序列点,它是从左到右求值的。由于 j 非零,因此不计算表达式的其余部分。因此,j || (....) 变为 true,即 1。由于 is ++i 未计算 i 仍然为 4。因此,输出为 4, 1 .

来自 C 标准:

Annex C

— The end of the first operand of the following operators: logical AND && (6.5.13); logical OR || (6.5.14); conditional ? (6.5.15); comma , (6.5.17).

如果 j 为零,则 ++i && printf("you can") 将被计算,并且 i 将变为 5 you can 也会被打印出来。关于++ 的优先级大于 || 的说法是正确的,但由于存在序列点,因此首先评估 j||

关于c - 需要解释输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12569060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com