相关疑难解决方法(0)

在每种语言中编译时,C和C++中有效的代码是否会产生不同的行为?

C和C++有许多不同之处,并非所有有效的C代码都是有效的C++代码.
("有效"是指具有已定义行为的标准代码,即不是特定于实现/未定义/等.)

在使用每种语言的标准编译器编译时,是否有任何一种在C和C++中都有效的代码会产生不同的行为?

为了使它成为一个合理/有用的比较(我试图学习一些实用的东西,而不是试图在问题中找到明显的漏洞),让我们假设:

  • 没有任何预处理器相关(这意味着没有hacks #ifdef __cplusplus,pragma等)
  • 任何实现定义在两种语言中都是相同的(例如数字限制等)
  • 我们正在比较每个标准的合理最新版本(例如,比如C++ 98和C90或更高版本)
    如果版本很重要,那么请提及每个版本的哪些版本产生不同的行为.

c c++

653
推荐指数
16
解决办法
4万
查看次数

在C/C++中使用%(模数)有什么替代方法吗?

我曾经读到过某些地方模数运算符在小型嵌入式设备(例如没有整数除法指令的8位微控制器)上效率低下.也许有人可以证实这一点,但我认为差异比整数除法运算慢5-10倍.

除了保持计数器变量并在mod点手动溢出到0之外,还有另一种方法吗?

const int FIZZ = 6;
for(int x = 0; x < MAXCOUNT; x++)
{
    if(!(x % FIZZ)) print("Fizz\n"); // slow on some systems
}
Run Code Online (Sandbox Code Playgroud)

VS:

我目前正在这样做的方式:

const int FIZZ = 6;
int fizzcount = 1;
for(int x = 1; x < MAXCOUNT; x++)
{
    if(fizzcount >= FIZZ) 
    {
        print("Fizz\n");
        fizzcount = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

c c++ embedded modulo

33
推荐指数
3
解决办法
5万
查看次数

整数除法在C++中用负数舍入

假设a并且b都是类型int,并且b非零.考虑a/b在以下情况下执行的结果:

  1. a并且b都是非负的.
  2. a并且b都是消极的.
  3. 其中只有一个是消极的.

在案例1中,结果向下舍入到最接近的整数.但标准对案例2和案例3有什么看法?我发现在互联网上浮动的旧草案表明它是依赖于实现的(是的,甚至是案例2),但委员会倾向于使其始终"向零舍入".有谁知道(最新)标准说的是什么?请仅根据标准回答,而不是有意义的回答,或者特定的编译器做什么.

c++ rounding

31
推荐指数
3
解决办法
2万
查看次数

C中的模运算有哪些规则?

在早期的课程中,我被教导n % d = r并将其视为n = d*q + r,d除数在哪里,q是商,并且r是余数(注意其余部分永远不会是负数).

因此,例如,-111 mod 1110,因为-111 = -11*-11 + 10(相反-111 = -11*10 -1,看到这将如何给我们一个负余数).

但是,打印结果时-111 % 11,-1结果并非如此10.为什么?这在技术上是不是错了?

c modulus

21
推荐指数
2
解决办法
8838
查看次数

c ++ 11中的运算符模数变化?

可能重复:
C++运算符%保证

在c ++ 98/03中

5.6-4

二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义; 否则(a/b)*b + a%b等于a.如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是​​实现定义的.

在c ++ 11中:

5.6 -4

二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义.对于积分操作数,/运算符产生代数商,丢弃任何小数部分;如果商a/b在结果类型中可表示,则为(a/b)*b + a%b等于a.

正如您所看到的那样,为符号位定义的实现缺失了,它会发生什么?

c++ modulo language-lawyer c++11 c++03

11
推荐指数
1
解决办法
4472
查看次数

模数和无符号整数

我发现以下行为令人惊讶:

int a = -2;
int b = 5;
uint c = 5;
std::cout << a%b << '\n';
std::cout << a%c << '\n';

Output:
-2
4
Run Code Online (Sandbox Code Playgroud)

当涉及比较时,混合有符号和无符号是有问题的 - 运算符中是否存在隐藏的比较%,或者此处是否还有其他事情发生?

c++ unsigned modulus

4
推荐指数
1
解决办法
201
查看次数

标签 统计

c++ ×5

c ×3

modulo ×2

modulus ×2

c++03 ×1

c++11 ×1

embedded ×1

language-lawyer ×1

rounding ×1

unsigned ×1