Tag: 逻辑运算符

关于c中“非法”的优化?

在学习编译器优化时,我在Linux下使用GCC版本gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5.1)编写代码 为了理解C中not a statement (nop),我先写了两个代码,然后使用gcc -S选项generate their compiled assembly code 。 拳头代码yc desktop:~$ cat yc main() { int i=0; } desktop:~$ gcc -S yc desktop:~$ 第二个代码xc desktop:~$ cat xc main() { int i=0; /* Loops and if*/ while(0); for(;0;); if(0); /* Arithmetic Operations */ i * i; i / i; i […]

C中的OR和AND运算

我对下面的程序有疑问。 int main() { int i = -3,j = 2, k = 0,m; m = ++i || ++j && ++k; printf(“%d %d %d %d\n”, i, j, k, m); return 0; } 我得到输出为-2 2 0 1 。 在OR运算中,如果第一个值为真,那么它将不计算第二个值,因此i = -2且j =2 。 然后是AND操作。 它将检查该值是否为真。所以如果k = 1则m = 1 。 所以输出应该是-2 2 1 1 。 我运行并检查输出为-2 2 […]

NOT(〜)vs NEGATION(!)

#include using namespace std; int main(int argc, char *argv[]) { int i=-5; while(~(i)) { cout<<i; ++i; } } 输出为-5,-4,-3,-2。 它不应该打印值直到-1?为什么它只到-2。 请解释一下’not’和’negation’运算符之间的区别。当我编写程序时,它们就是bug的来源。 while(i) 我知道循环条件对于正和负i都是正确的,除了0。 while(!i) vs while(~i) 对于’i’的值,上述两个循环是否被执行?

BITWISE AND操作如何在C程序中占用比ARITHMETIC ADDITION操作更多的CPU时钟?

我想测试按位运算是否真的比算术运算更快。 我以为他们是。 我写了一个小的C程序来测试这个假设,令我惊讶的是,加法平均比按位AND运算少。 这对我来说是令人惊讶的,我无法理解为什么会这样。 根据我所知的附加,来自较低有效位的进位应该被携带到下一位,因为结果也取决于进位。 对我来说,逻辑运算符比加法更慢是没有意义的。 我的鳕鱼在下面: #include #include int main() { int x=10; int y=25; int z=x+y; printf(“Sum of x+y = %i”, z); time_t start = clock(); for(int i=0;i<100000;i++)z=x+y; time_t stop = clock(); printf("\n\nArithmetic instructions take: %d",stop-start); start = clock(); for(int i=0;i<100000;i++)z=x&y; stop = clock(); printf("\n\nLogic instructions take: %d",stop-start); } 一些结果: Arithmetic instructions take: […]

C中的逻辑运算符有什么意义?

我只是想知道在C中是否有一个XOR逻辑运算符(类似于&& for AND但是对于XOR)。 我知道我可以将XOR分成AND,NOT和OR,但简单的XOR会好得多。 然后我发现如果我在两个条件之间使用普通的XOR位运算符,它可能会起作用。 对于我的测试,它做到了。 考虑: int i = 3; int j = 7; int k = 8; 仅仅为了这个相当愚蠢的例子,如果我需要k大于i或大于j而不是两者,XOR将是非常方便的。 if ((k > i) XOR (k > j)) printf(“Valid”); else printf(“Invalid”); 要么 printf(“%s”,((k > i) XOR (k > j)) ? “Valid” : “Invalid”); 我把按位XOR ^ ,它产生“无效”。 将两个比较的结果放在两个整数中导致2个整数包含1,因此XOR产生错误。 然后我用&和|尝试了 按位运算符和两者都给出了预期的结果。 知道真实条件具有非零值,而虚假条件具有零值,所有这些都是有意义的。 我在想,是否有理由使用逻辑&&和|| 当按位运算符&,| 和^工作一样吗?

C编程语言中&&的行为

我是C编程语言的初学者,最近我读过有关Logical AND &&运算符的内容。 我也知道,在C编程语言中,所有非零值都被视为TRUE 。 NON-ZERO && NON-ZERO = 1 NON-ZERO && ZERO = 0 ZERO && NON-ZERO = 0 ZERO && ZERO = 0 但是当我处理以下程序时,我没有得到预期的答案。 int main(){ int x, y, z; x = y = z = -1; y = ++x && ++y && ++z; printf(“x = %d, y = %d, z = %d, […]

我如何评估?=(20 || 10)?

#include int main(void) { int i=10; if(i==(20||10)) printf(“True”); else printf(“False”); return 0; } 这给出了输出False 。 请解释一下这个程序是如何工作的?

如果你不合理,那么会发生什么?

我假设这只返回一个int。 还有什么事情我应该知道吗? C / C ++的差异? float a = 2.5; !a; // What does this return? Int? Float?

是>,<,!,&&,||的“真实”结果 或==定义?

例如,当我在C中写入7>1时(如果这不是一直是特征,则说是C99),我可以期望结果恰好是1还是只有一些非零值? 这适用于所有bool运营商吗?

为什么语句“m = ++ i && ++ j ||”中的“k”不递增 ++ k“当”++ i && ++ j“评估为真?

复合逻辑AND / OR表达式中的各个表达式是否应该在将逻辑运算符应用于其结果之前首先进行求值?为什么++k在条件m = ++i && ++j || ++k未被触及? m = ++i && ++j || ++k用于以下程序: #include int main() { int i=-3, j=2, k=0, m; m = ++i && ++j || ++k; printf(“%d, %d, %d, %d\n”, i, j, k, m); return 0; } 输出: -2,3,0,1 但我期望输出-2,3,1,1