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

use*_*580 3 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;
}
Run Code Online (Sandbox Code Playgroud)

输出: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.
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下我还没有开始组合数据包,数据包大小可以适合组合数据包.

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

我想我需要把它分成更多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;
}
Run Code Online (Sandbox Code Playgroud)

编辑4:最终使用

else if(!building_cluster && p->len > MAX_CLUSTER_SIZE)
Run Code Online (Sandbox Code Playgroud)

jxh*_*jxh 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;
    }
} 
Run Code Online (Sandbox Code Playgroud)