当前位置: 首页 > 知识库问答 >
问题:

需要对输出进行解释

景康安
2023-03-14

代码

#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.逻辑<代码>

怀疑:

>

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

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

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

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

    如果首先计算|,根据我的知识,这不应该是正确的,那么结果是正确的。但是,如果没有首先对其求值,则可以打印51。


  • 共有3个答案

    戚俊健
    2023-03-14

    你这里有什么:

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

    是一个逻辑表达式(没有数学发生)。让我们把它分解一下:

    ++i                // as a mathematical expression this is i=i+1 (5 in your case)
    printf("you can"); // printf returns the number of chars written, (7)
    

    所以你会认为这是:

    j = 7 || 5 && 7;
    

    上述表达式的输出简单地说就是1。因此,即使执行了此操作,您也应该看到j=1。那么为什么没有看到printf()输出呢?原因是整个表达式没有运行。没必要。考虑:

    result = TRUE || (anything else);
    

    任何“真实的”或与其他任何内容相关联的内容都将始终返回真实。编译器知道这一点,一旦它看到7 | |,它就将其等同于true | |,并说“我知道得够多了,将j设置为true,然后继续”。

    这就是为什么表达式不增加i,也不打印“youcan”。现在,如果要翻转表达式:

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

    逻辑保持不变,但编译器在对| |求值之前不会看到它,因此i将递增,printf将显示。

    景帅
    2023-03-14

    j|i

    当然,真正的代码不应该每次都做这样的事情。您应该始终以操作顺序显而易见的方式编写代码,并且几乎不应该在OR语句中使用具有副作用的代码。

    缑嘉玉
    2023-03-14

    在此表达式中:

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

    ||后面有一个序列点,它是从左到右计算的。由于j是非0,表达式的其余部分不计算。因此,j||(......)变为true,其值为1。由于isi未被评估i保持为4.因此,输出为4,1

    从C标准:

    附件C

    -以下运算符的第一个操作数的结尾:逻辑AND

    如果j为零,则i

     类似资料:
    • 我想深入了解Jmeter输出。 > 我对吞吐量率的概念感到困惑。这是否意味着服务器在给定负载下只能处理48.1个请求/分钟,还是意味着其他什么。总吞吐量速率和单个请求显示的吞吐量速率之间的差异是什么。在我的情况下,发送了8个请求,单个请求显示吞吐量为6.1/min。请解释一下。 我需要建议服务器端的任何更改/解释jmeter报告,请建议我如何解释需要做什么。 总的总结报告如下: 总用户: 100上

    • 在我的作业中,我对字符串Lexer有以下描述: “字符串文字由零个或多个用双引号(”“)括起的字符组成。使用转义序列(如下所列)表示字符串中的特殊字符。在字符串文本中出现新行或EOF字符是编译时错误。 所有支持的转义序列如下: \b退格 \f formfeed \r回车 \n换行符 \t水平选项卡 \“双引号 \反斜杠 以下是字符串文字的有效示例: "这是一个包含制表符\t的字符串" "他问我:\

    • 问题内容: 我的文件在第一行都有编码定义器,就像我的 正如我在相关问题上提到的那样,我用来返回api文档。由于我通过以下方式定义编码: 一切正常,当我调用我的API服务时,除了 由pprint由字典形成的字符串 外 , 没有任何编码问题 __ 由于我在字典中的某些值中使用土耳其语字符,因此pprint将其转换为等效的字符,例如: 我的纯文本输出如下: 我尝试将pprint输出解码或编码为不同的编码

    • 问题内容: 我有一个索引器,其中包含一个名为“ billingSequence”的字段。映射中该字段的数据类型为String,并且该字段的每个记录的值可以是1到30之间的一个。我使用此字段进行聚合,并且在尝试对_terms进行排序时,该字段的排序不正确是字符串类型。 上述聚合排序的结果是-1 11 12 13 14 15 16 17 18 19 2 3 4 5等。 预期结果是-1 2 3 4 5

    • 在我发现的每一个使用动态规划的1/0背包问题的例子中,项目有权重(成本)和利润,它从来没有明确地说要对项目列表进行排序,但在所有例子中,它们都是通过增加权重和利润来排序的(在例子中,权重越高,利润越高)。所以我的问题是当从项数组/列表中添加矩阵中的项时,我可以按照任何顺序添加它们,还是添加权重或利润最小的那个?因为从多个例子中,我发现我不确定这是否只是一个巧合,或者你真的需要每次把最小的权重/利润