Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C语言中,两个假(零)和#x27;我们在一起是真的吗?_C++_Boolean Logic - Fatal编程技术网

C++ 在C语言中,两个假(零)和#x27;我们在一起是真的吗?

C++ 在C语言中,两个假(零)和#x27;我们在一起是真的吗?,c++,boolean-logic,C++,Boolean Logic,我知道,只有当语句通过或/和等任何方式计算为true时,语句才有效 我不明白为什么计算机至少不能理解C++。< /P> #include <stdio.h> #include <stdbool.h> int main(void) { // your code goes here if(false && false) printf("true\n"); else printf("false\n");

我知道,只有当语句通过
或/和
等任何方式计算为true时,语句才有效

我不明白为什么计算机至少不能理解C++。< /P>
#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;
}
所以在这种情况下,我还没有开始组合数据包,数据包的大小可以适合组合数据包

但是在这种情况下,不管数据包是否已经开始合并,或者还没有开始合并但仍然可以合并,它都不会尝试合并它

我想我需要把它分成更多的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;
}

逻辑and具有以下值表:

  • true&&true=>true
  • true&&false=>false
  • false&&true=>false
  • false&&false=>false
仅当两个操作数都为真时,结果才为真。事情就是这样。这才是真正的逻辑。如果你不相信我,就看这本书。它对“和”的定义如上所述


如果您想要一个条件,如果两个操作数的值相同(例如,均为真或均为假),则只需使用
If(a==b)

我认为您可能将
假和假与双反混淆起来。当双否定变为肯定时,C和C++中表达的方式是<代码>!错误
!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;
    }
} 

&&
操作与协议无关

此处的
false
值与否定无关

此处的
false
值是值


&
操作是一个函数,定义为
true
&
true
yeilds
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

&&
是一种表示布尔and运算的计算机操作。它是在布尔数系统中正式定义的,通常用布尔逻辑来研究。

这与这种逻辑无关。这是关于处理逻辑的。在编程语言中,当您具有以下内容时:

if (false && false) { ... }
由于
&
的原因,编译器会在
if
中看到选项。然后计算第一个值,即
false
。从这一点来看,对下一个表达式的求值没有意义——因为第一个表达式的求值结果是
false
,所以没有必要对后面的表达式求值,因为这是一个自动的整体false:
false&

这就是为什么下面的说法是正确的:

  • true&&true=>true
  • true&&false=>false
  • false&&true=>false
  • false&&false=>false
…编译器看到它的方式(如停止计算的位置)是:

  • true&&true=>true
  • true&&false=>false
  • false&[这甚至没有被计算]=>false
  • false&[这甚至没有被计算]=>false
查看此“真值表”:


您正在寻找的操作可能是“独占或”,这是“独占或”的“非”。在数学中,异或由一个圆圈表示,圆圈中有一个
+
,当用于按位计算时,在基于C的语言中由
^
符号表示。对于“逻辑”计算,“异或”可以用“不等于”运算符表示(而“异或”是“等于”运算符)。

您了解布尔与布尔相等之间的区别吗?false和false是false。这是C++所使用和使用的一个基本逻辑。它与计算机毫无关系。这就是它在Math和其他任何地方的情况。它是真正的逻辑:“考虑<代码>一条狗有三条腿,猫有五条腿< /代码> -这两个子语句都是错误的,组合语句也是如此。我想如果USER 3535580要求我归还我借用的割草机并修复我断开的引擎,那么,两种做法都不符合他的要求,也没关系:)听你母亲的话——两种错误都不能成为正确!这不仅是它的方式,也是“和”一词在现实生活中的使用方式。是的,但是有没有任何逻辑可以确定
假与假
是否变成
真与真
变成
只有失败才会是
真与假
?这就是我的问题。正如我所写的-
(a==b)
将导致
true
如果a和b都是true或false。逻辑相等是您正在寻找的构造。不符合逻辑和逻辑。如果你谈论“逻辑and”,那么你基本上总是谈论我在我的帖子中详细介绍的逻辑。@user3435580——对于逻辑表达式,你谈论的是“排他的NOR”。@RetoKoradi——在英语中有一个不同的问题,因为它经常被解释为逻辑
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
if (false && false) { ... }