考虑这个程序:
#include <stdio.h>
int main(void)
{
unsigned int a;
printf("%u %u\n", a^a, a-a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是不确定的行为?
从表面上看,它a是一个未初始化的变量.所以这指向未定义的行为.但是a^a并且a-a等于0所有的价值a,至少我认为是这样的.有可能有某种方式来证明行为是明确定义的吗?
C++标准的第3.9.1/6节说,
bool类型的值是
true或者false.
现在考虑这段代码,
void f(bool b)
{
switch(b) //since b is bool, it's value can be either true or false!
{
case true: cout << "possible value - true"; break;
case false: cout << "possible value - false"; break;
default: cout << "impossible value";
}
}
int main()
{
bool b; //note : b is uninitialized
f(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编 F:\workplace>g++ test.cpp -pedantic
跑.输出:
不可能的价值
出乎意料的输出?嗯,不是真的,因为标准在§3.9.1/ 6的脚注中读到:
以本国际标准描述的方式将bool值用作 "未定义",例如通过检查未初始化的自动对象的值,可能会使其表现为既不是真也不是假 …
c++ compiler-construction gcc initialization undefined-behavior
我意识到差异可以忽略不计,但是在尝试将无符号长度归零时哪个更有效?
unsigned long x;
...
x=0;
--OR--
x^=x;
Run Code Online (Sandbox Code Playgroud)
泰勒
并且f(x)+(g(y))可以确保g(y)先打电话吗?我知道表达式中的顺序在很多情况下是未定义的,但在这种情况下括号是否有效?
我需要在基于USB(libusb)C的命令行实用程序中执行以下操作:
char pid[20];
sprintf(pid, "Product ID : %#06x", anInteger);
puts(pid);
Run Code Online (Sandbox Code Playgroud)
有没有更短的单线方式来做到这一点?