C++ で大文字に変換する関数を作成しているときに、C で期待どおりの出力が得られないことに気付きました。
C++関数
#include <iostream>
#include <cctype>
#include <cstdio>
void strupp(char* beg)
{
while (*beg++ = std::toupper(*beg));
}
int main(int charc, char* argv[])
{
char a[] = "foobar";
strupp(a);
printf("%s\n", a);
return 0;
}
期待通りの出力:
FOOBAR
C関数
#include <ctype.h>
#include <stdio.h>
#include <string.h>
void strupp(char* beg)
{
while (*beg++ = toupper(*beg));
}
int main(int charc, char* argv[])
{
char a[] = "foobar";
strupp(a);
printf("%s\n", a);
return 0;
}
出力は最初の文字が欠落しているが、期待される結果である。
OOBAR
C でコンパイルするときに結果が切り捨てられる理由を知っている人はいますか?
ベストアンサー1
問題は、シーケンスポイントがないことです
while (*beg++ = toupper(*beg));
つまり、未定義の動作が発生します。この場合、コンパイラはC ではbeg++
前に評価しますがtoupper(*beg)
、C++ では逆の評価を行います。