我有以下代码片段:
main( )
{
int k = 35 ;
printf ( "\n%d %d %d", k == 35, k = 50, k > 40 ) ;
}
Run Code Online (Sandbox Code Playgroud)
产生以下输出
0 50 0
Run Code Online (Sandbox Code Playgroud)
我不知道我理解的第一个值怎么printf来0.当值k与之比较时35,理想情况下它应该返回(并因此打印)1,但它如何打印为零?产生的其他两个值 - 50并且0都是正确的,因为在第二个值中,k的值被视为50,而对于第三个值,k的值(即35)被比较40.因为35 < 40,所以它打印0.
任何帮助将不胜感激,谢谢.
**更新**
在研究了关于这个主题的更多内容之后undefined behavior,我在一本关于C的书中看到了这一点,最后给出了源代码.
调用约定 调用约定表示在遇到函数调用时参数被传递给函数的顺序.这里有两种可能性:
C语言遵循第二顺序.
考虑以下函数调用:
fun (a, b, c, d ) ;
Run Code Online (Sandbox Code Playgroud)
在这个调用中,参数是从左向右还是从右向左传递并不重要.但是,在某些函数调用中,传递参数的顺序成为一个重要的考虑因素.例如:
int a = 1 ;
printf …Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
#include <string.h>
main()
{
short int x=0x55AA;
printf("%x ",~x);
}
Run Code Online (Sandbox Code Playgroud)
上面的程序给出了输出:ffffaa55.我期待o/p只有aa55,因为short int是2个字节.有人可以解释一下吗?
我的课程如下:
void main() {
int n =0;
printf("%x", (~0 << (32+ (~n +1) )));
}
Run Code Online (Sandbox Code Playgroud)
由于n = 0,~n = 0xffffffff == -1,所以~n + 1等于0.当我执行该程序时,我得到0xffffffff,这是不正确的,因为(~0 << 32)输出0.
当我用0替换(~n +1)时,它输出0.
很感谢任何形式的帮助.
我正在编写一组充当接口的纯虚拟类。这个想法是,实现此类接口的代码可以使用不同的构建配置、编译器,甚至不同的 STL 实现来构建,以通过此类接口使用此类对象。
像和一样的普通旧数据uint32_t是标准化的。(不是因为标准没有说明它的大小。)doublefloatbool
属于哪个类别std::size_t?它纯粹是机器架构的功能吗?例如,在 32 位机器上,它可能sizeof(std::size_t)不是 4?
C++标准说明了ODR,因为它适用于内联函数(强调我的):
3.2一个定义规则
3每个程序应包含该程序中每个非内联函数或变量的一个定义; 无需诊断.该定义可以在程序中明确显示,可以在标准或用户定义的库中找到,或者(在适当的时候)隐式定义(见12.1,12.4和12.8).内联函数应在每个使用它的翻译单元中定义.
它没有说明内联函数是否可以在不同的翻译单元中具有不同的实现.我尝试了以下方法:
test-1.cc
#include <iostream>
inline std::ostream& foo(std::ostream& os)
{
return os << "Foo_1";
}
void test_1()
{
foo(std::cout) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
test-2.cc
#include <iostream>
inline std::ostream& foo(std::ostream& os)
{
return os << "Foo_2";
}
void test_2()
{
foo(std::cout) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
main.cc
extern void test_1();
extern void test_2();
int main()
{
test_1();
test_2();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待看到以下输出:
Foo_1
Foo_2
Run Code Online (Sandbox Code Playgroud)
相反,我看到:
Foo_1
Foo_1
Run Code Online (Sandbox Code Playgroud)
我用它来测试它g++ 4.7.3.
g ++在选择其中一个内联实现时是否正确?是否不可能在不同的翻译单元中提供内联函数的不同实现?
我已经读过,它在某些C标准(可能是99?)中未定义,当修改const时会发生什么.但是一位学生向我提供了一些我修改过的代码.
我看不出常量变量的地址有什么特别之处a.我验证了它&a并且b是相同的,因此编译器不会巧妙地指向其他位置.然而,当我分配时*b,const值不会改变.
我没有运行优化.当我使用-g标志进行编译以进行调试并进入代码时,我得到了我期望的结果(变量的内存位置发生了a变化).然而,下面提供的代码并未反映更新后的价值a.
即使在调试模式下,这个temp现在也被放在寄存器中,没有优化吗?
#include <iostream>
using namespace std;
int main(){
const int a = 15;
cout << a << '\n';
int * b= (int*)&a;
cout << &a << "\n";
cout << b << "\n";
*b = 20;
cout << *b << '\n';
cout << a << '\n';
int x = a;
cout << x << '\n';
x = *b;
cout << …Run Code Online (Sandbox Code Playgroud) 对不起这个愚蠢的问题我很抱歉.我有C程序提示用户输入年龄和名称,然后将年龄和名称打印到屏幕上.这是我从书中读到的练习.
这个程序:
#include <stdio.h>
int main (void) {
int age;
char name[20];
puts("Enter your age:");
scanf("%d",&age);
fflush(stdin);
puts("Enter your name:");
scanf("%s",name);
printf("Your age is %d\n",age);
printf("Your name is %s\n",name);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我向第一个输入额外的字符时,scanf()程序终止并将额外的字符分配给下一个scanf()
然后我更改了代码,并添加了命名函数clear_buff()并使用其中的fgets函数clear_buff()来读取流上的剩余字符.代码按照我的预期工作.
#include <stdio.h>
#define MAXLEN 80
void clear_buff(void);
int main (void) {
int age;
char name[20];
puts("Enter your age:");
scanf("%d",&age);
clear_buff();
puts("Enter your name:");
scanf("%s",name);
printf("Your age is %d\n",age);
printf("Your name is %s\n",name);
return 0;
}
void clear_buff(void){ …Run Code Online (Sandbox Code Playgroud) 我找到了这段代码,并想知道我是否真的应该在我的真实项目中实现这样的东西.
令我困惑的事情是
这需要更多的编译时间,但我不应该以运行时为代价来打扰编译时间.
如果N真的是一个非常大的数字呢?源代码中是否有文件大小限制?
或者它的好事要知道,而不是实施?
#include <iostream>
using namespace std;
template<int N>
class Factorial {
public:
static const int value = N * Factorial<N-1>::value;
};
template <>
class Factorial<1> {
public:
static const int value = 1;
};
int main() {
Factorial<5L> f;
cout << "5! = " << f.value << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
5! = 120
Run Code Online (Sandbox Code Playgroud)
稍微修改一下,因为我正在玩代码,发现了
Factorial<12> f1; // works
Factorial<13> f2; // doesn't work
Run Code Online (Sandbox Code Playgroud)
错误:
undefined reference to `Factorial<13>::value'
Run Code Online (Sandbox Code Playgroud)
是不是可以12进一步深入?
我正在通过GDB对用C++编写的项目进行调试,并发现在GNU C++编译器中没有警告或错误地修改了const.
这不是我正在调试的程序,但这是我目睹的行为的一个例子:
#include <iostream>
int main(int argc, char *argv[]) {
const int x = 10;
int *px = (int *)&x;
++*px;
std::cout << "*px: " << *px << "\n";
std::cout << "x: " << x << "\n";
for (int i = 0; i < x; ++i)
std::cout << i+1 << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不能代表其他编译器,因为我只使用GNU C++编译器4.9.2版进行了测试.为什么允许这样的事情?这打破了const对象的整个点.
我用g ++ main.c -Wall -Werror编译了上面的代码
输出:
*px: 11
x: 10
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud) 我试图创建通用的流类持有者,但似乎我无法传递std::cout给它,代码:
#include <iostream>
struct x
{
std::ostream &o;
x(std::ostream &o):o(o){}
};
int main()
{
x(std::cout);
x.o<<"Hi\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译时失败:
c++ str.cc -o str -std=c++11
str.cc: In function ‘int main()’:
str.cc:11:14: error: invalid use of qualified-name ‘std::cout’
str.cc:12:4: error: expected unqualified-id before ‘.’ token
Run Code Online (Sandbox Code Playgroud)
为什么?