【问题标题】:Why does the code "x++ && y++;" work in C without a control operator?为什么代码“x++ && y++;”在没有控制运算符的情况下在 C 中工作?
【发布时间】:2019-04-01 16:01:33
【问题描述】:

我一直在寻找减少线路使用的方法,但遇到了这个问题,它似乎工作正常。我在网上找不到任何关于它的信息,有人可以解释发生了什么吗?假设它甚至会运行,我仍然希望 x++ 评估为 false,因此 y 的值不会增加。但确实如此!

#include <stdio.h>

int     main(void)
{
    int     x;
    int     y;

    x = 4;
    y = 7;
    x++ && y++;
    printf("%d\n%d", x, y);
    return (0);
}
>> 5 
   8

编辑:我的项目的每个函数的函数限制为 25 行,这就是我必须减少几行的原因。

编辑 2:我的所有代码都受到严格的语法和格式检查器的约束,检查器禁止 "x++,y++;"和任何其他多行语句,所以我只是在寻找一个“黑客”来从我的程序中切断一行,但不知道为什么 ^^ 对我有用!谢谢大家的回复!

【问题讨论】:

  • 在这个程序中,x++ 的计算结果为 4,它非零,因此为“真”。
  • 另外,现在“减少线路使用”通常被认为是不好的风格。
  • “我一直在寻找减少线路使用量的方法” 除非您正在打代码高尔夫,否则请不要将此作为目标。而是专注于编写易于理解的简洁代码。
  • x++ && y++;此行计算为真或假,任何不同于零的 val 为真。如果你替换x=0,你会得到x=1 and y=7。因为第一个条件是假的。
  • “我不得不减少行数以满足每个函数 25 行的项目要求”然后将你的函数拆分成更小的函数??

标签: c math operators logical-operators


【解决方案1】:

逻辑运算符&amp;&amp;|| 使用short-circuit evaluation

对于左侧都总是进行评估。对于&amp;&amp;,如果左侧为“真”,则右侧也会被评估。 || 则相反,如果左侧为“假”,则评估右侧。

在 C 中,任何非零的东西都是“真”的。只有零是“假”。

【讨论】:

  • 好的,谢谢,这是有道理的,所以只要我的 x 从来没有值为 0,我的表达式就会按预期工作。
  • @ZakStucke :不,表达式无法按您的预期工作 - 或者至少不像您预期​​的那样在您的问题中工作:" 期望 x++ 评估为假,因此 y 不会增值”。如果您希望双方都被评估,那么写x++, y++ ;x++; y++ ; 会更清楚。你的“解决方案”没有任何价值。
  • 对不起,我的意思是按预期工作,除非 x 最初等于 0,否则两个值都将递增 1。此外,由于格式检查器对我的代码进行了严格检查,我无法使用 x++,是++;因为逗号被禁止。感谢您提供所有信息!
【解决方案2】:

每个函数规则 25 行的精神确实是为了可扩展性和清晰性;您应该通过将长函数分解为单独的组件函数来努力遵守它,而不是尝试通过您在问题中引用的此类发明来打高尔夫球您的代码。

对于表达式x++ &amp;&amp; y++,仅当x++ 不为零时才计算y++,并注意x++ 的计算结果为x 的初始值。

请注意,您可以将程序简化为

#include <stdio.h>
int main()
{
     for (int x = 4, y = 7; x++ && y++, printf("%d\n%d", x, y); ) break;
}

还剩 24 行,这很好!?请注意,对于函数main,编译器需要插入隐式return 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2019-02-27
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多