在C中,两个假(零)可以一起真实吗?

时间:2014-08-09 00:04:38

标签: c++ boolean-logic

我知道只有在OR/AND等任何方式评估为真时,语句才有效。

我不明白为什么计算机至少可以理解C ++。

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    // your code goes here
    if(false && false)
        printf("true\n");
    else
        printf("false\n");
    return 0;
}
  

输出:false

我知道,看着那段代码,你很快就会看到2个谬误,这将是错误的。

但是,如果他们两个都作为AND运算符一起变得虚假并不能使它们成为真实呢?不试图NOT运营商在这里只是不明白为什么2个错误的检查在一起并且两个都给出相同的输出而不是真的?

现在我写了更多关于这一点似乎会破坏很多程序嘿嘿......

我想我只想知道一种不同的思维方式,我不知道为什么它没有这样做。

编辑:yaa我想我会收到一堆downvotes我想它只是简单地说如何构建计算机他们没有真正的逻辑

编辑2:

好的,我给你举个例子

假设您必须将一堆数据包组合在一起,而不是垃圾邮件过多的小数据包。 但是如果那些小包装太大你就无法将它们组合在一起,只需按原样发送即可。 但是,假设您已经开始组合数据包,并且在此过程中会产生一个大数据包,因此您无法继续在此处退出并发送当前的组合数据包。

问题是什么时候突破列表中的数据包循环..

我正在尝试避免使用2个循环来检查高级列表以了解如何尝试使其尽可能优化对我来说非常重要。

所以我进入了一个程序

if(already building a combined packet boolean   AND    current_packet->size > MAX_COMBINE_PACKET)
  break;
else
  //don't try to combine the packets just send normally.

所以在这种情况下,我还没有开始组合数据包,数据包大小可以放入合并数据包。

但是在这种情况下,如果数据包已经开始组合或者还没有开始组合但是仍然可以组合起来并不会尝试将它组合起来并不重要。

我想我需要把它分成更多if语句。

编辑3:真实代码

/* pull packets from packet list into buf, and erase/free them */
static int pull_packets(packet_list_t *l, uint8_t *buf, bool cluster) {
    int bytes_placed = 0;
    int offset = 0;
    bool building_cluster = false;
    int MAX_CLUSTER_SIZE = 0xFF; //maybe make this a constant? 0xFF bytes is the payload max.

    while(l->begin() != l->end()) {
        PACKET *p = *l->begin();
        /* if you are building a cluster and the packet can't be clustered you can't send a regular packet anymore */
        /* otherwise just send it as a regular packet, ignore any clustering */
        if(building_cluster && p->len > MAX_CLUSTER_SIZE) 
            break; 
        else  //else if(!building_cluster && p->len > MAX_CLUSTER_SIZE)
            cluster = false;
        /* if theres room in the packet for cluster+cluster len+[packet] */
        if(cluster && p->len <= (MAX_PACKET - offset)) {
            if(!building_cluster) {
                //starts a new cluster packet 
                bytes_placed = build_packet( buf, "BBBX", 0x00, 0x0e, p->len, p->data, p->len);
                offset += bytes_placed;
                building_cluster = true;
                free_packet(p);
                l->erase(l->begin());
            } else {
                //appends to existing cluster packet
                bytes_placed = build_packet( &buf[offset], "BX", p->len, p->data, p->len);
                offset += bytes_placed;
                free_packet(p);
                l->erase(l->begin());
            }
        } else {
            /* can't create cluster or cluster is filled up */
            if(building_cluster) //has a previous cluster in progress
                break;
            //cluster is filled up
            bytes_placed = build_packet(buf, "X", p->data, p->len);
            free_packet(p);
            l->erase(l->begin());
            return bytes_placed;
        }
    }
    return offset;
}

编辑4:最终使用

else if(!building_cluster && p->len > MAX_CLUSTER_SIZE)

5 个答案:

答案 0 :(得分:5)

我认为你可能会混淆false && false双重否定。虽然双重否定变得肯定,但在C和C ++中表达的方式是!false!0


您的问题描述和代码有点模糊,但假设您真正想要的是:

  • 如果不在组合数据包中,但当前数据包太大,则发送当前
  • 如果在组合数据包但当前数据包太大,则发送组合,然后发送当前
  • 如果不在组合数据包中,但当前数据包很小,则打破组合
  • 如果在组合数据包中但当前数据包很小,则进行中断以进行组合

假设上述内容是正确的,那么您只需检查当前数据包是否小而且适合,否则您需要转发内容。


查看您的真实代码,对于您当前是否正在构建群集以及当前数据包是否适合您的群集,似乎存在一些令人困惑的逻辑。您将受益于遵循简化的结构。下面的伪代码大致遵循我最初的建议,但是围绕循环的实际操作进行了调整。

bool start = true;
while (packet = head of list of packets) {
    if (packet will fit cluster) {
        if (start) {
            initialize cluster with packet;
            start = false;
        } else {
            add packet to cluster;
        }
        remove from head;
    } else {
        if (start) {
            initialize cluster with XL packet;
            remove from head;
        }
        break;
    }
} 

答案 1 :(得分:3)

逻辑并具有以下值表:

  • true&amp;&amp; true =&gt;真
  • true&amp;&amp; false =&gt;假
  • false&amp;&amp; true =&gt;假
  • false&amp;&amp; false =&gt;假

仅当两个操作数都为真时,结果才为真。就是那样子。那真正的逻辑。如果您不相信我,请阅读Wiki article on boolean algebra。它定义了'和',如上所述。

如果你想要一个条件,如果两个操作数具有相同的值(例如,都是true或两个都是false),则求值为true,那么你可以使用if(a == b) ..

答案 2 :(得分:1)

&&操作不是关于协议

此处的false值与否定无关。

此处的false值为

&&操作是一个函数,定义为true && true生成true以及任何其他组合生成值false

简而言之,a && b

的简写
a && b = f(a, b)
where
f(a, b) = { false | a = false, b = false
          { false | a = true, b = false
          { false | a = false, b = true
          { true  | a = true, b = true

&&是一个表示布尔和操作的计算机操作。它在布尔数系统中正式定义,通常使用布尔逻辑进行研究。

答案 3 :(得分:0)

这不是关于那种逻辑。这是关于处理逻辑。在编程语言中,当你有类似的东西时:

if (false && false) { ... }

由于if,编译器会在&&内看到选项。然后它评估fisrt one,即false。从那时起,没有必要评估下一个表达式 - 因为第一个表达式评估为false,所以不需要评估&&之后的任何内容,因为这是一个自动整体false:false &&

这就是为什么以下情况:

  • true&amp;&amp; true =&gt;真
  • true&amp;&amp; false =&gt;假
  • false&amp;&amp; true =&gt;假
  • false&amp;&amp; false =&gt;假

......编译器看到它的方式(如它停止评估的地方)是:

  • true&amp;&amp; true =&gt;真
  • true&amp;&amp; false =&gt;假
  • false&amp;&amp; [这甚至没有评估] =&gt;假
  • false&amp;&amp; [这甚至没有评估] =&gt;假

答案 4 :(得分:0)

查看这个&#34;真值表&#34;:

http://en.wikipedia.org/wiki/Truth_table#Truth_table_for_all_binary_logical_operators

您正在寻找的操作可能是&#34;独家NOR&#34;,这是&#34; NOT&#34; &#34;独家OR&#34;。异或由数学中用+的圆圈表示,当用于按位计算时,由基于C语言的^符号表示。对于&#34;逻辑&#34;计算异或可以由&#34;而不是等于&#34;运算符(和&#34;异或NOR&#34;是&#34;等于&#34;运算符)。